現在、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 呼び出し内でこの問題を引き起こす可能性があるものを知っていますか? または、誰かがこの問題をデバッグする新しい方法を知っていますか?
ありがとう