为了复用打包的基本流,我还需要一些像 libmpegts 这样的库。或者可能是 ffmpeg(通过使用 libavcodec 和 libavformat 库)。
据我所知,没有办法将 TS 与 AVFoundation 或相关框架混合使用。虽然它似乎可以手动完成,但我正在尝试使用Bento4 库来完成与您相同的任务。我猜 libmpegts、ffmpeg、GPAC、libav 或任何其他类似的库也可以工作,但我不喜欢他们的 API。
基本上,我关注的是Mp42Ts.cpp,忽略了 Mp4 部分,只看 Ts 写作部分。
这个StackOverflow 问题包含了如何给它提供视频的所有大纲,以及如何给它提供音频的实现。如果您有任何问题,请用更具体的问题联系我。
不过,我希望这为您提供了一个良好的起点。
我还需要来自麦克风数据的 AAC 或 PCM 基本流(我认为 PCM 会更容易,因为不涉及编码)。我也不知道该怎么做。
以 AAC 形式获取麦克风数据非常简单。像这样的东西:
AVCaptureDevice *microphone = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
_audioInput = [AVCaptureDeviceInput deviceInputWithDevice:microphone error:&error];
if (_audioInput == nil) {
NSLog(@"Couldn't open microphone %@: %@", microphone, error);
return NO;
}
_audioProcessingQueue = dispatch_queue_create("audio processing queue", DISPATCH_QUEUE_SERIAL);
_audioOutput = [[AVCaptureAudioDataOutput alloc] init];
[_audioOutput setSampleBufferDelegate:self queue:_audioProcessingQueue];
NSDictionary *audioOutputSettings = @{
AVFormatIDKey: @(kAudioFormatMPEG4AAC),
AVNumberOfChannelsKey: @(1),
AVSampleRateKey: @(44100.),
AVEncoderBitRateKey: @(64000),
};
_audioWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:audioOutputSettings];
_audioWriterInput.expectsMediaDataInRealTime = YES;
if(![_writer canAddInput:_audioWriterInput]) {
NSLog(@"Couldn't add audio input to writer");
return NO;
}
[_writer addInput:_audioWriterInput];
[_captureSession addInput:_audioInput];
[_captureSession addOutput:_audioOutput];
- (void)audioCapture:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
/// sampleBuffer contains encoded aac samples.
}
我猜你已经在为你的相机使用 AVCaptureSession 了;您可以对麦克风使用相同的捕获会话。