Erstellen von MP4-Videos für HTTP-Streaming

25

Wie kann ich konvertieren some.flvoder some.avioder some.wmvmit FFmpeg sicher sein , dass dieses Video spielbar sein wird und seekable in JW Player?

abrahab
quelle

Antworten:

9

Dies ist eine Antwort auf den letzten Kommentar von dir @abrahab.

Sie brauchen keine mp4boxDatei, um sie per Pseudo-Streaming über Nginx zu übertragen. Das MP4-Streaming-Modul erledigt dies unabhängig von der Positionierung der Moov-Atome ( mp4boxverschiebt das Moov-Atom zum Dateianfang).


Verwenden Sie für den 500-Server-Fehler die Option "-frag" für mp4box? MP4-Streaming-Modul kann keine fragmentierten MP4-Dateien lesen. Gute Verwendung mp4boxfür Pseudo-Streaming ist das Interleaven der Videos für eine bessere Suche. Moov Atom Shifting ist ein zusätzlicher Vorteil.

Ich mache das immer mit mp4boxeiner FFmpeg-kodierten Datei

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

Dies verschachtelt die MP4-Datei standardmäßig in 500 Millisekunden.

Vineet
quelle
1
Verwenden SieMP4Box -isma -inter 500 Myvideo.mp4
Vineet
45

H.264 in MP4

Im Allgemeinen möchten Sie x264-Videos in einem MP4-Container erstellen. Diese Option wird grundsätzlich von jedem Gerät und Browser unterstützt.

Folgendes sollte ausreichen. Stellen Sie sicher, dass Sie die Optionen für Eingabenamen und CRF ersetzen. Letzteres legt die Qualität fest, wobei die normalen Werte zwischen 19 und 25 liegen. Niedriger bedeutet bessere Qualität, aber auch höhere Bitrate:

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

Sie können Handbrake auch zum Codieren verwenden, wenn Sie die GUI-Art mögen.

Mit der faststartOption

Bewegen Sie nun das MOOV-Atom des MP4-Containers an den Anfang. Dieses Atom (im Wesentlichen eine Dateneinheit im MP4-Container) enthält wichtige Metadaten zu den Video- / Audiostreams selbst. -movflags faststartsollte genau das tun.

Wenn Ihre FFmpeg-Version diese Option nicht bietet, sollten Sie ein Upgrade in Betracht ziehen. Wenn Sie kein Upgrade durchführen können, können Sie dasselbe mit einem der folgenden Tools erreichen:

  • QTIndexSwapper , eine Adobe AIR-Anwendung

  • MP4Box , frei und Open Source, mit einem Befehl ähnlich dem folgenden, in dem Sie das Intervall ändern können (hier 500):

    mp4box -inter 500 input.mp4

  • qt-faststart in Python , das überall dort funktioniert, wo Python installiert ist.

    qtfaststart input.mp4

Das ist alles.

Bitrate / Qualität steuern

Zum Streamen möchten Sie jetzt möglicherweise die Bitrate einschränken, um innerhalb bestimmter Grenzen zu bleiben. Sie können mehr darüber in meinem Blog-Beitrag über Methoden zur Ratenkontrolle lesen .

Wenn Sie beispielsweise -maxrate 2M -bufsize 2Mdie Codierungsoptionen erweitern, begrenzen Sie die Codierung auf 2 Mbit / s, was für 720p-Videos ausreichend sein kann. Die erforderliche Bitrate hängt natürlich davon ab, wie komplex der Inhalt ist. Dies erfordert einige Versuche und Irrtümer.

slhck
quelle
danke, ich mache das genauso, aber das problem scheint immer noch mit dem video zu sein :( ich mache ffmpeg -i 1.flv -vcodec libx264 -f mp4 -an -g 1 -f mp4 -g 30 -level 3 new.mp4dann mp4boxund kann mp4 nicht suchen und nginx berichte 500 internal server errorfür startparameter mehr als das 0. wenn video codiert ohne -vcoded libx264(default mp4 coder) alle arbeitsdatei (aber Qualität! krank!) :( (Entschuldigung, jetzt nicht erlaubt, Sie Antwort zu stimmen)
Abrahab
Dies scheint eher ein Problem mit dem h.264-Plugin bei NginX zu sein als ein Problem mit der Videokonvertierung. Ich bin nicht der Experte für Web-Video- Streaming per se, aber wie ich sehe, haben Sie dies bereits bei Stack Overflow erfragt? stackoverflow.com/questions/11079748/…
slhck
Ich denke auch, dass Nginx dieses Videoformat möglicherweise nicht richtig lesen kann. Video von YouTube wird auch gut abgespielt. Ja, ich werde über das Nginx-Problem gestapelt gefragt, aber es scheint, als ob keine Antworten vorliegen. :(
abrahab
3
+1 für -movflags faststartgenau das, was ich brauchte
Andrew
Link ist tot, muss web.archive.org verwenden: web.archive.org/web/20140201142344/http://www.longtailvideo.com/…
malat
5

Sie können ein nicht-streambares AVI oder MP4 einfach konvertieren, auch ohne alles neu zu kodieren:

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

Es ist nicht notwendig, irgendetwas neu zu codieren, da nur das Moov-Atom bewegt werden muss.

user769852
quelle
-1

Sie können dies mit ffmpeg versuchen:

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
quelle
5
22 kHz PCM Stereo Audio für Internet Streaming Video? Klingt nicht zu effizient. Und warum sollten Sie dann die Audio-Bitrate auf 128k einstellen?
Slhck
@slhck, Sie können 22k auf 44k ändern und "-ar 22050" durch "ar 44100"
ersetzen
1
@SEARAS Das Problem ist nicht die Abtastrate. Es ist die Tatsache, dass das Audio unkomprimiertes PCM-Stereo ist. Für das Internet-Streaming. Das kommt nicht in Frage.
Slhck
Diese Antwort ist von sehr geringer Qualität und sollte entfernt werden. Die Parameter können die Framerate, die Videoauflösung und die Audio-Abtastrate des Inhalts ändern und ineffiziente oder qualitativ minderwertige Ergebnisse liefern (ffmpeg kann selbst sicherere oder bessere Parameter auswählen). Die Leistung wird auch durch die Beschränkung auf weniger Threads beeinträchtigt und funktioniert nicht einmal mit -acodec pcm_s16le(error:) Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument. Ein guter Grund wie ein IETF-Entwurf, warum genau diese Parameter ausgewählt werden sollten, scheint ebenfalls zu fehlen.
LiveWireBT