为啥我无法播放 AVAudioRecorder 录制的声音文件?
Posted
技术标签:
【中文标题】为啥我无法播放 AVAudioRecorder 录制的声音文件?【英文标题】:Why can't I playback sound files recorded by AVAudioRecorder?为什么我无法播放 AVAudioRecorder 录制的声音文件? 【发布时间】:2015-11-27 12:53:14 【问题描述】:这就是我定义 myrecorder 和 myplayer 的方式
var myrecorder:AVAudioRecorder!
var myplayer : AVAudioPlayer!
这是在 viewDidLoad() 中设置 myrecorder 的代码
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
filepath = "\(getDocumentsDirectory())/001.caf"
print(filepath)
try! session.setCategory(AVAudiosessionCategoryPlayAndRecord)
//define settings
let recordSettings: [String: AnyObject] = [
AVFormatIDKey: NSNumber(unsignedInt: kAudioFormatMPEG4AAC),
AVEncoderAudioQualityKey : AVAudioQuality.Medium.rawValue,
AVSampleRateKey: 44100.0,
AVNumberOfChannelsKey: 2,
]
myrecorder = try! AVAudioRecorder(URL: NSURL(fileURLWithPath: filepath), settings: recordSettings)
myrecorder.delegate = self
myrecorder.prepareToRecord()
我有控制记录和停止的按钮,我得到了文件 001.caf。我可以播放声音文件,但我认为文件不够好。
@IBAction func Play()
try! myplayer = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: filepath))
myplayer.volume = 0.5
myplayer.play()
print("Playing...")
播放成功,没有任何错误或崩溃。只有一个问题,播放时没有声音。
我认为我在录制阶段遗漏了一些东西,但我找不到它。请帮忙。
【问题讨论】:
【参考方案1】:问题在于在这一行中实例化的 AVAudioPlayer。
try! myplayer = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: filepath))
这个实例 myplayer 将在播放功能完成后立即被释放。
在另一个函数中实例化 AVAudio 播放器,例如 Viewdidload,这样它即使在控件离开播放函数后仍然存在。
【讨论】:
不,它不起作用。我在外面有 myplayer 定义。让我正确解决问题 而且,顺便说一句,如果您在 Viewdidload 中启动它,它不会使实例永久化。要使实例坚持,您必须在任何特定方法之外定义它,这有效地使其坚持自我。当自我在那里时,对象就在那里。而且你在定义它时也不能放弱。何时何地初始化实例并不重要。我以为我不必显示定义代码,因为我的实例名称之前没有 LET,这意味着我已经在外面定义了它。这都是关于变量的范围。【参考方案2】:好的,终于找到问题了。
您不能使用 AVAudioSessionCategoryPlayAndRecord。
录制时必须使用 AVAudioSessionCategoryRecord,播放时必须使用 AVAudioSessionCategoryPlayback。并且您在播放和录制时来回设置会话。
AVAudioSessionCategoryPlayAndRecord 用于需要同时播放和录音的情况,比如语音聊天时...
【讨论】:
不是这样。AVAudioSessionCategoryPlayAndRecord
上的文档说:“此类别适用于同时录制和播放,也适用于录制和播放但不是同时进行的应用程序 [我的斜体]。”
自己试试吧。我想我们不能真正遵循文件所说的 100%。就我而言,如果我使用的是 AVAudioSessionCategoryPlayAndRecord,那么我无法播放我录制的 CAF 文件。当我将类型切换为播放时播放和录制时录制时,一切正常。
我注意到您在代码中设置了会话类别,但您从未激活会话。这更有可能是问题所在。以上是关于为啥我无法播放 AVAudioRecorder 录制的声音文件?的主要内容,如果未能解决你的问题,请参考以下文章