2016-06-30 9 views
2

Ausführen avprobe test.h264 AusgängeWie die Dauer/Bitrate einer H264-Datei mit avconv/ffmpeg

Input #0, h264, from 'test.h264': 
    Duration: N/A, bitrate: N/A 
    Stream #0.0: Video: h264 (High), yuv420p, 720x480, 25 fps, 25 tbn, 50 tbc 

Ausführen file test.h264 Ausgänge

test.h264: JVT NAL sequence, H.264 video @ L 30 

Hinweis erhalten, dass die Datei nicht beschädigt oder fehlerhaft ist, ich kann es auf VLC ohne Probleme spielen.

Gibt es eine Möglichkeit, die Dauer und Bitrate aus einer rohen H264-Datei zu erhalten? Ich habe irgendwo gelesen, dass es möglich ist, wenn ich die Datei zuerst entziffere, aber ich bin nicht sicher, wie das gemacht werden kann.

Edit # 1

Ich bin derjenige, der H264-Datei mit einer Python-Bibliothek picamera genannt zu schaffen.

Edit # 2

Konsole ausgegeben, wenn avconv -i test.h264 -f null -

avconv version 11.7-6:11.7-1~deb8u1+rpi1, Copyright (c) 2000-2016 the Libav developers 
    built on Jun 17 2016 02:13:49 with gcc 4.9.2 (Raspbian 4.9.2-10) 
[h264 @ 0x1bcc200] Estimating duration from bitrate, this may be inaccurate 
Input #0, h264, from 'test.h264': 
    Duration: N/A, bitrate: N/A 
    Stream #0.0: Video: h264 (High), yuv420p, 720x480, 25 fps, 25 tbn 
Output #0, null, to 'pipe:': 
    Metadata: 
    encoder   : Lavf56.1.0 
    Stream #0.0: Video: rawvideo, yuv420p, 720x480, q=2-31, 200 kb/s, 25 tbn, 25 tbc 
    Metadata: 
     encoder   : Lavc56.1.0 rawvideo 
Stream mapping: 
    Stream #0:0 -> #0:0 (h264 (native) -> rawvideo (native)) 
Press ctrl-c to stop encoding 
frame= 208 fps= 68 q=0.0 Lsize=  0kB time=10000000000.00 bitrate= 0.0kbits/s 
video:13kB audio:0kB other streams:0kB global headers:0kB muxing overhead: unknown 

Antwort

4

laufen könnten Sie es in einen Behälter Mux und dann überprüfen

ffmpeg -i test.h264 -c copy test.mp4 

ffprobe test.mp4 

Sie können auch Bilder in der H264 zählen und dividieren durch Bildrate

ffprobe test.h264 -count_frames -show_entries stream=nb_read_frames,avg_frame_rate,r_frame_rate 

Dauer = nb_read_frames/avg_frame_rate

+0

„Muxing“ scheint die Datei in einen Container zu arbeiten, aber wenn man den Befehl ouputs es 'Nicht-monotone DTS in Ausgangsstrom 0: 0; früher: 203, aktuell: 0; Wechseln zu 204. Dies kann zu falschen Zeitstempeln in der Ausgabedatei führen.' Für jeden Rahmen versucht es, für die MP4-Datei zu kodieren. Ist es auch zuverlässig? Vielen Dank! – maximedupre

+1

Keine Zeitstempel in einem rohen Bitstream, also wird jedem eingehenden Frame '0' zugeordnet, was natürlich falsch ist. Aber kein Problem. Wenn Ihr Bitstream keine wie @Ronald gespeicherte Framerate hat, sollten Sie "-frame N" vor "-i" hinzufügen, wobei N der fps-Wert ist, sonst wird ffmpeg 25 fps annehmen. – Mulvya

+0

'avconv -framerate 30 -i test.h264 -c Kopie test.mp4' funktioniert perfekt! Vielen Dank! – maximedupre

2

Der Grund Dauer N/A ist, dass annexb (raw) H.264-Dateien haben in der Regel keine Zeitstempel oder Framerate Informationen in der Datei gespeichert. Die Framerate kann optional in der VUI des PPS gespeichert werden, aber diese Datei hat das anscheinend nicht, so dass sie nur Framescount kennt (durch Parsing der gesamten Datei), aber nichts, was mit Timestamp zusammenhängt.

+0

So kann ich momentan die Dauer der Videodatei nicht bekommen, aber gibt es da einen Weg, den ich kann? – maximedupre

+0

wie @Mulvya vorgeschlagen, ist die einfachste Lösung, die Video-Frames in ein Container-Format, z. mp4, mkv oder so ähnlich. Diese Containerformate enthalten Zeitstempel und Dauerinformationen.Mit den Dateien, die Sie bereits erstellt haben, können Sie diese Informationen manuell erneut hinzufügen, indem Sie sie (mit ffmpeg) in einem anderen Container remuxen und ffmpeg über die Framerate der Quelle informieren (ffmpeg -r 30 -i file.h264 -c: v copy file.mp4 , Ich glaube). –

1

Eine Methode ist die Datei mit ffmpeg zu entschlüsseln, die Dauer zu erhalten:

ffmpeg -framerate 24 -i input.h264 -f null - 

dann für die Dauer time= in der zweiten bis letzten Zeile in der Konsolenausgabe beziehen. Zum Beispiel kann ein 5 Sekunden Eingang:

frame= 125 fps=0.0 q=-0.0 Lsize=N/A time=00:00:05.00 bitrate=N/A speed= 189x 
+0

Ich bekomme 'Zeit = 10000000000.00'. Mein Video ist 6 Sekunden lang, also bezweifle ich, dass diese Information sinnvoll ist. – maximedupre

+0

@maximedupre Arbeitete für mich. Zeigen Sie Ihren eigentlichen Befehl und die gesamte Konsolenausgabe. Verwenden Sie tatsächlich 'ffmpeg'? – LordNeckbeard

+0

Ich benutze 'avconv' (Gabel von' ffmpeg', die ziemlich genau dasselbe tut). Ich habe meine Frage die komplette Konsolenausgabe aktualisiert. – maximedupre

Verwandte Themen