Я делаю шумоподавление в режиме реального времени при записи видео.Я получаю аудио выборочный буфер из -captureOutput: didOutputSampleBuffer: fromConnection: обратный вызов делегата AVCapture.Процесс ns: samplebuffer-> char * -> ns -> char * -> samplebuffer.Я застрял на последнем шаге.Я получил сообщение об ошибке:
CMSampleBufferSetDataBufferFromAudioBufferList kCMSampleBufferError_RequiredParameterMissing = -12731.
Подробный процесс последнего шага выглядит следующим образом: I 1008 * 100 *видел следующие ссылки, но они не работают.
ошибка преобразования AudioBufferList в CMBlockBufferRef
Преобразование AudioBufferList в CMSampleBuffer приводит к неожиданным результатам
CMSampleBufferSetDataBufferFromAudioBufferList возвращает ошибку 12731
Как преобразовать AudioBufferList в CMSampleBuffer?
Их источником аудиоданных является AudioUnit, ноИсточник AVCapture.Исходя из предположения, что источником данных является AudioUnit, все в порядке, если установить TimingInfo как следующий код:
struct mach_timebase_info tinfo;
kern_return_t err =mach_timebase_info( &tinfo );
uint32_t hostTimeToNSFactor = tinfo.numer / tinfo.denom;
uint64_t timeNS = (uint64_t)(hostTime * hostTimeToNSFactor);
CMTime presentationTime = CMTimeMake(timeNS, 1000000000);
CMSampleTimingInfo timing = { CMTimeMake(1, 44100.00), presentationTime, kCMTimeInvalid };
Но я не могу получить AudioTimeStamp.hostTime в CMSamplebuffer.Может кто-нибудь сказать мне, как получить hostTime в CMSampulebuffer или другие методы для решения проблемы -12731.
Ниже приведены данные исходного Samplebuffer:
Printing description of originalSampleBuffer:
CMSampleBuffer 0x102064500 retainCount: 1 allocator: 0x1b7085610
invalid = NO
dataReady = YES
makeDataReadyCallback = 0x0
makeDataReadyRefcon = 0x0
formatDescription = <CMAudioFormatDescription 0x281e819e0 [0x1b7085610]> {
mediaType:'soun'
mediaSubType:'lpcm'
mediaSpecific: {
ASBD: {
mSampleRate: 44100.000000
mFormatID: 'lpcm'
mFormatFlags: 0xc
mBytesPerPacket: 2
mFramesPerPacket: 1
mBytesPerFrame: 2
mChannelsPerFrame: 1
mBitsPerChannel: 16 }
cookie: {(null)}
ACL: {Mono}
FormatList Array: {(null)}
}
extensions: {(null)}
}
sbufToTrackReadiness = 0x0
numSamples = 1024
sampleTimingArray[1] = {
{PTS = {31931558330/44100 = 724071.617, rounded}, DTS = {INVALID}, duration = {1/44100 = 0.000}},
}
sampleSizeArray[1] = {
sampleSize = 2,
}
dataBuffer = 0x281e88f30
, а следующеечто я преобразовал:
Printing description of audioSampleBuffer:
CMSampleBuffer 0x102167540 retainCount: 1 allocator: 0x1b7085610
invalid = NO
dataReady = NO
makeDataReadyCallback = 0x0
makeDataReadyRefcon = 0x0
formatDescription = <CMAudioFormatDescription 0x281e97f00 [0x1b7085610]> {
mediaType:'soun'
mediaSubType:'lpcm'
mediaSpecific: {
ASBD: {
mSampleRate: 44100.000000
mFormatID: 'lpcm'
mFormatFlags: 0xc
mBytesPerPacket: 2
mFramesPerPacket: 1
mBytesPerFrame: 2
mChannelsPerFrame: 1
mBitsPerChannel: 16 }
cookie: {(null)}
ACL: {(null)}
FormatList Array: {(null)}
}
extensions: {(null)}
}
sbufToTrackReadiness = 0x0
numSamples = 1024
sampleTimingArray[1] = {
{PTS = {31931558330/44100 = 724071.617, rounded}, DTS = {INVALID}, duration = {1/44100 = 0.000}},
}
dataBuffer = 0x0
Я новичок в аудио и видео, я надеюсь, что кто-то может мне помочь.