wie man die Bitrate von Videos im Laufe der Zeit misst

Wie würde man bei einer codierten Videodatei mit nicht konstanter Bitrate die Bitrate im Laufe der Zeit analysieren? Bisher habe ich ein altes Programm gefunden, das einen Bitrate-Plot erstellt, aber keines, das die Rohdaten der codierten Frames liefern kann.

Ich denke, Bitratendaten sollten generiert werden, indem die Größe einer Reihe von Frames gemittelt wird, die sich über 1 Sekunde erstrecken - dh Frames mit einem DTS, das zu diesem Intervall gehört. Ein 10-Sekunden-Video hätte also 10 Datenpunkte, die die Encoder-Eingangsbitrate beschreiben. Obwohl ich neugierig bin, alternative Methoden zur Berechnung der Bitrate zu hören.

Gibt es eine Möglichkeit, die Größe jedes (codierten) Frames zu ermitteln? vorzugsweise mit Windows-Software. Ich weiß, dass es für eine unkomprimierte Quelle trivial einfach ist (Auflösung * Bittiefe * Zeit).

Die Größe eines codierten Frames ist für vorhergesagte Frames nicht sinnvoll. Ich werde später am Tag eine Antwort liefern, aber der grundlegende Weg besteht darin, das Video zu segmentieren und dann ffprobe für jedes der Segmente auszuführen und diese Daten in eine Datei auszugeben.
oh gute idee, daran hätte ich denken sollen. Brauche mehr Kaffee.
Ah @Mulvya, aber wenn Sie das Video nach Keyframes in Segmente segmentieren, sollten Sie: 1) nicht neu codieren, 2) eine Quelle mit (angemessen) homogen verteilten Keyframes benötigen
Nr. 1 ist offensichtlich wahr, wenn Sie die Quellbitrate messen möchten. Siehe Antwort für Nr. 2.

Antworten (1)

Es macht keinen Sinn, in einem für MPEG-Videos typischen interkodierten Videostrom von der Größe eines kodierten Frames zu sprechen X. I-Frames sind in sich abgeschlossen, aber P- und B-Frames sind vorhergesagte Frames, und das endgültige decodierte Ergebnis verwendet Daten von verschiedenen Eingängen. Andererseits kann die Größe einer einzelnen Bildergruppe (GOP) ein sinnvolles Maß sein.

Der FFmpeg-Segmenter in Kombination mit einem kompatiblen Demuxer kann den Videostream an GOP-Grenzen aufteilen. Indem Sie eine extrem niedrige Zeit für die Segmentgröße angeben, können Sie sicherstellen, dass jedes Segment 1 GOP enthält. Das Ausführen eines ffprobe auf jedem Segment liefert dann die Bitrate für diese GOP.

Ich habe den folgenden Befehl auf MP4s getestet, die 1) eine GOP mit variabler Größe, 2) ein intracodiertes Schema und 3) eine feste GOP mit ungewöhnlicher Länge (11 Frames) hatten, und jede Ausgabe hatte das erwartete Ergebnis.

ffmpeg -i input.mp4 -an -c:v copy -segment_time 0.00001 -f segment i%0d.mp4

Jedes Segment enthielt genau 1 I-Frame (jedes Segment der Intra-Eingabe enthielt insgesamt genau 1 Frame).

Wenn Sie ffprobe für jedes Segment ausführen, erhalten Sie einen Bitratenwert:

Duration: 00:00:00.37, start: 4.466016, bitrate: 1539 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p,
1280x720 [SAR 1:1 DAR 16:9], 1520 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)

Das obige stammt aus der 11-Frame-GOP und hat eine Bitrate von 1520 kbps.

Wenn Sie also 1 Quelle mit GOPs von 1-2 Sekunden und anderen GOPs von etwa 250 Millisekunden haben, hätte Ihr resultierendes Diagramm unregelmäßige Datenpunkte auf der Zeitachse. Was wäre ein guter Workaround für diesen Fall? Ich nehme an, ich würde die GOPs in größere Behälter gruppieren, dh durchschnittlich über 3-5 GOPs.
Zeichnen Sie einfach die Datenrate (Y) gegen die Startzeit (X) anstelle der Dauer. Das Y bleibt von seinem Start bis zur Startzeit des nächsten Segments unverändert. Wenn Sie das Aussehen der Stufenfunktion loswerden möchten, gibt es eine Glättungs-/Interpolationsfunktion in Ihrer Plot-Software.