2012-09-03 21 views
29

私はAVCaptureSessionを使ってビデオをキャプチャし、iPhoneカメラからリアルタイムフレームを取得しますが、フレームとサウンドの多重化を使用してサーバに送信するにはどうすればよいでしょうか、ffmpegについてのチュートリアルがあれば、任意の例をここで共有してください。iphoneカメラからリアルタイムビデオストリームを取得してサーバーに送信するにはどうすればいいですか?

+1

私はあなたがすでにMOV/MP4のチャンクファイルを記録していると仮定しています。私は[ffstream](https://github.com/otmakie/LivuLib)(誰かがフォークした)という古いプロジェクトを使用してこれらをストリーミングすることができます。あなたは単調に増加する時間を維持しなければならないことに留意してください。つまり、各MOV/MP4の開始時間は同じでなければなりません。このようにして、すべての1 + Nファイルは最初に「空白」スペースを持ち、ffmpegでmov.cによって生成されたタイムスタンプは正しいでしょう。 UDP/TCP上でRTSP/RTPを使用するか、ストリーミング用にffmpegにlibrtmpプラグインを使用することができます。 –

+0

@SteveMcFarlinローカルからサーバーへストリームを送信する方法を教えてください。ストリームをチャンクとして送信する方法を意味します。 – Ron

答えて

22

私がやっていることは、すべてのフレームで実行されるコールバックを持つデリゲートを持つAVCaptureSessionを実装することです。そのコールバックはネットワークを介して各フレームをサーバーに送信します。サーバーには、受信するカスタムセットアップがあります。ここで

は流れます:

http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/03_MediaCapture.html#//apple_ref/doc/uid/TP40010188-CH5-SW2

そしてここではいくつかのコードです:

// make input device 

NSError *deviceError; 

AVCaptureDevice *cameraDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 

AVCaptureDeviceInput *inputDevice = [AVCaptureDeviceInput deviceInputWithDevice:cameraDevice error:&deviceError]; 

// make output device 

AVCaptureVideoDataOutput *outputDevice = [[AVCaptureVideoDataOutput alloc] init]; 

[outputDevice setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; 

// initialize capture session 

AVCaptureSession *captureSession = [[[AVCaptureSession alloc] init] autorelease]; 

[captureSession addInput:inputDevice]; 

[captureSession addOutput:outputDevice]; 

// make preview layer and add so that camera's view is displayed on screen 

AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession]; 
previewLayer.frame = view.bounds; 
[view.layer addSublayer:previewLayer]; 

// go! 

[captureSession startRunning]; 

そして、出力デバイスのデリゲート(ここでは、自己)コールバックを実装することがあります。

-(void) captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection*)connection 

{ 
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

CGSize imageSize = CVImageBufferGetEncodedSize(imageBuffer); 

// also in the 'mediaSpecific' dict of the sampleBuffer 

    NSLog(@"frame captured at %.fx%.f", imageSize.width, imageSize.height); 

    } 

生のフレームや個々の画像を送信するとうまく動作しませんあなたのために十分です(データの量とフレーム数のために)。また、電話から何かを合理的に提供することはできません(WWANネットワークにはあらゆる種類のファイアウォールがあります)。ビデオをエンコードして、サーバーにストリームする必要があります。これは、おそらく標準のストリーミング形式(RTSP、RTMP)を超えている可能性があります。 iPhone 3GSにH.264エンコーダチップがあります。問題はストリーム指向ではないということです。つまり、最後にビデオを解析するために必要なメタデータを出力します。これにより、いくつかの選択肢が残されます。

1)生データを取得し、FFmpegを使用して電話でエンコードします(1トンのCPUとバッテリーを使用します)。

2)H.264/AAC出力用の独自のパーサーを作成します(非常に難しい)。

3)チャンクで録画して処理する(チャンクの長さに等しいレイテンシが追加され、セッションを開始および停止すると、各チャンク間で約1/4秒のビデオがドロップされます)。

+0

、それまで私はあなたの応答のために、私の質問は、iphoneからサーバーにオーディオとビデオのフレームを送信する方法です。 – Ron

+0

私はこれが古いと理解していますが、私はこの非常にトピックのサーバー側で立ち往生しています。イメージフレームのストリームを扱うようにサーバーを構成したのはどうでしたか? – Siriss

+0

ページがdeveloper.apple.comに見つかりません。 – AechoLiu

4

Look hereand here

は、AV Foundationフレームワークを使用してビデオをキャプチャしてみます。 HTTPストリーミングでサーバーにアップロードします。また

スタックに

(The post below was found at this link here)

あなたが既に知っている可能性が高い、下記の別のスタックオーバーフローのポストをチェックアウト....

1) How to get compressed frames and audio from iPhone's camera? 

あなたにca nこれをしないでください。 AVFoundation APIはこれをすべての角度で から防ぎました。私は名前付きパイプと、他の卑劣なunix fooを試しました。 そのような運はありません。ファイルに書き込む以外に選択肢はありません。 リンク先の投稿では、コード化された フレームを配信するようにコールバックを設定することをおすすめします。私が知る限り、これはH.264ストリームでは不可能です。 キャプチャデリゲートは、特定のピクセル 形式でエンコードされたイメージを配信します。 エンコーディングを行うのはMovie WritersとAVAssetWriterです。

2) Encoding uncompressed frames with ffmpeg's API is fast enough for 
real-time streaming? 

はいそうです。しかし、あなたは GPL領域に入るlibx264を使う必要があります。それはアプリストアと正確には互換性がありません。

私は効率のためにAVFoundationとAVAssetWriterを使用することをお勧めします

3

長い話題と短い話題があります。

これは短いものです: これは出発点であるhttps://github.com/OpenWatch/H264-RTSP-Server-iOS

を見に行きます。

あなたはそれを入手して、彼がフレームをどのように抽出するか見ることができます。これは小さくてシンプルなプロジェクトです。

次に、特定の機能「encodedFrame」を持っているkickflipを見ることができます。バックプレーンとエンコードされたフレームは、このポイントから到着します。あなたが望むことをwebsocket経由で送ることができます。 mpegのアトムを読み取るための非常に難しいコードがたくさんあります

関連する問題