単一の。mkvファイルに抽出する複数のオーディオトラックと字幕があります。私はffmpeg
コマンドが初めてで、これは私が試したものです(オーディオ):
ffmpeg -i VIDEO.mkv -vn -acodec copy AUDIO.aac
音声を1つ抽出するだけです。私が欲しいのは、ffmpeg
にすべての単一のオーディオファイルと字幕ファイルを目的地に抽出し、各ファイルと拡張子の元の名前を保持するように指示することです。 (オーディオファイルの拡張子がわからないため、場合によっては。flacまたは。aac)。
。ところで、Windows CMDからコードを実行することを計画しました。
ありがとう。
ffmpeg
には、すべてのストリームを適切なコンテナに自動的に抽出するオプションはまだありませんが、手動で行うことは確かに可能です。デフォルト ストリーム選択 は、ストリームタイプごとに1つのストリームのみを選択するため、各ストリームを手動でマッピングする必要があります。
ffmpeg
またはffprobe
を使用すると、個々のストリームごとに情報を取得できます。また、 さまざまな形式 (xml、json、cvsなど)ニーズに合わせて。
ffmpeg
の例ffmpeg -i input.mkv
結果の出力(余分なものを切り取り、ストリーム番号とフォーマット情報が重要です):
Input #0, matroska,webm, from 'input.mkv':
Metadata:
Duration: 00:00:05.00, start: 0.000000, bitrate: 106 kb/s
Stream #0:0: Video: h264 (High 4:4:4 Predictive), yuv444p, 320x240 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
Stream #0:1: Audio: vorbis, 44100 Hz, mono, fltp (default)
Stream #0:2: Audio: vorbis, 44100 Hz, mono, fltp (default)
Stream #0:3: Audio: vorbis, 44100 Hz, mono, fltp (default)
Stream #0:4: Subtitle: ass (default)
ffprobe
の例ffprobe -v error -show_entries stream=index,codec_name,codec_type input.mkv
結果の出力:
[STREAM]
index=0
codec_name=h264
codec_type=video
[/STREAM]
[STREAM]
index=1
codec_name=vorbis
codec_type=audio
[/STREAM]
[STREAM]
index=2
codec_name=vorbis
codec_type=audio
[/STREAM]
[STREAM]
index=3
codec_name=vorbis
codec_type=audio
[/STREAM]
[STREAM]
index=4
codec_name=ass
codec_type=subtitle
[/STREAM]
上記のコマンドのいずれかの情報を使用します。
ffmpeg -i input.mkv \
-map 0:v -c copy video.mkv \
-map 0:a:0 -c copy audio0.oga \
-map 0:a:1 -c copy audio1.oga \
-map 0:a:2 -c copy audio2.oga \
-map 0:s -c copy subtitles.ass
この場合、上記の例は次と同じです。
ffmpeg -i input.mkv \
-map 0:0 -c copy video.mkv \
-map 0:1 -c copy audio0.oga \
-map 0:2 -c copy audio1.oga \
-map 0:3 -c copy audio2.oga \
-map 0:4 -c copy subtitles.ass
最初の例を好むのは、input file index:stream specifier:stream index
はより柔軟で効率的です。また、マッピングが間違っている可能性も低くなります。
ストリーム指定子 および -map
option 構文を完全に理解します。追加情報は FFmpeg muxビデオとオーディオ(別のビデオから)-マッピングの問題 への回答にあります。
これらの例は ストリームコピー (re-mux)であるため、再エンコードは発生しません。
最初にすべてのオーディオストリームをリストします。
ffmpeg -i VIDEO.mkv
次に、出力に基づいてコマンドをコンパイルし、オーディオトラックを個別に抽出できます。
シェルスクリプトを使用すると、スクリプトファイルでこれを潜在的に自動化できるため、mkvファイルに対して一般的に実行できます。
字幕はほとんど同じです。字幕が情報に印刷され、次のように抽出できます。
ffmpeg -threads 4 -i VIDEO.mkv -vn -an -codec:s:0.2 srt myLangSubtitle.srt
0.2は、情報から読み取る必要がある識別子です。
次のスクリプトは、現在のディレクトリ内のファイルからすべてのオーディオストリームを抽出します
ls |parallel "ffmpeg -i {} 2>&1 |\
sed -n 's/.*Stream \#\(.\+\)\:\(.\+\)\: Audio\: \([a-zA-Z0-9]\+\).*$/-map \1:\2 -c copy \"{.}.\1\2.\3\"/p' |\
xargs -n5 ffmpeg -i {} "
私はこのように解決しました:
ffprobe -show_entries stream=index,codec_type:stream_tags=language -of compact $video1 2>&1 | { while read line; do if $(echo "$line" | grep -q -i "stream #"); then echo "$line"; fi; done; while read -d $'\x0D' line; do if $(echo "$line" | grep -q "time="); then echo "$line" | awk '{ printf "%s\r", $8 }'; fi; done; }
出力:
コマンドの前にのみ$ video1 varを設定してください。
楽しめ!。