媒体播放器
本文介绍如何调用媒体播放器相关的 API 播放本地或在线媒体资源,或将媒体资源同步分享给声网频道内的远端用户观看或收听。
前提条件
在进行操作之前,请确保你已经在项目中实现了基本的实时音视频功能。详见实现音视频互动。
实现方法
参考如下步骤,在你的项目中实现媒体播放功能:
-
初始化
AgoraRtcEngineKit
后,创建AgoraRtcMediaPlayerProtocol
对象。SwiftagoraKit = AgoraRtcEngineKit.sharedEngine(with: config, delegate: self)
mediaPlayerKit = agoraKit.createMediaPlayer(with: self) -
实现媒体播放器回调。
Swift
extension MediaPlayerMain: AgoraRtcMediaPlayerDelegate {
func agoraRtcMediaPlayer(_ playerKit: AgoraRtcMediaPlayerProtocol, didChangedTo state: AgoraMediaPlayerState, error: AgoraMediaPlayerError) {
LogUtils.log(message: "player rtc channel publish helper state changed to: \(state.rawValue), error: \(error.rawValue)", level: .info)
DispatchQueue.main.async {[weak self] in
guard let weakself = self else { return }
switch state {
case .failed:
weakself.showAlert(message: "media player error: \(error.rawValue)")
break
case .openCompleted:
let duration = weakself.mediaPlayerKit.getDuration()
weakself.playerControlStack.isHidden = false
weakself.playerDurationLabel.text = "\(String(format: "%02d", duration / 60)) : \(String(format: "%02d", duration % 60))"
weakself.playerProgressSlider.setValue(0, animated: true)
break
case .stopped:
weakself.playerControlStack.isHidden = true
weakself.playerProgressSlider.setValue(0, animated: true)
weakself.playerDurationLabel.text = "00 : 00"
break
default: break
}
}
}
func agoraRtcMediaPlayer(_ playerKit: AgoraRtcMediaPlayerProtocol, didChangedToPosition position: Int) {
let duration = Float(mediaPlayerKit.getDuration() * 1000)
var progress: Float = 0
var left: Int = 0
if duration > 0 {
progress = Float(mediaPlayerKit.getPosition()) / duration
left = Int((mediaPlayerKit.getDuration() * 1000 - mediaPlayerKit.getPosition()) / 1000)
}
DispatchQueue.main.async {[weak self] in
guard let weakself = self else { return }
weakself.playerDurationLabel.text = "\(String(format: "%02d", left / 60)) : \(String(format: "%02d", left % 60))"
if !weakself.playerProgressSlider.isTouchInside {
weakself.playerProgressSlider.setValue(progress, animated: true)
}
}
}
}
-
渲染本地媒体播放视图。
SwiftmediaPlayerKit.setView(localVideo.videoView)
let videoCanvas = AgoraRtcVideoCanvas()
videoCanvas.view = localVideo.videoView
videoCanvas.renderMode = .hidden
videoCanvas.sourceType = .mediaPlayer
videoCanvas.sourceId = mediaPlayerKit.getMediaPlayerId()
agoraKit.setupLocalVideo(videoCanvas) -
加入频道前,设置媒体播放器 ID,发布媒体播放器的音视频,将媒体资源分享给声网频道内的远端用户。
Swiftlet option1 = AgoraRtcChannelMediaOptions()
...
option1.publishMediaPlayerId = .of((Int32)(mediaPlayerKit.getMediaPlayerId())) -
打开本地或在线媒体文件。
SwiftmediaPlayerKit.open(url, startPos: 0)
-
播放媒体文件。
注意请在收到
didChangedToState
回调报告播放状态为AgoraMediaPlayerStateOpenCompleted
后再调用play
方法播放媒体文件。SwiftmediaPlayerKit.play()
-
当用户离开频道时,停止播放、销毁媒体播放器、取消注册播放观测器,并销毁分配的资源。
SwiftmediaPlayerKit.stop()
agoraKit.destroyMediaPlayer(mediaPlayerKit)
参考信息
本节介绍本文中使用方法的更多信息以及相关页面的链接。
示例项目
声网在 GitHub 上提供了一个开源的示例项目 MediaPlayer。