ffmpegで入力ビデオを繰り返し/ループしますか?


52

ffmpegでmp4ビデオをループし、現在の設定とコーデックを保持したいだけです。

たとえば、input.mp4の長さが0:10で、4回ループしてoutput.mp4の長さが0:40の場合、次のコマンドラインを変更するにはどうすればよいですか?

ffmpeg -i input.mp4 -c copy output.mp4

私は試した...

ffmpeg -loop 4 -i input.mp4 -c copy output.mp4

...しかし、「Option loop not found。」というエラーが表示されます。


quicktime 7 proおよびmovコンテナーを使用します。したがって、オープンソースのファイルサイズよりも大きなファイルサイズを取得することはできません。
ДмитрийМышков

回答:


69

Concatデマルチプレクサ

これにより、再エンコードする必要なく入力をループできます。

  1. テキストファイルを作成します。4回繰り返すテキストファイルの例の内容。

    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    
  2. 次に実行しますffmpeg

    ffmpeg -f concat -i list.txt -c copy output.mp4
    

Linuxユーザーの場合

この例は上記と同じですが、手動で作成する必要はありませんlist.txt

for i in {1..4}; do printf "file '%s'\n" input.mp4 >> list.txt; done
ffmpeg -f concat -i list.txt -c copy output.mp4

最も一般的に使用される最新のシェルでは、list.txtファイルの作成を完全に回避することさえできます。たとえば、bashの場合:

ffmpeg -f concat -i <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -c copy output.mp4

参照:


ループフィルター

ループフィルターを使用して4回ループする例。各ループは75フレームで、各ループは入力の最初の25フレームをスキップします。

ffmpeg -i input -filter_complex loop=loop=3:size=75:start=25 output
  • または、速記を使用します。 loop=3:75:25
  • フィルタリングには再エンコードが必要です。
  • このフィルタは、すべてのフレームをメモリに配置します
  • を使用loop=3すると、4回ループします。
  • 無限ループするには、を使用します-1
  • ループするフレームの数をリストする必要があります(上記の例では75として表示)。最大値は32767です。
  • も参照してくださいffmpeg -h filter=loop

映画フィルター

映画のフィルタは、ループオプションを持っています。モナ・トゥクによる下記の回答をご覧ください。フィルタリングには再エンコードが必要です。オーディオには、amovieフィルターを使用します。


-stream_loop オプション

参照してください答え Thingyのとで以下の答えギャンこともできます。

このオプションバグ多かった(バグレポート#5719#6121、および#7043参照)ため、古いビルド(FFmpeg 4.0.xリリースブランチを含む2018 06-27より古いもの)では動作しない可能性があることに注意してください。チケット#6121でmulvyaが述べているように、古いビルドのユーザーの場合、1つの回避策は、最初にMKVまたはTSに再多重化-stream_loopしてから、次のコマンドで使用することです。


-loop オプション

この-loopオプションは画像ファイルデマルチプレクサgif muxerに固有であるため、通常のビデオファイルには使用できませんが、一連の入力画像を無限にループするために使用できます。この例は繰り返しループし-t 30ますが、出力期間を30秒に制限します:

ffmpeg -loop 1 -i %03d.png -t 30 output.mkv

または、GIF出力をループするには:

ffmpeg -i input -loop 3 output.gif

これはmp4ファイルで正常に機能しますか?
トーマスキング14年

3
このエラーが表示されます> <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -bash: /dev/fd/63: Permission denied
-JZ11

1
@jamesfzhang-これは、ファイルへの絶対パスが必要だからだと思います(ここで説明するように、trac.ffmpeg.org / wiki / Concatenate)。それを実現するために、次のように書くことができます:ffmpeg -safe 0 -f concat -i <(for i in {1..4}; do printf "file '$ PWD' / '%s' \ n" input.mp4; done )-c copy output.mp4
プレナスフランクリー

1
私としてこれを繰り返すために働くフルタイム 4回スキップのFAMEせずにビデオをffmpeg -i video.mp4 -filter_complex "loop=4:32767" output.mp4
ヴラド

この問題は4歳で、誰もが第二の問題へのリンクに気づい-stream_loopセクションでは、最初の1 ...同じチケットを指している
レオニードUsov

15

FFmpegの2.8.x上に、少なくとも(ただし、オールディーズがあまりにも働く必要があります)を使用できlavfi用いて、入力フォーマットと複雑なフィルタグラフとしてmoviesetptsの引数としてのフィルタ-iオプション。

この作業を行う次のコマンド:

ffmpeg -re -f lavfi -i "movie=filename=input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" output.mp4

loop=引数がゼロの場合、無限ループを意味します。ゼロより大きい値は繰り返し回数を設定します。setpts2回目以降の繰り返しのPTS調整に必要なフィルター。そうしないと、ほとんどの出力マルチプレクサが非単調なPTSの増加で失敗します。ループはPTSを再計算しません。

デコード/エンコードなしでフレームをバイパスすることは不可能であると仮定してフィルターを使用することに注意してください。設計により、フィルターはデコードされたフレームのみを処理します。

FFmpeg 2.8.2では、新しい入力オプションが-stream_loop導入されました。私は最初にそれがよりシンプルに動作し、トランスコーディングなしでコンテンツをコピーできるように見えます:

ffmpeg -re -stream_loop -1 -i input.mp4 -c copy -y output.mp4

ただし、PTSは再計算されず、出力ファイルは間違っています。PTSを修正するためにフィルターを追加する場合(を参照setpts)も削除する必要があり-c copyます。エンコードされたパケットを処理できるのはビットストリームフィルターのみですが、PTSを修正するビットストリームフィルターはありません(https://ffmpeg.org/ffmpeg-bitstream-filters.htmlを参照)

いずれの場合でも、2回目のパスでのffmpegはエラーで失敗します。

input.mp4: Resource temporarily unavailable

私の既知の回避策:PTS制限なしで入力ファイルにコンテナを使用します(ストリーミングコンテナ)。それらの1つは、私が知っているMPEG-TSです。したがって、MP4ファイルをMPEG-TSに簡単に変換できます。

ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input.ts

そして、次のコマンドを使用して無限大ファイルを作成します。

ffmpeg -re -stream_loop -1 -i input.ts -c copy -strict -2 -bsf:a aac_adtstoasc -y output.mp4

(ビットストリームフィルターは、必要な場合にのみ使用する必要があり、サンプルでは必要です)

この場合、FFmpeg> = 2.8.2が必要です。


1
このコマンドを実行すると、エラーが発生します:「[mp4 @ 00000000053fa1a0]ストリーム#0でコーデックrawvideoのタグが見つかりませんでした。コーデックは現在コンテナでサポートされていません」入力の前に-vcodec h264を追加すると、そのエラーは消えますが、エンコーダーは終了しません。ゼロ以外のループカウントを指定すると、多くのエラーが生成されますが、終了します。ファイルは有効な出力ではありません。
ギャン

1
stream_loopのドキュメントには、「ループ0はループなしを意味し、ループ-1は無限ループを意味します」と書かれています。
ギャン

不正な入力ファイルのようです。共有してもらえますか?「ループ0はループなしを意味し、ループ-1は無限ループを意味します。」-古いドキュメントが表示されているようです:
モナトゥク

1
忘れていたのは、トランスコーディング(デコード/エンコード)を想定したフィルターです。意図的に。したがって、削除する必要があります-c copy。回答が修正されました。
モナトゥク

1
知っておくと便利ですが、生成する大きなループがある場合、それは重大な制限です。
ギャン

14

ffmpeg 2.8.4では、次のコマンドは、ffmpegプロセスが停止するまでinput.mp4の繰り返しコピーであるoutput.mp4を作成します。

ffmpeg -stream_loop -1 -i input.mp4 -c copy output.mp4

このコマンドは単独では終了せず、出力ファイルは無限に大きくなります。


2
最速の方法のようです
-josef

2
最速の方法は控えめです。この方法では、数時間で数時間のビデオに到達します。
スレイボーイ

これは非常に便利な方法です。行を繰り返すファイルを作成する必要がないためです。
マーカスツェラー

-1

Q:「...次のコマンドラインを変更するにはどうすればよいですか?ffmpeg -i input.mp4 -c copy output.mp4」

A:どのコマンドがどのバージョンで機能するかという問題を回避する簡単な方法は、「簡単な解決策」です。

ffmpeg -i input.mp4 -i input.mp4 -i input.mp4 -i input.mp4 -c copy output.mp4

多くの例については、https//trac.ffmpeg.org/wiki/Concatenateも参照してください。


2
これは行っていない任意の連結を。concatメソッドの少なくとも1つを使用する必要があります:protocol、filter、またはdemuxer。このコマンドでは、ffmpegの自動マッピングにより、入力の中から1つのビデオ、1つのオーディオ、1つの字幕ストリームが選択されます。それらは同一であるため、OPの最初のコマンドと同等です。
ギャン

そのMulvyaをテストしていただきありがとうございます。ドキュメントに記載されている動作とは異なります:ffmpeg.org/ffmpeg.html#Description -「-i -i /tmp/test%d.mp4」を使用してファイル名に類似性がある場合( et。al)も可能です。
ロブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.