提交 ee4a9432 编写于 作者: H hwgaizw

audio js api Signed-off-by: hwgaizw <gaizhengwei@huawei.com>

Signed-off-by: Nhwgaizw <gaizhengwei@huawei.com>
Change-Id: I011538971028418e6b6c2001e083f8a465b1bcfd
上级 3004db52
...@@ -18,10 +18,6 @@ ...@@ -18,10 +18,6 @@
详细API含义可参考:[媒体服务API文档AudioRecorder](../reference/apis/js-apis-media.md) 详细API含义可参考:[媒体服务API文档AudioRecorder](../reference/apis/js-apis-media.md)
### 开发者示例
端到端开发者示例请参考:https://gitee.com/openharmony/app_samples/blob/master/media/Recorder/entry/src/main/ets/MainAbility/pages/RecordPage.ets
### 全流程场景 ### 全流程场景
包含流程:创建实例,设置录制参数,录制音频,暂停录制,恢复录制,停止录制,释放资源等流程。 包含流程:创建实例,设置录制参数,录制音频,暂停录制,恢复录制,停止录制,释放资源等流程。
...@@ -29,46 +25,49 @@ ...@@ -29,46 +25,49 @@
```js ```js
import media from '@ohos.multimedia.media' import media from '@ohos.multimedia.media'
import mediaLibrary from '@ohos.multimedia.mediaLibrary' import mediaLibrary from '@ohos.multimedia.mediaLibrary'
export class AudioRecorderDemo {
let testFdNumber; private testFdNumber; // 用于保存fd地址
function SetCallBack(audioRecorder) { // 设置音频录制相关回调函数
audioRecorder.on('prepare', () => { // 设置'prepare'事件回调 setCallBack(audioRecorder) {
console.log('prepare success'); audioRecorder.on('prepare', () => { // 设置'prepare'事件回调
// 录制界面可切换至已准备好,可点击录制按钮进行录制 console.log('prepare success');
audioRecorder.start(); // 调用start方法开始录制,并触发start回调
}); });
audioRecorder.on('start', () => { // 设置'start'事件回调 audioRecorder.on('start', () => { // 设置'start'事件回调
console.log('audio recorder start success'); console.log('audio recorder start success');
// 将录制按钮切换至可暂停状态 audioRecorder.pause(); // 调用pause方法暂停录制,并触发pause回调
}); });
audioRecorder.on('pause', () => { // 设置'pause'事件回调 audioRecorder.on('pause', () => { // 设置'pause'事件回调
console.log('audio recorder pause success'); console.log('audio recorder pause success');
// 将录制按钮切换至可录制状态 audioRecorder.resume(); // 调用resume方法恢复录制,并触发resume回调
}); });
audioRecorder.on('resume', () => { // 设置'resume'事件回调 audioRecorder.on('resume', () => { // 设置'resume'事件回调
console.log('audio recorder resume success'); console.log('audio recorder resume success');
// 将录制按钮切换至可暂停状态 audioRecorder.stop(); // 调用stop方法停止录制,并触发stop回调
}); });
audioRecorder.on('stop', () => { // 设置'stop'事件回调 audioRecorder.on('stop', () => { // 设置'stop'事件回调
console.log('audio recorder stop success'); console.log('audio recorder stop success');
audioRecorder.reset(); // 调用reset方法重置录制,并触发reset回调
}); });
audioRecorder.on('release', () => { // 设置'release'事件回调 audioRecorder.on('reset', () => { // 设置'reset'事件回调
console.log('audio recorder release success'); console.log('audio recorder reset success');
audioRecorder.release(); // 调用release方法,释放资源,并触发release回调
}); });
audioRecorder.on('reset', () => { // 设置'reset'事件回调 audioRecorder.on('release', () => { // 设置'release'事件回调
console.log('audio recorder reset success'); console.log('audio recorder release success');
// 需要重新设置录制参数才能再次录制 audioRecorder = undefined;
}); });
audioRecorder.on('error', (error) => { // 设置'error'事件回调 audioRecorder.on('error', (error) => { // 设置'error'事件回调
console.info(`audio error called, errName is ${error.name}`); console.info(`audio error called, errName is ${error.name}`);
console.info(`audio error called, errCode is ${error.code}`); console.info(`audio error called, errCode is ${error.code}`);
console.info(`audio error called, errMessage is ${error.message}`); console.info(`audio error called, errMessage is ${error.message}`);
}); });
} }
// pathName是传入的录制文件名,例如:01.mp3,生成后的文件地址:/storage/media/100/local/files/Movies/01.mp3 // pathName是传入的录制文件名,例如:01.mp3,生成后的文件地址:/storage/media/100/local/files/Video/01.mp3
// 使用mediaLibrary需要添加以下权限, ohos.permission.MEDIA_LOCATION、ohos.permission.WRITE_MEDIA、ohos.permission.READ_MEDIA // 使用mediaLibrary需要添加以下权限, ohos.permission.MEDIA_LOCATION、ohos.permission.WRITE_MEDIA、ohos.permission.READ_MEDIA
async function getFd(pathName) { async getFd(pathName) {
let displayName = pathName; let displayName = pathName;
const mediaTest = mediaLibrary.getMediaLibrary(); const mediaTest = mediaLibrary.getMediaLibrary();
let fileKeyObj = mediaLibrary.FileKey; let fileKeyObj = mediaLibrary.FileKey;
...@@ -76,49 +75,37 @@ async function getFd(pathName) { ...@@ -76,49 +75,37 @@ async function getFd(pathName) {
let publicPath = await mediaTest.getPublicDirectory(mediaLibrary.DirectoryType.DIR_VIDEO); let publicPath = await mediaTest.getPublicDirectory(mediaLibrary.DirectoryType.DIR_VIDEO);
let dataUri = await mediaTest.createAsset(mediaType, displayName, publicPath); let dataUri = await mediaTest.createAsset(mediaType, displayName, publicPath);
if (dataUri != undefined) { if (dataUri != undefined) {
let args = dataUri.id.toString(); let args = dataUri.id.toString();
let fetchOp = { let fetchOp = {
selections : fileKeyObj.ID + "=?", selections : fileKeyObj.ID + "=?",
selectionArgs : [args], selectionArgs : [args],
} }
let fetchFileResult = await mediaTest.getFileAssets(fetchOp); let fetchFileResult = await mediaTest.getFileAssets(fetchOp);
let fileAsset = await fetchFileResult.getAllObject(); let fileAsset = await fetchFileResult.getAllObject();
let fdNumber = await fileAsset[0].open('Rw'); let fdNumber = await fileAsset[0].open('Rw');
fdNumber = "fd://" + fdNumber.toString(); this.testFdNumber = "fd://" + fdNumber.toString();
testFdNumber = fdNumber;
} }
}
async audioRecorderDemo() {
// 1.创建实例
let audioRecorder = media.createAudioRecorder();
// 2.设置回调
this.setCallBack(audioRecorder);
await this.getFd('01.mp3'); // 调用getFd方法获取需要录制文件的fd地址
// 3.设置录制参数
let audioRecorderConfig = {
audioEncodeBitRate : 22050,
audioSampleRate : 22050,
numberOfChannels : 2,
uri : this.testFdNumber, // testFdNumber由getFd生成
location : { latitude : 30, longitude : 130},
audioEncoderMime : media.CodecMimeType.AUDIO_AAC,
fileFormat : media.ContainerFormatType.CFT_MPEG_4A,
}
audioRecorder.prepare(audioRecorderConfig); // 调用prepare方法,触发prepare回调函数
}
} }
await getFd('01.mp3');
// 1.创建实例
let audioRecorder = media.createAudioRecorder();
// 2.设置回调
SetCallBack(audioRecorder);
// 3.设置录制参数
let audioRecorderConfig = {
audioEncoder : media.AudioEncoder.AAC_LC ,
audioEncodeBitRate : 22050,
audioSampleRate : 22050,
numberOfChannels : 2,
format : media.AudioOutputFormat.AAC_ADTS,
uri : testFdNumber, // testFdNumber由getFd生成
location : { latitude : 30, longitude : 130},
}
audioRecorder.prepare(audioRecorderConfig);
// 4.开始录制
audioRecorder.start(); // 需等待'prepare'事件回调完成后,才可调用start进行录制,触发'start'事件回调
// 5.暂停录制
audioRecorder.pause(); // 需等待'start'事件回调完成后,才可调用pause进行暂停,触发'pause'事件回调
// 6.恢复录制
audioRecorder.resume(); // 需等待'pause'事件回调完成后,才可调用resume进行录制,触发'resume'事件回调
// 7.停止录制
audioRecorder.stop(); // 需等待'start'或'resume'事件回调完成后,才可调用stop进行暂停,触发'stop'事件回调
// 8.重置录制
audioRecorder.reset(); // 触发'reset'事件回调后,重新进行prepare,才可重新录制
// 9.释放资源
audioRecorder.release(); // audioRecorder资源被销毁
audioRecorder = undefined;
``` ```
### 正常录制场景 ### 正常录制场景
...@@ -128,29 +115,37 @@ audioRecorder = undefined; ...@@ -128,29 +115,37 @@ audioRecorder = undefined;
```js ```js
import media from '@ohos.multimedia.media' import media from '@ohos.multimedia.media'
import mediaLibrary from '@ohos.multimedia.mediaLibrary' import mediaLibrary from '@ohos.multimedia.mediaLibrary'
export class AudioRecorderDemo {
let testFdNumber; private testFdNumber; // 用于保存fd地址
function SetCallBack(audioRecorder) { // 设置音频录制相关回调函数
audioRecorder.on('prepare', () => { // 设置'prepare'事件回调 setCallBack(audioRecorder) {
console.log('prepare success'); audioRecorder.on('prepare', () => { // 设置'prepare'事件回调
// 录制界面可切换至已准备好,可点击录制按钮进行录制 console.log('prepare success');
audioRecorder.start(); // 调用start方法开始录制,并触发start回调
}); });
audioRecorder.on('start', () => { // 设置'start'事件回调 audioRecorder.on('start', () => { // 设置'start'事件回调
console.log('audio recorder start success'); console.log('audio recorder start success');
// 将录制按钮切换至可暂停状态 audioRecorder.stop(); // 调用stop方法停止录制,并触发stop回调
}); });
audioRecorder.on('stop', () => { // 设置'stop'事件回调 audioRecorder.on('stop', () => { // 设置'stop'事件回调
console.log('audio recorder stop success'); console.log('audio recorder stop success');
}); audioRecorder.release(); // 调用release方法,释放资源,并触发release回调
audioRecorder.on('release', () => { // 设置'release'事件回调 });
console.log('audio recorder release success'); audioRecorder.on('release', () => { // 设置'release'事件回调
}); console.log('audio recorder release success');
} audioRecorder = undefined;
});
audioRecorder.on('error', (error) => { // 设置'error'事件回调
console.info(`audio error called, errName is ${error.name}`);
console.info(`audio error called, errCode is ${error.code}`);
console.info(`audio error called, errMessage is ${error.message}`);
});
}
// pathName是传入的录制文件名,例如:01.mp3,生成后的文件地址:/storage/media/100/local/files/Movies/01.mp3 // pathName是传入的录制文件名,例如:01.mp3,生成后的文件地址:/storage/media/100/local/files/Video/01.mp3
// 使用mediaLibrary需要添加以下权限, ohos.permission.MEDIA_LOCATION、ohos.permission.WRITE_MEDIA、ohos.permission.READ_MEDIA // 使用mediaLibrary需要添加以下权限, ohos.permission.MEDIA_LOCATION、ohos.permission.WRITE_MEDIA、ohos.permission.READ_MEDIA
async function getFd(pathName) { async getFd(pathName) {
let displayName = pathName; let displayName = pathName;
const mediaTest = mediaLibrary.getMediaLibrary(); const mediaTest = mediaLibrary.getMediaLibrary();
let fileKeyObj = mediaLibrary.FileKey; let fileKeyObj = mediaLibrary.FileKey;
...@@ -158,43 +153,37 @@ async function getFd(pathName) { ...@@ -158,43 +153,37 @@ async function getFd(pathName) {
let publicPath = await mediaTest.getPublicDirectory(mediaLibrary.DirectoryType.DIR_VIDEO); let publicPath = await mediaTest.getPublicDirectory(mediaLibrary.DirectoryType.DIR_VIDEO);
let dataUri = await mediaTest.createAsset(mediaType, displayName, publicPath); let dataUri = await mediaTest.createAsset(mediaType, displayName, publicPath);
if (dataUri != undefined) { if (dataUri != undefined) {
let args = dataUri.id.toString(); let args = dataUri.id.toString();
let fetchOp = { let fetchOp = {
selections : fileKeyObj.ID + "=?", selections : fileKeyObj.ID + "=?",
selectionArgs : [args], selectionArgs : [args],
} }
let fetchFileResult = await mediaTest.getFileAssets(fetchOp); let fetchFileResult = await mediaTest.getFileAssets(fetchOp);
let fileAsset = await fetchFileResult.getAllObject(); let fileAsset = await fetchFileResult.getAllObject();
let fdNumber = await fileAsset[0].open('Rw'); let fdNumber = await fileAsset[0].open('Rw');
fdNumber = "fd://" + fdNumber.toString(); this.testFdNumber = "fd://" + fdNumber.toString();
testFdNumber = fdNumber;
} }
}
async audioRecorderDemo() {
// 1.创建实例
let audioRecorder = media.createAudioRecorder();
// 2.设置回调
this.setCallBack(audioRecorder);
await this.getFd('01.mp3'); // 调用getFd方法获取需要录制文件的fd地址
// 3.设置录制参数
let audioRecorderConfig = {
audioEncodeBitRate : 22050,
audioSampleRate : 22050,
numberOfChannels : 2,
uri : this.testFdNumber, // testFdNumber由getFd生成
location : { latitude : 30, longitude : 130},
audioEncoderMime : media.CodecMimeType.AUDIO_AAC,
fileFormat : media.ContainerFormatType.CFT_MPEG_4A,
}
audioRecorder.prepare(audioRecorderConfig); // 调用prepare方法,触发prepare回调函数
}
} }
await getFd('01.mp3');
// 1.创建实例
let audioRecorder = media.createAudioRecorder();
// 2.设置回调
SetCallBack(audioRecorder);
// 3.设置录制参数
let audioRecorderConfig = {
audioEncoder : media.AudioEncoder.AAC_LC ,
audioEncodeBitRate : 22050,
audioSampleRate : 22050,
numberOfChannels : 2,
format : media.AudioOutputFormat.AAC_ADTS,
uri : testFdNumber, // testFdNumber由getFd生成
location : { latitude : 30, longitude : 130},
}
audioRecorder.prepare(audioRecorderConfig)
// 4.开始录制
audioRecorder.start(); // 需等待'prepare'事件回调完成后,才可调用start进行录制,触发'start'事件回调
// 5.停止录制
audioRecorder.stop(); // 需等待'start'或'resume'事件回调完成后,才可调用stop进行暂停,触发'stop'事件回调
// 6.释放资源
audioRecorder.release(); // audioRecorder资源被销毁
audioRecorder = undefined;
``` ```
## 相关实例 ## 相关实例
......
...@@ -43,141 +43,135 @@ ...@@ -43,141 +43,135 @@
VideoPlayer支持的url媒体源输入类型可参考:[url属性说明](../reference/apis/js-apis-media.md#videoplayer_属性) VideoPlayer支持的url媒体源输入类型可参考:[url属性说明](../reference/apis/js-apis-media.md#videoplayer_属性)
Xcomponent创建方法可参考:[Xcomponent创建方法](#xcomponent创建方法) Xcomponent创建方法可参考:[Xcomponent创建方法](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/ts-basic-components-xcomponent.md)
*注意:SetSurface需要在设置url和Prepare之间 *注意:SetSurface需要在设置url和Prepare之间
```js ```js
import media from '@ohos.multimedia.media' import media from '@ohos.multimedia.media'
import fileIO from '@ohos.fileio' import fileIO from '@ohos.fileio'
export class VideoPlayerDemo {
let videoPlayer = undefined; // 用于保存createVideoPlayer创建的对象 // 函数调用发生错误时用于上报错误信息
let surfaceID = undefined; // 用于保存Xcomponent接口返回的surfaceID failureCallback(error) {
// 调用Xcomponent的接口用于获取surfaceID,并保存在surfaceID变量中,该接口由XComponent组件默认加载,非主动调用
LoadXcomponent() {
surfaceID = this.$element('Xcomponent').getXComponentSurfaceId();
console.info('LoadXcomponent surfaceID is' + surfaceID);
}
// 函数调用发生错误时用于上报错误信息
function failureCallback(error) {
console.info(`error happened,error Name is ${error.name}`); console.info(`error happened,error Name is ${error.name}`);
console.info(`error happened,error Code is ${error.code}`); console.info(`error happened,error Code is ${error.code}`);
console.info(`error happened,error Message is ${error.message}`); console.info(`error happened,error Message is ${error.message}`);
} }
// 当函数调用发生异常时用于上报错误信息 // 当函数调用发生异常时用于上报错误信息
function catchCallback(error) { catchCallback(error) {
console.info(`catch error happened,error Name is ${error.name}`); console.info(`catch error happened,error Name is ${error.name}`);
console.info(`catch error happened,error Code is ${error.code}`); console.info(`catch error happened,error Code is ${error.code}`);
console.info(`catch error happened,error Message is ${error.message}`); console.info(`catch error happened,error Message is ${error.message}`);
} }
// 用于打印视频轨道信息 // 用于打印视频轨道信息
function printfDescription(obj) { printfDescription(obj) {
for (let item in obj) { for (let item in obj) {
let property = obj[item]; let property = obj[item];
console.info('key is ' + item); console.info('key is ' + item);
console.info('value is ' + property); console.info('value is ' + property);
} }
} }
// 调用createVideoPlayer接口返回videoPlayer实例对象 async videoPlayerDemo() {
await media.createVideoPlayer().then((video) => { let videoPlayer = undefined;
if (typeof (video) != 'undefined') { let surfaceID = 'test' // surfaceID用于播放画面显示,具体的值需要通过Xcomponent接口获取,相关文档链接见上面Xcomponent创建方法
let fdPath = 'fd://'
// path路径的码流可通过"hdc file send D:\xxx\H264_AAC.mp4 /data/app/el1/bundle/public/ohos.acts.multimedia.video.videoplayer/ohos.acts.multimedia.video.videoplayer/assets/entry/resources/rawfile" 命令,将其推送到设备上
let path = '/data/app/el1/bundle/public/ohos.acts.multimedia.video.videoplayer/ohos.acts.multimedia.video.videoplayer/assets/entry/resources/rawfile/H264_AAC.mp4';
await fileIO.open(path).then((fdNumber) => {
fdPath = fdPath + '' + fdNumber;
console.info('open fd sucess fd is' + fdPath);
}, (err) => {
console.info('open fd failed err is' + err);
}).catch((err) => {
console.info('open fd failed err is' + err);
});
// 调用createVideoPlayer接口返回videoPlayer实例对象
await media.createVideoPlayer().then((video) => {
if (typeof (video) != 'undefined') {
console.info('createVideoPlayer success!'); console.info('createVideoPlayer success!');
videoPlayer = video; videoPlayer = video;
} else { } else {
console.info('createVideoPlayer fail!'); console.info('createVideoPlayer fail!');
} }
}, failureCallback).catch(catchCallback); }, this.failureCallback).catch(this.catchCallback);
// 设置播放源
// 用户选择视频设置fd(本地播放) videoPlayer.url = fdPath;
let fdPath = 'fd://'
// path路径的码流可通过"hdc file send D:\xxx\01.mp3 /data/accounts/account_0/appdata" 命令,将其推送到设备上 // 设置surfaceID用于显示视频画面
let path = '/data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp4'; await videoPlayer.setDisplaySurface(surfaceID).then(() => {
await fileIO.open(path).then(fdNumber) => { console.info('setDisplaySurface success');
fdPath = fdPath + '' + fdNumber; }, this.failureCallback).catch(this.catchCallback);
console.info('open fd sucess fd is' + fdPath);
}, (err) => { // 调用prepare完成播放前准备工作
console.info('open fd failed err is' + err); await videoPlayer.prepare().then(() => {
}),catch((err) => { console.info('prepare success');
console.info('open fd failed err is' + err); }, this.failureCallback).catch(this.catchCallback);
});
// 调用play接口正式开始播放
videoPlayer.url = fdPath; await videoPlayer.play().then(() => {
console.info('play success');
// 设置surfaceID用于显示视频画面 }, this.failureCallback).catch(this.catchCallback);
await videoPlayer.setDisplaySurface(surfaceID).then(() => {
console.info('setDisplaySurface success'); // 暂停播放
}, failureCallback).catch(catchCallback); await videoPlayer.pause().then(() => {
console.info('pause success');
// 调用prepare完成播放前准备工作 }, this.failureCallback).catch(this.catchCallback);
await videoPlayer.prepare().then(() => {
console.info('prepare success'); // 通过promise回调方式获取视频轨道信息
}, failureCallback).catch(catchCallback); let arrayDescription;
await videoPlayer.getTrackDescription().then((arrlist) => {
// 调用play接口正式开始播放 if (typeof (arrlist) != 'undefined') {
await videoPlayer.play().then(() => {
console.info('play success');
}, failureCallback).catch(catchCallback);
// 暂停播放
await videoPlayer.pause().then(() => {
console.info('pause success');
}, failureCallback).catch(catchCallback);
// 通过promise回调方式获取视频轨道信息
let arrayDescription;
await videoPlayer.getTrackDescription().then((arrlist) => {
if (typeof (arrlist) != 'undefined') {
arrayDescription = arrlist; arrayDescription = arrlist;
} else { } else {
console.log('video getTrackDescription fail'); console.log('video getTrackDescription fail');
}
}, this.failureCallback).catch(this.catchCallback);
for (let i = 0; i < arrayDescription.length; i++) {
this.printfDescription(arrayDescription[i]);
} }
}, failureCallback).catch(catchCallback);
for (let i = 0; i < arrayDescription.length; i++) { // 跳转播放时间到50s位置,具体入参意义请参考接口文档
printfDescription(arrayDescription[i]); let seekTime = 50000;
await videoPlayer.seek(seekTime, media.SeekMode.SEEK_NEXT_SYNC).then((seekDoneTime) => {
console.info('seek success');
}, this.failureCallback).catch(this.catchCallback);
// 音量设置接口,具体入参意义请参考接口文档
let volume = 0.5;
await videoPlayer.setVolume(volume).then(() => {
console.info('setVolume success');
}, this.failureCallback).catch(this.catchCallback);
// 倍速设置接口,具体入参意义请参考接口文档
let speed = media.PlaybackSpeed.SPEED_FORWARD_2_00_X;
await videoPlayer.setSpeed(speed).then(() => {
console.info('setSpeed success');
}, this.failureCallback).catch(this.catchCallback);
// 结束播放
await videoPlayer.stop().then(() => {
console.info('stop success');
}, this.failureCallback).catch(this.catchCallback);
// 重置播放配置
await videoPlayer.reset().then(() => {
console.info('reset success');
}, this.failureCallback).catch(this.catchCallback);
// 释放播放资源
await videoPlayer.release().then(() => {
console.info('release success');
}, this.failureCallback).catch(this.catchCallback);
// 相关对象置undefined
videoPlayer = undefined;
surfaceID = undefined;
}
} }
// 跳转播放时间到50s位置,具体入参意义请参考接口文档
let seekTime = 50000;
await videoPlayer.seek(seekTime, media.SeekMode._NEXT_SYNC).then((seekDoneTime) => {
console.info('seek success');
}, failureCallback).catch(catchCallback);
// 音量设置接口,具体入参意义请参考接口文档
let volume = 0.5;
await videoPlayer.setVolume(volume).then(() => {
console.info('setVolume success');
}, failureCallback).catch(catchCallback);
// 倍速设置接口,具体入参意义请参考接口文档
let speed = media.PlaybackRateMode.SPEED_FORWARD_2_00_X;
await videoPlayer.setSpeed(speed).then(() => {
console.info('setSpeed success');
}, failureCallback).catch(catchCallback);
// 结束播放
await videoPlayer.stop().then(() => {
console.info('stop success');
}, failureCallback).catch(catchCallback);
// 重置播放配置
await videoPlayer.reset().then(() => {
console.info('reset success');
}, failureCallback).catch(catchCallback);
// 释放播放资源
await videoPlayer.release().then(() => {
console.info('release success');
}, failureCallback).catch(catchCallback);
// 相关对象置undefined
videoPlayer = undefined;
surfaceID = undefined;
``` ```
### 正常播放场景 ### 正常播放场景
...@@ -185,86 +179,86 @@ surfaceID = undefined; ...@@ -185,86 +179,86 @@ surfaceID = undefined;
```js ```js
import media from '@ohos.multimedia.media' import media from '@ohos.multimedia.media'
import fileIO from '@ohos.fileio' import fileIO from '@ohos.fileio'
export class VideoPlayerDemo {
let videoPlayer = undefined; // 用于保存createVideoPlayer创建的对象 // 函数调用发生错误时用于上报错误信息
let surfaceID = undefined; // 用于保存Xcomponent接口返回的surfaceID failureCallback(error) {
// 调用Xcomponent的接口用于获取surfaceID,并保存在surfaceID变量中,该接口由XComponent组件默认加载,非主动调用
LoadXcomponent() {
surfaceID = this.$element('Xcomponent').getXComponentSurfaceId();
console.info('LoadXcomponent surfaceID is' + surfaceID);
}
// 函数调用发生错误时用于上报错误信息
function failureCallback(error) {
console.info(`error happened,error Name is ${error.name}`); console.info(`error happened,error Name is ${error.name}`);
console.info(`error happened,error Code is ${error.code}`); console.info(`error happened,error Code is ${error.code}`);
console.info(`error happened,error Message is ${error.message}`); console.info(`error happened,error Message is ${error.message}`);
} }
// 当函数调用发生异常时用于上报错误信息 // 当函数调用发生异常时用于上报错误信息
function catchCallback(error) { catchCallback(error) {
console.info(`catch error happened,error Name is ${error.name}`); console.info(`catch error happened,error Name is ${error.name}`);
console.info(`catch error happened,error Code is ${error.code}`); console.info(`catch error happened,error Code is ${error.code}`);
console.info(`catch error happened,error Message is ${error.message}`); console.info(`catch error happened,error Message is ${error.message}`);
} }
// 设置'playbackCompleted'事件回调,播放完成触发 // 用于打印视频轨道信息
function SetCallBack(videoPlayer) { printfDescription(obj) {
videoPlayer.on('playbackCompleted', () => { for (let item in obj) {
console.info('video play finish'); let property = obj[item];
console.info('key is ' + item);
await videoPlayer.release().then(() => { console.info('value is ' + property);
console.info('release success'); }
}, failureCallback).catch(catchCallback); }
videoPlayer = undefined; async videoPlayerDemo() {
surfaceID = undefined; let videoPlayer = undefined;
let surfaceID = 'test' // surfaceID用于播放画面显示,具体的值需要通过Xcomponent接口获取,相关文档链接:
let fdPath = 'fd://'
// path路径的码流可通过"hdc file send D:\xxx\H264_AAC.mp4 /data/app/el1/bundle/public/ohos.acts.multimedia.video.videoplayer/ohos.acts.multimedia.video.videoplayer/assets/entry/resources/rawfile" 命令,将其推送到设备上
let path = '/data/app/el1/bundle/public/ohos.acts.multimedia.video.videoplayer/ohos.acts.multimedia.video.videoplayer/assets/entry/resources/rawfile/H264_AAC.mp4';
await fileIO.open(path).then((fdNumber) => {
fdPath = fdPath + '' + fdNumber;
console.info('open fd sucess fd is' + fdPath);
}, (err) => {
console.info('open fd failed err is' + err);
}).catch((err) => {
console.info('open fd failed err is' + err);
}); });
} // 调用createVideoPlayer接口返回videoPlayer实例对象
await media.createVideoPlayer().then((video) => {
// 调用createVideoPlayer接口返回videoPlayer实例对象 if (typeof (video) != 'undefined') {
await media.createVideoPlayer().then((video) => {
if (typeof (video) != 'undefined') {
console.info('createVideoPlayer success!'); console.info('createVideoPlayer success!');
videoPlayer = video; videoPlayer = video;
} else { } else {
console.info('createVideoPlayer fail!'); console.info('createVideoPlayer fail!');
} }
}, failureCallback).catch(catchCallback); }, this.failureCallback).catch(this.catchCallback);
// 设置播放源
// 设置事件回调 videoPlayer.url = fdPath;
SetCallBack(videoPlayer);
// 设置surfaceID用于显示视频画面
// 用户选择视频设置fd(本地播放) await videoPlayer.setDisplaySurface(surfaceID).then(() => {
let fdPath = 'fd://' console.info('setDisplaySurface success');
// path路径的码流可通过"hdc file send D:\xxx\01.mp3 /data/accounts/account_0/appdata" 命令,将其推送到设备上 }, this.failureCallback).catch(this.catchCallback);
let path = '/data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp4';
await fileIO.open(path).then(fdNumber) => { // 调用prepare完成播放前准备工作
fdPath = fdPath + '' + fdNumber; await videoPlayer.prepare().then(() => {
console.info('open fd sucess fd is' + fdPath); console.info('prepare success');
}, (err) => { }, this.failureCallback).catch(this.catchCallback);
console.info('open fd failed err is' + err);
}),catch((err) => { // 调用play接口正式开始播放
console.info('open fd failed err is' + err); await videoPlayer.play().then(() => {
}); console.info('play success');
}, this.failureCallback).catch(this.catchCallback);
videoPlayer.url = fdPath;
// 结束播放
// 设置surfaceID用于显示视频画面 await videoPlayer.stop().then(() => {
await videoPlayer.setDisplaySurface(surfaceID).then(() => { console.info('stop success');
console.info('setDisplaySurface success'); }, this.failureCallback).catch(this.catchCallback);
}, failureCallback).catch(catchCallback);
// 释放播放资源
// 调用prepare完成播放前准备工作 await videoPlayer.release().then(() => {
await videoPlayer.prepare().then(() => { console.info('release success');
console.info('prepare success'); }, this.failureCallback).catch(this.catchCallback);
}, failureCallback).catch(catchCallback);
// 相关对象置undefined
// 调用play接口正式开始播放 videoPlayer = undefined;
await videoPlayer.play().then(() => { surfaceID = undefined;
console.info('play success'); }
}, failureCallback).catch(catchCallback); }
``` ```
### 切视频场景 ### 切视频场景
...@@ -272,122 +266,110 @@ await videoPlayer.play().then(() => { ...@@ -272,122 +266,110 @@ await videoPlayer.play().then(() => {
```js ```js
import media from '@ohos.multimedia.media' import media from '@ohos.multimedia.media'
import fileIO from '@ohos.fileio' import fileIO from '@ohos.fileio'
export class VideoPlayerDemo {
let videoPlayer = undefined; // 用于保存createVideoPlayer创建的对象 // 函数调用发生错误时用于上报错误信息
let surfaceID = undefined; // 用于保存Xcomponent接口返回的surfaceID failureCallback(error) {
// 调用Xcomponent的接口用于获取surfaceID,并保存在surfaceID变量中,该接口由XComponent组件默认加载,非主动调用
LoadXcomponent() {
surfaceID = this.$element('Xcomponent').getXComponentSurfaceId();
console.info('LoadXcomponent surfaceID is' + surfaceID);
}
// 函数调用发生错误时用于上报错误信息
function failureCallback(error) {
console.info(`error happened,error Name is ${error.name}`); console.info(`error happened,error Name is ${error.name}`);
console.info(`error happened,error Code is ${error.code}`); console.info(`error happened,error Code is ${error.code}`);
console.info(`error happened,error Message is ${error.message}`); console.info(`error happened,error Message is ${error.message}`);
} }
// 当函数调用发生异常时用于上报错误信息 // 当函数调用发生异常时用于上报错误信息
function catchCallback(error) { catchCallback(error) {
console.info(`catch error happened,error Name is ${error.name}`); console.info(`catch error happened,error Name is ${error.name}`);
console.info(`catch error happened,error Code is ${error.code}`); console.info(`catch error happened,error Code is ${error.code}`);
console.info(`catch error happened,error Message is ${error.message}`); console.info(`catch error happened,error Message is ${error.message}`);
} }
// 设置'playbackCompleted'事件回调,播放完成触发 // 用于打印视频轨道信息
function SetCallBack(videoPlayer) { printfDescription(obj) {
videoPlayer.on('playbackCompleted', () => { for (let item in obj) {
console.info('video play finish'); let property = obj[item];
console.info('key is ' + item);
await videoPlayer.release().then(() => { console.info('value is ' + property);
console.info('release success'); }
}, failureCallback).catch(catchCallback); }
videoPlayer = undefined; async videoPlayerDemo() {
surfaceID = undefined; let videoPlayer = undefined;
let surfaceID = 'test' // surfaceID用于播放画面显示,具体的值需要通过Xcomponent接口获取,相关文档链接:
let fdPath = 'fd://'
// path路径的码流可通过"hdc file send D:\xxx\H264_AAC.mp4 /data/app/el1/bundle/public/ohos.acts.multimedia.video.videoplayer/ohos.acts.multimedia.video.videoplayer/assets/entry/resources/rawfile" 命令,将其推送到设备上
let path = '/data/app/el1/bundle/public/ohos.acts.multimedia.video.videoplayer/ohos.acts.multimedia.video.videoplayer/assets/entry/resources/rawfile/H264_AAC.mp4';
let nextPath = '/data/app/el1/bundle/public/ohos.acts.multimedia.video.videoplayer/ohos.acts.multimedia.video.videoplayer/assets/entry/resources/rawfile/MP4_AAC.mp4';
await fileIO.open(path).then((fdNumber) => {
fdPath = fdPath + '' + fdNumber;
console.info('open fd sucess fd is' + fdPath);
}, (err) => {
console.info('open fd failed err is' + err);
}).catch((err) => {
console.info('open fd failed err is' + err);
}); });
} // 调用createVideoPlayer接口返回videoPlayer实例对象
await media.createVideoPlayer().then((video) => {
// 调用createVideoPlayer接口返回videoPlayer实例对象 if (typeof (video) != 'undefined') {
await media.createVideoPlayer().then((video) => {
if (typeof (video) != 'undefined') {
console.info('createVideoPlayer success!'); console.info('createVideoPlayer success!');
videoPlayer = video; videoPlayer = video;
} else { } else {
console.info('createVideoPlayer fail!'); console.info('createVideoPlayer fail!');
} }
}, failureCallback).catch(catchCallback); }, this.failureCallback).catch(this.catchCallback);
// 设置播放源
// 设置事件回调 videoPlayer.url = fdPath;
SetCallBack(videoPlayer);
// 设置surfaceID用于显示视频画面
// 用户选择视频设置fd(本地播放) await videoPlayer.setDisplaySurface(surfaceID).then(() => {
let fdPath = 'fd://' console.info('setDisplaySurface success');
// path路径的码流可通过"hdc file send D:\xxx\01.mp3 /data/accounts/account_0/appdata" 命令,将其推送到设备上 }, this.failureCallback).catch(this.catchCallback);
let path = '/data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp4';
await fileIO.open(path).then(fdNumber) => { // 调用prepare完成播放前准备工作
fdPath = fdPath + '' + fdNumber; await videoPlayer.prepare().then(() => {
console.info('open fd sucess fd is' + fdPath); console.info('prepare success');
}, (err) => { }, this.failureCallback).catch(this.catchCallback);
console.info('open fd failed err is' + err);
}),catch((err) => { // 调用play接口正式开始播放
console.info('open fd failed err is' + err); await videoPlayer.play().then(() => {
}); console.info('play success');
}, this.failureCallback).catch(this.catchCallback);
videoPlayer.url = fdPath;
// 重置播放配置
// 设置surfaceID用于显示视频画面 await videoPlayer.reset().then(() => {
await videoPlayer.setDisplaySurface(surfaceID).then(() => { console.info('reset success');
console.info('setDisplaySurface success'); }, this.failureCallback).catch(this.catchCallback);
}, failureCallback).catch(catchCallback);
// 获取下一个视频fd地址
// 调用prepare完成播放前准备工作 fdPath = 'fd://'
await videoPlayer.prepare().then(() => { await fileIO.open(nextPath).then((fdNumber) => {
console.info('prepare success'); fdPath = fdPath + '' + fdNumber;
}, failureCallback).catch(catchCallback); console.info('open fd sucess fd is' + fdPath);
}, (err) => {
// 调用play接口正式开始播放 console.info('open fd failed err is' + err);
await videoPlayer.play().then(() => { }).catch((err) => {
console.info('play success'); console.info('open fd failed err is' + err);
}, failureCallback).catch(catchCallback); });
// 设置第二个视频播放源
// 播放一段时间后,下发切视频指令 videoPlayer.url = fdPath;
// 重置播放配置
await videoPlayer.reset().then(() => { // 调用prepare完成播放前准备工作
console.info('reset success'); await videoPlayer.prepare().then(() => {
}, failureCallback).catch(catchCallback); console.info('prepare success');
}, this.failureCallback).catch(this.catchCallback);
// 用户选择视频设置fd(本地播放)
let fdNextPath = 'fd://' // 调用play接口正式开始播放
// path路径的码流可通过"hdc file send D:\xxx\02.mp3 /data/accounts/account_0/appdata" 命令,将其推送到设备上 await videoPlayer.play().then(() => {
let nextPath = '/data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/02.mp4'; console.info('play success');
await fileIO.open(nextPath).then(fdNumber) => { }, this.failureCallback).catch(this.catchCallback);
fdNextPath = fdNextPath + '' + fdNumber;
console.info('open fd sucess fd is' + fdNextPath); // 释放播放资源
}, (err) => { await videoPlayer.release().then(() => {
console.info('open fd failed err is' + err); console.info('release success');
}),catch((err) => { }, this.failureCallback).catch(this.catchCallback);
console.info('open fd failed err is' + err);
}); // 相关对象置undefined
videoPlayer = undefined;
videoPlayer.url = fdNextPath; surfaceID = undefined;
}
// 设置surfaceID用于显示视频画面 }
await videoPlayer.setDisplaySurface(surfaceID).then(() => {
console.info('setDisplaySurface success');
}, failureCallback).catch(catchCallback);
// 调用prepare完成播放前准备工作
await videoPlayer.prepare().then(() => {
console.info('prepare success');
}, failureCallback).catch(catchCallback);
// 调用play接口正式开始播放
await videoPlayer.play().then(() => {
console.info('play success');
}, failureCallback).catch(catchCallback);
``` ```
### 单个视频循环场景 ### 单个视频循环场景
...@@ -395,100 +377,88 @@ await videoPlayer.play().then(() => { ...@@ -395,100 +377,88 @@ await videoPlayer.play().then(() => {
```js ```js
import media from '@ohos.multimedia.media' import media from '@ohos.multimedia.media'
import fileIO from '@ohos.fileio' import fileIO from '@ohos.fileio'
export class VideoPlayerDemo {
let videoPlayer = undefined; // 用于保存createVideoPlayer创建的对象 // 函数调用发生错误时用于上报错误信息
let surfaceID = undefined; // 用于保存Xcomponent接口返回的surfaceID failureCallback(error) {
// 调用Xcomponent的接口用于获取surfaceID,并保存在surfaceID变量中,该接口由XComponent组件默认加载,非主动调用
LoadXcomponent() {
surfaceID = this.$element('Xcomponent').getXComponentSurfaceId();
console.info('LoadXcomponent surfaceID is' + surfaceID);
}
// 函数调用发生错误时用于上报错误信息
function failureCallback(error) {
console.info(`error happened,error Name is ${error.name}`); console.info(`error happened,error Name is ${error.name}`);
console.info(`error happened,error Code is ${error.code}`); console.info(`error happened,error Code is ${error.code}`);
console.info(`error happened,error Message is ${error.message}`); console.info(`error happened,error Message is ${error.message}`);
} }
// 当函数调用发生异常时用于上报错误信息 // 当函数调用发生异常时用于上报错误信息
function catchCallback(error) { catchCallback(error) {
console.info(`catch error happened,error Name is ${error.name}`); console.info(`catch error happened,error Name is ${error.name}`);
console.info(`catch error happened,error Code is ${error.code}`); console.info(`catch error happened,error Code is ${error.code}`);
console.info(`catch error happened,error Message is ${error.message}`); console.info(`catch error happened,error Message is ${error.message}`);
} }
// 设置'playbackCompleted'事件回调,播放完成触发 // 用于打印视频轨道信息
function SetCallBack(videoPlayer) { printfDescription(obj) {
videoPlayer.on('playbackCompleted', () => { for (let item in obj) {
console.info('video play finish'); let property = obj[item];
console.info('key is ' + item);
await videoPlayer.release().then(() => { console.info('value is ' + property);
console.info('release success'); }
}, failureCallback).catch(catchCallback); }
videoPlayer = undefined; sleep(time) {
surfaceID = undefined; for(let t = Date.now(); Date.now() - t <= time;);
}
async videoPlayerDemo() {
let videoPlayer = undefined;
let surfaceID = 'test' // surfaceID用于播放画面显示,具体的值需要通过Xcomponent接口获取,相关文档链接:
let fdPath = 'fd://'
// path路径的码流可通过"hdc file send D:\xxx\H264_AAC.mp4 /data/app/el1/bundle/public/ohos.acts.multimedia.video.videoplayer/ohos.acts.multimedia.video.videoplayer/assets/entry/resources/rawfile" 命令,将其推送到设备上
let path = '/data/app/el1/bundle/public/ohos.acts.multimedia.video.videoplayer/ohos.acts.multimedia.video.videoplayer/assets/entry/resources/rawfile/H264_AAC.mp4';
await fileIO.open(path).then((fdNumber) => {
fdPath = fdPath + '' + fdNumber;
console.info('open fd sucess fd is' + fdPath);
}, (err) => {
console.info('open fd failed err is' + err);
}).catch((err) => {
console.info('open fd failed err is' + err);
}); });
} // 调用createVideoPlayer接口返回videoPlayer实例对象
await media.createVideoPlayer().then((video) => {
// 调用createVideoPlayer接口返回videoPlayer实例对象 if (typeof (video) != 'undefined') {
await media.createVideoPlayer().then((video) => {
if (typeof (video) != 'undefined') {
console.info('createVideoPlayer success!'); console.info('createVideoPlayer success!');
videoPlayer = video; videoPlayer = video;
} else { } else {
console.info('createVideoPlayer fail!'); console.info('createVideoPlayer fail!');
} }
}, failureCallback).catch(catchCallback); }, this.failureCallback).catch(this.catchCallback);
// 设置播放源
// 设置事件回调 videoPlayer.url = fdPath;
SetCallBack(videoPlayer);
// 设置surfaceID用于显示视频画面
// 用户选择视频设置fd(本地播放) await videoPlayer.setDisplaySurface(surfaceID).then(() => {
let fdPath = 'fd://' console.info('setDisplaySurface success');
// path路径的码流可通过"hdc file send D:\xxx\01.mp3 /data/accounts/account_0/appdata" 命令,将其推送到设备上 }, this.failureCallback).catch(this.catchCallback);
let path = '/data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp4';
await fileIO.open(path).then(fdNumber) => { // 调用prepare完成播放前准备工作
fdPath = fdPath + '' + fdNumber; await videoPlayer.prepare().then(() => {
console.info('open fd sucess fd is' + fdPath); console.info('prepare success');
}, (err) => { }, this.failureCallback).catch(this.catchCallback);
console.info('open fd failed err is' + err); // 设置循环播放属性
}),catch((err) => { videoPlayer.loop = true;
console.info('open fd failed err is' + err); // 调用play接口正式开始播放
}); await videoPlayer.play().then(() => {
console.info('play success');
videoPlayer.url = fdPath; }, this.failureCallback).catch(this.catchCallback);
// 进度条执行到末尾后,在播放放3秒钟,因为设置了循环播放,所以当进度条执行到末尾后会从头开始播放
// 设置surfaceID用于显示视频画面 await videoPlayer.seek(videoPlayer.duration, media.SeekMode.SEEK_NEXT_SYNC).then((seekDoneTime) => {
await videoPlayer.setDisplaySurface(surfaceID).then(() => { console.info('seek duration success');
console.info('setDisplaySurface success'); }, this.failureCallback).catch(this.catchCallback);
}, failureCallback).catch(catchCallback); this.sleep(3000);
// 释放播放资源
// 调用prepare完成播放前准备工作 await videoPlayer.release().then(() => {
await videoPlayer.prepare().then(() => { console.info('release success');
console.info('prepare success'); }, this.failureCallback).catch(this.catchCallback);
}, failureCallback).catch(catchCallback);
// 相关对象置undefined
// 设置循环播放属性 videoPlayer = undefined;
videoPlayer.loop = true; surfaceID = undefined;
}
// 调用play接口正式开始播放 }
await videoPlayer.play().then(() => {
console.info('play success');
}, failureCallback).catch(catchCallback);
```
### Xcomponent创建方法
播放视频中获取surfaceID依赖了Xcomponent,需要创建一个和xxx.js同名的xxx.hml文件,xxx.hml里面需要添加如下代码:
```js
<xcomponent id = 'Xcomponent'
if = "{{isFlush}}" // 刷新surfaceID,isFlush赋值false再赋值true为一次刷新,会主动再次加载LoadXcomponent获取新的surfaceID
type = 'surface'
onload = 'LoadXcomponent' // 默认加载接口
style = "width:720px;height:480px;border-color:red;border-width:5px;"> // 设置窗口宽高等属性
</xcomponent>
``` ```
...@@ -25,12 +25,11 @@ ...@@ -25,12 +25,11 @@
```js ```js
import media from '@ohos.multimedia.media' import media from '@ohos.multimedia.media'
import mediaLibrary from '@ohos.multimedia.mediaLibrary' import mediaLibrary from '@ohos.multimedia.mediaLibrary'
export class VideoRecorderDemo {
let testFdNumber; private testFdNumber; // 用于保存fd地址
// pathName是传入的录制文件名,例如:01.mp3,生成后的文件地址:/storage/media/100/local/files/Video/01.mp4
// pathName是传入的录制文件名,例如:01.mp4,生成后的文件地址:/storage/media/100/local/files/Movies/01.mp4 // 使用mediaLibrary需要添加以下权限, ohos.permission.MEDIA_LOCATION、ohos.permission.WRITE_MEDIA、ohos.permission.READ_MEDIA
// 使用mediaLibrary需要添加以下权限, ohos.permission.MEDIA_LOCATION、ohos.permission.WRITE_MEDIA、ohos.permission.READ_MEDIA async getFd(pathName) {
async function getFd(pathName) {
let displayName = pathName; let displayName = pathName;
const mediaTest = mediaLibrary.getMediaLibrary(); const mediaTest = mediaLibrary.getMediaLibrary();
let fileKeyObj = mediaLibrary.FileKey; let fileKeyObj = mediaLibrary.FileKey;
...@@ -38,111 +37,116 @@ async function getFd(pathName) { ...@@ -38,111 +37,116 @@ async function getFd(pathName) {
let publicPath = await mediaTest.getPublicDirectory(mediaLibrary.DirectoryType.DIR_VIDEO); let publicPath = await mediaTest.getPublicDirectory(mediaLibrary.DirectoryType.DIR_VIDEO);
let dataUri = await mediaTest.createAsset(mediaType, displayName, publicPath); let dataUri = await mediaTest.createAsset(mediaType, displayName, publicPath);
if (dataUri != undefined) { if (dataUri != undefined) {
let args = dataUri.id.toString(); let args = dataUri.id.toString();
let fetchOp = { let fetchOp = {
selections : fileKeyObj.ID + "=?", selections : fileKeyObj.ID + "=?",
selectionArgs : [args], selectionArgs : [args],
} }
let fetchFileResult = await mediaTest.getFileAssets(fetchOp); let fetchFileResult = await mediaTest.getFileAssets(fetchOp);
let fileAsset = await fetchFileResult.getAllObject(); let fileAsset = await fetchFileResult.getAllObject();
let fdNumber = await fileAsset[0].open('Rw'); let fdNumber = await fileAsset[0].open('Rw');
fdNumber = "fd://" + fdNumber.toString(); this.testFdNumber = "fd://" + fdNumber.toString();
testFdNumber = fdNumber; }
}
// 当发生错误上上报的错误回调接口
failureCallback(error) {
console.info('error happened, error name is ' + error.name);
console.info('error happened, error code is ' + error.code);
console.info('error happened, error message is ' + error.message);
}
// 当发生异常时,系统调用的错误回调接口
catchCallback(error) {
console.info('catch error happened, error name is ' + error.name);
console.info('catch error happened, error code is ' + error.code);
console.info('catch error happened, error message is ' + error.message);
}
async videoRecorderDemo() {
let videoRecorder = null; // videoRecorder空对象在createVideoRecorder成功后赋值
let surfaceID = null; // 用于保存getInputSurface返回的surfaceID
// 获取需要录制的视频的fd地址
await this.getFd('01.mp4');
// 录制相关参数配置
let videoProfile = {
audioBitrate : 48000,
audioChannels : 2,
audioCodec : 'audio/mp4a-latm',
audioSampleRate : 48000,
fileFormat : 'mp4',
videoBitrate : 48000,
videoCodec : 'video/mp4v-es',
videoFrameWidth : 640,
videoFrameHeight : 480,
videoFrameRate : 30
} }
}
await getFd('01.mp4');
let videoProfile = {
audioBitrate : 48000,
audioChannels : 2,
audioCodec : 'audio/mp4a-latm',
audioSampleRate : 48000,
fileFormat : 'mp4',
videoBitrate : 48000,
videoCodec : 'video/mp4v-es',
videoFrameWidth : 640,
videoFrameHeight : 480,
videoFrameRate : 30
}
let videoConfig = { let videoConfig = {
audioSourceType : 1, audioSourceType : 1,
videoSourceType : 0, videoSourceType : 0,
profile : videoProfile, profile : videoProfile,
url : testFdNumber, // testFdNumber由getFd生成 url : this.testFdNumber, // testFdNumber由getFd生成
orientationHint : 0, orientationHint : 0,
location : { latitude : 30, longitude : 130 }, location : { latitude : 30, longitude : 130 },
} }
// 创建videoRecorder对象
// 当发生错误上上报的错误回调接口 await media.createVideoRecorder().then((recorder) => {
function failureCallback(error) { console.info('case createVideoRecorder called');
console.info('error happened, error name is ' + error.name); if (typeof (recorder) != 'undefined') {
console.info('error happened, error code is ' + error.code);
console.info('error happened, error message is ' + error.message);
}
// 当发生异常时,系统调用的错误回调接口
function catchCallback(error) {
console.info('catch error happened, error name is ' + error.name);
console.info('catch error happened, error code is ' + error.code);
console.info('catch error happened, error message is ' + error.message);
}
let videoRecorder = null; // videoRecorder空对象在createVideoRecorder成功后赋值
let surfaceID = null; // 用于保存getInputSurface返回的surfaceID
// 创建videoRecorder对象
await media.createVideoRecorder().then((recorder) => {
console.info('case createVideoRecorder called');
if (typeof (recorder) != 'undefined') {
videoRecorder = recorder; videoRecorder = recorder;
console.info('createVideoRecorder success'); console.info('createVideoRecorder success');
} else { } else {
console.info('createVideoRecorder failed'); console.info('createVideoRecorder failed');
} }
}, failureCallback).catch(catchCallback); }, this.failureCallback).catch(this.catchCallback);
// 获取surfaceID并保存下来传递给camera相关接口 // 调用prepare完成视频录制前的准备工作
await videoRecorder.getInputSurface().then((surface) => { await videoRecorder.prepare(videoConfig).then(() => {
console.info('getInputSurface success'); console.info('prepare success');
surfaceID = surface; }, this.failureCallback).catch(this.catchCallback);
}, failureCallback).catch(catchCallback);
// 获取surfaceID并保存下来传递给camera相关接口
// 视频录制依赖相机相关接口,以下需要先调用相机起流接口后才能继续执行 await videoRecorder.getInputSurface().then((surface) => {
console.info('getInputSurface success');
// 视频录制启动接口 surfaceID = surface;
await videoRecorder.start().then(() => { }, this.failureCallback).catch(this.catchCallback);
console.info('start success');
}, failureCallback).catch(catchCallback); // 视频录制依赖相机相关接口,以下需要先调用相机起流接口后才能继续执行,具体的相机接口调用请参考sample用例
// 视频录制启动接口
// 调用pause接口时需要暂停camera出流 await videoRecorder.start().then(() => {
await videoRecorder.pause().then(() => { console.info('start success');
console.info('pause success'); }, this.failureCallback).catch(this.catchCallback);
}, failureCallback).catch(catchCallback);
// 调用pause接口时需要暂停camera出流
// 调用resume接口时需要恢复camera出流 await videoRecorder.pause().then(() => {
await videoRecorder.resume().then(() => { console.info('pause success');
console.info('resume success'); }, this.failureCallback).catch(this.catchCallback);
}, failureCallback).catch(catchCallback);
// 调用resume接口时需要恢复camera出流
// 停止camera出流后,停止视频录制 await videoRecorder.resume().then(() => {
await videoRecorder.stop().then(() => { console.info('resume success');
console.info('stop success'); }, this.failureCallback).catch(this.catchCallback);
}, failureCallback).catch(catchCallback);
// 停止camera出流后,停止视频录制
// 重置录制相关配置 await videoRecorder.stop().then(() => {
await videoRecorder.reset().then(() => { console.info('stop success');
console.info('reset success'); }, this.failureCallback).catch(this.catchCallback);
}, failureCallback).catch(catchCallback);
// 重置录制相关配置
// 释放视频录制相关资源并释放camera对象相关资源 await videoRecorder.reset().then(() => {
await videoRecorder.release().then(() => { console.info('reset success');
console.info('release success'); }, this.failureCallback).catch(this.catchCallback);
}, failureCallback).catch(catchCallback);
// 释放视频录制相关资源并释放camera对象相关资源
// 相关对象置null await videoRecorder.release().then(() => {
videoRecorder = null; console.info('release success');
surfaceID = null; }, this.failureCallback).catch(this.catchCallback);
// 相关对象置null
videoRecorder = undefined;
surfaceID = undefined;
}
}
``` ```
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册