1

我無法使用iPhone上的avassetwriter將音頻錄製到視頻中。我可以在手機上錄製來自攝像頭的視頻沒有問題,但是當我嘗試添加音頻時,我什麼都沒有收到,而且相冊應用中的視頻顯示的內容也顯示出了一些真正的問題,4秒的視頻將會顯示15:54:01或類似的東西,即使視頻較短,編號後的每個視頻都會增加。我一直在試圖追尋其他問題,但沒有運氣。AVAssetWriter不記錄音頻

繼承人設置了AVAssetWriter如何IM

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]; 

然後在這裏是如何我寫使用CMSampleBufferRef音頻採樣緩衝器發送我怎麼設置我的音頻輸入

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()]; 

繼承人通過audioOutput回撥

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

會真的很贊任何幫助,我一直在這一天卡住。

+0

嘿,你找到答案了嗎? – 2013-03-24 12:33:56

回答

4

我沒有看到你打電話給[videoWriter startSessionAtSourceTime],當audioWriterInput沒有準備好時(也就是你想要的),你也會丟棄音頻採樣緩衝區。

所以你的問題在於你寫出來的PTSs(Presentation Time Stamps)。您可以通過startSessionAtSourceTime告訴輸出您的時間線在給定時間t開始,或者您可以修改您追加的緩衝區以使其具有基於零的presentationTimeStamps。

+0

在AVCaptureAudioDataOutput上找不到函數startSessionAtSourceTime。你的意思是別的嗎? – 2016-12-05 15:45:49

+0

是的,這個問題是關於'AVAssetWriter',一個用於編碼音頻和視頻文件的類,並且您正在問'AVCaptureAudioDataOutput'用於從麥克風捕獲音頻。您可以使用'AVAssetWriter'將您使用'AVCaptureAudioDataOutput'捕獲的音頻寫入文件,在這種情況下,您可以將捕獲的緩衝區的時間戳傳遞給'startSessionAtSourceTime'。 – 2016-12-05 21:09:16

+0

所以你的意思是寫''[assetWriter startSessionAtSourceTime]' – 2016-12-06 20:28:34