9

iPhone で HTTP ライブ ストリーミング サーバーを実行しようとしています。これは、カメラからビデオ ストリームをキャプチャし、それを HTML5 クライアント (HTTP ライブ ストリーミングをサポートする) にフィードします。

これまでのところ、次の作業を行っています。

  1. iOS 上の HTTP ライブ ストリーミング サーバー (Node.js で記述)。ビデオ キャプチャ モジュールによって生成されたトランスポート ストリーム (ビデオ/MP2T) ファイルのリストからインデックス ファイルを動的に更新します。
  2. AVCaptureMovieFileOutput を使用して一連の 10 秒の QuickTime ファイルを連続して生成するビデオ キャプチャ モジュール (ファイル間には小さなギャップがありますが、私のアプリケーションには十分小さいです)。

私が必要としているのは、各 QuickTime ファイルをトランスポート ストリーム ファイル (エンコーディングを変更する必要はなく、別のコンテナーが必要なだけです) に変換するオンザフライ コンバーターであり、上記の 2 つのモジュールを橋渡しします。

私が知る限り、これが iPhone のハードウェア ビデオ エンコーダーを利用する唯一の方法であるため、私はこのアプローチを採用しています (このトピックについてかなりの調査を行い、99% 確信しています。私が間違っているかどうかを知ってください)。

何人かは ffmpeg を提案しましたが、私は MIT ライセンス (もしあれば) ではるかに小さなコードを使用するか、ゼロから何かを作成します (そして MIT ライセンスでオープンソース化します)。

私はこのメディア コンテナのことはまったく初めてなので、誰かが正しい方向性 (サンプル コード、オープン ソース、ドキュメントなど) を教えてくれたら本当にありがたいです。

4

1 に答える 1

6

私はこれを Apple 開発者フォーラムに投稿しました。私たちは活発な (しゃれを許して) 議論を続けています。これは、同様の考えを提起した人への回答でした。

私が間違っている場合は訂正してください。AVCaptureVideoDataOutput から取得した生の h264 から mpeg ts を作成することは、x264 などを使用してトランスコードしない限り簡単な作業ではないことに同意しない場合の例を教えてください。少しの間、mpeg ts ファイルを簡単に取得できると仮定すると、m3u8 コンテナーでそれらをコンパイルし、小さな Web サーバーを起動してそれらを提供するという単純な問題になります。私の知る限り、それを行うアプリはたくさんありますが、デバイスから localhost トンネルを使用することは拒否の問題ではありません。したがって、デバイスから hls を生成できる可能性があります。

テクニック番号 2 に進みます。引き続き AvCaptureVideoDataOutput を使用して、フレームをキャプチャし、きちんとした小さなプロトコル、json、またはおそらく bencode のようなより難解なものでラップし、ソケットを開き、サーバーに送信します。ああ...無線LAN経由でも圧縮されていないフレームを送信するには帯域幅が必要になるため、堅牢なネットワークが必要です。

というわけでテクニックその3へ。

avassetwriter を使用して新しいムービーを作成し、標準の C 関数を使用して一時ファイルから読み戻します。これは問題ありませんが、持っているのは生の h264 です。mp4 は完全ではないため、moov アトムがありません。再生する楽しい部分が来ます。このヘッダー。幸運を。

というわけで、実際にメリットがありそうなテクニック4へ

1 つではなく 2 つの avassetwriters を作成し、gcd dispatch_queue を使用してそれらを管理します。インスタンス化後 avassetwriters は 1 回しか使用できないため、タイマーで最初のライターを開始します。最初のものを引き裂く。これで、完全な moov アトムを含む一連の .mov ファイルができました。これらのそれぞれには、圧縮された h264 ビデオが含まれていました。これで、これらをサーバーに送信して、1 つの完全なビデオ ストリームにまとめることができます。別の方法として、mov ファイルを取得し、librtmp を使用して rtmp プロトコルでラップし、メディア サーバーに送信する単純なストリーマーを使用することもできます。

個々のmovファイルを別のAppleデバイスに送信して、デバイス間通信を取得するだけでよいでしょうか。その質問は何度も誤解されています.Wi-Fi経由で同じサブネット上の別のiPhoneデバイスを見つけることは非常に簡単で、実行できます. セルラー接続を介した tcp で別のデバイスを見つけることは、すべての一般的なキャリアが行うわけではなく、アドレス指定可能な IP を使用するセル ネットワークでのみ可能であれば、ほとんど魔法のようです。

できるとしたら、別の問題が発生します。これは、avfoundation のビデオ プレーヤーでは、多くの異なる個別のムービー ファイル間の遷移を処理できないためです。おそらくffmpegデコードに基づいて、独自のストリーミングプレーヤーを作成する必要があります。(それはかなりうまくいきます)

于 2012-12-15T03:35:44.933 に答える