Wie erstelle und verbinde ich FFMPEG mit iOS?

alles!

Ich weiß, es gibt hier viele Fragen zu FFMPEG unter iOS, aber keine Antwort ist für meinen Fall angemessen: (In jedem Fall passiert etwas Seltsames, wenn ich versuche, FFMPEG in meinem Projekt zu verlinken. Bitte helfen Sie mir!

Meine Aufgabe ist es, eine Video-Chat-Anwendung für iOS zu schreiben, die das RTMP-Protokoll zum Veröffentlichen und Lesen von Video-Streams auf / von einem benutzerdefinierten Flash Media Server verwendet.

Ich habe mich für rtmplib entschieden, eine kostenlose Open-Source-Bibliothek zum Streamen von FLV-Videos über RTMP, da dies die einzige geeignete Bibliothek ist.

Viele Probleme tauchten auf, als ich anfing, nachzuforschen, aber später verstand ich, wie es funktionieren sollte.

Jetzt kann ich den Live-Stream eines FLV-Videos (von der URL) lesen und mithilfe meiner Anwendung an den Kanal zurücksenden.

Mein Problem ist jetzt das Senden von Video von der Kamera. Die grundlegende Operationssequenz sollte, wie ich verstanden habe, die folgende sein:

Wenn ich AVFoundation verwende, schreibe ich dies mit Hilfe der Sequenz (Device-AVCaptureSession-AVVideoDataOutput-> AVAssetWriter) in eine Datei (Wenn Sie brauchen, kann ich diesen Ablauf detaillierter beschreiben, aber im Kontext der Frage ist es nicht wichtig). Dieser Ablauf ist erforderlich, um die hardwarebeschleunigte Konvertierung von Live-Videos von der Kamera in den H.264-Codec durchzuführen. Aber es ist im MOV-Container-Format. (Dies ist abgeschlossen Schritt)

Ich lese diese temporäre Datei mit jedem geschriebenen Beispiel und erhalte den Strom von Bytes von Videodaten (H.264-codiert im QuickTime-Container). (dieser Schritt ist bereits abgeschlossen)

Ich muss Videodaten vom QuickTime-Containerformat in FLV konvertieren. Und das alles in Echtzeit. (Paket für Paket)

Wenn ich die Videodatenpakete im FLV-Container-Format habe, kann ich mit rtmplib Pakete über RTMP senden.

Das Komplizierteste für mich ist Schritt 3.

Ich denke, ich muss ffmpeg lib für diese Konvertierung verwenden (libavformat). Ich habe sogar den Quellcode gefunden, der zeigt, wie man h.264-Datenpakete aus einer MOV-Datei dekodiert (ich habe im libav-Format festgestellt, dass es möglich ist, diese Pakete sogar aus einem Byte-Stream zu extrahieren, was für mich passender ist). Und wenn dies abgeschlossen ist, muss ich Pakete in FLV codieren (mithilfe von ffmpeg oder manuell, um FLV-Header zu h.264-Paketen hinzuzufügen, ist dies kein Problem und ist einfach, wenn ich richtig liege).

FFMPEG hat eine großartige Dokumentation und ist eine sehr leistungsfähige Bibliothek, und ich denke, es wird kein Problem geben, sie zu verwenden. ABER das Problem hier ist, dass ich es nicht bekommen kann, in iOS-Projekt zu arbeiten.

Ich habe 3 Tage damit verbracht, Dokumentation, Stackoverflow und die Antwort auf die Frage "Wie erstelle ich FFMPEG für iOS?" Zu lesen, und ich denke, meine PM wird mich feuern, wenn ich noch eine Woche damit verbringe, diese Bibliothek zu kompilieren :))

Ich habe versucht, viele verschiedene Build-Skripte zu verwenden und Dateien zu konfigurieren, aber als ich FFMPEG erstellte, bekam ich libavformat, libavcodec usw. für die x86-Architektur (auch wenn ich armv6 arch im Build-Skript spezifizierte). (Ich benutze "lipo -info libavcodec.a" um Architekturen zu zeigen)

Daher kann ich diese Quellen nicht erstellen und habe beschlossen, vorgefertigtes FFMPEG zu finden, das für die Architektur armv7, armv6, i386 erstellt wurde.

Ich habe iOS Comm Lib von MidnightCoders von github heruntergeladen und es enthält ein Beispiel für die Verwendung von FFMPEG. Es enthält vorgefertigte .a-Dateien von avcodec, avformat und anderen FFMPEG-Bibliotheken.

Ich überprüfe ihre Architektur:

iMac-2:MediaLibiOS root# lipo -info libavformat.a
Architectures in the fat file: libavformat.a are: armv6 armv7 i386 

Und ich fand, dass es für mich angemessen ist! Als ich versuchte, diese Bibliotheken und Header zum xCode-Projekt hinzuzufügen, wurde die Kompilierung einwandfrei durchgeführt (und ich habe sogar keine Warnungen wie "Bibliothek wird für eine andere Architektur kompiliert"), und ich kann Strukturen aus Headern verwenden, aber wenn ich versuche, C aufzurufen -Funktion von libavformat (av_register_all ()), der Compiler zeigt mir die Fehlermeldung "Symbol (e) nicht gefunden für Architektur armv7: av_register_all".

Ich dachte, dass es vielleicht keine Symbole in lib gibt und versuchte sie zu zeigen:

root# nm -arch armv6 libavformat.a | grep av_register_all
00000000 T _av_register_all

Jetzt stecke ich hier fest, ich verstehe nicht, warum xCode diese Symbole nicht sehen kann und sich nicht vorwärts bewegen kann.

Bitte korrigieren Sie mich, wenn ich mich im Verständnis von Flow zum Veröffentlichen von RTMP-Stream von iOS irre, und helfen Sie mir beim Erstellen und Verknüpfen von FFMPEG für iOS.

Ich habe ein iPhone 5.1. SDK und xCode 4.2.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage