概要
H.264ビデオのフレームレートは非常に高いため、抽出しようとしているビデオの長さに適用されるスケーリング係数が必要です(900分の1)。
ボディ
MP4形式( Handbrake を使用して作成)のムービーからクリップを抽出しようとしています。 MencoderとVLCを試した後、コーデックのコピーに関して最も面倒ではなかったので、FFmpegを試してみることにしました。つまり、mencoderやVLCと比較して、結果のファイルはQuickTimeで再生可能でした(Perianなどについては知っていますが、これがどのように機能するかを学習しようとしています)。
とにかく、私のコマンドは次のとおりでした:
ffmpeg -ss 01:15:51 -t 00:05:59 -i outofsight.mp4 \
-acodec copy -vcodec copy clip.mp4
コピー中に、次のことが表示されます。
Seems stream 0 codec frame rate differs from container frame rate: 45000.00 (45000/1) -> 25.00 (25/1)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from outofsight.mp4':
Duration: 01:57:42.10, start: 0.000000, bitrate: 830 kb/s
Stream #0.0(und): Video: h264, yuv420p, 720x384, 25 tbr, 22500 tbn, 45k tbc
Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, s16
Output #0, mp4, to 'out.mp4':
Stream #0.0(und): Video: libx264, yuv420p, 720x384, q=2-31, 90k tbn, 22500 tbc
Stream #0.1(eng): Audio: libfaac, 48000 Hz, stereo, s16
Stream mapping:
Stream #0.0 -> #0.0
Stream #0.1 -> #0.1
Press [q] to stop encoding
frame= 2591 fps=2349 q=-1.0 size= 8144kB time=101.60 bitrate= 656.7kbits/s
…
5:59の長さのクリップの代わりに、映画の残りの部分全体を取得します。そこで、これをテストするために、-t 00:00:01
を指定してffmpegコマンドを実行しました。私が得たのはちょうど15:00分のクリップでした。そこで、ブラックボックスエンジニアリングを行い、1秒が900秒と解釈された場合に入力する値を計算することにより、-t
オプションをスケーリングすることにしました。希望する359秒のクリップに対して0.399秒を計算したので、ffmpegコマンドは次のようになりました。
ffmpeg -ss 01:15.51 -t 00:00:00.399 -i outofsight.mp4 \
-acodec copy -vcodec copy clip.mp4
これは機能しますが、期間が900でスケーリングされる理由がわかりません。さらに調査すると、各ffmpegの実行には次の行があります。
Seems stream 0 codec frame rate differs from container frame rate: 45000.00 (45000/1) -> 25.00 (25/1)
45000/25 = 1800。どこかの関係である必要があります。どういうわけか、わいせつな高フレームレートがタイミングの問題を引き起こしています。そのフレームレートはどうしてそんなに高いのですか?これについての最良の部分は、結果のclip.mp4が(コピーされたビデオコーデックのために)まったく同じ機能を持っていることであり、これからさらにクリップを取得するには、-t
期間オプションに対して同じスケーリングが必要です。したがって、 私はそれを利用可能にしました これをチェックしてくれる人のために。
付録
私のシステムのffmpegのプリアンブル(MacPorts ffmpegポートを使用して構築):
FFmpeg version 0.5, Copyright (c) 2000-2009 Fabrice Bellard, et al.
configuration: --prefix=/opt/local --disable-vhook --enable-gpl --enable-postproc --enable-swscale --enable-avfilter --enable-avfilter-lavf --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libdirac --enable-libschroedinger --enable-libfaac --enable-libfaad --enable-libxvid --enable-libx264 --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/gcc-4.2 --Arch=x86_64
libavutil 49.15. 0 / 49.15. 0
libavcodec 52.20. 0 / 52.20. 0
libavformat 52.31. 0 / 52.31. 0
libavdevice 52. 1. 0 / 52. 1. 0
libavfilter 1. 4. 0 / 1. 4. 0
libswscale 1. 7. 1 / 1. 7. 1
libpostproc 51. 2. 0 / 51. 2. 0
built on Jan 4 2010 21:51:51, gcc: 4.2.1 (Apple Inc. build 5646) (dot 1)
[〜#〜]編集[〜#〜]
バグかどうかはわかりませんが、少なくともこのビデオ(MacPortsのバージョン0.6.1)では、現在のバージョンのffmpegで修正されているようです。
Ffmpegでは、オプションの配置が重要です。あなたの例では、入力に-ssと-tを適用しようとしています。このように使用すると、代わりにオプションが出力に適用されます。
ffmpeg -i outofsight.mp4 -ss 01:15:51 -t 00:05:59 -acodec copy -vcodec copy clip.mp4
現在のffmpegでは、正しい構文は次のようになります。
ffmpeg -i outofsight.mp4 -ss 01:15:51 -t 00:05:59 -c copy clip.mp4
私はこれと同じ問題を抱えていました、そして私の解決策は次のとおりでした:
$ffmpegout = array();
//10 is the number of images you want from video
$fracduration = ($info['duration']/10);
exec( 'ffmpeg -y -i/testmedia/'.$info['filename']。'-vffps = fps = 1/'。$fracduration。'-f image2 /testmedia/images/output%03d.jpg 2 >&1 '、$ ffmpegout); // print_r($ ffmpegout);
これにより、ビデオの長さに関係なく、すべてのビデオに対して10枚の画像が得られます。