首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVFoundation:使用AVAudioEngine和AVAudioFile的格式错误的.m4a文件格式

AVFoundation:使用AVAudioEngine和AVAudioFile的格式错误的.m4a文件格式
EN

Stack Overflow用户
提问于 2014-06-25 14:24:08
回答 1查看 3.5K关注 0票数 4

我在iOS 8测试版中使用新的AVFoundation框架使用AVAudioEngine和AVAudioFile写入数据时遇到了问题。

我想使用m4a格式在输入节点上点击来写入数据。但是,输出文件似乎已损坏,但使用完全相同的设置将文件格式更改为.aac,该文件格式良好,可以成功播放:

代码语言:javascript
复制
import Foundation
import AVFoundation

func captureMicrophoneInput() {
    var error : NSError?

    var audioFileSettings = Dictionary<NSObject, AnyObject>()
    audioFileSettings[AVFormatIDKey]                 = kAudioFormatMPEG4AAC
    audioFileSettings[AVNumberOfChannelsKey]         = 1
    audioFileSettings[AVSampleRateKey]               = 44100.0
    audioFileSettings[AVEncoderBitRatePerChannelKey] = 16
    audioFileSettings[AVEncoderAudioQualityKey]      = AVAudioQuality.Medium.toRaw()

    let audioEngine = AVAudioEngine()
    let inputNode = audioEngine.inputNode

    // by using .acc the output file can be played successfully
    let url : CFURL = NSURL.fileURLWithPath("/path/to/outputdir/myFileWithProblematicExtension.m4a") as CFURL
    var audioFile = AVAudioFile(forWriting: url, settings: audioFileSettings, error: &error)

    if error != nil {
        println("AVAudioFile error")
        println(error)
        return
    }   

    // Write the output of the input node to disk
    inputNode.installTapOnBus(0, bufferSize: 4096, 
                                     format: inputNode.outputFormatForBus(0), 
                                      block: { (audioPCMBuffer : AVAudioPCMBuffer!, audioTime : AVAudioTime!) in
        audioFile.writeFromBuffer(audioPCMBuffer, error: &error)

        if error != nil {
            println("AVAudioFile error")
            println(error)
            return
        }
    })    

    audioEngine.startAndReturnError(&error)
}

如果有人能在这方面提供一些意见,我会很高兴。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2014-09-26 13:43:05

从XCode 6.0/Swift 1.0GM开始,我的Swift代码也不能记录为MPEG4AAC格式。显然,常量kAudioFormatMPEG4AAC的定义仍然不正确。该文件已创建,但未填充任何音频样本。

我能找到的唯一解决办法是在Objective C帮助函数中构建设置字典:

代码语言:javascript
复制
+ (NSDictionary *)getRecorderSettings
{
    return @{AVFormatIDKey: @(kAudioFormatMPEG4AAC),
             AVNumberOfChannelsKey: @(1),
             AVSampleRateKey:@(22050),
             AVEncoderAudioQualityKey: @(AVAudioQualityHigh)};
}

并将其传递回用于初始化AVAudioRecorder的Swift代码:

代码语言:javascript
复制
_recorder = AVAudioRecorder(URL: fileURL, settings: recsettings, error: &initRecorderError)   
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24401609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档