41

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

Apple の Http Living Streaming を使用する必要がありますか? または、他の何か?ありがとう。

4

3 に答える 3

46

私の知る限り、これを行う組み込みの方法はありません。おっしゃる通り、HTTP Live Streaming は iPhone へのダウンロード用です。

私がやっている方法は、すべてのフレームで実行されるコールバックを持つデリゲートを持つ 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];

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

-(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 エンコードされているため、トランスコーディングはファイルのヘッダー形式を変更するだけです。

于 2011-04-08T21:39:47.113 に答える
2

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

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

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

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

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

于 2019-12-19T06:02:50.967 に答える
-4

HTTP Live Streaming でそれができるかどうかはわかりません。HTTP ライブ ストリーミングは、ビデオを 10 秒 (約) の長さでセグメント化し、それらのセグメントでプレイリストを作成します。そのため、iPhone を HTTP ライブ ストリーミングでストリーム サーバー側にしたい場合は、ビデオ ファイルをセグメント化し、プレイリストを作成する方法を考え出す必要があります。

それを行う方法は私の知識を超えています。ごめん。

于 2011-02-21T08:31:15.470 に答える