У меня есть представление OpenGL, в котором я записываю видео, используя то, что объяснено в этом отличный пост в блоге. Кроме того, я хотел бы записать звук с микрофона и смешать его с видео.
Первое решение, которое я придумал, было примерно таким (для ясности я опустил некоторый код):
writer = [[AVAssetWriter alloc]initWithURL:[NSURL fileURLWithPath:filePath] fileType:AVFileTypeMPEG4 error:&error];
audioWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:audioOutputSettings];
videoWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:videoSettings];
[writer addInput:audioWriterInput];
[writer addInput:videoWriterInput];
[writer startWriting];
Я создаю два входа, один аудио, один видео, и начинаю писать. Каждый раз при рендеринге кадра я получаю снимок представления OpenGL, преобразовываю его в CVPixelBufferRef
и добавляю к вводу записи с помощью AVAssetWriterInputPixelBufferAdaptor
:
CVPixelBufferRef buffer = NULL;
float millisecondsElapsed = [[NSDate date] timeIntervalSinceDate:startRecordingDate] * 1000.0;
buffer = [self pixelBufferFromCGImage:[shot CGImage] size:shot.size];
BOOL addedToBuffer = [bufferAdaptor appendPixelBuffer:buffer withPresentationTime:CMTimeMake(millisecondsElapsed, 1000)];
Теперь моя проблема в том, что я не знаю, как передать аудиопакеты с микрофона в AVAssetWriterInput
, и я не знаю, как правильно их синхронизировать. Я смотрел на AVAssetReader
, но он не может понять, как получить звук с микрофона. Также я думал о чтении из файла, в который пишет AVAudioRecorder
, но я не знаю, как читать из него и преобразовывать эти пакеты в CMSampleBufferRef
. Который тогда будет входом для AVAssetWriterInput
.
Я надеюсь, что кто-то может указать мне на правильное решение. Любые предложения или указания?
Спасибо!