4

Я работаю с AVFoundation для записи и записи звука. Есть некоторые проблемы, которые я не совсем понимаю.Как установить временную метку CMSampleBuffer для записи AVWriter

В основном я хочу захватить аудио с AVCaptureSession и записать его с помощью AVWriter, однако мне нужно некоторое смещение в метке времени CMSampleBuffer, которую я получаю от AVCaptureSession. Я прочитал документацию по CMSampleBuffer. Я вижу два разных термина timestamp: «timestamp представления» и «timestamp представления представления». Какие разные из них?

Скажем, я получаю экземпляр CMSampleBuffer (для аудио) от AVCaptureSession, и я хочу записать его в файл с помощью AVWriter, какую функцию я должен использовать для «ввода» CMTime в буфер, чтобы установить презентацию отметка времени в полученном файле?

Спасибо.

ответ

6

Используйте CMSampleBufferGetPresentationTimeStamp, это время, когда буфер захвачен и должен быть «представлен» при воспроизведении, чтобы синхронизироваться. Процитировать сеанс 520 на WWDC 2012: «Время представления - это время, когда первый образец в буфере был поднят микрофоном».

Если начать AVWriter с

[videoWriter startWriting]; 
[videoWriter startSessionAtSourceTime:CMSampleBufferGetPresentationTimeStamp(sampleBuffer)]; 

, а затем добавлять образцы с

if(videoWriterInput.readyForMoreMediaData) [videoWriterInput appendSampleBuffer:sampleBuffer]; 

кадры в готовом видео будет соответствовать CMSampleBufferGetPresentationTimeStamp (я проверил). Если вы хотите изменить время при добавлении образцов вы должны использовать AVAssetWriterInputPixelBufferAdaptor

+0

Почему вы задаете вопрос, когда вас не интересует ответ? – Sten

+0

Мне нужно установить временную метку CMSampleBuffer, потому что я хочу когда-нибудь приостановить запись сеанса. Я закончил использование CMSampleBufferCreateCopyWithNewTiming. Интересно, есть ли прямой способ добавить временную метку существующего буфера, поэтому мне не нужно ее копировать. –

+2

Я не могу использовать AVAssetWriterInputPixelBufferAdaptor, поскольку он работает только для видеопотока. –

6

Кусок образца кода здесь: http://www.gdcl.co.uk/2013/02/20/iPhone-Pause.html CMSampleBufferRef образца - это ваш sampleBuffer, CMSampleBufferRef Sout вашей продукции. NewTimeStamp - ваш штамп времени.

CMItemCount count; 
CMTime newTimeStamp = CMTimeMake(YOURTIME_GOES_HERE); 
CMSampleBufferGetSampleTimingInfoArray(sample, 0, nil, &count); 
CMSampleTimingInfo* pInfo = malloc(sizeof(CMSampleTimingInfo) * count); 
CMSampleBufferGetSampleTimingInfoArray(sample, count, pInfo, &count); 
for (CMItemCount i = 0; i < count; i++) 
{ 
    pInfo[i].decodeTimeStamp = newTimeStamp; // kCMTimeInvalid if in sequence 
    pInfo[i].presentationTimeStamp = newTimeStamp; 

} 
CMSampleBufferRef sout; 
CMSampleBufferCreateCopyWithNewTiming(kCFAllocatorDefault, sample, count, pInfo, &sout); 
free(pInfo); 

 Смежные вопросы

  • Нет связанных вопросов^_^