1

現在、AVCaptureSession を使用してビデオとオーディオをキャプチャしており、AVAssetWriter を使用してデータをディスクに書き出すようにパイプラインを設定しています。短いビデオの場合、これはまったく問題なく正常に機能しています。

ただし、記録されたメディアの長さが任意の時間 (通常は約 2 分) を超えた場合、書き込みを終了する呼び出しは失敗しますが、コンテンツの約 50% しか再生されないビデオ ファイルを生成することはできます。書き込み中に isReadyForMoreMediaData と appendSampleBuffer を継続的に呼び出すと、常に true が返されます。finishWriting 呼び出しまで、何か問題が発生したという通知を受け取っていないようです。

AVAssetWriters エラーは、finishWriting 呼び出しが失敗した後に次のように設定されます。

Capture failed to end with status 3 and error Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo=0x210b7880 {NSLocalizedFailureReason=An unknown error occurred (268451843), NSUnderlyingError=0x210b1ee0 "The operation couldn’t be completed. (OSStatus error 268451843.)", NSLocalizedDescription=The operation could not be completed}

世界で最も有用なエラーではありません...

この直後に、エラーを含む設定した AVCaptureSessionRuntimeErrorNotification リスナーへの呼び出しが続きます。

Error Domain=AVFoundationErrorDomain Code=-11819 "Cannot Complete Action" UserInfo=0x21011940 {NSLocalizedRecoverySuggestion=Try again later., NSLocalizedDescription=Cannot Complete Action}

これまたあまり参考にならない...

これは、オーディオ用のAVAssetWriter入力を構成するために使用するコードです

    //\Configure Audio Writer Input
AudioChannelLayout acl;
bzero(&acl, sizeof(acl));
acl.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo;

NSDictionary*  audioOutputSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                      [ NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,
                                      [ NSNumber numberWithInt: 2 ], AVNumberOfChannelsKey,
                                      [ NSNumber numberWithFloat: 44100.0 ], AVSampleRateKey,
                                      [ NSData dataWithBytes: &acl length: sizeof( AudioChannelLayout ) ], AVChannelLayoutKey,
                                      [ NSNumber numberWithInt: 64000 ], AVEncoderBitRateKey,
                                      nil];


m_audioWriterInput = [[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:audioOutputSettings] retain];

これは、ビデオ用に AVAssetWriterInput を構成するために使用するコードです

        videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                     AVVideoCodecH264, AVVideoCodecKey,
                     [NSNumber numberWithInt:640], AVVideoWidthKey,
                     [NSNumber numberWithInt:480], AVVideoHeightKey,
                     nil];


m_videoWriterInput = [[AVAssetWriterInput
                       assetWriterInputWithMediaType:AVMediaTypeVideo
                       outputSettings:videoSettings] retain];

m_videoWriterInput.expectsMediaDataInRealTime = YES;

これは、AVAssetWriter を初期化するために使用するコードです。

    m_audioAndVideoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:outputPath] fileType:AVFileTypeQuickTimeMovie error:&error];

m_audioAndVideoWriter.shouldOptimizeForNetworkUse = YES;
[m_audioAndVideoWriter addInput:m_videoWriterInput];
[m_audioAndVideoWriter addInput:m_audioWriterInput];

誰かが同様の問題を経験しましたか? または、finishWriting 呼び出し内でこの問題を引き起こす可能性があるものを知っていますか? または、誰かがこの問題をデバッグする新しい方法を知っていますか?

ありがとう

4

1 に答える 1

0

m_audioAndVideoWriter shouldOptimizeForNetworkUse = NO設定がこれを修正するのは奇妙です。shouldOptimizeForNetworkUse実際、ファイルからエンコードされたフレームを取得してストリーミングする場合は、必ずYES. 私はそれを機能させたので、あなたはそれを機能させることができると確信しています.

AVCCコンテナー生成の最後のステップには、エンコードされたフレームを指定するようないくつかの重要なコンテナー アトムSPS/PPSと、その他の非常に重要なメタデータの書き込みが含まれます。

いくつかのアイデア:

  1. テスト iOS デバイスで作成するファイルのサイズはどれくらいですか? スペースが不足していないことを確認してください。これにより、.movファイル作成の最後のステップが失敗します。ファイルが急速に大きくなりすぎた場合は、ビデオのサイズを微調整します。また、品質のニーズに基づいて(または に)設定する AVCaptureSessionだけのプリセ​​ットの1つを使用します。他に 2 つの設定があり、ファイルサイズを縮小するのにも役立ちます。もっと情報を提供できますが、まずファイルサイズが問題であることを確認しましょう :)captureSession.sessionPresetAVCaptureSessionPresetLowAVCaptureSessionPresetMediumAVVideoMaxKeyFrameIntervalKeyAVVideoAverageBitRateKey

  2. .mp4ファイルを生成しようとしましたか?assetWriter には、fileType:kUTTypeMPEG4オプションを指定するだけです。それが何か違いを生むかどうか、私は興味があります。

于 2012-06-25T15:53:44.647 に答える