Klip ekstrak FFmpeg - laju bingkai streaming berbeda dari laju bingkai wadah (x264, aac)

8

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 -tpilihan 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 -topsi 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).

fideli
sumber
Pengodean ulang bukan solusi dan melakukan decoding selama berjam-jam untuk lima menit konten tidak masuk akal dan kemungkinan tidak akan mengatasi masalah mendasar. Penelitian awal yang bagus btw. Anda mungkin benar dengan berasumsi bahwa fps ffmpeg telah mendeteksi adalah akar masalah Anda. Kedengarannya seperti versi terbaru dari ffmpeg memperbaiki masalah Anda, tetapi saya akan memberikan komentar. Saya akan merekomendasikan melakukan copy -c ke format wadah yang berbeda. Ini dapat memiliki berbagai efek tetapi ini akan menjadi langkah selanjutnya yang baik untuk bereksperimen.
dstob

Jawaban:

1

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:

ffmpeg -i outofsight.mp4 -ss 01:15:51 -t 00:05:59 -acodec copy -vcodec copy clip.mp4

Dengan ffmpeg saat ini, sintaks yang benar adalah:

ffmpeg -i outofsight.mp4 -ss 01:15:51 -t 00:05:59 -c copy clip.mp4
Evilsoup
sumber
1

Saya mengalami masalah yang sama dan solusi saya adalah sebagai berikut:

        $ffmpegout = array();           
        //10 is the number of images you want from video
        $fracduration = ($info['duration']/10);             

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

Gus
sumber