15 Stimmen

Wie man die Größe des GOP einer H264-Datei berechnet

Ich habe eine h264-Datei, die aus dem YUV-Format unter Verwendung von SVC-Software extrahiert wurde. Jetzt möchte ich die Größe jedes GOPs in der h264-Datei berechnen. Wir wissen, dass die Größe des GOP der Abstand zwischen zwei nächsten I-Frames ist. hier. Könnten Sie mir vorschlagen, wie ich die GOP-Größe einer gegebenen h264-Datei berechnen kann? Es ist besser, wenn wir es mit C/C++ implementieren. Vielen Dank

16voto

mysteryegg Punkte 491

Ich persönlich ziehe es vor, nach pict_type zu filtern:

ffprobe -show_frames input.h264 | grep pict_type

Dies zeigt Ihnen die Frame-Struktur:

pict_type=I
pict_type=P
pict_type=P
pict_type=P
pict_type=P
pict_type=P
...

11voto

Fredrik Pihl Punkte 42950

Nun, das Parsen des Bitstreams, um jedes I-Frame zu finden, ist ein wenig knifflig; unter anderem könnte die Codierreihenfolge (oder auch nicht) von der Anzeigereihenfolge abweichen. Eine Lösung besteht darin, http://www.ffmpeg.org/ffprobe.html aus dem ffmpeg-Suite zu verwenden.

Beispiel:

ffprobe -show_frames input.bin | grep key_frame
key_frame=1
key_frame=0
key_frame=0
key_frame=0
key_frame=0
key_frame=0
...

Aus der Ausgabe kannst du leicht die GOP-Länge berechnen

Eine weitere Lösung besteht darin, die Referenzimplementierung zu patchen, die unter http://iphome.hhi.de/suehring/tml/ gefunden werden kann.

Lass mich wissen, wenn du Hilfe bei diesem Teil benötigst :-)

5voto

okrunner Punkte 2803
#!/bin/sh

ffprobe -show_frames $1 > output.txt

GOP=0;

while read p; do
  if [ "$p" = "key_frame=0" ]
  then
    GOP=$((GOP+1))
  fi

if [ "$p" = "key_frame=1" ]
then
  echo $GOP
  GOP=0;
fi

done < output.txt

0voto

Da jede GOP mit einem Schlüsselbild beginnt, müssen Sie diese zählen.
pict_type kann irreführend sein, da alle Arten innerhalb der GOP auftreten können.

ffprobe -show_frames video_file.h264  | grep -A 3 "type=video" | grep "key_frame=1" | wc -l

0voto

moonkop Punkte 29
ffprobe -i video_file.h264 -show_frames -of flat |grep I

frames.frame.1.pict_type="I"
frames.frame.308.pict_type="I"
frames.frame.805.pict_type="I"
frames.frame.1282.pict_type="I"
frames.frame.1750.pict_type="I"
frames.frame.2221.pict_type="I"
frames.frame.2620.pict_type="I"
frames.frame.3178.pict_type="I"
frames.frame.3693.pict_type="I"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X