3

iPhone で avassetwriter を使用してオーディオをビデオに録音するのに問題があります。電話のカメラからビデオを録画することは問題ありませんが、オーディオを追加しようとすると何も得られません。また、フォト アルバム アプリのビデオに表示される時間も、何かおかしなことを示しています。4 秒のビデオはshow 15:54:01 またはそのようなものであり、ビデオが短くても、番号の後に作成されたすべてのビデオが増加します。ここで他の質問で見たものに従おうとしましたが、うまくいきませんでした。

オーディオ入力の設定方法は次のとおりです

captureSession = [[AVCaptureSession alloc] init];
//set up audio input 
AVCaptureDevice *audioDevice     = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeAudio];
AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error ]; 
audioOutput = [[AVCaptureAudioDataOutput alloc] init];

if([captureSession canAddOutput:audioOutput])
{
    [captureSession addOutput:audioOutput];
}    

[audioOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];

AVAssetWriterの設定方法は次のとおりです

videoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:MOVIE_PATH] fileType:AVFileTypeQuickTimeMovie error:&error];

AudioChannelLayout acl;
bzero( &acl, sizeof(acl));
acl.mChannelLayoutTag = kAudioChannelLayoutTag_Mono;


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

次に、AudioOutput コールバックによって送信された CMSampleBufferRef を使用してオーディオ サンプル バッファを書き込む方法を次に示します。

- (void) captureAudio:(CMSampleBufferRef)sampleBuffer
 {
   if([audioWriterInput isReadyForMoreMediaData]){
     [audioWriterInput appendSampleBuffer:sampleBuffer];
   }
 }

本当に助けていただければ幸いです。私は一日中これにこだわっています。

4

1 に答える 1

3

[videoWriter startSessionAtSourceTime]また、準備ができていないときにオーディオサンプルバッファを破棄しています(そして、それはあなたが望むaudioWriterInputものではありません)。

したがって、問題は、書き出す内容の PTS (プレゼンテーション タイム スタンプ) にあります。タイムラインが特定の時間 t で開始することを出力に伝えるか、startSessionAtSourceTime追加するバッファーを変更してゼロベースのpresentationTimeStamps にすることができます。

于 2012-02-11T19:57:26.180 に答える