音视频播放
更新时间:2025-12-31 14:54:05
RTCXMedia 提供设备的直播,回放,截图,录制,音频对讲等相关功能
// 导入媒体播放头文件
import { RTCXMediaControl, RTCXMediaService, RTCXMediaType, RTCXPlayerView } from 'rtcxsdk'
播放器初始化
export declare class PlayerController implements IPlayerController {
private playInfo;
private playerListener;
constructor(playInfo: IPlayInfo, mediaListener: IMediaListener);
}
export declare struct PlayerView {
@Prop
playInfo: IPlayInfo;
@State
playerController: IPlayerController | undefined;
}
调用示例如下:
// 声明属性
@State playInfo: RTCXMediaType.IPlayInfo|undefined = undefined
private playerController: RTCXMediaService.IPlayerController | undefined
//1. 创建播放控制器
const playInfo: RTCXMediaType.IPlayInfo = {
iotId: PlayDeviceInfo.iotId,
productKey: PlayDeviceInfo.productKey,
deviceName: PlayDeviceInfo.deviceName,
lensId: 0,
streamType: 0,
deviceType: 0
}
this.playInfo = playInfo
this.playerController = new RTCXMediaControl.PlayerController(playInfo, this.playerListener)
//2. 创建播放窗口
build() {
Column({ space: 0 }) {
RTCXPlayerView({
playInfo: this.playInfo,
playerController: this.playerController
}).width('100%').height('100%')
}
}
直播
export interface IPlayerController {
/**
直播调用
*/
start(): void;
}
调用示例如下:
// 开始直播
this.playerController.start()
云/SD 卡回放
export interface IPlayerController {
/**
回放调用
@param playbackInfo 回放参数
*/
seekToTime(playbackInfo: IPlaybackInfo): void;
}
调用示例如下:
// 云回放或SD卡回放
const playbackInfo: RTCXMediaType.IPlaybackInfo = {
startTime: beginT!,
endTime: endT!,
playbackType: RTCXMediaType.PlaybackTypeEnum.CloudRecord
}
this.playerController?.seekToTime(playbackInfo)
监听播放状态
/// 播放器状态回调
export interface IMediaListener {
/**
player播放状态回调
@param status player状态
@param code player错误码
*/
onPlayStatusChanged: (status: ECameraPlayerStatus, code: number) => void;
}
调用示例如下:
playerListener: RTCXMediaType.IMediaListener = {
onPlayStatusChanged: (status: RTCXMediaType.ECameraPlayerStatus, code: number)=>{
RTCXLogger.i(TAG, '播放状态变化')
},
}
播放状态码
| 播放状态 | 状态码&描述 |
|---|---|
| ECameraPlayerStatus.Stopped | -501:SD卡回放没有更多数据了(回放结束) |
| ECameraPlayerStatus.PlaybackCompleted | -10010:到达了限制播放时长 |
| ECameraPlayerStatus.Error | -2:播放通道断开连接 -5:播放通道异常预警 -10025:SD卡回放达到最大路数限制 -10047:低功耗设备即将进入休眠 |
播放器销毁
当不再需要播放的时候,要销毁播放器
export interface IPlayerController {
/**
释放player(不再需要时调用释放)
*/
releasePlayer(): void;
}
调用示例如下:
// 销毁播放器
this.playerController?.releasePlayer()
截图
export interface IPlayerController {
/**
截图
@param path 保存文件夹
@param isAddTimeWatermark 是否添加时间水印
*/
snapshot(path: string, isAddTimeWatermark: boolean): boolean;
}
调用示例如下:
// 截图
const context = getContext(this) as common.UIAbilityContext;
const filesDir = context.filesDir; // 获取 filesDir 路径
const targetPath = `${context.filesDir}/${this.deviceInfo?.iotId}}`;
const succeed = this.playerController?.snapshot(targetPath, false)
if (succeed) {
showToast(this, `截屏成功`)
this.savePlaySnapshot(targetPath)
} else {
showToast(this, `截屏失败`)
}
静音
export interface IPlayerController {
/**
设置播放是否静音
@param mute 是否静音 YES:静音 NO:非静音
*/
setMuteRemoteAudio(mute: boolean): void;
}
调用示例如下:
// 是否静音 YES/NO
this.playerController?.setMuteRemoteAudio(false)
倍速播放
注意
- SD卡非1倍速播放时,是不支持静音设置和视屏录制的
export interface IPlayerController {
/**
倍速播放
@param rate 1、2、4等
*/
setPlaybackSpeed(rate: number): void;
}
调用示例如下:
// 设置倍速
this.playerController?.setPlaybackSpeed(rate)
边播边录
export interface IPlayerController {
/**
边播边录
@param path 保存文件夹
@param isAddTimeWatermark 是否添加时间水印
*/
startRecord(path: string, isAddTimeWatermark: boolean): boolean;
/**
停止边播边录
*/
stopRecord(): boolean;
}
调用示例如下:
// 边播边录
recordStart(): boolean {
const context = getContext(this) as common.UIAbilityContext;
const filesDir = context.filesDir; // 获取 filesDir 路径
const targetPath = `${context.filesDir}/${this.deviceInfo?.iotId}}`;
const succeed = this.playerController?.startRecord(targetPath, false)
return succeed??false
}
recordStop(): boolean {
const succeed = this.playerController?.stopRecord()
return succeed??false
}
// 设置录制状态监听回调
playerListener: RTCXMediaType.IMediaListener = {
onPlayRecord: (progress: number, filePath: string|undefined, error: BusinessError<void>|undefined)=>{
RTCXLogger.i(this.TAG, `直播页录制进度:${progress}, ${filePath},${error}`)
if (filePath) {// 录制完成
this.savePlayRecord(filePath)
} else {
const progressStr = formatMillisecondsToTime(progress)
showToast(this,`当前进度:${progressStr}`)
}
}
}
画面旋转
export interface IPlayerController {
/**
设置旋转角度
@param degrees 旋转角度
*/
setVideoRotate(degrees: ERenderRotation): void;
}
调用示例如下:
// 设置画面旋转90度
this.playerController?.setVideoRotate(ERenderRotation.Rotation_90)
音频通话(语音对讲)
export interface IAudioVideoTalk {
/**
开始通话
*/
startTalk(): void,
/**
结束通话
*/
endTalk(): void,
}
export interface IAudioVideoTalkListener {
/**
音视频通话失败回调
@param error 错误
*/
onFailToAudioVideoTalk?: (error: BusinessError<void>|undefined)=>void
}
export enum EAudioVideoTalkType {
Audio = 0,// 音频通话
Video = 1 // 视频通话
}
export class AudioVideoTalk implements IAudioVideoTalk {
private playInfo: IPlayInfo|undefined
private talkListener: IAudioVideoTalkListener|undefined
private avTalkType: EAudioVideoTalkType|undefined
constructor(playInfo: IPlayInfo, avTalkType: EAudioVideoTalkType, talkListener: IAudioVideoTalkListener)
}
调用示例如下:
// 1. 添加监听
audiaListener: RTCXAudiaVideoService.IAudioVideoTalkListener = {
onFailToAudioVideoTalk: (error: BusinessError<void>|undefined)=>{
RTCXLogger.i(this.TAG, `对讲发生错误:${error?.code}, ${error?.message}`)
}
}
// 2. 初始化通话引擎
const playInfo: RTCXMediaType.IPlayInfo = {
iotId: this.deviceInfo?.iotId!,
productKey: this.deviceInfo?.productKey!,
deviceName: this.deviceInfo?.deviceName!,
lensId: 0,
streamType: 0,
deviceType: 0
}
this.audioTalkEngin = new RTCXAudiaVideoTalk.AudioVideoTalk(playInfo,RTCXAudiaVideoService.EAudioVideoTalkType.Audio,this.audiaListener)
// 3. 开始音频通话
this.audioTalkEngin.startTalk()
// 4. 结束音频通话
this.audioTalkEngin.endTalk()
码率
export interface IPlayerController {
/**
获取码率 单位bit
*/
getBitrate(): number;
}
调用示例如下:
// 获取码率
const bitrate = this.playerController?.getBitrate()
帧率
export interface IPlayerController {
/**
获取帧率 fps
*/
getPlayFPS(): number;
}
调用示例如下:
// 获取帧率
const fps = this.playerController?.getPlayFPS()
主子码流
直播支持设置主码流、子码流、其他码流播放,App可以在初始化播放器的时候提前设置码流参数,如果初始化播放器时未设置码流,则默认播放主码流;
const playInfo: RTCXMediaType.IPlayInfo = {
iotId: PlayDeviceInfo.iotId,
productKey: PlayDeviceInfo.productKey,
deviceName: PlayDeviceInfo.deviceName,
lensId: 0,
streamType: 1,// 设置码流
deviceType: 0
}
this.playInfo = playInfo
this.playerController = new RTCXMediaControl.PlayerController(playInfo, this.playerListener)
// 也可以通过该方法设置码流
// this.playerController?.setPlayStreamType(1)
...
若需要播放中途切换码流,需要先停止(releasePlayer())播放,设置码流后,再重新开启播放(start())
export interface IPlayerController {
/**
设置码流类型(设置码流之后需要重新开启播放)
@param streamType 0:主码流; 1:辅码流;2、3、...:其他码流
*/
}
调用示例如下:
// 设置主、子码流、其他码流
this.playerController?.setPlayStreamType(1)