Membuat video MP4 siap untuk streaming HTTP

25

Bagaimana saya bisa mengkonversi some.flvatau some.aviatau some.wmvdengan FFmpeg untuk memastikan bahwa video ini akan dimainkan dan seekable di JW Player?

abrahab
sumber

Jawaban:

9

Ini adalah jawaban untuk komentar terakhir oleh Anda @ abrahab.

Anda tidak perlu mp4boxsebuah file untuk dapat melakukan pseudo streaming melalui nginx. Modul streaming MP4 merawatnya terlepas dari posisi atom moov ( mp4boxmenggeser atom moov ke awal file).


Sekarang untuk kesalahan 500 server, apakah Anda menggunakan opsi "-frag" dengan mp4box? Modul streaming MP4 tidak dapat membaca file MP4 terfragmentasi. Penggunaan mp4boxpseudo streaming yang baik adalah untuk menyisipkan video untuk pencarian yang lebih baik. Pergeseran atom Moov adalah keuntungan tambahan.

Saya selalu melakukan ini pada mp4boxfile yang disandikan FFmpeg

MP4Box -add MyVideo.mp4 -isma Myvideo-box.mp4

Ini juga akan interleave file MP4 dalam 500 milidetik potongan secara default.

Vineet
sumber
1
Untuk melakukan interleaving file "di tempat" tanpa harus membuat file baru, langsung gunakanMP4Box -isma -inter 500 Myvideo.mp4
Vineet
45

H.264 dalam MP4

Secara umum, Anda ingin membuat video x264 dalam wadah MP4. Opsi ini pada dasarnya didukung oleh semua perangkat dan browser.

Berikut ini harus cukup. Pastikan untuk mengganti nama input dan opsi CRF. Yang terakhir menentukan kualitas, di mana nilai waras berkisar antara 19 hingga 25 - lebih rendah berarti kualitas yang lebih baik, tetapi juga bitrate lebih tinggi:

ffmpeg -i input.avi -c:v libx264 -crf 23 -c:a aac -movflags faststart output.mp4

Anda juga dapat menggunakan Handbrake untuk penyandian jika Anda menyukai cara GUI.

Menggunakan faststartopsi

Sekarang, apa yang perlu Anda lakukan adalah memindahkan atom MOOV penampung MP4 ke awal. Atom ini (pada dasarnya, satu unit data dalam wadah MP4) akan berisi metadata penting tentang aliran video / audio itu sendiri. -movflags faststartharus melakukan hal itu.

Jika versi FFmpeg Anda tidak memiliki opsi ini, pertimbangkan untuk memutakhirkan. Jika Anda tidak dapat memutakhirkan, Anda dapat mencapai hal yang sama dengan alat di bawah ini:

  • QTIndexSwapper , aplikasi Adobe AIR

  • MP4Box , sumber bebas dan terbuka, menjalankan perintah yang mirip dengan yang berikut, tempat Anda dapat mengubah interval (di sini, 500):

    mp4box -inter 500 input.mp4

  • qt-faststart in Python , yang bekerja di mana-mana di mana Python diinstal.

    qtfaststart input.mp4

Itu saja.

Mengontrol bitrate / kualitas

Sekarang, tentu saja, untuk streaming, Anda mungkin sebenarnya ingin membatasi bitrate agar tetap dalam batas tertentu. Anda dapat membaca lebih lanjut tentang itu di posting blog saya tentang metode kontrol tingkat .

Misalnya, dengan menambahkan -maxrate 2M -bufsize 2Mopsi pengkodean, Anda membatasi pengkodean menjadi 2 Mbit / dtk, yang mungkin cukup untuk video 720p. Kecepatan bit yang dibutuhkan akan tergantung, tentu saja, pada seberapa kompleks kontennya. Ini membutuhkan beberapa trial and error.

slhck
sumber
terima kasih, saya melakukan semua dengan cara yang sama, tetapi tampaknya masalah masih dengan video :( saya lakukan ffmpeg -i 1.flv -vcodec libx264 -f mp4 -an -g 1 -f mp4 -g 30 -level 3 new.mp4kemudian mp4boxdan mp4 tidak bisa mencari dan laporan nginx 500 internal server erroruntuk parameter awal yang lebih yang 0. saat video dikodekan tanpa -vcoded libx264(default mp4 coder) semua berkas kerja (tapi kualitas! sakit!) :( (maaf, sekarang, tidak diizinkan untuk mengubah pendapat Anda)
abrahab
Ini sepertinya masalah plugin h.264 dengan NginX daripada masalah konversi video. Saya bukan ahli dalam streaming video web per se, tapi saya melihat Anda sudah bertanya tentang ini di Stack Overflow? stackoverflow.com/questions/11079748/…
slhck
Saya juga berpikir bahwa mungkin nginx tidak dapat membaca format video ini dengan benar. video dari youtube juga diputar dengan baik. ya, saya ditanya tentang masalah nginx, tetapi sepertinya tidak ada jawaban. :(
abrahab
3
+1 untuk -movflags faststartapa yang saya butuhkan
andrew
tautan sudah mati, perlu menggunakan web.archive.org: web.archive.org/web/20140201142344/http://www.longtailvideo.com/…
malat
5

Anda cukup mengonversi AVI atau MP4 yang tidak dapat di-stream, juga tanpa meng-enkode ulang semuanya, dengan melakukan ini:

ffmpeg -i INPUT.mp4 -c copy -movflags faststart STREAMABLE_OUTPUT.mp4

Tidak perlu menyandikan ulang apa pun, karena hanya atom moov yang harus dipindahkan.

pengguna769852
sumber
-1

Anda dapat mencoba ini dengan ffmpeg:

ffmpeg.exe -i "INPUT_FILE.AVI" -threads 2 -s 800x600 -r 25.00 -threads 1 -pix_fmt yuv420p -g 300 -qmin 3 -b 2048k -async 1 -acodec pcm_s16le -ar 22050 -ac 1 -ab 128k -y "OUTPUT_FILE.mp4"
Tomás Hernández
sumber
5
Audio stereo PCM 22 kHz untuk video streaming internet? Kedengarannya tidak efisien. Dan mengapa Anda mengatur bitrate audio ke 128k?
slhck
@ slhck, Anda dapat mengubah 22k menjadi 44k menggantikan "-ar 22050" dengan "ar 44100"
Searush
1
@ SEARAS Masalahnya bukan laju sampling. Itu fakta bahwa audio stereo PCM terkompresi. Untuk streaming internet. Itu bukan angka.
slhck
Jawaban ini berkualitas sangat rendah dan harus dihapus. Parameter dapat mengubah framerate, resolusi video dan laju sampling audio konten dan menghasilkan hasil yang tidak efisien atau berkualitas rendah (ffmpeg dapat memilih parameter yang lebih aman atau lebih baik itu sendiri). Performanya juga lumpuh karena keterbatasan jumlah utas dan bahkan tidak berfungsi dengan -acodec pcm_s16le(error:) Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument. Alasan yang bagus seperti draft IETF mengapa memilih persis parameter ini tampaknya juga tidak ada.
LiveWireBT