ios - 使用原始 PCM 生成视频或音频
<p><p>使用 Int16 数组作为音频的立体声 channel 生成 .mov 或 .m4a 文件的过程是什么?</p>
<p>我可以轻松地将原始 PCM 数据生成为 <code></code> 从 .mov 文件并将其存储在两个文件中 <code>leftChannel.pcm</code> 和 <code>rightChannel.pcm</code> 并执行一些操作以供以后使用。但我无法从这些文件中重新生成视频。</p>
<p>任何过程,即使用原始 PCM 直接生成视频或使用从 PCM 生成 m4a 的中间步骤都可以工作。</p>
<p><strong>更新:</strong></p>
<p>我想出了如何将 PCM 阵列转换为音频文件。但它不会播放。</p>
<pre><code>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!
let rightBuffer = try NSArray(contentsOf: rigthPath, error: ()) as!
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
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! = leftBuffer
}
for i in 0..<rightBuffer.count {
pcmBuffer.int16ChannelData! = rightBuffer
}
try! audioFile.write(from: pcmBuffer)
converterCallback.m4aEncoded(to: m4aUrl)
} catch {
print(error.localizedDescription)
}
}
</code></pre>
<p>使用 <code>AVAudioFileTypeKey</code> 作为 <code>m4a type</code> 将其保存为 .m4a 会导致文件格式错误。</p>
<p>使用上述设置将其保存为 .aac 可播放文件,但声音中断。只是原始音频的嗡嗡声带有一些慢动作效果,最初我认为这与采样率的输入和输出有关,但事实并非如此。</p>
<p>我认为输出字典有问题。任何帮助将不胜感激。</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>至少使用您显示的代码创建 AAC 文件是可行的。</p>
<p>我写出了两个具有有效 Int16 音频数据的 NSArray,并且您的代码得到了一个有效的结果,例如在 QuickTime Player 中使用(使用后缀 .aac)播放时,听起来与输入相同。 </p>
<p> <a href="/image/vZcZQ.png" rel="noreferrer noopener nofollow"><img src="/image/vZcZQ.png" alt="encoded audio"/></a> </p>
<p>你是如何创建输入的?</p>
<p>嗡嗡声(有很多噪音)例如如果您使用 AVAudioFormat 读取音频数据,例如<em>.pcmFormatInt16</em> 格式,但实际读取的数据是 <em>.pcmFormatFloat32</em> 格式(最常见的默认格式)。如果您尝试这样做,很遗憾没有运行时警告。</p>
<p>如果是这种情况,请尝试使用 <em>.pcmFormatFloat32</em>。如果您在 <em>Int16</em> 中需要它,您可以通过基本上将两个 channel 的 [-1,1] 映射到 [-32768,32767] 来自行转换。</p>
<pre><code>let fac = Float(1 << 15)
for i in 0..<count {
let val = min(max(inBuffer!.floatChannelData! * fac, -fac), fac - 1)
xxx = Int16(val)
}
...
</code></pre></p>
<p style="font-size: 20px;">关于ios - 使用原始 PCM 生成视频或音频,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/50368988/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/50368988/
</a>
</p>
页:
[1]