2012-04-25 19 views
14

Ich bin in der Lage, die RGBA-Rahmendaten von der Kamera zu bekommen, und ich möchte es im H.264-Format zu kodieren. Ich habe FFmpeg verwendet, um H.264-Video zu kodieren und zu dekodieren, aber bei einer Bildgröße von 640x480 ist es für meine Bedürfnisse zu langsam.Wie kann ich hardwarebeschleunigte H.264-Codierung und -Decodierung für das Streaming durchführen?

Ich möchte Hardware-Beschleunigung verwenden, um die Codierung und Decodierung zu beschleunigen, also wie würde ich das tun?

Außerdem muss ich in der Lage sein, das codierte Video über das Netzwerk zu streamen und am anderen Ende zu dekodieren. Wie kann das gemacht werden?

+0

Der Titel der Frage ist "Video Decoding", aber die eigentliche Frage ist über die Codierung, oder? Vielleicht solltest du den Titel bearbeiten? – Anastasia

+0

Es gibt eine Bibliothek, die es ermöglicht, Raw-Frames nach H.264 zu codieren: http://www.foxitsolutions.com/iphone_h264_sdk.html. Diese Bibliothek verwendet einen Hardware-Encoder und separate H.264-Frames. Bitte sehen Sie diese Frage und Antwort: http://stackoverflow.com/questions/7979842/video-encoding-libraries-for-ios/ – Anastasia

+0

Vielleicht ein Duplikat: http://stackoverflow.com/questions/25197169/how-to- decode-ah-264-frame-on-ios-by-hardware-decoding –

Antwort

18

Wenn Sie die hardwarebeschleunigte Videocodierung und -decodierung von H.264-Video auf iOS durchführen möchten, ist AVfoundation die einzige Möglichkeit. Verwenden Sie keine Bibliotheken von Drittanbietern für die Codierung oder Decodierung, da alle derzeit CPU-gebunden sind und viel langsamer als das, was Sie von AVFoundation erhalten. Der einzige Grund für die Verwendung eines Encoders oder Decoders eines Drittanbieters wäre, wenn Sie mit einem Format arbeiten, das in iOS standardmäßig nicht unterstützt wird.

Für hardwarebeschleunigte Decodierung sollten Sie eine AVAssetReader-Instanz (oder eine der Player-Klassen für die reine Wiedergabe) verwenden. Mit einem AVAssetReader erhalte ich regelmäßig 2X oder höhere Wiedergabegeschwindigkeiten für das Lesen von H.264-kodiertem Video, weshalb die iOS-Geräte dafür eine ziemlich gute Hardwarebeschleunigung verwenden.

In ähnlicher Weise verwenden Sie für die beschleunigte Codierung einen AVAssetWriter. Es gibt einige Tricks, um AVAssetWriter mit der besten Geschwindigkeit zu kodieren (Feeds in BGRA-Frames, Verwendung eines Pixel Buffer Pools, Verwendung der iOS 5.0 Textur-Caches beim Lesen von OpenGL ES), die ich ausführlich unter this answer beschreibe.

Wenn Sie Code sehen möchten, der die schnellsten Pfade verwendet, die ich für beschleunigte Codierung und Decodierung gefunden habe, können Sie mein Open Source-Framework GPUImage betrachten, das im Gegensatz zu dem von Anastasia verlinkten Framework völlig kostenlos ist .

+1

Vielen Dank für Ihren Quellcode und grobe sah, aber nicht die Funktion oder Parameter des Zugriffs auf die Codierung oder Decodierung von Daten finden, muss ich die Kodierung von Daten über das Netzwerk gesendet, und dann am anderen Ende der Endgerätedekodierung, wenn Sie bereits die Schnittstelle oder die Funktion haben, aber ich habe keine Hoffnung gefunden, um Ihre Hilfe zu erhalten, vielen Dank – king

+1

Ihre lib ist großartig, aber es ist für das Anwenden von Filtern und das rohe Video zu verarbeiten, aber es hilft nichts mit der tatsächlichen Frage, die Hardware-Codierung ist. Wenn Benutzer komprimierte Daten über das Netzwerk senden möchten, hilft keine der oben genannten API (Asset Reader und Asset Writer). –

+0

@king - Dies könnte ein Detail sein, das Sie der Frage hinzufügen möchten, weil Sie nicht angegeben haben, dass Sie Zugriff auf die rohen Eingabe- und Ausgabestreams für die Übertragung über das Netzwerk haben möchten. Meine Antwort bezieht sich auf das Kodieren und Dekodieren von Dateien, wobei AVAssetReader und AVAssetWriter eindeutig der richtige Weg sind. Dennoch verwenden Sie die AVFoundation, um Ihre Codierung hier zu tun, wie von mohsenr beschrieben: http://stackoverflow.com/a/3484950/19679. –