9

ffmpeg で 2 つの動画を連結しようとしています。空想は何もありません。ビデオ A の直後にビデオ B が続く 1 つのビデオが必要です。

Fedora 17 上の ffmpeg 1.2.1 の新しく構築された、それ以外の場合は動作する正常なインストールで、メディア ファイルを連結 (結合、マージ) する方法のコードを試しましたが、次のエラー メッセージが表示されます。

$ ffmpeg -i video_a.mov -i video_b.mov -filter_complex '[0:0] [0:1] [1:0] [1:1] concat=n=2:v=1:a=1 [v] [a]' -map '[v]' -map '[a]' output.mp4

ffmpeg version N-54271-g7f866c1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jun 29 2013 11:05:42 with gcc 4.7.2 (GCC) 20120921 (Red Hat 4.7.2-2)
  configuration: --enable-gpl --enable-nonfree --enable-pthreads --enable-libx264 --enable-libfaac --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib
  libavutil      52. 37.101 / 52. 37.101
  libavcodec     55. 17.100 / 55. 17.100
  libavformat    55. 10.100 / 55. 10.100
  libavdevice    55.  2.100 / 55.  2.100
  libavfilter     3. 77.101 /  3. 77.101
  libswscale      2.  3.100 /  2.  3.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  3.100 / 52.  3.100

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'v1221-MTQxMzcyNTIxODU2.mov':
  Metadata:
    major_brand     : qt  
    minor_version   : 0
    compatible_brands: qt  
    creation_time   : 2013-03-28 20:34:59
    encoder         : Mac OS X v10.8.3 (CMA 914, CM 926.87, x86_64)
    encoder-eng     : Mac OS X v10.8.3 (CMA 914, CM 926.87, x86_64)
  Duration: 00:00:05.34, start: 0.000000, bitrate: 15837 kb/s
    Stream #0:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 221 kb/s
    Metadata:
      creation_time   : 2013-03-28 20:34:59
      handler_name    : Core Media Data Handler
    Stream #0:1(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 15512 kb/s, 29.81 fps, 30 tbr, 600 tbn, 1200 tbc
    Metadata:
      creation_time   : 2013-03-28 20:34:59
      handler_name    : Core Media Data Handler

Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'v1224-MTQxMzcyNTIxODg5.mov':
  Metadata:
    major_brand     : qt  
    minor_version   : 0
    compatible_brands: qt  
    creation_time   : 2013-03-28 20:36:28
    encoder         : Mac OS X v10.8.3 (CMA 914, CM 926.87, x86_64)
    encoder-eng     : Mac OS X v10.8.3 (CMA 914, CM 926.87, x86_64)
  Duration: 00:00:04.13, start: 0.000000, bitrate: 15689 kb/s
    Stream #1:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 221 kb/s
    Metadata:
      creation_time   : 2013-03-28 20:36:28
      handler_name    : Core Media Data Handler
    Stream #1:1(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 15446 kb/s, 29.79 fps, 30 tbr, 600 tbn, 1200 tbc
    Metadata:
      creation_time   : 2013-03-28 20:36:28
      handler_name    : Core Media Data Handler

Stream specifier ':0' in filtergraph description [0:0] [0:1] [1:0] [1:1] concat=n=2:v=1:a=1 [v] [a] matches no streams.

その他の注意事項:

  • 私が取り組んでいる 2 つのビデオは同じカメラで撮影されたものなので、アスペクト比やその他の悲惨なビデオの詳細に問題はないはずです。
  • これらのビデオの1つを.movから.mp4に変換するなど、ffmpegのインストールで他のことを行うことができます(はい、faacで再コンパイルする必要がありました...)。これは、ffmpegとビデオの両方を保証しているようです.
  • 上記の呼び出しを変更して、最後に .mov ファイルを生成しようとしましたが、以前と同じエラーが発生します。
  • 上記のリクエストに対して、同じビデオの 2 つのコピーを連結するなど、ばかげたハッキン​​グ トリックを試してみましたfilter_complex。動作していると引用されたものでも、「ストリームに一致しません」というメッセージが表示されます。
4

2 に答える 2

14

入力ごとに、最初にビデオ ストリームを指定し、次にオーディオ ストリームを指定します。ビデオ ストリームは各入力のストリーム 1 であり、オーディオ ストリームはストリーム 0 であるため、次のようになります。

ffmpeg -i video_a.mov -i video_b.mov -filter_complex '[0:1] [0:0] [1:1] [1:0] 
  concat=n=2:v=1:a=1 [v] [a]' -map '[v]' -map '[a]' output.mp4

さらに良いことに、次のコマンドは元のストリームの順序に関係なく機能し、複数のオーディオ ストリームがある場合は最初のオーディオ ストリームを取得します。

ffmpeg -i video_a.mov -i video_b.mov -filter_complex '[0:v] [0:a:0] [1:v] [1:a:0] 
   concat=n=2:v=1:a=1 [v] [a]' -map '[v]' -map '[a]' output.mp4
于 2013-07-02T15:27:32.007 に答える
3

連結デマルチプレクサ

concat demuxer は ffmpeg 1.1 に追加されました。ffmpeg のバージョンが古い場合は、http ://www.ffmpeg.org/download.html から最新の静的バイナリを入手してください。

指示

mylist.txt連結したいすべてのファイルを含むファイルを次の形式で作成します(ダッシュで始まる行は無視されます)。

# this is a comment
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'

これらは相対パスまたは絶対パスのいずれかであることに注意してください。次に、ファイルを次の方法でエンコードできます。

ffmpeg -f concat -i mylist.txt -c copy output

このリスト ファイルは、bash for ループまたは printf を使用して生成できます。次のいずれかを実行すると、作業ディレクトリ内のすべての *.wav を含むリスト ファイルが生成されます。

for f in ./*.wav; do echo "file '$f'" >> mylist.txt; done
printf "file '%s'\n" ./*.wav > mylist.txt

ソース: ffmpeg ウィキ

于 2014-03-02T01:34:09.267 に答える