2011-08-17 4 views
5

できるだけ早く、できるだけ早くiPhone(iOS5)から動画をアップロードする最良の方法を探しています。iPhoneからのほぼリアルタイムビデオアップロード

この前の質問と回答は非常に役に立ちました。
streaming video FROM an iPhone

しかし、いくつかの未解決の質問が残っています。私はその質問にコメントを投稿するのに十分な担当者を持っていません。私の質問は元の質問の範囲を超えていると思います。

ので:

  1. は急速にiPhoneのオフ(圧縮)のビデオを移動するための最良の方法AVCaptureSession/AVAssetWriterを使用し、短いクリップにビデオをチョッピングされています - ほぼリアルタイムでは?

  2. 2人のAVAssetWritersとバックグラウンドキューを使用してドロップアウトを回避する方法について詳しく説明してもらえますか(上記の質問にSteve McFarlinが言及したように)? 1つのAVAssetWriterから別のAVAssetWriterへのハンドオフがどのように機能するかわかりません...

  3. (重要)チョップされたビデオファイルを完全な長さのビデオに追加する簡単な方法はありますか。 1つの完全なビデオであるかのように再生しますか?小さなファイルをマージして、サーバー上とiPhone上で(プレビュー用に)1つのファイルのように見えるようにする必要があります。任意の助け

おかげで...

+0

あなたはこれらの質問を一般に公開することはできません。あなたはa)iOSデベロッパーがAppleとNDAを壊すように説得力を持ち、b)自分が有料iOSデベロッパーである場合は、AppleとNDAを壊す。あなたのiOS 5開発ポストを公式の**プライベート**と**機密**アップルのホスティングフォーラムに限定することは賢明で賢明でしょう。 – twilson

+0

あなたが有料のiOSデベロッパーでない場合は、iOS 5ベータSDKを使用する場所がなく、AppleがiOS 5を適切にリリースするまで待つ必要があります。 – twilson

答えて

4

さてあなたは、電話でのバッファリングを行うことを試みることができるが、それはそれはメモリが限られていることを考えると、私には逆効果と思われます。私はAVCaptureSessionをセットアップして、別のdispatch_queueスレッドでフレームをあなたに販売するAVCaptureVideoDataOutputを使用します(もしMPEGフレームとしてそれらを販売するならば)。そのスレッドは、非同期ソケットにフレームを渡して、フレーム番号とビデオ形式を示す小さなヘッダーで送信することができます。あるいは、送信待ちのフレーム数を監視できるキューを介して送信スレッドにデータを渡すこともできます。

受信側サーバーでは、小さなバッファ(数秒など)を作成し、順序が乱れている場合はフレームの並べ替えを処理する必要があります。

大きな問題は、帯域幅を検出し、品質を落とすタイミングを知っているため、外出待ちのパケットのバックログに終わらないことです。それは完全に異なった複雑なトピックです:)コーデック、品質、ビデオサイズなどがリアルタイムでフレームを送信するために必要な帯域幅を直接決定する場合、キーが選択されます。 AVVideoCodecH264は特定のモードでハードウェアでサポートされており、おそらくリアルタイムエンコードのための唯一の現実的なオプションです。

私はあなたがこれのための既製の例を見つけるつもりはないと思いますが、それはちょうどうまく動作するように多くの仕事を表しています。

+0

には、メディア断片データを読み込み、タイムスタンプを取得するためのプロッパAPIがあります。 –

0

2)ここで、私はあまりにも多くのフレームを落とすことなく、ファイルをチャンク方法は次のとおりです。

- (void) segmentRecording:(NSTimer*)timer { 
    AVAssetWriter *tempAssetWriter = self.assetWriter; 
    AVAssetWriterInput *tempAudioEncoder = self.audioEncoder; 
    AVAssetWriterInput *tempVideoEncoder = self.videoEncoder; 
    self.assetWriter = queuedAssetWriter; 
    self.audioEncoder = queuedAudioEncoder; 
    self.videoEncoder = queuedVideoEncoder; 
    //NSLog(@"Switching encoders"); 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     [tempAudioEncoder markAsFinished]; 
     [tempVideoEncoder markAsFinished]; 
     if (tempAssetWriter.status == AVAssetWriterStatusWriting) { 
      if(![tempAssetWriter finishWriting]) { 
       [self showError:[tempAssetWriter error]]; 
      } 
     } 
     if (self.readyToRecordAudio && self.readyToRecordVideo) { 
      NSError *error = nil; 
      self.queuedAssetWriter = [[AVAssetWriter alloc] initWithURL:[self newMovieURL] fileType:(NSString *)kUTTypeMPEG4 error:&error]; 
      if (error) { 
       [self showError:error]; 
      } 
      self.queuedVideoEncoder = [self setupVideoEncoderWithAssetWriter:self.queuedAssetWriter formatDescription:videoFormatDescription bitsPerSecond:videoBPS]; 
      self.queuedAudioEncoder = [self setupAudioEncoderWithAssetWriter:self.queuedAssetWriter formatDescription:audioFormatDescription bitsPerSecond:audioBPS]; 
      //NSLog(@"Encoder switch finished"); 

     } 
    }); 
} 

https://github.com/chrisballinger/FFmpeg-iOS-Encoder/blob/master/AVSegmentingAppleEncoder.m

3)ここでは、サーバ

import glob 
import os 
run = os.system # convenience alias 


files = glob.glob('*.mp4') 
out_files = [] 

n = 0 
for file in files: 
    out_file = "out-{0}.ts".format(n) 
    out_files.append(out_file) 
    full_command = "ffmpeg -i {0} -f mpegts -vcodec copy -acodec copy -vbsf h264_mp4toannexb {1}".format(file, out_file) 
    run(full_command) 
    n += 1 

out_file_concat = '' 
for out_file in out_files: 
    out_file_concat += ' {0} '.format(out_file) 

cat_command = 'cat {0} > full.ts'.format(out_file_concat) 
print cat_command 
run(cat_command) 
run("ffmpeg -i full.ts -f mp4 -vcodec copy -acodec copy -absf aac_adtstoasc full.mp4") 

https://github.com/chrisballinger/FFmpeg-iOS-Encoder/blob/master/concat-mp4.py上のファイルを連結するためのスクリプトです

+0

これらのチャンクセグメントにアクセスし、nssstreamを使用してサーバーにストリームしてから他のデバイスにストリームする方法はありますか? – sajwan

+0

'assetWriter'が書き込みを正常に終了した場合は、セグメントをアップロードするために代理コールを行う可能性がありますか?または私は何かを逃していますか? – HighFlyingFantasy

関連する問題