Tworzenie filmów MP4 gotowych do przesyłania strumieniowego HTTP

25

W jaki sposób można konwertować some.flvlub some.avilub some.wmvz FFmpeg, aby mieć pewność, że ten film będzie grywalna i możliwy do przeszukania w JW Player?

abrahab
źródło

Odpowiedzi:

9

To jest odpowiedź na twój ostatni komentarz @abrahab.

Nie potrzebujesz mp4boxpliku, aby móc pseudo strumieniować go przez nginx. Moduł strumieniowy MP4 dba o to bez względu na położenie atomów moov ( mp4boxprzesuwa atom moov na początek pliku).


Teraz, jeśli chodzi o błąd serwera 500, czy używasz opcji „-frag” z mp4box? Moduł przesyłania strumieniowego MP4 nie może odczytać pofragmentowanych plików MP4. Dobrym zastosowaniem mp4boxpseudo-streamingu jest przeplatanie filmów w celu lepszego wyszukiwania. Przesunięcie atomów Moova jest dodatkową zaletą.

Zawsze robię to dla mp4boxpliku zakodowanego w FFmpeg

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

Spowoduje to również przeplot pliku MP4 domyślnie w 500 milisekundach porcji.

Vineet
źródło
1
Aby wykonać przeplatanie plików „w miejscu” bez konieczności tworzenia nowego pliku, użyj bezpośrednioMP4Box -isma -inter 500 Myvideo.mp4
Vineet
45

H.264 w MP4

Ogólnie rzecz biorąc, chcesz utworzyć wideo x264 w kontenerze MP4. Ta opcja jest obsługiwana przez praktycznie każde urządzenie i przeglądarkę.

Poniższe powinny wystarczyć. Pamiętaj, aby zastąpić nazwę wejściową i opcje CRF. Ten ostatni określa jakość, w której wartości rozsądne mieszczą się w zakresie od 19 do 25 - niższa oznacza lepszą jakość, ale także wyższą przepływność:

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

Możesz także użyć hamulca ręcznego do kodowania, jeśli podoba ci się GUI.

Korzystanie z faststartopcji

Teraz musisz przenieść atom MOOV pojemnika MP4 na początek. Ten atom (w istocie jednostka danych w kontenerze MP4) będzie zawierać ważne metadane dotyczące samych strumieni wideo / audio. -movflags faststartpowinien zrobić dokładnie to.

Jeśli wersja FFmpeg nie ma tej opcji, rozważ aktualizację. Jeśli nie możesz dokonać aktualizacji, możesz to samo osiągnąć za pomocą jednego z poniższych narzędzi:

  • QTIndexSwapper , aplikacja Adobe AIR

  • MP4Box , darmowy i open source, uruchamiający polecenie podobne do następującego, w którym możesz zmienić interwał (tutaj 500):

    mp4box -inter 500 input.mp4

  • qt-faststart w Pythonie , który działa wszędzie tam, gdzie jest zainstalowany Python.

    qtfaststart input.mp4

O to chodzi.

Kontrolowanie przepływności / jakości

Teraz, oczywiście, w przypadku przesyłania strumieniowego możesz chcieć ograniczyć przepływność, aby pozostać w określonych granicach. Możesz przeczytać więcej na ten temat w moim blogu na temat metod kontroli stawek .

Na przykład, dodając -maxrate 2M -bufsize 2Mdo opcji kodowania, ograniczasz kodowanie do 2 Mbit / s, co może być wystarczające dla wideo 720p. Wymagana szybkość transmisji zależy oczywiście od stopnia złożoności treści. To wymaga trochę prób i błędów.

slhck
źródło
dziękuję, robię to samo, ale wydaje się, że problem nadal występuje z filmem :( Robię ffmpeg -i 1.flv -vcodec libx264 -f mp4 -an -g 1 -f mp4 -g 30 -level 3 new.mp4to, mp4boxa mp4 nie może szukać i nginx raportuje 500 internal server errorparametr początkowy bardziej niż 0. kiedy wideo zakodowane bez -vcoded libx264(domyślny koder mp4) cały plik roboczy (ale jakość! chory!) :( (przepraszam, teraz nie wolno głosować za odpowiedzią)
abrahab
Wygląda to na problem wtyczki h.264 z NginX, a nie jakikolwiek problem z konwersją wideo. Nie jestem ekspertem w strumieniowaniu wideo w sieci jako takiej , ale widzę, że już o to pytałeś w Stack Overflow? stackoverflow.com/questions/11079748/…
slhck
Myślę też, że może nginx nie potrafi poprawnie odczytać tego formatu wideo. dobrze odtwarzane jest również wideo z YouTube. tak, jestem pytany na stosie o problemie z Nginx, ale wydaje się, że nie ma odpowiedzi. :(
abrahab
3
+1 za -movflags faststartdokładnie to, czego potrzebowałem
Andrew
link nie działa, należy użyć web.archive.org: web.archive.org/web/20140201142344/http
malat
5

Możesz po prostu przekonwertować AVI lub MP4 bez możliwości przesyłania strumieniowego, również bez ponownego kodowania wszystkiego, wykonując następujące czynności:

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

Nie trzeba ponownie kodować niczego, ponieważ wystarczy przesunąć atom Moova.

użytkownik769852
źródło
-1

Możesz spróbować z 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
źródło
5
22 kHz PCM Stereo audio do strumieniowego przesyłania wideo w Internecie? Nie brzmi zbyt wydajnie. Dlaczego więc miałbyś ustawić bitrate audio na 128k?
slhck
@slhck, możesz zmienić 22k na 44k, zastępując „-ar 22050” na „ar 44100”
Searush
1
@SEARAS Problemem nie jest częstotliwość próbkowania. Faktem jest, że dźwięk jest nieskompresowanym stereo PCM. Do przesyłania strumieniowego w Internecie. To się nie liczy.
slhck
Ta odpowiedź jest bardzo niskiej jakości i powinna zostać usunięta. Parametry mogą zmieniać liczbę klatek na sekundę, rozdzielczość wideo i częstotliwość próbkowania audio treści i powodować nieefektywne lub niskiej jakości wyniki (ffmpeg może wybrać bezpieczniejsze lub lepsze parametry jako takie). Wydajność jest również ograniczona przez ograniczenie wątków i nawet nie działa z -acodec pcm_s16le(error:) Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument. Wydaje się, że brakuje też dobrego powodu, takiego jak szkic IETF, dlaczego dokładnie wybrać te parametry.
LiveWireBT