跳到主要内容

音视频播放

更新时间: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)

倍速播放

注意
  1. 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)