AVAssetWriter не записывает звук - PullRequest
2 голосов
/ 11 февраля 2012

У меня проблемы с записью звука в видео с помощью avassetwriter на iPhone.Я могу записывать видео с камеры на телефон без проблем, но когда я пытаюсь добавить аудио, я ничего не получаю, также длительность, отображаемая в видео в приложении фотоальбомов, показывает что-то действительно не в себе, 4-секундное видео будетпокажите 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];

и затем вот как я пишу буферы аудиосэмпла с использованием CMSampleBufferRef, отправленного обратным вызовом audioOutput

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

Буду очень признателен за любую помощь, я застрялэто весь день.

1 Ответ

3 голосов
/ 11 февраля 2012

Я не вижу, как вы звоните [videoWriter startSessionAtSourceTime], также вы отбрасываете буферы аудиосэмплов, когда audioWriterInput не готов (и это не может быть тем, что вы хотите).

Так что вашпроблема заключается в PTS (метках времени представления) того, что вы пишете.Либо вы можете сообщить выходным данным, что ваша временная шкала начинается в заданное время t с startSessionAtSourceTime, либо вы можете изменить буферы, к которым вы добавляете, чтобы иметь представление presentationTimeStamps на основе нуля.

...