web-dev-qa-db-ja.com

ffmpegを使用して長いビデオの途中でセグメントを抽出する

ビデオをwebmに変換しながら、ビデオの途中から30秒の間隔を抽出する必要があります。 ffmpegは完璧な1つのライナーのように見えました:

ffmpeg -i long.mkv -vcodec libvpx -b:v 1M -ss 02:00:00 -t 00:00:30 -threads 4 out.webm

驚いたことに、それはほとんどすぐに利用可能なすべてのメモリを飲み込み、物事が交換され始めたので、私はそれを殺しました。明らかなエラーが見つからなかった後(そして、ffmpegを使用することはめったにないことを念頭に置いて)、avconvを試しました。何もしなかったと報告されており、メモリ使用量は(ゆっくりと)同じ方向に増加していました。

いくつかのテストの後:

 -ss 02:00:00 -t 00:00:01
 -ss 00:00:01 -t 00:00:01
 -ss 00:01:00 -t 00:00:01

Ffmpegがムービー全体を-ssまでメモリにロードしているようです。とにかく、この種の操作には適していないようです。私の質問は、私は何か間違ったことをしていて、ffmpegは実際に合理的なリソース使用量でこの操作を実行できるのですか? ffmpegがこれを目的としていない場合、またはそれを行う方法について愚かである場合、長方形をタイムラインにドラッグアンドドロップし、小さなはさみとスクロールバーを使用しない代替手段はありますか?

debian@pc:~/ ffmpeg -version
ffmpeg version 0.8.16-6:0.8.16-1, Copyright (c) 2000-2014 the Libav developers
  built on Sep 16 2014 23:10:48 with gcc 4.7.2
The ffmpeg program is only provided for script compatibility and will be removed
in a future release. It has been deprecated in the Libav project to allow for
incompatible command line syntax improvements in its replacement called avconv
(see Changelog for details). Please use avconv instead.
ffmpeg 0.8.16-6:0.8.16-1
libavutil    51. 22. 2 / 51. 22. 2
libavcodec   53. 35. 0 / 53. 35. 0
libavformat  53. 21. 1 / 53. 21. 1
libavdevice  53.  2. 0 / 53.  2. 0
libavfilter   2. 15. 0 /  2. 15. 0
libswscale    2.  1. 0 /  2.  1. 0
libpostproc  52.  0. 0 / 52.  0.100

私もffmpegのサイトから最新バージョンを試してみましたが、結果はavconvのものと同じでした-一度に私の記憶を飲み込むことはありませんが、何もしないようです:

frame=    0 fps=0.0 q=-1.0 size=       4kB time=00:00:00.00 bitrate=N/A    

そして、着実にメモリ使用量を増やします。 1秒間のクリップの場合、それは瞬時であり、メモリをほとんど使用しないはずです。

4
Alex

ffmpeg-ssの後に-iを使用すると、時間がかかります。

これは、入力ではなく、出力内のポイントを探しているためです。 ffmpegシークに関するマニュアル

入力シーク

-ssパラメーターは、-iの前のどこかに指定する必要があります。

...入力はキーフレームを使用して解析されます。これは非常に高速です.。

と比較して:

出力シーク

-ssパラメーターは-iの後に指定する必要があります。

...これは非常にゆっくり、フレームごとに行われます...

あなたの質問では後者を指定します。代わりにinput seekを使用すると、はるかに高速になります。

ffmpeg -ss 02:00:00 -i long.mkv -vcodec libvpx -b:v 1M -t 00:00:30 -threads 4 out.webm

ただし、フレーム精度のシークがどうしても必要な場合は、次の両方を組み合わせることができます。

ffmpeg -ss 01:59:30 -i long.mkv -ss 30 -vcodec libvpx -b:v 1M -t 00:00:30 -threads 4 out.webm

(01:59:30まで高速シークし、次に02:00:00までフレームごとにシークします。これは+30です)

すでにご存知かもしれませんが、そうでない場合は、ffmpegがオプションとスイッチの配置に気を配っていることを明らかにするはずです!

7
bertieb