すべて!
iOSでのFFMPEGについては多くの質問がありますが、私の場合に適切な答えはありません:(プロジェクトでFFMPEGをリンクしようとすると、それぞれの場合に奇妙なことが起こります。助けてください!
私の仕事は、カスタムFlashMediaServerとの間でビデオストリームを公開および読み取るためにRTMPプロトコルを使用するiOS用のビデオチャットアプリケーションを作成することです。
私は、RTMPを介してFLVビデオをストリーミングするための無料のオープンソースライブラリであるrtmplibを使用することにしました。これは、唯一の適切なライブラリであるためです。
研究を始めると多くの問題が出てきましたが、後でどうなるかわかりました。
これで、アプリケーションを使用して、FLVビデオのライブストリーム(URLから)を読み取り、チャンネルに送り返すことができます。
私の問題は、カメラからビデオを送信することです。私が理解したように、基本的な操作シーケンスは次のようになります。
AVFoundationを使用して、シーケンス(Device-AVCaptureSession-AVVideoDataOutput-> AVAssetWriter)を使用して、これをファイルに書き込みます(必要に応じて、このフローをより詳細に説明できますが、質問のコンテキストでは重要ではありません)。このフローは、カメラからのライブビデオをH.264コーデックにハードウェアアクセラレーションで変換するために必要です。ただし、MOVコンテナ形式です。(これで完了です)
各サンプルが書き込まれた状態でこの一時ファイルを読み取り、ビデオデータのバイトストリームを取得します(QuickTimeコンテナでH.264エンコード)。(これはすでに完了したステップです)
ビデオデータをQuickTimeコンテナ形式からFLVに変換する必要があります。そして、それはすべてリアルタイムで行われます。(packet --by --packet)
FLVコンテナ形式で含まれるビデオデータのパケットがある場合、rtmplibを使用してRTMP経由でパケットを送信できます。
さて、私にとって最も複雑な部分はステップ3です。
私は、ffmpeg libをこの変換(libavformat)に使用する必要があると思います。MOVファイルからh.264データパケットをデコードする方法を示すソースコードも見つけました(libavformatを見ると、バイトストリームからでもこのパケットを抽出できることがわかりました。これは私にとってより適切です)。これが完了したら、パケットをFLVにエンコードする必要があります(ffmpegを使用するか、手動で、FLVヘッダーをh.264パケットに追加する方法で、問題はなく、正しい場合は簡単です)。
FFMPEGには優れたドキュメントがあり、非常に強力なライブラリであり、使用しても問題はないと思います。しかし、ここでの問題は、iOSプロジェクトで動作させることができないことです。
私は3日間ドキュメントを読み、stackoverflowを読み、「iOS用のFFMPEGを構築する方法」という質問に対する答えをグーグルで調べました。このライブラリのコンパイルにもう1週間費やすと、PMが私を解雇するでしょう:))
さまざまなビルドスクリプトを使用してファイルを構成しようとしましたが、FFMPEGをビルドすると、x86アーキテクチャ用にlibavformat、libavcodecなどが使用されました(ビルドスクリプトでarmv6 archを指定した場合でも)。(アーキテクチャを表示するために「lipo-infolibavcodec.a」を使用します)
そのため、このソースをビルドすることはできず、アーキテクチャarmv7、armv6、i386用にビルドされたビルド済みのFFMPEGを見つけることにしました。
githubのMidnightCodersからiOSCommLibをダウンロードしました。これには、FFMPEGの使用例が含まれており、avcodec、avformat、および別のFFMPEGライブラリのビルド済みの.aファイルが含まれています。
私は彼らのアーキテクチャをチェックします:
iMac-2:MediaLibiOS root# lipo -info libavformat.a
Architectures in the fat file: libavformat.a are: armv6 armv7 i386
そして、私はそれが私にとって適切であることがわかりました!このライブラリとヘッダーをxCodeプロジェクトに追加しようとすると、正常にコンパイルされ(「ライブラリは別のアーキテクチャ用にコンパイルされています」などの警告もありません)、ヘッダーの構造を使用できますが、Cを呼び出そうとすると-libavformat(av_register_all())からの関数、コンパイラはエラーメッセージ「アーキテクチャarmv7のシンボルが見つかりません:av_register_all」を表示します。
libにはシンボルがないのではないかと思い、それらを表示しようとしました。
root# nm -arch armv6 libavformat.a | grep av_register_all
00000000 T _av_register_all
今、私はここで立ち往生しています、私は理解していません、なぜxCodeはこのシンボルを見ることができず、前進することができません。
iOSからRTMPストリームを公開するためのフローの理解が間違っている場合は訂正してください。また、iOS用のFFMPEGの構築とリンクを手伝ってください。
私はiPhone5.1を持っています。SDKおよびxCode4.2。