通过流式传输音频样本到AVAssetWriter

时间:2016-01-28 11:10:11

标签: ios audio avfoundation avassetwriter

当我从相机录制视频时,我正在使用项目,但音频来自流媒体。音频帧显然与视频帧不同步。 如果我在没有视频的情况下使用AVAssetWriter,从流媒体录制音频帧就可以了。但如果我追加视频和音频帧,我就听不到任何声音。

这是将audiodata从流转换为CMsampleBuffer

的方法
AudioStreamBasicDescription monoStreamFormat = [self getAudioDescription];


CMFormatDescriptionRef format = NULL;
OSStatus status = CMAudioFormatDescriptionCreate(kCFAllocatorDefault, &monoStreamFormat, 0,NULL, 0, NULL, NULL, &format);
if (status != noErr) {
    // really shouldn't happen
    return nil;
}

CMSampleTimingInfo timing = { CMTimeMake(1, 44100.0), kCMTimeZero, kCMTimeInvalid };


CMSampleBufferRef sampleBuffer = NULL;
status = CMSampleBufferCreate(kCFAllocatorDefault, NULL, false, NULL, NULL, format, numSamples, 1, &timing, 0, NULL, &sampleBuffer);
if (status != noErr) {
    // couldn't create the sample alguiebuffer
    NSLog(@"Failed to create sample buffer");
    CFRelease(format);
    return nil;
}

// add the samples to the buffer
status = CMSampleBufferSetDataBufferFromAudioBufferList(sampleBuffer,
                                                        kCFAllocatorDefault,
                                                        kCFAllocatorDefault,
                                                        0,
                                                        samples);
if (status != noErr) {
    NSLog(@"Failed to add samples to sample buffer");
    CFRelease(sampleBuffer);
    CFRelease(format);
    return nil;
}

我不知道这是否与时间有关。但我想在视频的第一秒附加音频帧。

可能吗?

由于

1 个答案:

答案 0 :(得分:0)

最后我做了这个

uint64_t _hostTimeToNSFactor = hostTime;

_hostTimeToNSFactor *= info.numer;
_hostTimeToNSFactor /= info.denom;

uint64_t timeNS = (uint64_t)(hostTime * _hostTimeToNSFactor);
CMTime presentationTime = self.initialiseTime;//CMTimeMake(timeNS, 1000000000);
CMSampleTimingInfo timing = { CMTimeMake(1, 44100), presentationTime, kCMTimeInvalid };