AVAudioPlayer не играет ничего - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть tableViewCell, и я хочу воспроизвести звук, как правило .m4a внутри него.Я глобально объявил мой AVAudioPlayer экземпляр следующим образом:

var player = AVAudioPlayer()

Затем я загружаю свой звук и помещаю его в каталог в Documents.Но, когда я пытаюсь воспроизвести свой звуковой файл из каталога, я получаю эту ошибку:

Open failed
The operation couldn’t be completed. (OSStatus error 2003334207.)

Это мой код, я не понимаю, что не так.и я отследил файлы в симуляторе и смог воспроизвести их с помощью QuickTimePlayer.

func downloadSound(_ message: ChatVoiceMessageStructure) {
    guard let url = service?.networkManager.CDNURL else { return }
    let doanloadURL = URL(string: url.appending(message.name!))
    let docUrl:URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first as URL!
    let desURL = docUrl.appendingPathComponent("tmpsong.m4a")
    var downloadTask:URLSessionDownloadTask
    let request = URLRequest(url: doanloadURL!)
    downloadTask = URLSession.shared.downloadTask(with: request, completionHandler: { [weak self](URLData, response, error) -> Void in
        do{
            let isFileFound:Bool? = FileManager.default.fileExists(atPath: desURL.path)
            if isFileFound == true{
                print(desURL) //delete tmpsong.m4a & copy
            } else {
                try FileManager.default.copyItem(at: URLData!, to: desURL)
            }
            let sPlayer = try AVAudioPlayer(contentsOf: desURL)
            self?.player = sPlayer
            self?.player.prepareToPlay()
            self?.player.play()

        } catch let err {
            print(err.localizedDescription)
        }

    })
    downloadTask.resume()

}

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Я наконец понял проблему благодаря MAhipal. Проблема заключалась в том, что AVAudioPlayer не может воспроизводить какие-либо аудиоформаты. например, когда аудио расширение MPEG4, но аудио кодирование не AAC. Поэтому обратите внимание на форматы, которые поддерживает AVAudioPlayer. Вы можете найти их в CoreAudio Class, подклассах AudioFormatID. Это заняло у меня несколько недель, чтобы решить надежду, что это сэкономит время другим. если вы хотите играть в другие типы, вы можете использовать AVPlayer

Это типы для будущих ссылок:

public var kAudioFormatLinearPCM: AudioFormatID { get }
public var kAudioFormatAC3: AudioFormatID { get }
public var kAudioFormat60958AC3: AudioFormatID { get }
public var kAudioFormatAppleIMA4: AudioFormatID { get }
public var kAudioFormatMPEG4AAC: AudioFormatID { get }
public var kAudioFormatMPEG4CELP: AudioFormatID { get }
public var kAudioFormatMPEG4HVXC: AudioFormatID { get }
public var kAudioFormatMPEG4TwinVQ: AudioFormatID { get }
public var kAudioFormatMACE3: AudioFormatID { get }
public var kAudioFormatMACE6: AudioFormatID { get }
public var kAudioFormatULaw: AudioFormatID { get }
public var kAudioFormatALaw: AudioFormatID { get }
public var kAudioFormatQDesign: AudioFormatID { get }
public var kAudioFormatQDesign2: AudioFormatID { get }
public var kAudioFormatQUALCOMM: AudioFormatID { get }
public var kAudioFormatMPEGLayer1: AudioFormatID { get }
public var kAudioFormatMPEGLayer2: AudioFormatID { get }
public var kAudioFormatMPEGLayer3: AudioFormatID { get }
public var kAudioFormatTimeCode: AudioFormatID { get }
public var kAudioFormatMIDIStream: AudioFormatID { get }
public var kAudioFormatParameterValueStream: AudioFormatID { get }
public var kAudioFormatAppleLossless: AudioFormatID { get }
public var kAudioFormatMPEG4AAC_HE: AudioFormatID { get }
public var kAudioFormatMPEG4AAC_LD: AudioFormatID { get }
public var kAudioFormatMPEG4AAC_ELD: AudioFormatID { get }
public var kAudioFormatMPEG4AAC_ELD_SBR: AudioFormatID { get }
public var kAudioFormatMPEG4AAC_ELD_V2: AudioFormatID { get }
public var kAudioFormatMPEG4AAC_HE_V2: AudioFormatID { get }
public var kAudioFormatMPEG4AAC_Spatial: AudioFormatID { get }
public var kAudioFormatAMR: AudioFormatID { get }
public var kAudioFormatAMR_WB: AudioFormatID { get }
public var kAudioFormatAudible: AudioFormatID { get }
public var kAudioFormatiLBC: AudioFormatID { get }
public var kAudioFormatDVIIntelIMA: AudioFormatID { get }
public var kAudioFormatMicrosoftGSM: AudioFormatID { get }
public var kAudioFormatAES3: AudioFormatID { get }
public var kAudioFormatEnhancedAC3: AudioFormatID { get }
public var kAudioFormatFLAC: AudioFormatID { get }
public var kAudioFormatOpus: AudioFormatID { get }
0 голосов
/ 16 ноября 2018

, пожалуйста, запустите Реальное устройство & Добавьте DispatchQueue.main.async в URLSession блок.

Здесь я попробовал ваш код с небольшим изменением, и он работает на реальном устройстве ...

var audioPlayer:AVAudioPlayer!
    func downloadSound() {
        let doanloadURL = URL(string: "https://github.com/robovm/apple-ios-samples/raw/master/avTouch/sample.m4a")!
        let docUrl:URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
        let desURL = docUrl.appendingPathComponent("sample.m4a")
        var downloadTask:URLSessionDownloadTask
        let request = URLRequest(url: doanloadURL)
        downloadTask = URLSession.shared.downloadTask(with: request, completionHandler: { (URLData, response, error) -> Void in
            DispatchQueue.main.async {
                do{
                    let isFileFound:Bool? = FileManager.default.fileExists(atPath: desURL.path)
                    if isFileFound == true{
                        print(desURL) //delete tmpsong.m4a & copy
                    } else {
                        try FileManager.default.copyItem(at: URLData!, to: desURL)
                    }
                     let sPlayer = try AVAudioPlayer(contentsOf: desURL)
                    try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
                    try AVAudioSession.sharedInstance().setActive(true)
                    self.audioPlayer = sPlayer
                    self.audioPlayer.prepareToPlay()
                    self.audioPlayer.play()
                  } catch let err {
                    print(err.localizedDescription)
                }
            }
         })
        downloadTask.resume()
     }
...