web-dev-qa-db-ja.com

FFmpegがすべてのオーディオストリームをコピーしない

.mp4ファイルからすべてのオーディオストリームをコピーするためにffmpegを取得するのに問題があります。何時間もオンラインで検索した後、これはallストリーム( ここの例4に示すように )をコピーするはずです:

ffmpeg -i in.mp4 -map 0 -c copy out.mp4

in.mp4には3つのストリームが含まれます。

  • ビデオ
  • オーディオトラック1
  • オーディオトラック2

out.mp4in.mp4と同一でなければなりません)には2つのストリームのみが含まれます。

  • ビデオ
  • オーディオトラック1

FFmpegは3つのストリームすべてを正しく識別するように見えますが、それらすべてをコピーするわけではありません。 FFmpegからの出力:

Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
  Stream #0:2 -> #0:2 (copy)

編集:ffmpeg -v 9 -loglevel 99 -i in.mp4からの出力:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from in.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.36.100
  Duration: 00:00:06.03, start: 0.000000, bitrate: 5582 kb/s
    Stream #0:0(und), 1, 1/15360: Video: h264 (Main), 1 reference frame (avc1 /
0x31637661), yuv420p(tv, bt470bg/unknown/unknown, left), 1920x1080 (0x0) [SAR 1:
1 DAR 16:9], 0/1, 5317 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und), 1, 1/48000: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz,
 stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
    Stream #0:2(und), 1, 1/48000: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz,
 stereo, fltp, 128 kb/s
    Metadata:
      handler_name    : SoundHandler
Successfully opened the file.
At least one output file must be specified
[AVIOContext @ 0000000001c2b9e0] Statistics: 153350 bytes read, 2 seeks

Edit 2(解決済み):this ticket から正しい構文を見つけることができました。興味がある他の人にとって、正しい構文は次のとおりです。

ffmpeg -i in.mp4 -vcodec copy -c:a copy -map 0 out.mp4

これにより、すべてのストリームがコピーされます。

16
Dotl

どうやらこれはよくある質問なので、他の人が見ることができるように、ソリューションを回答として投稿しています(以前はコメントの返信でした)。

この ticket から正しい構文を見つけることができました。正しい構文は次のとおりです。

ffmpeg -i in.mp4 -vcodec copy -c:a copy -map 0:0 -map 0:1 -map 0:2 out.mp4

これにより、3つのストリームすべてがコピーされます。

11
Dotl

FFmpegには、すべてのストリームを出力にマップするオプションがあります。オプション-map 0を使用して、すべてのストリームを入力から出力にマップする必要があります。

完全な行では、次のようになります。

ffmpeg -i in.mp4 -c copy -map 0 out.mp4

詳細については、 ストリーム選択 および -map オプションのドキュメントを参照してください。

14
PRIHLOP

まず、ここでこのより広範な答えを試しました: https://stackoverflow.com/a/54616353/14226

しかし、サポートされていない字幕トラックで問題が発生したため、このコマンドを使用する必要がなくなりました。

avconv -i INFILE -c copy -map 0:a -map 0:v OUTFILE

コピーを依頼した後、基本的にコピーしたのはマッピングしたもののみ(そしてもちろんすべてのオーディオをマッピングした)字幕が埋め込まれていることに注意してください。字幕をマッピングする場合は、この-map 0:s

0
Aquarius Power

OK、ffmpegのマニュアルページをかなり深く読んでみると、これが役に立つはずです。

現在、各出力ストリームには単一の入力ストリームからのチャネルのみを含めることができます。たとえば、「-map_channel」を使用して、(同じまたは異なるファイルからの)異なるストリームに含まれる複数の入力オーディオチャンネルを選択し、それらを単一の出力ストリームにマージすることはできません。そのため、たとえば、2つの別々のモノストリームを1つのステレオストリームに変換することは現在できません。ただし、ステレオストリームを2つのシングルチャネルモノストリームに分割することは可能です。

この機能が必要な場合、可能な回避策は、マージフィルターを使用することです。たとえば、2つのモノラルオーディオストリームを持つメディア(ここではinput.mkv)を1つの単一のステレオチャネルオーディオストリームにマージする(およびビデオストリームを保持する)必要がある場合、次のコマンドを使用できます。

ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv

man ffmpeg-filtersのマニュアルページの指示を読み、実験して、チャネルと予想される出力の命名にどの程度の複雑さがあるかを理解することをお勧めします。

[編集:Mulvyaが指摘したように、これは質問に答えますが、元のポスターの質問ではありませんでした。]

0
vielmetti