私はAVCaptureSession
を使ってビデオをキャプチャし、iPhoneカメラからリアルタイムフレームを取得しますが、フレームとサウンドの多重化を使用してサーバに送信するにはどうすればよいでしょうか、ffmpegについてのチュートリアルがあれば、任意の例をここで共有してください。iphoneカメラからリアルタイムビデオストリームを取得してサーバーに送信するにはどうすればいいですか?
答えて
私がやっていることは、すべてのフレームで実行されるコールバックを持つデリゲートを持つAVCaptureSessionを実装することです。そのコールバックはネットワークを介して各フレームをサーバーに送信します。サーバーには、受信するカスタムセットアップがあります。ここで
は流れます:
そしてここではいくつかのコードです:
// 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秒のビデオがドロップされます)。
は、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を使用することをお勧めします
長い話題と短い話題があります。
これは短いものです: これは出発点であるhttps://github.com/OpenWatch/H264-RTSP-Server-iOS
を見に行きます。
あなたはそれを入手して、彼がフレームをどのように抽出するか見ることができます。これは小さくてシンプルなプロジェクトです。
次に、特定の機能「encodedFrame」を持っているkickflipを見ることができます。バックプレーンとエンコードされたフレームは、このポイントから到着します。あなたが望むことをwebsocket経由で送ることができます。 mpegのアトムを読み取るための非常に難しいコードがたくさんあります
- 1. iPhoneカメラからのリアルタイムビデオストリームを20秒遅れで再生する
- 2. サウンドを録音してWebアプリケーションからサーバーに送信するにはどうすればよいですか?
- 3. HTTPリクエストを送信してPHPで応答を取得するにはどうすればいいですか?
- 4. リモートサーバー/データベースに接続してIPhoneからデータを取得するにはどうすればいいですか
- 5. メッセージがiPhoneからサーバーに送信されているかどうかを確認するには?
- 6. サーバーに304を送信しないようにするにはどうすればいいですか?
- 7. PHPサーバーからクライアントにDOMツリーを送信するにはどうすればいいですか?
- 8. アプリケーションデータをJSONオブジェクトに変換してサーバーに送信するにはどうすればいいですか?
- 9. iPhoneアプリケーションのSQLiteデータベースからWebサービスにデータを送信するにはどうすればいいですか?
- 10. iBeaconになっているiphoneにデータを送信するにはどうすればいいですか?
- 11. ユーザーのブラウザ情報を取得してフォームフィールドに送信するにはどうすればよいですか?
- 12. Gmailから送信者の名前を取得するにはどうすればよいですか?
- 13. 電子メールページを取得してフォームデータを送信するにはどうすればよいですか?
- 14. サーバーからAndroidアプリにファイルを送信するにはどうすればよいですか?
- 15. サーバーから送信されたウェーブファイルを再生するにはどうすればよいですか?
- 16. -captureStillImageAsynchronouslyFromConnection:completionHandler:から取得したCMSampleBufferからNSImageを取得するにはどうすればいいですか?
- 17. myDialogからブロードキャスト(インテント)を送信してmyActivityで受信するにはどうすればよいですか?
- 18. iPhoneアプリから取得したユーザー情報をウェブサイト(Joomla)に送信するにはどうすればいいですか?
- 19. 値を取得したリンクをメールに送信するにはどうすればよいですか?
- 20. REST APIにリクエストを送信したページを取得するにはどうすればよいですか?
- 21. アクティビティにインテントを送信し、アクティビティからエクストラを読み取るにはどうすればよいですか?
- 22. emacsからunixサーバーに自分のコードを取得するにはどうすればいいですか?
- 23. ユーザーがサーバーにアップロードしたビデオからサムネイルを取得するにはどうすればよいですか?
- 24. iPhoneでWiFiを使ってシリアルデータを送信するにはどうすればいいですか?
- 25. iphoneアプリから個々のプッシュ通知を送信するにはどうすればよいですか?
- 26. サーバー上の「サーバー送信イベント」接続を閉じるにはどうすればいいですか?
- 27. .NET 2.0を使用して、サーバーにFTPで送信し、ファイルを取得し、ファイルを削除するにはどうすればよいですか。
- 28. Iphoneカメラが返ってきたらビューを切り替えるにはどうすればいいですか?
- 29. httpurlconnectionでパラメータを取得するリクエストを送信するにはどうすればよいですか?
- 30. iPhoneデバイスにインストールされているアプリリストを取得するにはどうすればよいですか?
私はあなたがすでにMOV/MP4のチャンクファイルを記録していると仮定しています。私は[ffstream](https://github.com/otmakie/LivuLib)(誰かがフォークした)という古いプロジェクトを使用してこれらをストリーミングすることができます。あなたは単調に増加する時間を維持しなければならないことに留意してください。つまり、各MOV/MP4の開始時間は同じでなければなりません。このようにして、すべての1 + Nファイルは最初に「空白」スペースを持ち、ffmpegでmov.cによって生成されたタイムスタンプは正しいでしょう。 UDP/TCP上でRTSP/RTPを使用するか、ストリーミング用にffmpegにlibrtmpプラグインを使用することができます。 –
@SteveMcFarlinローカルからサーバーへストリームを送信する方法を教えてください。ストリームをチャンクとして送信する方法を意味します。 – Ron