首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在我的应用程序中使用url在iOS中播放音频文件

无法在我的应用程序中使用url在iOS中播放音频文件
EN

Stack Overflow用户
提问于 2022-03-09 11:53:27
回答 1查看 357关注 0票数 2

音频链接

我上传了一个记录在我的谷歌驱动器链接(上述),并设置为公众。我试图使用音频工具包和其他音频player(cocoapods)与url,下载文件和播放,我试着转换成其他格式,没有任何工作对我。我不能演奏它。此音频也不在safari浏览器中播放。录音是在web平台上完成的,生成的音频格式是.opus。

EN

回答 1

Stack Overflow用户

发布于 2022-03-09 13:59:39

请试着用下面的代码告诉我是否适合你。

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

class ViewController: UIViewController {

    var player: AVPlayer?
    var playerItem:AVPlayerItem?
    fileprivate let seekDuration: Float64 = 10
    
    @IBOutlet weak var labelCurrentTime: UILabel!
    @IBOutlet weak var labelOverallDuration: UILabel!
    @IBOutlet weak var playbackSlider: UISlider!
    @IBOutlet weak var playButtonOutlet: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        initAudioPlayer()
    }
    
    //call this mehtod to init audio player
    func initAudioPlayer() {
        
        let url = URL(string: "https://argaamplus.s3.amazonaws.com/eb2fa654-bcf9-41de-829c-4d47c5648352.mp3")
        let playerItem:AVPlayerItem = AVPlayerItem(url: url!)
        player = AVPlayer(playerItem: playerItem)
        
        playbackSlider.minimumValue = 0
        
        //To get overAll duration of the audio
        let duration : CMTime = playerItem.asset.duration
        let seconds : Float64 = CMTimeGetSeconds(duration)
        labelOverallDuration.text = self.stringFromTimeInterval(interval: seconds)
        
        //To get the current duration of the audio
        let currentDuration : CMTime = playerItem.currentTime()
        let currentSeconds : Float64 = CMTimeGetSeconds(currentDuration)
        labelCurrentTime.text = self.stringFromTimeInterval(interval: currentSeconds)
        
        playbackSlider.maximumValue = Float(seconds)
        playbackSlider.isContinuous = true
        
        player!.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, preferredTimescale: 1), queue: DispatchQueue.main) { (CMTime) -> Void in
            if self.player!.currentItem?.status == .readyToPlay {
                let time : Float64 = CMTimeGetSeconds(self.player!.currentTime());
                self.playbackSlider.value = Float ( time );
                self.labelCurrentTime.text = self.stringFromTimeInterval(interval: time)
            }
            let playbackLikelyToKeepUp = self.player?.currentItem?.isPlaybackLikelyToKeepUp
            if playbackLikelyToKeepUp == false{
                print("IsBuffering")
                self.playButtonOutlet.isHidden = true
            } else {
                //stop the activity indicator
                print("Buffering completed")
                self.playButtonOutlet.isHidden = false
            }
        }
        
        //change the progress value
        playbackSlider.addTarget(self, action: #selector(playbackSliderValueChanged(_:)), for: .valueChanged)
        
        //check player has completed playing audio
        NotificationCenter.default.addObserver(self, selector: #selector(self.finishedPlaying(_:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerItem)}
    
    
    @objc func playbackSliderValueChanged(_ playbackSlider:UISlider) {
        let seconds : Int64 = Int64(playbackSlider.value)
        let targetTime:CMTime = CMTimeMake(value: seconds, timescale: 1)
        player!.seek(to: targetTime)
        if player!.rate == 0 {
            player?.play()
        }
    }
    
    @objc func finishedPlaying( _ myNotification:NSNotification) {
        playButtonOutlet.setImage(UIImage(named: "play"), for: UIControl.State.normal)
        //reset player when finish
        playbackSlider.value = 0
        let targetTime:CMTime = CMTimeMake(value: 0, timescale: 1)
        player!.seek(to: targetTime)
    }
    
    @IBAction func playButton(_ sender: Any) {
        print("play Button")
        if player?.rate == 0
        {
            player?.play()
            self.playButtonOutlet.isHidden = true
            playButtonOutlet.setImage(UIImage(systemName: "pause"), for: UIControl.State.normal)
        } else {
            player?.pause()
            playButtonOutlet.setImage(UIImage(systemName: "play"), for: UIControl.State.normal)
        }
        
    }
    
    func stringFromTimeInterval(interval: TimeInterval) -> String {
        let interval = Int(interval)
        let seconds = interval % 60
        let minutes = (interval / 60) % 60
        let hours = (interval / 3600)
        return String(format: "%02d:%02d:%02d", hours, minutes, seconds)
    }
    
    @IBAction func seekBackWards(_ sender: Any) {
        if player == nil { return }
        let playerCurrenTime = CMTimeGetSeconds(player!.currentTime())
        var newTime = playerCurrenTime - seekDuration
        if newTime < 0 { newTime = 0 }
        player?.pause()
        let selectedTime: CMTime = CMTimeMake(value: Int64(newTime * 1000 as Float64), timescale: 1000)
        player?.seek(to: selectedTime)
        player?.play()
    }
    
    @IBAction func seekForward(_ sender: Any) {
        if player == nil { return }
        if let duration = player!.currentItem?.duration {
            let playerCurrentTime = CMTimeGetSeconds(player!.currentTime())
            let newTime = playerCurrentTime + seekDuration
            if newTime < CMTimeGetSeconds(duration)
            {
                let selectedTime: CMTime = CMTimeMake(value: Int64(newTime * 1000 as Float64), timescale: 1000)
                player!.seek(to: selectedTime)
            }
            player?.pause()
            player?.play()
        }
    }
}

下面是一个演示:https://github.com/florentin89/PlaySongFromExternalSource

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71408926

复制
相关文章

相似问题

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