Stellen Sie die Rate ein, mit der AVSampleBufferDisplayLayer die Beispielpuffer rendert.

Ich verwende einen AVSampleBufferDisplayLayer, um CMSampleBuffer anzuzeigen, die über eine Netzwerkverbindung im h.264-Format übertragen werden. Die Videowiedergabe ist flüssig und funktioniert einwandfrei, aber ich kann die Bildrate scheinbar nicht steuern. Wenn ich im AVSampleBufferDisplayLayer 60 Bilder pro Sekunde in die Warteschlange stelle, werden diese 60 Bilder angezeigt, obwohl das Video mit 30 Bildern pro Sekunde aufgenommen wird.

Bei der Erstellung von Beispielpuffern kann der Präsentationszeitstempel durch Übergabe eines Timing-Info-Arrays an CMSampleBufferCreate festgelegt werden (die Timing-Info ist im h.264-Stream nicht vorhanden, kann jedoch berechnet oder in einem Containerformat übergeben werden). Die von mir festgelegten Präsentationszeitstempel liegen ungefähr im Abstand von 0,033 Sekunden und die Dauer beträgt 0,033, aber auf der Anzeigeebene werden immer noch so viele Bilder pro Sekunde wie möglich angezeigt.

Es gibt zwei Möglichkeiten, um Puffer in AVSampleBufferDisplayLayer in die Warteschlange zu stellen: "Eingeschränkt" durch Aufrufen von - [AVSampleBufferDisplayLayer enqueueSampleBuffer:], wenn ein Puffer bereit ist, oder "Nicht eingeschränkt" durch Aufrufen von - [AVSampleBufferDisplayLayer in die Warteschlange stellen, wennReadyOnQueUping] und Verwenden von: MediaD Ich habe beide Methoden ausprobiert, aber auch die zweite Methode zeigt Puffer so schnell wie möglich an. Wenn sich beispielsweise 300 Frames auf der Empfangsseite in der Warteschlange befinden, wird der Block in der obigen Methode zum ersten Mal ausgeführt. ReadyForMoreMediaData bleibt unabhängig von der Anzahl wahr Puffer werden in die Warteschlange gestellt und alle werden in kürzester Zeit angezeigt.

Dieses Verhalten ähnelt dem, was zu erwarten wäre, wenn die kCMSampleAttachmentKey_DisplayImmediately-Anlage für den CMSampleBuffer festgelegt wäre, dies ist jedoch derzeit NICHT festgelegt (und die Standardeinstellung ist false).

Ich habe versucht, die Ebenen controlTimeBase einzustellen, aber es schien keinen Effekt zu haben. Ich bin ratlos, andere Dinge auszuprobieren, und konnte online keine Beispiele finden. Weiß jemand, wie man die Framerate steuern kann, mit der AVSampleBufferDisplayLayer Frames anzeigt?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage