2016-04-13 20 views
10

Ich nehme Video mit FFmpeg auf und ich möchte die Bildrate, mit der es geschrieben wird, um wenigstens im rechten Baseballstadion zu sein. Im Moment nehme ich die Bildrate, die meine Eingabe beansprucht, und benutze diese, um die Bildrate (time_base) für meinen Videoausgangsstrom festzulegen. Dies unterscheidet sich jedoch manchmal stark von der tatsächlichen Bildrate, die ich erhalte (ich habe einen Stream gesehen, der 50 fps beansprucht, aber mit 9 fps veröffentlicht).Aufnahme von Video mit unbekannter Bildrate mit FFmpeg

Was ich tun möchte, ist einen verstrichenen Timer zu verwenden und die Frames zu zählen, die ich aufnehme, um die tatsächliche Bildrate zu berechnen, die ich aufgenommen habe, als ich mit der Aufnahme fertig bin. Ich würde jedoch scheinen, dass die Bildrate in meinem AVStream eingestellt ist, wird in avcodec_open2 verwendet, bevor ich irgendwelche Frames schreibe. Wenn ich es später setze (zB während ich Frames schreibe), während ffplay es abspielen kann (beschweren, dass die Zeitinkrement-Bits 6, nicht 4 sind), können andere Video-Player nicht. Gibt es eine Möglichkeit, die Bildrate für die gesamte Datei nach die Frames zu schreiben? Wenn nicht, gibt es eine Möglichkeit, den Bildern selbst eine Art Zeitstempel oder Bildrate zu geben, während ich aufnehme, was zu einer gültigen Aufnahmedatei führt?

+0

hi, ich werde mehr suchen, wollte aber nur nach avconv fragen. Ich habe es nach einer schnellen Google-Suche gefunden. Es sieht so aus, als könnte es die Bildrate einer Datei ändern. vielleicht könnten Sie die Datei mit einer beliebigen Bildrate schreiben und dann, nachdem Sie die tatsächliche Rate erkannt haben, das Schreiben beenden und avconv mit der neuen Rate ausführen? nur ein Gedanke, keine echte Antwort;) wird aber weiter schauen. Gib mir Bescheid. – nephi12

+0

avconv ist der binäre Name für das libav-Projekt. (http://superuser.com/questions/507386/why-would-i-choose-libav-over-ffmpeg-or-is-there-even-a-difference) hat eine ziemlich gute Zusammenfassung aller Namen, die hatten Ich bin seit geraumer Zeit verwirrt. Alles, was Avconv macht, sollte mit den Bibliotheken, die es benutzt, möglich sein. – Chris

Antwort

0

Der Trick scheint zu sein, AVCodecContext time_base und AVFrame pts in einer intelligenteren Weise zu verwenden, als ich war. Wenn Sie mit einer festen Bildrate aufnehmen, wird time_base auf 1/framerate gesetzt und die pts ist nur eine inkrementierte Zahl für den aufgezeichneten Frame.

Stattdessen starte ich jetzt einen Timer, wenn ich mit der Aufnahme beginne und time_base über die Granularität des Timers auf 1 setze (in meinem Fall hat es eine Genauigkeit von Millisekunden, also 1000). Ich setze Bildpunkte auf die verstrichene Zeit vor der Kodierung. Diese Kombination führt zu einer Videodatei mit einer variablen Bildrate, die korrekt wiedergegeben wird.

0

Chris. Sie müssen eine neue Videostream-Engine entwickeln. Wenn Sie also die Framerate auf [N] setzen, schreibt die Engine Writer Frames nach Rate.

  • Überprüfung Zeitstempel für jeden Frame Wenn
  • Schreiben
  • Wenn Sie weniger Frames als N haben für eine zweite, müssen Sie doppelte Frames machen.
  • Wenn Sie für eine Sekunde mehr Frames als N haben, müssen Sie einige Frames löschen.

Bevor Sie schreiben, müssen Sie die genaue Bildrate angeben.

Und Ihre Videodatei-Writing-Engine muss mit der angegebenen Framerate arbeiten.

Sie können dies mithilfe von ffmpeg implementieren.

+0

Dies scheint das Beste zu sein, was Sie mit einer variablen Bildrate tun könnten, aber was wäre, wenn es fest und unbekannt wäre? Für den Fall, dass ich den Stream mit 50 fps vorstelle, ist er tatsächlich 9, also würde deine Aufnahme zwar mehr als 5 mal mehr Frames aufnehmen als nötig. Damit dies funktioniert, müssen Sie die Bildrate bereits kennen, bevor Sie beginnen. – Chris