webdevqa.jp.net

UstreamやQikなどのiPhoneからライブストリーミングビデオをアップロードする

IPhoneからUstreamやQikなどのサーバーに動画をライブストリーミングする方法AppleからのHttp Live Streamingと呼ばれるものがあることは知っていますが、私が見つけたほとんどのリソースは、サーバーからiPhoneへのビデオのストリーミングについてのみ話します。

AppleのHttp Living Streamingは私が使用すべきものですか?または、他の何か?ありがとう。

40
0pcl

私が知る限り、これを行うための組み込みの方法はありません。おっしゃるとおり、HTTPライブストリーミングはiPhoneへのダウンロード用です。

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

フローは次のとおりです: https://developer.Apple.com/library/content/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_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];

次に、出力デバイスのデリゲート(ここではself)がコールバックを実装する必要があります。

-(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 );
}

編集/更新

フレームを1つずつサーバーに送信せずにこれを行う方法をいくつかの人々が尋ねました。答えは複雑です...

基本的に、上記のdidOutputSampleBuffer関数では、サンプルをAVAssetWriterに追加します。実際、私は一度に3人のアセットライター(過去、現在、未来)を別々のスレッドで管理していました。

過去の作家が映画ファイルを閉じてアップロードしている最中です。現在のライターは、カメラからサンプルバッファーを受信して​​います。将来のライターは、新しいムービーファイルを開いて、データ用に準備している最中です。 5秒ごとにpast=current; current=futureとシーケンスを再開します。

次に、ビデオを5秒のチャンクでサーバーにアップロードします。必要に応じて、ffmpegでビデオをつなぎ合わせるか、HTTPライブストリーミング用にMPEG-2トランスポートストリームにトランスコードできます。ビデオデータ自体はアセットライターによってH.264でエンコードされているため、トランスコーディングによってファイルのヘッダー形式が変更されるだけです。

46
jab

これに役立つライブラリを1つ見つけました。

HaishinKitストリーミングライブラリ

上記のライブラリは、RTMPまたはHLSを介してストリーミングするすべてのオプションを提供しています。

与えられた手順に従ってこのライブラリを実行し、すべての説明を注意深く読んでください。このライブラリで提供されているサンプルコードを直接実行しないでください。必要なクラスとポッドをデモアプリに取得する代わりに、エラーが発生します。

これで、画面、カメラ、オーディオを記録できます。

0
Hardik Vyas