HTTP akışı için hazır MP4 videolar oluşturma


25

Nasıl dönüştürebilir some.flvya some.aviya some.wmvFFmpeg'den ile bu videonun JW Player'da oynanabilir ve seekable olacağından emin olunur?

Yanıtlar:


9

Bu, @ abrahab'ın son yorumuna bir cevap.

mp4boxBir dosyaya nginx üzerinden akış yapabilmek için dosyaya ihtiyacınız yoktur . MP4 akış modülü, moov atomlarının konumlandırılmasından bağımsız olarak ilgilenir ( mp4boxmoov atomunu dosyanın başlangıcına kaydırır).


Şimdi 500 sunucu hatası için mp4box ile "-frag" seçeneğini kullanıyor musunuz? MP4 akış modülü, parçalanmış MP4 dosyalarını okuyamaz. mp4boxSözde yayın için iyi bir kullanım, daha iyi arama için videoları bir araya getirmektir. Moov atomunun kayması ilave bir avantajdır.

Bunu her zaman mp4boxFFmpeg kodlu bir dosyaya yapıyorum

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

Bu aynı zamanda, MP4 dosyasını varsayılan olarak 500 milisaniye boyutunda araya sokacaktır.


1
"Yerinde" dosyasını yeni bir dosya oluşturmak zorunda kalmadan araya sokmak için doğrudan kullanınMP4Box -isma -inter 500 Myvideo.mp4
Vineet

45

MP4'te H.264

Genellikle, bir MP4 kabı içinde x264 video oluşturmak istersiniz. Bu seçenek temelde herhangi bir cihaz ve tarayıcı tarafından desteklenir.

Aşağıdakiler yeterli olmalı. Giriş adını ve CRF seçeneklerini değiştirdiğinizden emin olun. İkincisi, akıl sağlığı değerlerinin 19 ile 25 arasında değiştiği kaliteyi ayarlar - daha düşük daha iyi kalite, aynı zamanda daha yüksek bit hızı anlamına gelir:

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

GUI yöntemini isterseniz kodlama için El Freni de kullanabilirsiniz .

faststartSeçeneği kullanma

Şimdi yapmanız gereken, MP4 taşıyıcısının MOOV atomunu başlangıcına taşımak . Bu atom (özünde, MP4 kabındaki bir veri birimi), video / ses akışlarının kendileri hakkında önemli meta veriler içerecektir. -movflags faststarttam olarak bunu yapmalı.

FFmpeg sürümünüzde bu seçenek yoksa, yükseltmeyi düşünün. Yükseltme yapamıyorsanız, aşağıdaki araçlardan herhangi biriyle aynı şeyi başarabilirsiniz:

  • QTIndexSwapper , bir Adobe AIR uygulaması

  • MP4Box , serbest ve açık kaynak kodlu, aşağıdakine benzer bir komut çalıştırarak, aralığını değiştirebilir (burada, 500):

    mp4box -inter 500 input.mp4

  • Python'un kurulu olduğu her yerde çalışan Python'da qt-faststart .

    qtfaststart input.mp4

Bu konuda.

Bit hızını / kaliteyi kontrol etme

Şimdi, tabii ki, akış için, aslında belirli sınırlar içinde kalmak için bit hızını sınırlamak isteyebilirsiniz. Bu konuda daha fazla bilgiyi blog yazımda ücret kontrol yöntemleri hakkında okuyabilirsiniz .

Örneğin -maxrate 2M -bufsize 2M, kodlama seçeneklerine ekleyerek , kodlamayı 720p video için yeterli olabilecek 2 Mbit / s değerine kadar kaplarsınız. Gerekli bit hızı, elbette, içeriğin ne kadar karmaşık olduğuna bağlı olacaktır. Bu bazı deneme yanılma alır.


teşekkürler, ben de aynısını yapıyorum, ama hala videodaki sorun gibi görünüyor :( O ffmpeg -i 1.flv -vcodec libx264 -f mp4 -an -g 1 -f mp4 -g 30 -level 3 new.mp4zaman mp4boxve mp4 arama yapamıyorum ve nginx raporunu 500 internal server errorbaşlatmak için daha fazla parametre başlattı 0. -vcoded libx264( video, varsayılan mp4 kodlayıcı olmadan) kodlandığında (ama quality! sick!) :( (üzgünüm, şimdi, cevabını değiştirmemize izin verilmiyor)
abrahab

Bu, herhangi bir video dönüştürme sorunundan ziyade, NginX ile h.264 eklentisi sorunu gibi görünüyor. Kendi başıma web video yayını konusunda uzman değilim , ancak Stack Overflow'ta bunu daha önce sorduğunuzu mu görüyorum? stackoverflow.com/questions/11079748/…
slhck

Ayrıca, nginx'in bu video formatını düzgün okuyamadığını da düşünüyorum. youtube video da iyi oynatılır. evet, nginx sorunu hakkında istiflemem istendi ama cevap yok gibi görünüyor. :(
abrahab

3
-movflags faststartTam ihtiyacım olan şey için +1
andrew

bağlantı öldü, web.archive.org kullanmanız gerekiyor: web.archive.org/web/20140201142344/http://www.longtailvideo.com/…
malat

5

Akışı olmayan bir AVI veya MP4'ü, her şeyi yeniden kodlamadan da, basitçe, aşağıdakileri yaparak dönüştürebilirsiniz:

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

Herhangi bir şeyi yeniden kodlamaya gerek yok çünkü sadece moov atomunun taşınması gerekiyor.


-1

Bunu ffmpeg ile deneyebilirsiniz:

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"

5
22 kHz PCM İnternet akış videosu için stereo ses? Kulağa çok verimli gelmiyor. Peki neden ses bit hızını 128k olarak ayarladınız?
slhck

@slhck, "-ar 22050" yerine "ar 44100" yerine 22k ila 44k değerini değiştirebilirsiniz
Searush

1
@ SEARAS Problem örnekleme oranı değil. Bu ses sıkıştırılmamış PCM stereo olmasıdır. İnternet akışı için. Bu anlamadı.
slhck

Bu cevap çok düşük kalitede ve kaldırılması gerekiyor. Parametreler, içeriğin kare hızını, video çözünürlüğünü ve ses örnekleme oranını değiştirebilir ve verimsiz veya düşük kaliteli sonuçlar üretebilir (ffmpeg daha güvenli veya daha iyi parametreleri kendisi seçebilir). Performans aynı zamanda daha az dişe sınırlama ile sakat kalıyor ve -acodec pcm_s16le(hata :) ile bile çalışmıyor Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument. IETF taslağı gibi iyi bir neden tam olarak bu parametrelerin seçilmesinin de eksik olduğu görülüyor.
LiveWireBT
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.