Fatal error: 'try!' expression unexpectedly raised an error : Error Domain=com.apple.coreaudio.avfaudio Code=2003332927

huangapple go评论60阅读模式
英文:

Fatal error: 'try!' expression unexpectedly raised an error : Error Domain=com.apple.coreaudio.avfaudio Code=2003332927

问题

Using Xcode 14.3,尝试更新较旧的Swift应用程序,录制声音后,将其保存以播放所需的效果,但是一旦尝试播放它,应用程序立即崩溃。

致命错误:'try!'表达式意外引发错误:错误域=com.apple.coreaudio.avfaudio,代码=2003332927 "(null)" 用户信息={failed call=AudioConverterSetProperty(converter, kAudioConverterEncodeBitRate, sizeof(UInt32), &bitRate)}

在以下代码的第一行崩溃:

func saveVoiceCganger() {
    do{
        
        let newAudio:AVAudioFile = try! AVAudioFile(forWriting: getOutPutUrl(), settings:  [
            AVFormatIDKey: NSNumber(value:kAudioFormatAppleLossless),
            AVEncoderAudioQualityKey : AVAudioQuality.low.rawValue,
            AVEncoderBitRateKey : 320000,
            AVNumberOfChannelsKey: 2,
            AVSampleRateKey : 44100.0
            ])
        let length = self.audioFile?.length
        self.audioEngine.mainMixerNode.installTap(onBus: 0, bufferSize: 1024, format: self.audioEngine.mainMixerNode.outputFormat(forBus: 0)) {
            (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
            
            
            print(newAudio.length)
            print("=====================")
            print(length!)
            print("**************************")
            
            if (newAudio.length) < length! {//Let us know when to stop saving the file, otherwise saving infinitely
                
                do{
                    //print(buffer)
                    try newAudio.write(from: buffer)
                }catch _{
                    print("Problem Writing Buffer")
                }
            }else{
                self.audioEngine.mainMixerNode.removeTap(onBus: 0)
            }
            
        }
    }catch _{
        print("Problem")
    }
}
英文:

Using Xcode 14.3, trying to update an older swift app, once recording a voice, it is then saved to play the required effect, however, app crashes as soon as I try to play it.

Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=com.apple.coreaudio.avfaudio Code=2003332927 "(null)" UserInfo={failed call=AudioConverterSetProperty(converter, kAudioConverterEncodeBitRate, sizeof(UInt32), &bitRate)}

Crashes on the first line of this

func saveVoiceCganger() {
        do{
            
            let newAudio:AVAudioFile = try! AVAudioFile(forWriting: getOutPutUrl(), settings:  [
                AVFormatIDKey: NSNumber(value:kAudioFormatAppleLossless),
                AVEncoderAudioQualityKey : AVAudioQuality.low.rawValue,
                AVEncoderBitRateKey : 320000,
                AVNumberOfChannelsKey: 2,
                AVSampleRateKey : 44100.0
                ])
            let length = self.audioFile?.length
            self.audioEngine.mainMixerNode.installTap(onBus: 0, bufferSize: 1024, format: self.audioEngine.mainMixerNode.outputFormat(forBus: 0)) {
                (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
                
                
                print(newAudio.length)
                print("=====================")
                print(length!)
                print("**************************")
                
                if (newAudio.length) < length! {//Let us know when to stop saving the file, otherwise saving infinitely
                    
                    do{
                        //print(buffer)
                        try newAudio.write(from: buffer)
                    }catch _{
                        print("Problem Writing Buffer")
                    }
                }else{
                    self.audioEngine.mainMixerNode.removeTap(onBus: 0)
                }
                
            }
        }catch _{
            print("Problem")
        }
    }

答案1

得分: 1

请看以下翻译:

总体而言,将 ! 视为崩溃运算符,不要使用它。在这个上下文中,它意味着尝试调用一些可能引发异常的函数,如果引发异常则崩溃。

try! 更改为 try,然后在您的捕获块中记录错误(不要使用 catch _ 并忽略结果)。

在其他上下文中,! 是一个强制解包运算符,即“如果为 nil 则崩溃”运算符。它还可以用来创建“隐式解包可选值”,每当引用这种可选值并且它为 nil 时都会引发崩溃。

! 运算符也可以用作逻辑 NOT。这种用法不会导致崩溃。)

英文:

In general, think of the ! as the crash operator, and don't use it. In this context, it means try calling some function that throws, and crash if it throws.

Change try! to try, and then in your catch, log the error. (don't use catch _ and ignore the result.)

In other contexts, ! is a force-unwrap, which is the "crash if nil` operator. It can also be used as to create "implicitly unwrapped optionals", which set up a crash any time you reference such an optional and it's nil.

(The ! operator can also be logical NOT. That use doesn't cause crashes.)

huangapple
  • 本文由 发表于 2023年5月24日 17:56:54
  • 转载请务必保留本文链接:https://go.coder-hub.com/76322263.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定