Ringkasan
video H.264 tampaknya memiliki frame rate yang sangat tinggi yang memerlukan faktor penskalaan untuk diterapkan pada durasi video yang saya coba ekstrak (900x lebih rendah).
Tubuh
saya mencoba mengekstrak klip dari film yang saya miliki dalam format MP4 (dibuat menggunakan Handbrake ). Setelah mencoba mencoder dan VLC, saya memutuskan untuk mencoba FFmpeg karena itu yang paling merepotkan ketika harus menyalin codec. Artinya, dibandingkan dengan mencoder dan VLC, file yang dihasilkan masih dapat diputar di QuickTime (saya tahu tentang Perian, dll. Saya hanya mencoba mempelajari bagaimana semua ini bekerja).
Lagi pula, perintah saya adalah sebagai berikut:
ffmpeg -ss 01:15:51 -t 00:05:59 -i outofsight.mp4 \
-acodec copy -vcodec copy clip.mp4
Selama salinan, Berikut ini muncul:
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
…
Alih-alih klip durasi 5:59, saya mendapatkan seluruh sisa film. Jadi, untuk menguji ini, saya menjalankan perintah ffmpeg -t 00:00:01
. Apa yang saya dapatkan adalah klip 15:00 menit. Jadi saya melakukan beberapa teknik black box dan memutuskan untuk menskalakan -t
pilihan saya dengan menghitung nilai apa yang dimasukkan karena 1 detik ditafsirkan sebagai 900 detik. Untuk klip 359 yang saya inginkan, saya menghitung 0,399 dan jadi perintah ffmpeg saya menjadi:
ffmpeg -ss 01:15.51 -t 00:00:00.399 -i outofsight.mp4 \
-acodec copy -vcodec copy clip.mp4
Ini berfungsi, tetapi saya tidak tahu mengapa durasinya ditingkatkan oleh 900. Menyelidiki lebih lanjut, setiap proses ffmpeg memiliki garis:
Seems stream 0 codec frame rate differs from container frame rate: 45000.00 (45000/1) -> 25.00 (25/1)
45000/25 = 1800. Harus ada hubungan di suatu tempat. Entah bagaimana, frame rate yang sangat tinggi menyebabkan masalah dengan waktu. Bagaimana frame rate itu begitu tinggi? Bagian terbaik tentang ini adalah bahwa clip.mp4 yang dihasilkan memiliki fitur yang sama persis (karena codec video yang disalin), dan mengambil klip lebih lanjut dari ini membutuhkan penskalaan yang sama untuk -t
opsi durasi. Oleh karena itu, saya telah membuatnya tersedia untuk siapa saja yang mau memeriksa ini.
Lampiran
Pembukaan untuk ffmpeg pada sistem saya (dibangun menggunakan port ffmpeg MacPorts):
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)
EDIT
Tidak yakin apakah itu bug atau tidak, tetapi tampaknya sudah diperbaiki sekarang di versi ffmpeg saya saat ini, setidaknya untuk video ini (versi 0.6.1 dari MacPorts).
Jawaban:
Dengan ffmpeg, pemosisian opsi menjadi penting. Dengan contoh Anda, ia mencoba menerapkan -ss dan -t ke input. Gunakan seperti ini yang akan menerapkan opsi ke output sebagai gantinya:
Dengan ffmpeg saat ini, sintaks yang benar adalah:
sumber
Saya mengalami masalah yang sama dan solusi saya adalah sebagai berikut:
exec ('ffmpeg -y -i /testmedia/'.$info['filename']. '-vf fps = fps = 1 /'.$ fracduration.' -f image2 /testmedia/images/output%03d.jpg 2 > & 1 ', $ ffmpegout); // print_r ($ ffmpegout);
Ini memberi saya 10 gambar untuk semua video terlepas dari panjang video
sumber