2024/10/17 14:17:33
媒体播放器
本文介绍如何调用媒体播放器相关的 API 播放本地或在线媒体资源,或将媒体资源同步分享给声网频道内的远端用户。
前提条件
在进行操作之前,请确保你已经在项目中实现了基本的实时音视频功能。详见实现音视频互动。
实现方法
参考如下步骤,在你的项目中使用媒体播放器:
-
初始化
AgoraRtcEngineKit
后,调用createMediaPlayer
创建AgoraRtcMediaPlayerProtocol
对象。Swift// 初始化 AgoraRtcEngineKit
agoraKit = AgoraRtcEngineKit.sharedEngine(with: config, delegate: self)
// 创建 mediaPlayerKit 对象
mediaPlayerKit = agoraKit.createMediaPlayer(with: self) -
实现媒体播放器回调。根据你的需求,你可以通过
didChangedToState
回调来观测播放器的状态,通过didChangedToPosition
回调来获取当前媒体文件的播放进度。Swiftextension 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)
}
}
}
} -
调用
setupLocalVideo
渲染本地媒体播放视图。SwiftmediaPlayerKit.setView(localVideo.videoView)
let videoCanvas = AgoraRtcVideoCanvas()
videoCanvas.view = localVideo.videoView
videoCanvas.renderMode = .hidden
videoCanvas.sourceType = .mediaPlayer
videoCanvas.sourceId = mediaPlayerKit.getMediaPlayerId()
agoraKit.setupLocalVideo(videoCanvas) -
调用
joinChannelByToken
加入频道时,通过mediaOptions
设置媒体播放器 ID,发布媒体播放器的音视频,将媒体资源分享给声网频道内的远端用户。Swiftlet option1 = AgoraRtcChannelMediaOptions()
...
option1.publishMediaPlayerId = .of((Int32)(mediaPlayerKit.getMediaPlayerId())) -
调用
open
打开本地或在线媒体文件。SwiftmediaPlayerKit.open(url, startPos: 0)
-
调用
play
播放媒体文件。注意请在收到
didChangedToState
回调报告播放状态为AgoraMediaPlayerStateOpenCompleted
后再调用play
方法播放媒体文件。SwiftmediaPlayerKit.play()
-
当用户离开频道时,调用
stop
停止播放、调用destroyMediaPlayer
销毁媒体播放器、取消注册播放观测器,并销毁分配的资源。SwiftmediaPlayerKit.stop()
agoraKit.destroyMediaPlayer(mediaPlayerKit)
参考信息
示例项目
声网提供了开源的示例项目供你参考,你可以前往下载或查看其中的源代码。
支持的格式
声网的媒体播放器支持下列格式及协议:
视频编码格式
- H.263、H.264、H.265、MPEG4、MPEG2、RMVB、Theora、VP3、VP8、AVS、WMV
音频编码格式
- WAV、MP2、MP3、AAC、OPUS、FLAC、Vorbis、AMR-NB、AMR-WB、WMA v1、WMA v2
容器格式
- WAV、FLAC、OGG、MOV、ASF、FLV、PM3、MP4、MPEG-TS、Matroska (MKV)、AVI、ASS、CONCAT、DTS、AVS
支持的协议
- HTTP、HTTPS、RTMP、HLS、RTP、RTSP