2013-10-14 10 views
6

Ich arbeite an einer Implementierung eines der Android Test Cases in Bezug auf previewTexture Aufnahme mit den neuen MediaCodec und MediaMuxer APIs von Android 4.3.Muxing Kamera Vorschau h264 encoded Elementary Stream mit MediaMuxer

Ich habe es geschafft, den Vorschau-Stream mit einer Bildrate von ca. 30fps aufzunehmen, indem ich den Aufnahme-Hint auf die Kamera-Parameter setze.

Ich stieß jedoch auf ein Verzögerung/Verzögerung Problem und weiß nicht wirklich, wie man das behebt. Bei der Aufnahme der Kamera-Vorschau mit ganz normalen Qualitätseinstellungen (1280x720, Bitrate von ~ 8.000.000) kommt es bei der Vorschau und dem codierten Material zu gelegentlichen Verzögerungen. Um genauer zu sein: Diese Verzögerung tritt etwa alle 2-3 Sekunden auf und dauert etwa 300-600 ms.

Durch Verfolgen der Verzögerung ich in der Lage war die Verzögerung kommt in der „drainEncoder“ Methode aus der folgenden Codezeile, um herauszufinden:

mMuxer.writeSampleData(mTrackIndex, encodedData, mBufferInfo); 

Diese Zeile in einer Schleife aufgerufen wird, wenn der Geber für das Datum verfügbar zum Muxen. Derzeit nehme ich kein Audio auf, daher werden nur die h264-Streams vom MediaMuxer in ein mp4-Format konvertiert.

Ich weiß nicht, ob dies etwas mit dieser Verzögerung zu tun hat, aber es tritt immer auf, wenn die Schleife zwei Iterationen benötigt, um alle verfügbaren Daten des Encoders zu entfernen (um noch spezifischer zu sein, tritt es immer in der ersten auf) diese zwei Iterationen). In den meisten Fällen genügt eine Iteration, um den Encoder zu entfernen.

Da es nicht viele Informationen online über diese neuen APIs gibt, wird jede Hilfe sehr geschätzt!

Antwort

3

Ich vermute, Sie werden von der MediaMuxer Disk schreiben gebissen bekommen. Der beste Weg, um sicher zu gehen, besteht darin, während der Aufnahme Systrace auszuführen und zu sehen, was während der Pause tatsächlich passiert. (Systrace docs, explanation, bigflake example - ab jetzt nur letztere für Android aktualisiert 4.3)

Wenn das der Fall ist, können Sie in der Lage sein, das Problem zu mildern, indem die MediaMuxer Instanz auf einer separaten Thread, Fütterung läuft die H.264-Daten über eine synchronisierte Warteschlange zu ihm.

Werden diese Pausen regelmäßig alle 5 Sekunden ausgeführt? Das CameraToMpegTest-Beispiel konfiguriert den Encoder so, dass alle 5 Sekunden ein I-Frame ausgegeben wird (mit einer erwarteten Frame-Rate von 30 Bildern pro Sekunde), was dazu führt, dass ein Vollformat-Frame anstelle von winzigen Deltas ausgegeben wird.

+0

Vielen Dank für Ihre Antwort: - Die Verzögerungen auftreten tatsächlich alle 5 Sekunden in der Tat. Aber die Frequenz ändert sich nicht, wenn ich das I-Frame-Intervall ändere. Die beste Vermutung ist, dass das benutzerdefinierte I-Frame-Intervall von meinem Encoder (Nexus 4) ignoriert wird? - Ich habe gestern bereits versucht, das Muxing in einem separaten Thread zu trennen und das scheint zu funktionieren ... also werde ich diesen Weg gehen, danke für die Bestätigung! - Ich werde die Verzögerung systrace, sobald ich genug Zeit habe – mAx

0

Wie @fadden darauf hinweist, handelt es sich um ein Festplattenschreibproblem, das vor allem bei Geräten mit niedrigeren Schreibgeschwindigkeiten auftritt oder wenn Sie versuchen, auf die SD-Karte zu schreiben.

Ich habe eine Lösung geschrieben, wie MediaMuxer schreiben in einer ähnlichen Frage here zu puffern.