Как происходит генерация файла .mov или .m4a с использованием массивов Int16 в качестве стереоканала для звука?
Я могу легко сгенерировать необработанные данные PCM как [Int16]
из файла .mov, сохранить их в двух файлах leftChannel.pcm
и rightChannel.pcm
и выполнить некоторые операции для последующего использования. Но я не могу восстановить видео из этих файлов.
Будет работать любой процесс, то есть прямая генерация видео с использованием необработанного PCM или промежуточного этапа генерации m4a из PCM.
Обновление:
Я выяснил, как преобразовать массив PCM в аудиофайл. Но он не будет играть.
private func convertToM4a(leftChannel leftPath : URL, rightChannel rigthPath : URL, converterCallback : ConverterCallback){
let m4aUrl = FileManagerUtil.getTempFileName(parentFolder: FrameExtractor.PCM_ENCODE_FOLDER, fileNameWithExtension: "encodedAudio.m4a")
if FileManager.default.fileExists(atPath: m4aUrl.path) {
try! FileManager.default.removeItem(atPath: m4aUrl.path)
}
do{
let leftBuffer = try NSArray(contentsOf: leftPath, error: ()) as! [Int16]
let rightBuffer = try NSArray(contentsOf: rigthPath, error: ()) as! [Int16]
let sampleRate = 44100
let channels = 2
let frameCapacity = (leftBuffer.count + rightBuffer.count)/2
let outputSettings = [
AVFormatIDKey : NSInteger(kAudioFormatMPEG4AAC),
AVSampleRateKey : NSInteger(sampleRate),
AVNumberOfChannelsKey : NSInteger(channels),
AVAudioFileTypeKey : NSInteger(kAudioFileAAC_ADTSType),
AVLinearPCMIsBigEndianKey : true,
] as [String : Any]
let audioFile = try AVAudioFile(forWriting: m4aUrl, settings: outputSettings, commonFormat: .pcmFormatInt16, interleaved: false)
let format = AVAudioFormat(commonFormat: .pcmFormatInt16, sampleRate: Double(sampleRate), channels: AVAudioChannelCount(channels), interleaved: false)!
let pcmBuffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: AVAudioFrameCount(frameCapacity))!
pcmBuffer.frameLength = pcmBuffer.frameCapacity
for i in 0..<leftBuffer.count {
pcmBuffer.int16ChannelData![0][i] = leftBuffer[i]
}
for i in 0..<rightBuffer.count {
pcmBuffer.int16ChannelData![1][i] = rightBuffer[i]
}
try! audioFile.write(from: pcmBuffer)
converterCallback.m4aEncoded(to: m4aUrl)
} catch {
print(error.localizedDescription)
}
}
Сохранение файла в формате .m4a с AVAudioFileTypeKey
в качестве m4a type
приводило к ошибке неверного файла.
Сохранение файла в формате .aac с указанными выше настройками воспроизводит файл, но с нарушенным звуком. Просто гудящий звук с некоторым эффектом замедления оригинального звука, сначала я думал, что это как-то связано с входом и выходом частоты дискретизации, но это не так.
Я предполагаю, что что-то не так в словаре вывода. Любая помощь будет оценена.