FFmpegの2.8.x上に、少なくとも(ただし、オールディーズがあまりにも働く必要があります)を使用できlavfi
用いて、入力フォーマットと複雑なフィルタグラフとしてmovie
とsetpts
の引数としてのフィルタ-i
オプション。
この作業を行う次のコマンド:
ffmpeg -re -f lavfi -i "movie=filename=input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" output.mp4
loop=
引数がゼロの場合、無限ループを意味します。ゼロより大きい値は繰り返し回数を設定します。setpts
2回目以降の繰り返しの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が必要です。