From 63e8f4838a4c5a73c4c2a7b16be90e8d380d5719 Mon Sep 17 00:00:00 2001 From: abc12133 Date: Thu, 10 Feb 2022 17:02:42 +0800 Subject: [PATCH 01/14] add venc md Signed-off-by: abc12133 --- zh-cn/application-dev/media/video-encoder.md | 135 +++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 zh-cn/application-dev/media/video-encoder.md diff --git a/zh-cn/application-dev/media/video-encoder.md b/zh-cn/application-dev/media/video-encoder.md new file mode 100644 index 00000000000..fc08287ddd4 --- /dev/null +++ b/zh-cn/application-dev/media/video-encoder.md @@ -0,0 +1,135 @@ +# 视频编码开发指导 + +## 场景介绍 + +视频编码的主要工作是对原始视频数据进行压缩编码。 + +**图1** 视频编码状态机 + +## 视频编码零层图 + +**图2** 视频编码零层图 + +## 视频编码开发步骤 + +详细API含义可参考:[js-apis-media.md](../reference/apis/js-apis-media.md) + +### 全流程场景 + +包含流程:创建编码器、设置监听事件、配置编码器规格、获取surfaceID并配置给数据源、准备编码、开始编码、获取编码后数据的媒体信息、清空缓存、停止编码、重置编码器、销毁编码器 + +```js +/* 用于打印编码后数据的媒体信息 */ +function printfDescription(obj) { + for (let item in obj) { + let property = obj[item]; + console.info('videoEncoder key is ' + item); + console.info('videoEncoder value is ' + property); + } +} + +/* 设置订阅事件回调函数 */ +function SetCallback() { + videoEncoder.on('outputAvailable', (buffer) => { // 订阅编码器输出事件 + console.info('videoEncoder outputAvailable'); + /* 根据业务场景消费buffer */ + /* 消费完毕,将buffer归还给编码器,调用该接口后,不得再对buffer进行读写操作 */ + videoEncoder.releaseOutput(buffer, (error) => { + if (typeof(error) != 'undefined') { + console.log('videoEncoder releaseOutput success'); + } else { + console.info(`videoEncoder releaseOutput fail, errMessage:${error.message}`); + } + }); + }); + + videoEncoder.on('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}`);// 打印错误类型详细描述 + }); + + videoEncoder.on('outputFormatChanged', (format) => { // 订阅编码后数据的媒体信息变化事件 + if (typeof(format) != 'undefined') { + printfDescription(format); + } + }); +} + +/* 函数调用发生错误时用于上报错误信息 */ +function failureCallback(error) { + console.info(`videoEncoder failureCallback, error:${error.message}`); +} + +/* 函数调用发生异常时用于上报错误信息 */ +function catchCallback(error) { + console.info(`videoEncoder catchCallback, error:${error.message}`); +} + +let videoEncoder = undefined; +let surfaceID = undefined; +let mediaDescription = { + "width" : 1920, + "height" : 1080, + "pixel_format" : media.VideoPixelformat.NV21, + "frame_rate" : 60.00, +} + +/* 1.创建编码器 */ +await media.createVideoEncoderByMime(media.CodecMimeType.VIDEO_AVC).then((encoder) => { + if (typeof(encoder) != 'undefined') { + videoEncoder = encoder; + console.info('videoEncoder createVideoEncoderByMime success'); + } else { + console.info('videoEncoder createVideoEncoderByMime fail'); + } +}, failureCallback).catch(catchCallback); + +/* 2.设置监听事件 */ +SetCallback(); + +/* 3.配置编码器规格 */ +await videoEncoder.configure(mediaDescription).then(() => { + console.log('videoEncoder configure success'); +}, failureCallback).catch(catchCallback); + +/* 4.获取surfaceID并配置给数据源 */ + +/* 5.准备编码 */ +await videoEncoder.prepare().then(() => { + console.log('videoEncoder prepare success'); +}, failureCallback).catch(catchCallback); + +/* 6.开始编码 */ +await videoEncoder.start().then(() => { + console.log('videoEncoder start success'); +}, failureCallback).catch(catchCallback); + +/* 7.获取编码后数据的媒体信息 */ +await videoEncoder.getOutputMediaDescription().then((mediaDescription) => { + console.log('videoEncoder getOutputMediaDescription success'); + printfDescription(mediaDescription); +}, failureCallback).catch(catchCallback); + +/* 8.清空缓存,调用该接口后,所有buffer将归还给编码器,应用不得继续使用 */ +await videoEncoder.flush().then(() => { + console.log('videoEncoder flush success'); +}, failureCallback).catch(catchCallback); + +/* 9.停止编码 */ +await videoEncoder.stop().then(() => { + console.log('videoEncoder stop success'); +}, failureCallback).catch(catchCallback); + +/* 10.重置编码器 */ +await videoEncoder.reset().then(() => { + console.log('videoEncoder reset success'); +}, failureCallback).catch(catchCallback); + +/* 11.销毁编码器 */ +await videoEncoder.release().then(() => { + console.log('videoEncoder release success'); +}, failureCallback).catch(catchCallback); +videoEncoder = undefined; // 将编码器置空 +``` + -- Gitee From d432ef90dc9034d36207671964815e3878e90455 Mon Sep 17 00:00:00 2001 From: abc12133 Date: Fri, 11 Feb 2022 11:31:10 +0800 Subject: [PATCH 02/14] venc Signed-off-by: abc12133 --- zh-cn/application-dev/media/video-encoder.md | 8 +- .../reference/apis/js-apis-media.md | 853 +++++++++++++++++- 2 files changed, 854 insertions(+), 7 deletions(-) diff --git a/zh-cn/application-dev/media/video-encoder.md b/zh-cn/application-dev/media/video-encoder.md index fc08287ddd4..34a88efedb4 100644 --- a/zh-cn/application-dev/media/video-encoder.md +++ b/zh-cn/application-dev/media/video-encoder.md @@ -16,7 +16,7 @@ ### 全流程场景 -包含流程:创建编码器、设置监听事件、配置编码器规格、获取surfaceID并配置给数据源、准备编码、开始编码、获取编码后数据的媒体信息、清空缓存、停止编码、重置编码器、销毁编码器 +包含流程:创建编码器、设置监听事件、配置媒体信息、获取surfaceID并配置给数据源、准备编码、开始编码、获取编码后数据的媒体信息、清空缓存、停止编码、重置编码器、销毁编码器 ```js /* 用于打印编码后数据的媒体信息 */ @@ -42,13 +42,13 @@ function SetCallback() { } }); }); - + videoEncoder.on('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}`);// 打印错误类型详细描述 }); - + videoEncoder.on('outputFormatChanged', (format) => { // 订阅编码后数据的媒体信息变化事件 if (typeof(format) != 'undefined') { printfDescription(format); @@ -88,7 +88,7 @@ await media.createVideoEncoderByMime(media.CodecMimeType.VIDEO_AVC).then((encode /* 2.设置监听事件 */ SetCallback(); -/* 3.配置编码器规格 */ +/* 3.配置媒体信息 */ await videoEncoder.configure(mediaDescription).then(() => { console.log('videoEncoder configure success'); }, failureCallback).catch(catchCallback); diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index 8855a833252..b75c1d2d501 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -7,7 +7,7 @@ - 音频播放([AudioPlayer](#audioplayer)) - 音频录制([AudioRecorder](#audiorecorder)) -后续将提供以下功能:视频播放、视频录制、DataSource音视频播放、音视频编解码、容器封装解封装、媒体能力查询等功能。 +后续将提供以下功能:视频播放、视频录制、DataSource音视频播放、音视频编编码、容器封装解封装、媒体能力查询等功能。 ## 导入模块 @@ -90,7 +90,136 @@ await media.createAudioPlayerAsync.then((audio) => { }, failureCallback).catch(catchCallback); ``` +## media.createVideoEncoderByName + +createVideoEncoderByName(name: string, callback: AsyncCallback<[VideoEncodeProcessor]>): void + +通过编码器名称,创建指定的视频编码器实例。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------ | +| name | string | 是 | 编码器名称。 | +| callback | AsyncCallback<[VideoEncodeProcessor]> | 是 | 接口调用的回调函数,包含视频编码器实例。 | + +**示例:** + +```js +media.createVideoEncoderByName('avenc_mpeg4', (error, encoder) => { + if (typeof(encoder) != 'undefined') { + videoEncoder = encoder; + console.info('videoEncoder createVideoEncoderByName success'); + } else { + console.info(`videoEncoder createVideoEncoderByName fail, error:${error.message}`); + } +}); +``` + +## media.createVideoEncoderByName + +createVideoEncoderByName(name: string): Promise<[VideoEncodeProcessor]> + +通过编码器名称,创建指定的视频编码器实例。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ---------------- | +| name | string | 是 | 编码器名称。 | + +**返回值:** + +| 类型 | 说明 | +| ------------------------------------------------------- | ----------------------------------- | +| Promise<[VideoEncodeProcessor]> | 接口调用的返回值,包含视频编码器实例。 | + +**示例:** + +```js +function failureCallback(error) { + console.info(`videoEncoder failureCallback, error:${error.message}`); +} +function catchCallback(error) { + console.info(`videoEncoder catchCallback, error:${error.message}`); +} + +await media.createVideoEncoderByName('avenc_mpeg4').then((encoder) => { + if (typeof(encoder) != 'undefined') { + videoEncoder = encoder; + console.info('videoEncoder createVideoEncoderByName success'); + } else { + console.info('videoEncoder createVideoEncoderByName fail'); + } +}, failureCallback).catch(catchCallback); +``` + +## media.createVideoEncoderByMime + +createVideoEncoderByMime(codecMime: string, callback: AsyncCallback<[VideoEncodeProcessor]>) + +根据[CodecMimeType],创建优选的视频编码器实例。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| --------- | ------------------------------------------------------------ | ---- | ----------------------------------------------------------- | +| codecMime | string | 是 | MIME类型,具体可参考[CodecMimeType]。 | +| callback | AsyncCallback<[VideoEncodeProcessor]> | 是 | 接口调用的回调函数,包含视频编码器实例。| + +**示例:** + +```js +media.createVideoEncoderByMime('video/avc', (error, encoder) => { + if (typeof(encoder) != 'undefined') { + videoEncoder = encoder; + console.info('videoEncoder createVideoEncoderByMime success'); + } else { + console.info(`videoEncoder createVideoEncoderByMime fail, error:${error.message}`); + } +}); +``` + +## media.createVideoEncoderByMime + +createVideoEncoderByMime(name: string): Promise<[VideoEncodeProcessor]> + +根据[CodecMimeType],创建优选的视频编码器实例。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ---------------- | +| codecMime | string | 是 | MIME类型,具体可参考[CodecMimeType]。 | + +**返回值:** + +| 类型 | 说明 | +| ------------------------------------------------------- | ----------------------------------- | +| Promise<[VideoEncodeProcessor]> | 接口调用的返回值,包含视频编码器实例。 | + +**示例:** + +```js +function failureCallback(error) { + console.info(`videoEncoder failureCallback, error:${error.message}`); +} +function catchCallback(error) { + console.info(`videoEncoder catchCallback, error:${error.message}`); +} + +await media.createVideoEncoderByMime('video/avc').then((encoder) => { + if (typeof(encoder) != 'undefined') { + videoEncoder = encoder; + console.info('videoEncoder createVideoEncoderByMime success'); + } else { + console.info('videoEncoder createVideoEncoderByMime fail'); + } +}, failureCallback).catch(catchCallback); +``` + ## media.createAudioRecorder + createAudioRecorder(): AudioRecorder 创建音频录制的实例来控制音频的录制。 @@ -104,7 +233,7 @@ createAudioRecorder(): AudioRecorder **示例:** ``` -var audiorecorder = media.createAudioRecorder(); +var audiorecorder = media.createAudioRecorder(); ``` ## MediaErrorCode8+ @@ -703,4 +832,722 @@ on(type: 'error', callback: ErrorCallback): void | 名称 | 默认值 | 说明 | | -------- | ------ | ------------------------------------------------------------ | | MPEG_4 | 2 | 封装为MPEG-4格式。 | -| AAC_ADTS | 6 | 封装为ADTS(Audio Data Transport Stream)格式,是AAC音频的传输流格式。 | \ No newline at end of file +| AAC_ADTS | 6 | 封装为ADTS(Audio Data Transport Stream)格式,是AAC音频的传输流格式。 | + +## VideoEncodeProcessor + +视频编码管理类,在调用VideoEncodeProcessor的方法前,需要先通过[createVideoEncoderByName()]或[createVideoEncoderByMime()]构建一个[VideoEncodeProcessor]实例。 + +视频编码demo可参考:[视频编码开发指导](../../media/video-decoder.md) + +### configure + +configure(desc: [MediaDescription](#mediadescription8), callback: AsyncCallback\): void + +配置媒体信息。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------- | ---- | ------------------------------------------------------------ | +| desc | [MediaDescription](#mediadescription8) | 是 | 媒体信息键值对,key值的范围可参考[MediaDescriptionKey](#mediadescriptionkey8)。
必须设置的媒体信息:MD_KEY_WIDTH、MD_KEY_HEIGHT、MD_KEY_FRAME_RATE、MD_KEY_PIXEL_FORMAT。 | +| callback | AsyncCallback\ | 是 | 接口调用的回调函数。 | + +**示例:** + +```js +let mediaDescription = { + "width" : 320, + "height" : 240, + "frame_rate" : 60.00, + "pixel_format" : media.VideoPixelformat.NV21, +} +videoEncoder.configure(mediaDescription, (error) => { + if (typeof(error) != 'undefined') { + console.log('videoEncoder configure success'); + } else { + console.info(`videoEncoder configure fail, errMessage:${error.message}`); + } +}); +``` + +### configure + +configure(desc: [MediaDescription](#mediadescription8)): Promise\ + +配置媒体信息。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | -------------------------------------- | ---- | ------------------------------------------------------------ | +| desc | [MediaDescription](#mediadescription8) | 是 | 媒体信息键值对,key值的范围可参考[MediaDescriptionKey](#mediadescriptionkey8)。
必须设置的媒体信息:MD_KEY_WIDTH、MD_KEY_HEIGHT、MD_KEY_FRAME_RATE、MD_KEY_PIXEL_FORMAT。 | + +**返回值:** + +| 类型 | 说明 | +| -------------- | --------------------------- | +| Promise\ | 接口调用的返回值。| + +**示例:** + +```js +function failureCallback(error) { + console.info(`videoEncoder failureCallback, error:${error.message}`); +} +function catchCallback(error) { + console.info(`videoEncoder catchCallback, error:${error.message}`); +} + +let mediaDescription = { + "width" : 320, + "height" : 240, + "frame_rate" : 60.00, + "pixel_format" : media.VideoPixelformat.NV21, +} +await videoEncoder.configure(mediaDescription).then(() => { + console.log('videoEncoder configure success'); +}, failureCallback).catch(catchCallback); +``` + +### prepare + +prepare(callback: AsyncCallback\): void + +准备编码。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | -------------------------- | +| callback | AsyncCallback\ | 是 | 接口调用的回调函数。 | + +**示例:** + +```js +videoEncoder.prepare((error) => { + if (typeof(error) != 'undefined') { + console.log('videoEncoder prepare success'); + } else { + console.info(`videoEncoder prepare fail, errMessage:${error.message}`); + } +}); +``` + +### prepare + +prepare(): Promise\ + +准备编码。 + +**返回值:** + +| 类型 | 说明 | +| -------------- | --------------------------- | +| Promise\ | 接口调用的返回值。 | + +**示例:** + +```js +function failureCallback(error) { + console.info(`videoEncoder failureCallback, error:${error.message}`); +} +function catchCallback(error) { + console.info(`videoEncoder catchCallback, error:${error.message}`); +} + +await videoEncoder.prepare().then(() => { + console.log('videoEncoder prepare success'); +}, failureCallback).catch(catchCallback); +``` + +### start + +start(callback: AsyncCallback\): void + +开始编码。在start()方法调用前需完成inputAvailable和outputAvailable事件的注册。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | -------------------------- | +| callback | AsyncCallback\ | 是 | 接口调用的回调函数。 | + +**示例:** + +```js +videoEncoder.start((error) => { + if (typeof(error) != 'undefined') { + console.log('videoEncoder start success'); + } else { + console.info(`videoEncoder start fail, errMessage:${error.message}`); + } +}); +``` + +### start + +start(): Promise\ + +开始编码。在start()方法调用前需完成inputAvailable和outputAvailable事件的注册。 + +**返回值:** + +| 类型 | 说明 | +| -------------- | --------------------------- | +| Promise\ | 接口调用的返回值。 | + +**示例:** + +```js +function failureCallback(error) { + console.info(`videoEncoder failureCallback, error:${error.message}`); +} +function catchCallback(error) { + console.info(`videoEncoder catchCallback, error:${error.message}`); +} + +await videoEncoder.start().then(() => { + console.log('videoEncoder start success'); +}, failureCallback).catch(catchCallback); +``` + +### stop + +stop(callback: AsyncCallback\): void + +停止编码。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | -------------------------- | +| callback | AsyncCallback\ | 是 | 接口调用的回调函数。 | + +**示例:** + +```js +videoEncoder.stop((error) => { + if (typeof(error) != 'undefined') { + console.log('videoEncoder stop success'); + } else { + console.info(`videoEncoder stop fail, errMessage:${error.message}`); + } +}); +``` + +### stop + +stop: Promise\ + +停止编码。 + +**返回值:** + +| 类型 | 说明 | +| -------------- | --------------------------- | +| Promise\ | 接口调用的返回值。 | + +**示例:** + +```js +function failureCallback(error) { + console.info(`videoEncoder failureCallback, error:${error.message}`); +} +function catchCallback(error) { + console.info(`videoEncoder catchCallback, error:${error.message}`); +} + +await videoEncoder.stop().then(() => { + console.log('videoEncoder stop success'); +}, failureCallback).catch(catchCallback); +``` + +### flush + +flush(callback: AsyncCallback\): void + +清空缓存队列。调用该接口后,不得继续使用通过outputAvailable获取的buffer。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------------------- | +| callback | AsyncCallback\ | 是 | 接口调用的回调函数。 | + +**示例:** + +```js +videoEncoder.flush((error) => { + if (typeof(error) != 'undefined') { + console.log('videoEncoder flush success'); + } else { + console.info(`videoEncoder flush fail, errMessage:${error.message}`); + } +}); +``` + +### flush + +flush(): Promise\ + +清空缓存队列。调用该接口后,不得继续使用通过outputAvailable获取的buffer。 + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------- | +| Promise\ | 接口调用的返回值。 | + +**示例:** + +```js +function failureCallback(error) { + console.info(`videoEncoder failureCallback, error:${error.message}`); +} +function catchCallback(error) { + console.info(`videoEncoder catchCallback, error:${error.message}`); +} + +await videoEncoder.flush().then(() => { + console.log('videoEncoder flush success'); +}, failureCallback).catch(catchCallback); +``` + +### reset + +reset(callback: AsyncCallback\): void + +重置编码器。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | -------------------------- | +| callback | AsyncCallback\ | 是 | 接口调用的回调函数。 | + +**示例:** + +```js +videoEncoder.reset((error) => { + if (typeof(error) != 'undefined') { + console.log('videoEncoder reset success'); + } else { + console.info(`videoEncoder reset fail, errMessage:${error.message}`); + } +}); +``` + +### reset + +reset(): Promise\ + +重置编码器。 + +**返回值:** + +| 类型 | 说明 | +| -------------- | --------------------------- | +| Promise\ | 接口调用的返回值。 | + +**示例:** + +```js +function failureCallback(error) { + console.info(`videoEncoder failureCallback, error:${error.message}`); +} +function catchCallback(error) { + console.info(`videoEncoder catchCallback, error:${error.message}`); +} + +await videoEncoder.reset().then(() => { + console.log('videoEncoder reset success'); +}, failureCallback).catch(catchCallback); +``` + +### release + +release(callback: AsyncCallback\): void + +销毁编码器。应用需手动release,不能依赖内存回收机制。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | -------------------------------- | +| callback | AsyncCallback\ | 是 | 接口调用的回调函数。 | + +**示例:** + +```js +videoEncoder.release((error) => { + if (typeof(error) != 'undefined') { + console.log('videoEncoder release success'); + videoEncoder = undefined; + } else { + console.info(`videoEncoder release fail, errMessage:${error.message}`); + } +}); +``` + +### release + +release(): Promise\ + +销毁编码器。应用需手动release,不能依赖内存回收机制。 + +**返回值:** + +| 类型 | 说明 | +| -------------- | --------------------------------- | +| Promise\ | 接口调用的返回值。 | + +**示例:** + +```js +function failureCallback(error) { + console.info(`videoEncoder failureCallback, error:${error.message}`); +} +function catchCallback(error) { + console.info(`videoEncoder catchCallback, error:${error.message}`); +} + +await videoEncoder.release().then(() => { + console.log('videoEncoder release success'); +}, failureCallback).catch(catchCallback); +videoEncoder = undefined; +``` + +### releaseOutput + +releaseOutput(buffer: CodecBuffer, callback: AsyncCallback\): void + +将输出buffer归还给编码器。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------------- | ---- | -------------------------------------- | +| buffer | CodecBuffer | 是 | 输出buffer。 | +| callback | AsyncCallback\ | 是 | 接口调用的回调函数。 | + +**示例:** + +```js +videoEncoder.on('outputAvailable', (outputBuffer) => { + videoEncoder.releaseOutput(outputBuffer, (error) => { + if (typeof(error) != 'undefined') { + console.log('videoEncoder releaseOutput success'); + } else { + console.info(`videoEncoder releaseOutput fail, errMessage:${error.message}`); + } + }); +}); +``` + +### releaseOutput + +releaseOutput(buffer: CodecBuffer): Promise\ + +将输出buffer归还给编码器。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------------- | ---- | -------------------------- | +| buffer | [CodecBuffer](#codecbuffer8) | 是 | 输出buffer。 | + +**返回值:** + +| 类型 | 说明 | +| -------------- | --------------------------------------- | +| Promise\ | 接口调用的返回值。 | + +**示例:** + +```js +function failureCallback(error) { + console.info(`videoEncoder failureCallback, error:${error.message}`); +} +function catchCallback(error) { + console.info(`videoEncoder catchCallback, error:${error.message}`); +} + +videoEncoder.on('outputAvailable', (outputBuffer) => { + await videoEncoder.releaseOutput(outputBuffer).then(() => { + console.log('videoEncoder releaseOutput success'); + }, failureCallback).catch(catchCallback); +}); +``` + +### setParameter + +setParameter(desc: [MediaDescription](#mediadescription8), callback: AsyncCallback\): void + +动态设置媒体信息,是否生效依赖于硬件平台。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------- | ---- | ------------------------------------------------------------ | +| desc | [MediaDescription](#mediadescription8) | 是 | 媒体信息键值对,key值的范围可参考[MediaDescriptionKey](#mediadescriptionkey8)。 | +| callback | AsyncCallback\ | 是 | 接口调用的回调函数。| + +**示例:** + +```js +let mediaDescription = { + "req_i_frame" : 1, // 动态请求I帧 +} + +videoEncoder.setParameter(mediaDescription, (error) => { + if (typeof(error) != 'undefined') { + console.log('videoEncoder setParameter success'); + } else { + console.info(`videoEncoder setParameter fail, errMessage:${error.message}`); + } +}); +``` + +### setParameter + +setParameter(desc: [MediaDescription](#mediadescription8)): Promise\ + +动态设置媒体信息,是否生效依赖于硬件平台。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | -------------------------------------- | ---- | ------------------------------------------------------------ | +| desc | [MediaDescription](#mediadescription8) | 是 | 媒体信息键值对,key值的范围可参考[MediaDescriptionKey](#mediadescriptionkey8)。 | + +**返回值:** + +| 类型 | 说明 | +| -------------- | ------------------------------------------- | +| Promise\ | 接口调用的返回值。 | + +**示例:** + +```js +function failureCallback(error) { + console.info(`videoEncoder failureCallback, error:${error.message}`); +} +function catchCallback(error) { + console.info(`videoEncoder catchCallback, error:${error.message}`); +} + +let mediaDescription = { + "req_i_frame" : 1, // 动态请求I帧 +} + +await videoEncoder.setParameter(mediaDescription).then(() => { + console.log('videoEncoder setParameter success'); +}, failureCallback).catch(catchCallback); +``` + +### getOutputMediaDescription + +getOutputMediaDescription(callback: AsyncCallback<[MediaDescription](#mediadescription8)>): void + +获取编码后数据的媒体信息。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------------------- | ---- | ---------------------------------------- | +| callback | AsyncCallback<[MediaDescription](#mediadescription8)> | 是 | 接口调用的回调函数。 | + +**示例:** + +```js +function printfDescription(obj) { + for (let item in obj) { + let property = obj[item]; + console.info('videoEncoder key is ' + item); + console.info('videoEncoder value is ' + property); + } +} + +videoEncoder.getOutputMediaDescription((error, mediaDescription) => { + if (typeof(mediaDescription) != 'undefined') { + console.log('videoEncoder getOutputMediaDescription success'); + printfDescription(mediaDescription); + } else { + console.log('videoEncoder getOutputMediaDescription fail'); + } +}); +``` + +### getOutputMediaDescription + +getOutputMediaDescription(): Promise<[MediaDescription](#mediadescription8)> + +获取编码后数据的媒体信息。 + +**返回值:** + +| 类型 | 说明 | +| -------------- | ------------------------------------------- | +| Promise\ | 接口调用的返回值。 | + +**示例:** + +```js +function printfDescription(obj) { + for (let item in obj) { + let property = obj[item]; + console.info('videoEncoder key is ' + item); + console.info('videoEncoder value is ' + property); + } +} +function failureCallback(error) { + console.info(`videoEncoder failureCallback, error:${error.message}`); +} +function catchCallback(error) { + console.info(`videoEncoder catchCallback, error:${error.message}`); +} + +await videoEncoder.getOutputMediaDescription().then((mediaDescription) => { + console.log('videoEncoder getOutputMediaDescription success'); + printfDescription(mediaDescription); +}, failureCallback).catch(catchCallback); +``` + +### getVideoEncoderCaps + +getVideoEncoderCaps(callback: AsyncCallback\): void + +获取编码器能力。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ------------------------------ | +| callback | AsyncCallback | 是 | 接口调用的回调函数。 | + +**示例:** + +```js +videoEncoder.getVideoEncoderCaps((error, videoCaps) => { + if (typeof(videoCaps) != 'undefined') { + console.log('videoEncoder getVideoEncoderCaps success'); + printfDescription(mediaDescription); + } else { + console.log('videoEncoder getVideoEncoderCaps fail'); + } +}); +``` + +### getVideoEncoderCaps + +getVideoDecoder(): Promise\ + +获取编码器能力。 + +**返回值:** + +| 类型 | 说明 | +| -------------- | --------------------------------- | +| Promise\ | 接口调用的返回值。 | + +**示例:** + +```js +function failureCallback(error) { + console.info(`videoEncoder failureCallback, error:${error.message}`); +} +function catchCallback(error) { + console.info(`videoEncoder catchCallback, error:${error.message}`); +} + +await videoEncoder.getVideoEncoderCaps().then((videoCaps) => { + console.log('videoEncoder getVideoEncoderCaps success'); +}, failureCallback).catch(catchCallback); +``` + +### on('error') + +on(type: 'error', callback: ErrorCallback<[CodecError](#codecerror8)>): void + +订阅视频编码错误事件。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 视频编码错误事件回调类型,支持的事件包括:'error'。
- 'error':视频编码中发生错误,触发该事件。 | +| callback | ErrorCallback<[CodecError](#codecerror8)> | 是 | 视频编码错误事件回调方法。 | + +**示例:** + +```js +videoEncoder.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}`);// 打印错误类型详细描述 +}); +``` + +### on('outputFormatChanged') + +on(type: 'outputFormatChanged', callback: Callback<[MediaDescription](#mediadescription8)>) + +订阅编码后数据的媒体信息变化事件。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 编码视频第一帧或媒体信息发生变化事件回调类型,支持的事件包括:'outputFormatChanged'。
- 'outputFormatChanged':编码视频第一帧编码完成或媒体信息发生变化时,触发该事件。 | +| callback | Callback<[MediaDescription](#mediadescription8)> | 是 | 编码视频第一帧或媒体信息发生变化事件回调方法。 | + +**示例:** + +```js +/* 将format中的所有内容显示 */ +function printfDescription(obj) { + for (let item in obj) { + let property = obj[item]; + console.info('videoEncoder key is ' + item); + console.info('videoEncoder value is ' + property); + } +} + +videoEncoder.on('outputFormatChanged', (format) => { // 设置编码视频第一帧或媒体信息发生变化事件回调 + if (typeof(format) != 'undefined') { + printfDescription(format); + } +}); +/* 编码视频的媒体信息发生变化时,触发事件 */ +``` + +### on('outputAvailable') + +on(type: 'outputAvailable', callback: Callback<[CodecBuffer](#codecbuffer8)>) + +订阅视频编码输出视频帧编码后内存事件。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 视频编码输出视频帧编码后内存事件回调类型,支持的事件包括:'outputAvailable'。
- 'outputAvailable':queueInput()调用之后,触发该事件。 | +| callback | Callback<[CodecBuffer](#codecbuffer8)> | 是 | 视频编码输出视频帧编码后内存事件。
- 媒体服务将视频帧编码后的内容通过[CodecBuffer](#codecbuffer8)返回给用户,用户读取内存后,需调用releaseOutput()方法将该内存从队列中移除。 | + +**示例:** + +```js +videoEncoder.on('outputAvailable', (outBuffer) => { + console.info('videoEncoder outputAvailable'); + /* 根据业务场景消费buffer */ + /* 消费完毕,将buffer归还给编码器,调用该接口后,不得再对buffer进行读写操作 */ + videoEncoder.releaseOutput(outBuffer, (error) => { + if (typeof(error) != 'undefined') { + console.log('videoEncoder releaseOutput success'); + } else { + console.info(`videoEncoder releaseOutput fail, errMessage:${error.message}`); + } + }); +}); +``` \ No newline at end of file -- Gitee From bc93c3e2863d8f6bb7d56cebc54f29fee7cec7fe Mon Sep 17 00:00:00 2001 From: abc12133 Date: Fri, 11 Feb 2022 16:08:57 +0800 Subject: [PATCH 03/14] doc Signed-off-by: abc12133 --- .../zh-ch_image_image_video_encoder.png | Bin 0 -> 19284 bytes ...h-ch_image_image_video_encoder_machine.png | Bin 0 -> 41065 bytes .../reference/apis/js-apis-media.md | 34 +++++++++--------- 3 files changed, 16 insertions(+), 18 deletions(-) create mode 100644 zh-cn/application-dev/media/figures/zh-ch_image_image_video_encoder.png create mode 100644 zh-cn/application-dev/media/figures/zh-ch_image_image_video_encoder_machine.png diff --git a/zh-cn/application-dev/media/figures/zh-ch_image_image_video_encoder.png b/zh-cn/application-dev/media/figures/zh-ch_image_image_video_encoder.png new file mode 100644 index 0000000000000000000000000000000000000000..31a984b77803d613a73796d3dc9521f4cd7be2f4 GIT binary patch literal 19284 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

s#q^Ln^09tg%L-u>+)pD;Je|Q~ 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 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index b75c1d2d501..3dc6f67aa2f 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -1350,7 +1350,7 @@ await videoEncoder.setParameter(mediaDescription).then(() => { getOutputMediaDescription(callback: AsyncCallback<[MediaDescription](#mediadescription8)>): void -获取编码后数据的媒体信息。 +获取输出buffer的媒体信息。 **参数:** @@ -1383,7 +1383,7 @@ videoEncoder.getOutputMediaDescription((error, mediaDescription) => { getOutputMediaDescription(): Promise<[MediaDescription](#mediadescription8)> -获取编码后数据的媒体信息。 +获取输出buffer的媒体信息。 **返回值:** @@ -1476,16 +1476,16 @@ on(type: 'error', callback: ErrorCallback<[CodecError](#codecerror8)>): void | 参数名 | 类型 | 必填 | 说明 | | -------- | ----------------------------------------- | ---- | ------------------------------------------------------------ | -| type | string | 是 | 视频编码错误事件回调类型,支持的事件包括:'error'。
- 'error':视频编码中发生错误,触发该事件。 | -| callback | ErrorCallback<[CodecError](#codecerror8)> | 是 | 视频编码错误事件回调方法。 | +| type | string | 是 | 事件名称。 | +| callback | ErrorCallback<[CodecError](#codecerror8)> | 是 | 错误信息。 | **示例:** ```js -videoEncoder.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}`);// 打印错误类型详细描述 +videoEncoder.on('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}`); }); ``` @@ -1493,19 +1493,18 @@ videoEncoder.on('error', (error) => { // 设置'error'事件回调 on(type: 'outputFormatChanged', callback: Callback<[MediaDescription](#mediadescription8)>) -订阅编码后数据的媒体信息变化事件。 +订阅输出buffer的媒体信息变化事件。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------------------------------ | ---- | ------------------------------------------------------------ | -| type | string | 是 | 编码视频第一帧或媒体信息发生变化事件回调类型,支持的事件包括:'outputFormatChanged'。
- 'outputFormatChanged':编码视频第一帧编码完成或媒体信息发生变化时,触发该事件。 | -| callback | Callback<[MediaDescription](#mediadescription8)> | 是 | 编码视频第一帧或媒体信息发生变化事件回调方法。 | +| type | string | 是 | 事件名称。 | +| callback | Callback<[MediaDescription](#mediadescription8)> | 是 | 输出buffer的媒体信息。 | **示例:** ```js -/* 将format中的所有内容显示 */ function printfDescription(obj) { for (let item in obj) { let property = obj[item]; @@ -1514,26 +1513,25 @@ function printfDescription(obj) { } } -videoEncoder.on('outputFormatChanged', (format) => { // 设置编码视频第一帧或媒体信息发生变化事件回调 +videoEncoder.on('outputFormatChanged', (format) => { if (typeof(format) != 'undefined') { printfDescription(format); } }); -/* 编码视频的媒体信息发生变化时,触发事件 */ ``` ### on('outputAvailable') -on(type: 'outputAvailable', callback: Callback<[CodecBuffer](#codecbuffer8)>) +on(type: 'outputAvailable', callback: Callback) -订阅视频编码输出视频帧编码后内存事件。 +订阅输出buffer事件。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------------------------------------- | ---- | ------------------------------------------------------------ | -| type | string | 是 | 视频编码输出视频帧编码后内存事件回调类型,支持的事件包括:'outputAvailable'。
- 'outputAvailable':queueInput()调用之后,触发该事件。 | -| callback | Callback<[CodecBuffer](#codecbuffer8)> | 是 | 视频编码输出视频帧编码后内存事件。
- 媒体服务将视频帧编码后的内容通过[CodecBuffer](#codecbuffer8)返回给用户,用户读取内存后,需调用releaseOutput()方法将该内存从队列中移除。 | +| type | string | 是 | 事件名称。 | +| callback | Callback | 是 | 输出buffer。 | **示例:** -- Gitee From 68f071abb20e485f53815abcf5b9d79cf3240233 Mon Sep 17 00:00:00 2001 From: abc12133 Date: Fri, 11 Feb 2022 17:09:04 +0800 Subject: [PATCH 04/14] add Signed-off-by: abc12133 --- zh-cn/application-dev/media/video-encoder.md | 3 ++ .../reference/apis/js-apis-media.md | 53 +++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/zh-cn/application-dev/media/video-encoder.md b/zh-cn/application-dev/media/video-encoder.md index 34a88efedb4..fb6ff56f32d 100644 --- a/zh-cn/application-dev/media/video-encoder.md +++ b/zh-cn/application-dev/media/video-encoder.md @@ -94,6 +94,9 @@ await videoEncoder.configure(mediaDescription).then(() => { }, failureCallback).catch(catchCallback); /* 4.获取surfaceID并配置给数据源 */ +await videoEncoder.getInputSurface().then((id) => { + /* 将surfaceID配置给数据源 */ +}, failureCallback).catch(catchCallback); /* 5.准备编码 */ await videoEncoder.prepare().then(() => { diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index 3dc6f67aa2f..7bc5a6e4868 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -1346,6 +1346,59 @@ await videoEncoder.setParameter(mediaDescription).then(() => { }, failureCallback).catch(catchCallback); ``` +### getInputSurface + +getInputSurface(callback: AsyncCallback): void + +获取surfaceID。 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------------------- | ---- | ---------------------------------------- | +| callback | AsyncCallback | 是 | 接口调用的回调函数,包含surfaceID。 | + +**示例:** + +```js +videoEncoder.getInputSurface((error, id) => { + if (typeof(mediaDescription) != 'undefined') { + console.log('videoEncoder getInputSurface success'); + /* 将surfaceID配置给数据源 */ + } else { + console.log('videoEncoder getInputSurface fail'); + } +}); +``` + +### getInputSurface + +getInputSurface(): Promise + +获取surfaceID。 + +**返回值:** + +| 类型 | 说明 | +| -------------- | ------------------------------------------- | +| Promise\ | 接口调用的返回值,包含surfaceID。 | + +**示例:** + +```js +function failureCallback(error) { + console.info(`videoEncoder failureCallback, error:${error.message}`); +} +function catchCallback(error) { + console.info(`videoEncoder catchCallback, error:${error.message}`); +} + +await videoEncoder.getInputSurface().then((id) => { + console.log('videoEncoder getInputSurface success'); + /* 将surfaceID配置给数据源 */ +}, failureCallback).catch(catchCallback); +``` + ### getOutputMediaDescription getOutputMediaDescription(callback: AsyncCallback<[MediaDescription](#mediadescription8)>): void -- Gitee From c8dc7b03d660587851dca2ac6e1a53bd0354c961 Mon Sep 17 00:00:00 2001 From: abc12133 Date: Fri, 11 Feb 2022 17:28:19 +0800 Subject: [PATCH 05/14] fix Signed-off-by: abc12133 --- zh-cn/application-dev/reference/apis/js-apis-media.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index 7bc5a6e4868..75646ec689e 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -7,7 +7,7 @@ - 音频播放([AudioPlayer](#audioplayer)) - 音频录制([AudioRecorder](#audiorecorder)) -后续将提供以下功能:视频播放、视频录制、DataSource音视频播放、音视频编编码、容器封装解封装、媒体能力查询等功能。 +后续将提供以下功能:视频播放、视频录制、DataSource音视频播放、音视频编解码、容器封装解封装、媒体能力查询等功能。 ## 导入模块 -- Gitee From f8c99d3883773d8baa05cfdf6ea335907c6c57a1 Mon Sep 17 00:00:00 2001 From: abc12133 Date: Sun, 13 Feb 2022 11:42:49 +0800 Subject: [PATCH 06/14] md Signed-off-by: abc12133 --- .../zh-ch_image_image_video_encoder.png | Bin 19284 -> 19284 bytes zh-cn/application-dev/media/video-encoder.md | 14 +- .../reference/apis/js-apis-media.md | 210 +++++++++--------- 3 files changed, 113 insertions(+), 111 deletions(-) diff --git a/zh-cn/application-dev/media/figures/zh-ch_image_image_video_encoder.png b/zh-cn/application-dev/media/figures/zh-ch_image_image_video_encoder.png index 31a984b77803d613a73796d3dc9521f4cd7be2f4..4ebc911893f4ebeb4bd914df5b94f24bf1787907 100644 GIT binary patch literal 19284 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 literal 19284 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 rjyeWh;z5NiAwY)@1ydF*`Olodq { }, failureCallback).catch(catchCallback); ``` -## media.createVideoEncoderByName +## media.createVideoEncoderByName8+ createVideoEncoderByName(name: string, callback: AsyncCallback<[VideoEncodeProcessor]>): void @@ -116,7 +117,7 @@ media.createVideoEncoderByName('avenc_mpeg4', (error, encoder) => { }); ``` -## media.createVideoEncoderByName +## media.createVideoEncoderByName8+ createVideoEncoderByName(name: string): Promise<[VideoEncodeProcessor]> @@ -154,7 +155,7 @@ await media.createVideoEncoderByName('avenc_mpeg4').then((encoder) => { }, failureCallback).catch(catchCallback); ``` -## media.createVideoEncoderByMime +## media.createVideoEncoderByMime8+ createVideoEncoderByMime(codecMime: string, callback: AsyncCallback<[VideoEncodeProcessor]>) @@ -180,7 +181,7 @@ media.createVideoEncoderByMime('video/avc', (error, encoder) => { }); ``` -## media.createVideoEncoderByMime +## media.createVideoEncoderByMime8+ createVideoEncoderByMime(name: string): Promise<[VideoEncodeProcessor]> @@ -552,24 +553,24 @@ on(type: 'play' | 'pause' | 'stop' | 'reset' | 'dataLoad' | 'finish' | 'volumeCh ```js let audioPlayer = media.createAudioPlayer(); //创建一个音频播放实例 audioPlayer.on('dataLoad', () => { //设置'dataLoad'事件回调,src属性设置成功后,触发此回调 - console.info('audio set source success'); + console.info('audio set source success'); audioPlayer.play(); //开始播放,并触发'play'事件回调 }); audioPlayer.on('play', () => { //设置'play'事件回调 - console.info('audio play success'); + console.info('audio play success'); audioPlayer.seek(30000); //调用seek方法,并触发'timeUpdate'事件回调 }); audioPlayer.on('pause', () => { //设置'pause'事件回调 - console.info('audio pause success'); + console.info('audio pause success'); audioPlayer.stop(); //停止播放,并触发'stop'事件回调 }); audioPlayer.on('reset', () => { //设置'reset'事件回调 - console.info('audio reset success'); + console.info('audio reset success'); audioPlayer.release(); //释放播放实例资源 audioPlayer = undefined; }); audioPlayer.on('timeUpdate', (seekDoneTime) => { //设置'timeUpdate'事件回调 - if (typeof(seekDoneTime) == "undefined") { + if (typeof(seekDoneTime) == "undefined") { console.info('audio seek fail'); return; } @@ -577,15 +578,15 @@ audioPlayer.on('timeUpdate', (seekDoneTime) => { //设置'timeUpdate'事件回 audioPlayer.setVolume(0.5); //设置音量为50%,并触发'volumeChange'事件回调 }); audioPlayer.on('volumeChange', () => { //设置'volumeChange'事件回调 - console.info('audio volumeChange success'); + console.info('audio volumeChange success'); audioPlayer.pause(); //暂停播放,并触发'pause'事件回调 }); audioPlayer.on('finish', () => { //设置'finish'事件回调 - console.info('audio play finish'); + console.info('audio play finish'); audioPlayer.stop(); //停止播放,并触发'stop'事件回调 }); audioPlayer.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, errMessage is ${error.message}`); }); @@ -635,7 +636,7 @@ on(type: 'error', callback: ErrorCallback): void ```js audioPlayer.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, errMessage is ${error.message}`);//打印错误类型详细描述 }); @@ -834,13 +835,13 @@ on(type: 'error', callback: ErrorCallback): void | MPEG_4 | 2 | 封装为MPEG-4格式。 | | AAC_ADTS | 6 | 封装为ADTS(Audio Data Transport Stream)格式,是AAC音频的传输流格式。 | -## VideoEncodeProcessor +## VideoEncodeProcessor8+ -视频编码管理类,在调用VideoEncodeProcessor的方法前,需要先通过[createVideoEncoderByName()]或[createVideoEncoderByMime()]构建一个[VideoEncodeProcessor]实例。 +视频编码管理类,在调用VideoEncodeProcessor的方法前,需要先通过[createVideoEncoderByName()](#media.createvideoencoderbyname8)或[createVideoEncoderByMime()](#media.createvideoencoderbymime8)构建一个[VideoEncodeProcessor]实例。 -视频编码demo可参考:[视频编码开发指导](../../media/video-decoder.md) +视频编码demo可参考:[视频编码开发指导](../../media/video-encoder.md) -### configure +### configure
configure(desc: [MediaDescription](#mediadescription8), callback: AsyncCallback\): void @@ -857,21 +858,21 @@ configure(desc: [MediaDescription](#mediadescription8), callback: AsyncCallback\ ```js let mediaDescription = { - "width" : 320, - "height" : 240, - "frame_rate" : 60.00, - "pixel_format" : media.VideoPixelformat.NV21, + "width": 1920, + "height": 1080, + "pixel_format": media.VideoPixelformat.NV21, + "frame_rate": 60.00, } videoEncoder.configure(mediaDescription, (error) => { - if (typeof(error) != 'undefined') { - console.log('videoEncoder configure success'); - } else { - console.info(`videoEncoder configure fail, errMessage:${error.message}`); - } + if (typeof(error) != 'undefined') { + console.log('videoEncoder configure success'); + } else { + console.info(`videoEncoder configure fail, errMessage:${error.message}`); + } }); ``` -### configure +### configure configure(desc: [MediaDescription](#mediadescription8)): Promise\ @@ -900,17 +901,17 @@ function catchCallback(error) { } let mediaDescription = { - "width" : 320, - "height" : 240, - "frame_rate" : 60.00, - "pixel_format" : media.VideoPixelformat.NV21, + "width": 1920, + "height": 1080, + "pixel_format": media.VideoPixelformat.NV21, + "frame_rate": 60.00, } await videoEncoder.configure(mediaDescription).then(() => { console.log('videoEncoder configure success'); }, failureCallback).catch(catchCallback); ``` -### prepare +### prepare prepare(callback: AsyncCallback\): void @@ -927,14 +928,14 @@ prepare(callback: AsyncCallback\): void ```js videoEncoder.prepare((error) => { if (typeof(error) != 'undefined') { - console.log('videoEncoder prepare success'); - } else { - console.info(`videoEncoder prepare fail, errMessage:${error.message}`); - } + console.log('videoEncoder prepare success'); + } else { + console.info(`videoEncoder prepare fail, errMessage:${error.message}`); + } }); ``` -### prepare +### prepare prepare(): Promise\ @@ -961,11 +962,11 @@ await videoEncoder.prepare().then(() => { }, failureCallback).catch(catchCallback); ``` -### start +### start start(callback: AsyncCallback\): void -开始编码。在start()方法调用前需完成inputAvailable和outputAvailable事件的注册。 +开始编码。在start()方法调用前需订阅[outputAvailable](#videoencodeprocessor_on_outputavailable)事件。 **参数:** @@ -978,18 +979,18 @@ start(callback: AsyncCallback\): void ```js videoEncoder.start((error) => { if (typeof(error) != 'undefined') { - console.log('videoEncoder start success'); - } else { - console.info(`videoEncoder start fail, errMessage:${error.message}`); - } + console.log('videoEncoder start success'); + } else { + console.info(`videoEncoder start fail, errMessage:${error.message}`); + } }); ``` -### start +### start start(): Promise\ -开始编码。在start()方法调用前需完成inputAvailable和outputAvailable事件的注册。 +开始编码。在start()方法调用前需订阅[outputAvailable](#videoencodeprocessor_on_outputavailable)事件。 **返回值:** @@ -1012,7 +1013,7 @@ await videoEncoder.start().then(() => { }, failureCallback).catch(catchCallback); ``` -### stop +### stop stop(callback: AsyncCallback\): void @@ -1029,14 +1030,14 @@ stop(callback: AsyncCallback\): void ```js videoEncoder.stop((error) => { if (typeof(error) != 'undefined') { - console.log('videoEncoder stop success'); - } else { - console.info(`videoEncoder stop fail, errMessage:${error.message}`); - } + console.log('videoEncoder stop success'); + } else { + console.info(`videoEncoder stop fail, errMessage:${error.message}`); + } }); ``` -### stop +### stop stop: Promise\ @@ -1063,11 +1064,11 @@ await videoEncoder.stop().then(() => { }, failureCallback).catch(catchCallback); ``` -### flush +### flush flush(callback: AsyncCallback\): void -清空缓存队列。调用该接口后,不得继续使用通过outputAvailable获取的buffer。 +清空缓存队列。调用该接口后,不得使用之前通过[outputAvailable](#videoencodeprocessor_on_outputavailable)获取的buffer。 **参数:** @@ -1080,18 +1081,18 @@ flush(callback: AsyncCallback\): void ```js videoEncoder.flush((error) => { if (typeof(error) != 'undefined') { - console.log('videoEncoder flush success'); - } else { - console.info(`videoEncoder flush fail, errMessage:${error.message}`); - } + console.log('videoEncoder flush success'); + } else { + console.info(`videoEncoder flush fail, errMessage:${error.message}`); + } }); ``` -### flush +### flush flush(): Promise\ -清空缓存队列。调用该接口后,不得继续使用通过outputAvailable获取的buffer。 +清空缓存队列。调用该接口后,不得使用之前通过[outputAvailable](#videoencodeprocessor_on_outputavailable)获取的buffer。 **返回值:** @@ -1114,7 +1115,7 @@ await videoEncoder.flush().then(() => { }, failureCallback).catch(catchCallback); ``` -### reset +### reset reset(callback: AsyncCallback\): void @@ -1131,14 +1132,14 @@ reset(callback: AsyncCallback\): void ```js videoEncoder.reset((error) => { if (typeof(error) != 'undefined') { - console.log('videoEncoder reset success'); - } else { - console.info(`videoEncoder reset fail, errMessage:${error.message}`); - } + console.log('videoEncoder reset success'); + } else { + console.info(`videoEncoder reset fail, errMessage:${error.message}`); + } }); ``` -### reset +### reset reset(): Promise\ @@ -1165,7 +1166,7 @@ await videoEncoder.reset().then(() => { }, failureCallback).catch(catchCallback); ``` -### release +### release release(callback: AsyncCallback\): void @@ -1182,15 +1183,15 @@ release(callback: AsyncCallback\): void ```js videoEncoder.release((error) => { if (typeof(error) != 'undefined') { - console.log('videoEncoder release success'); + console.log('videoEncoder release success'); videoEncoder = undefined; - } else { - console.info(`videoEncoder release fail, errMessage:${error.message}`); - } + } else { + console.info(`videoEncoder release fail, errMessage:${error.message}`); + } }); ``` -### release +### release release(): Promise\ @@ -1218,9 +1219,9 @@ await videoEncoder.release().then(() => { videoEncoder = undefined; ``` -### releaseOutput +### releaseOutput -releaseOutput(buffer: CodecBuffer, callback: AsyncCallback\): void +releaseOutput(buffer: [CodecBuffer](#codecbuffer8), callback: AsyncCallback\): void 将输出buffer归还给编码器。 @@ -1228,7 +1229,7 @@ releaseOutput(buffer: CodecBuffer, callback: AsyncCallback\): void | 参数名 | 类型 | 必填 | 说明 | | -------- | ---------------------------- | ---- | -------------------------------------- | -| buffer | CodecBuffer | 是 | 输出buffer。 | +| buffer | [CodecBuffer](#codecbuffer8) | 是 | 输出buffer。 | | callback | AsyncCallback\ | 是 | 接口调用的回调函数。 | **示例:** @@ -1245,9 +1246,9 @@ videoEncoder.on('outputAvailable', (outputBuffer) => { }); ``` -### releaseOutput +### releaseOutput -releaseOutput(buffer: CodecBuffer): Promise\ +releaseOutput(buffer: [CodecBuffer](#codecbuffer8)): Promise\ 将输出buffer归还给编码器。 @@ -1280,7 +1281,7 @@ videoEncoder.on('outputAvailable', (outputBuffer) => { }); ``` -### setParameter +### setParameter setParameter(desc: [MediaDescription](#mediadescription8), callback: AsyncCallback\): void @@ -1297,19 +1298,19 @@ setParameter(desc: [MediaDescription](#mediadescription8), callback: AsyncCallba ```js let mediaDescription = { - "req_i_frame" : 1, // 动态请求I帧 + "req_i_frame" : 1, // 动态请求I帧 } videoEncoder.setParameter(mediaDescription, (error) => { if (typeof(error) != 'undefined') { - console.log('videoEncoder setParameter success'); - } else { - console.info(`videoEncoder setParameter fail, errMessage:${error.message}`); - } + console.log('videoEncoder setParameter success'); + } else { + console.info(`videoEncoder setParameter fail, errMessage:${error.message}`); + } }); ``` -### setParameter +### setParameter setParameter(desc: [MediaDescription](#mediadescription8)): Promise\ @@ -1338,7 +1339,7 @@ function catchCallback(error) { } let mediaDescription = { - "req_i_frame" : 1, // 动态请求I帧 + "req_i_frame" : 1, // 动态请求I帧 } await videoEncoder.setParameter(mediaDescription).then(() => { @@ -1346,11 +1347,11 @@ await videoEncoder.setParameter(mediaDescription).then(() => { }, failureCallback).catch(catchCallback); ``` -### getInputSurface +### getInputSurface getInputSurface(callback: AsyncCallback): void -获取surfaceID。 +获取用作编码输入源的surface的ID。 **参数:** @@ -1362,20 +1363,15 @@ getInputSurface(callback: AsyncCallback): void ```js videoEncoder.getInputSurface((error, id) => { - if (typeof(mediaDescription) != 'undefined') { - console.log('videoEncoder getInputSurface success'); - /* 将surfaceID配置给数据源 */ - } else { - console.log('videoEncoder getInputSurface fail'); - } + /* 将surfaceID配置给数据源 */ }); ``` -### getInputSurface +### getInputSurface getInputSurface(): Promise -获取surfaceID。 +获取用作编码输入源的surface的ID。 **返回值:** @@ -1399,7 +1395,7 @@ await videoEncoder.getInputSurface().then((id) => { }, failureCallback).catch(catchCallback); ``` -### getOutputMediaDescription +### getOutputMediaDescription getOutputMediaDescription(callback: AsyncCallback<[MediaDescription](#mediadescription8)>): void @@ -1432,7 +1428,7 @@ videoEncoder.getOutputMediaDescription((error, mediaDescription) => { }); ``` -### getOutputMediaDescription +### getOutputMediaDescription getOutputMediaDescription(): Promise<[MediaDescription](#mediadescription8)> @@ -1467,9 +1463,9 @@ await videoEncoder.getOutputMediaDescription().then((mediaDescription) => { }, failureCallback).catch(catchCallback); ``` -### getVideoEncoderCaps +### getVideoEncoderCaps -getVideoEncoderCaps(callback: AsyncCallback\): void +getVideoEncoderCaps(callback: AsyncCallback<[VideoCaps](#videocaps8)>): void 获取编码器能力。 @@ -1477,7 +1473,7 @@ getVideoEncoderCaps(callback: AsyncCallback\): void | 参数名 | 类型 | 必填 | 说明 | | -------- | --------------------------------------- | ---- | ------------------------------ | -| callback | AsyncCallback | 是 | 接口调用的回调函数。 | +| callback | AsyncCallback<[VideoCaps](#videocaps8)> | 是 | 接口调用的回调函数。 | **示例:** @@ -1492,9 +1488,9 @@ videoEncoder.getVideoEncoderCaps((error, videoCaps) => { }); ``` -### getVideoEncoderCaps +### getVideoEncoderCaps -getVideoDecoder(): Promise\ +getVideoEncoder(): Promise<[VideoCaps](#videocaps8)> 获取编码器能力。 @@ -1519,7 +1515,7 @@ await videoEncoder.getVideoEncoderCaps().then((videoCaps) => { }, failureCallback).catch(catchCallback); ``` -### on('error') +### on('error') on(type: 'error', callback: ErrorCallback<[CodecError](#codecerror8)>): void @@ -1536,13 +1532,13 @@ on(type: 'error', callback: ErrorCallback<[CodecError](#codecerror8)>): void ```js videoEncoder.on('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, errMessage is ${error.message}`); }); ``` -### on('outputFormatChanged') +### on('outputFormatChanged') on(type: 'outputFormatChanged', callback: Callback<[MediaDescription](#mediadescription8)>) @@ -1573,9 +1569,9 @@ videoEncoder.on('outputFormatChanged', (format) => { }); ``` -### on('outputAvailable') +### on('outputAvailable') -on(type: 'outputAvailable', callback: Callback) +on(type: 'outputAvailable', callback: Callback<[CodecBuffer](#codecbuffer8)>) 订阅输出buffer事件。 @@ -1584,7 +1580,7 @@ on(type: 'outputAvailable', callback: Callback) | 参数名 | 类型 | 必填 | 说明 | | -------- | -------------------------------------- | ---- | ------------------------------------------------------------ | | type | string | 是 | 事件名称。 | -| callback | Callback | 是 | 输出buffer。 | +| callback | Callback<[CodecBuffer](#codecbuffer8)> | 是 | 输出buffer。 | **示例:** -- Gitee From 88d088bfb1fa527ddc7e859818042a57f6529bbe Mon Sep 17 00:00:00 2001 From: abc12133 Date: Sun, 13 Feb 2022 11:45:00 +0800 Subject: [PATCH 07/14] md Signed-off-by: abc12133 --- zh-cn/application-dev/media/video-encoder.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/zh-cn/application-dev/media/video-encoder.md b/zh-cn/application-dev/media/video-encoder.md index e3aaece1b69..50eda118b84 100644 --- a/zh-cn/application-dev/media/video-encoder.md +++ b/zh-cn/application-dev/media/video-encoder.md @@ -36,7 +36,7 @@ function printfDescription(obj) { /* 设置订阅事件回调函数 */ function SetCallback() { - videoEncoder.on('outputAvailable', (buffer) => { // 订阅编码器输出事件 + videoEncoder.on('outputAvailable', (buffer) => { console.info('videoEncoder outputAvailable'); /* 根据业务场景消费buffer */ /* 消费完毕,将buffer归还给编码器,调用该接口后,不得再对buffer进行读写操作 */ @@ -49,13 +49,13 @@ function SetCallback() { }); }); - videoEncoder.on('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}`);// 打印错误类型详细描述 + videoEncoder.on('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}`); }); - videoEncoder.on('outputFormatChanged', (format) => { // 订阅编码后数据的媒体信息变化事件 + videoEncoder.on('outputFormatChanged', (format) => { if (typeof(format) != 'undefined') { printfDescription(format); } -- Gitee From 068868c9e59dc33dec25d572a02451461fe536f4 Mon Sep 17 00:00:00 2001 From: abc12133 Date: Sun, 13 Feb 2022 15:52:58 +0800 Subject: [PATCH 08/14] md Signed-off-by: abc12133 --- zh-cn/application-dev/media/video-encoder.md | 8 ++++---- zh-cn/application-dev/reference/apis/js-apis-media.md | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/zh-cn/application-dev/media/video-encoder.md b/zh-cn/application-dev/media/video-encoder.md index 50eda118b84..9248fe093ad 100644 --- a/zh-cn/application-dev/media/video-encoder.md +++ b/zh-cn/application-dev/media/video-encoder.md @@ -50,9 +50,9 @@ function SetCallback() { }); videoEncoder.on('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}`); + console.info(`error happened, errName is ${error.name}`); + console.info(`error happened, errCode is ${error.code}`); + console.info(`error happened, errMessage is ${error.message}`); }); videoEncoder.on('outputFormatChanged', (format) => { @@ -139,6 +139,6 @@ await videoEncoder.reset().then(() => { await videoEncoder.release().then(() => { console.log('videoEncoder release success'); }, failureCallback).catch(catchCallback); -videoEncoder = undefined; // 将编码器置空 +videoEncoder = undefined; ``` diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index 170c388c0cd..6a7cb5893b6 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -1532,9 +1532,9 @@ on(type: 'error', callback: ErrorCallback<[CodecError](#codecerror8)>): void ```js videoEncoder.on('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}`); + console.info(`error happened, errName is ${error.name}`); + console.info(`error happened, errCode is ${error.code}`); + console.info(`error happened, errMessage is ${error.message}`); }); ``` -- Gitee From 82ba1ab5f6313fc4856ee8606acc3fb95642222d Mon Sep 17 00:00:00 2001 From: abc12133 Date: Sun, 13 Feb 2022 16:13:40 +0800 Subject: [PATCH 09/14] png Signed-off-by: abc12133 --- ...h-ch_image_image_video_encoder_machine.png | Bin 41065 -> 41065 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/zh-cn/application-dev/media/figures/zh-ch_image_image_video_encoder_machine.png b/zh-cn/application-dev/media/figures/zh-ch_image_image_video_encoder_machine.png index a2704711de00cc82254f9f8130e70aecab5f3e2d..92beb81472ad435e720bc87db76adb61e31c4800 100644 GIT binary patch delta 27632 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%0Amc%D>Om*i_#D3EGA4RqquO<+ zF7AjUvA|B1f{pO*q@d+XYjH71vz^ur2=9O*oA7_)6YWfo`vaLQ<9LmUcV zm?0NP!hZ+Dv>nvq%sO75EhH=A$%?HZnfz&x(I>C%qP7 z=?BKrpBfSm{zInjPt`Df3Vw3whs;oenV(NuJs;Q{GLIDaXPWOsclBAt@JUe!M|Qe| zc;)i9lLXlImb0h??&LB*N&|ETP{IDc96hyDoL6QhJ^zbyu2jdiS#KtK+;qR<6%Aei T(^A*JnXhUcQmp7ICjEZ^LMSMh delta 26273 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 GBm6(?te-*v -- Gitee From b5a551cfbf75f41da614a45821dd3560f4c1bdaa Mon Sep 17 00:00:00 2001 From: abc12133 Date: Sun, 13 Feb 2022 16:19:00 +0800 Subject: [PATCH 10/14] png Signed-off-by: abc12133 --- ...h-ch_image_image_video_encoder_machine.png | Bin 41065 -> 41065 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/zh-cn/application-dev/media/figures/zh-ch_image_image_video_encoder_machine.png b/zh-cn/application-dev/media/figures/zh-ch_image_image_video_encoder_machine.png index 92beb81472ad435e720bc87db76adb61e31c4800..b836458d068acc56f31d5d867d6565a6eb6884bf 100644 GIT binary patch delta 34046 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 PcME0Bg34%v)fxU5VA3<} delta 33967 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 z Date: Tue, 15 Feb 2022 09:56:13 +0800 Subject: [PATCH 11/14] fix Signed-off-by: abc12133 --- zh-cn/application-dev/media/video-encoder.md | 8 ++------ .../reference/apis/js-apis-media.md | 20 +++++++++---------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/zh-cn/application-dev/media/video-encoder.md b/zh-cn/application-dev/media/video-encoder.md index 9248fe093ad..2bb67663e93 100644 --- a/zh-cn/application-dev/media/video-encoder.md +++ b/zh-cn/application-dev/media/video-encoder.md @@ -8,17 +8,13 @@ ![zh-ch_image_image_video_encoder_machine](figures/zh-ch_image_image_video_encoder_machine.png) - -## 视频编码零层图 - **图2** 视频编码零层图 -![zh-ch_image_image_video_encoder](figures/zh-ch_image_image_video_encoder.jpg) - +![zh-ch_image_image_video_encoder](figures/zh-ch_image_image_video_encoder.png) ## 视频编码开发步骤 -详细API含义可参考:[js-apis-media.md](../reference/apis/js-apis-media.md) +详细API含义可参考:[js-apis-media.md](../reference/apis/js-apis-media.md)的VideoEncoderProcessor。 ### 全流程场景 diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index 6a7cb5893b6..78948485796 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -93,7 +93,7 @@ await media.createAudioPlayerAsync.then((audio) => { ## media.createVideoEncoderByName8+ -createVideoEncoderByName(name: string, callback: AsyncCallback<[VideoEncodeProcessor]>): void +createVideoEncoderByName(name: string, callback: AsyncCallback<[VideoEncodeProcessor](#videoencodeprocessor8)>): void 通过编码器名称,创建指定的视频编码器实例。 @@ -102,7 +102,7 @@ createVideoEncoderByName(name: string, callback: AsyncCallback<[VideoEncodeProce | 参数名 | 类型 | 必填 | 说明 | | -------- | ------------------------------------------------------------ | ---- | ------------------------------ | | name | string | 是 | 编码器名称。 | -| callback | AsyncCallback<[VideoEncodeProcessor]> | 是 | 接口调用的回调函数,包含视频编码器实例。 | +| callback | AsyncCallback<[VideoEncodeProcessor](#videoencodeprocessor8)> | 是 | 接口调用的回调函数,包含视频编码器实例。 | **示例:** @@ -119,7 +119,7 @@ media.createVideoEncoderByName('avenc_mpeg4', (error, encoder) => { ## media.createVideoEncoderByName8+ -createVideoEncoderByName(name: string): Promise<[VideoEncodeProcessor]> +createVideoEncoderByName(name: string): Promise<[VideoEncodeProcessor](#videoencodeprocessor8)> 通过编码器名称,创建指定的视频编码器实例。 @@ -133,7 +133,7 @@ createVideoEncoderByName(name: string): Promise<[VideoEncodeProcessor]> | 类型 | 说明 | | ------------------------------------------------------- | ----------------------------------- | -| Promise<[VideoEncodeProcessor]> | 接口调用的返回值,包含视频编码器实例。 | +| Promise<[VideoEncodeProcessor](#videoencodeprocessor8)> | 接口调用的返回值,包含视频编码器实例。 | **示例:** @@ -157,7 +157,7 @@ await media.createVideoEncoderByName('avenc_mpeg4').then((encoder) => { ## media.createVideoEncoderByMime8+ -createVideoEncoderByMime(codecMime: string, callback: AsyncCallback<[VideoEncodeProcessor]>) +createVideoEncoderByMime(codecMime: string, callback: AsyncCallback<[VideoEncodeProcessor](#videoencodeprocessor8)>) 根据[CodecMimeType],创建优选的视频编码器实例。 @@ -166,7 +166,7 @@ createVideoEncoderByMime(codecMime: string, callback: AsyncCallback<[VideoEncode | 参数名 | 类型 | 必填 | 说明 | | --------- | ------------------------------------------------------------ | ---- | ----------------------------------------------------------- | | codecMime | string | 是 | MIME类型,具体可参考[CodecMimeType]。 | -| callback | AsyncCallback<[VideoEncodeProcessor]> | 是 | 接口调用的回调函数,包含视频编码器实例。| +| callback | AsyncCallback<[VideoEncodeProcessor](#videoencodeprocessor8)> | 是 | 接口调用的回调函数,包含视频编码器实例。| **示例:** @@ -183,7 +183,7 @@ media.createVideoEncoderByMime('video/avc', (error, encoder) => { ## media.createVideoEncoderByMime8+ -createVideoEncoderByMime(name: string): Promise<[VideoEncodeProcessor]> +createVideoEncoderByMime(name: string): Promise<[VideoEncodeProcessor](#videoencodeprocessor8)> 根据[CodecMimeType],创建优选的视频编码器实例。 @@ -197,7 +197,7 @@ createVideoEncoderByMime(name: string): Promise<[VideoEncodeProcessor]> | 类型 | 说明 | | ------------------------------------------------------- | ----------------------------------- | -| Promise<[VideoEncodeProcessor]> | 接口调用的返回值,包含视频编码器实例。 | +| Promise<[VideoEncodeProcessor](#videoencodeprocessor8)> | 接口调用的返回值,包含视频编码器实例。 | **示例:** @@ -837,7 +837,7 @@ on(type: 'error', callback: ErrorCallback): void ## VideoEncodeProcessor8+ -视频编码管理类,在调用VideoEncodeProcessor的方法前,需要先通过[createVideoEncoderByName()](#media.createvideoencoderbyname8)或[createVideoEncoderByMime()](#media.createvideoencoderbymime8)构建一个[VideoEncodeProcessor]实例。 +视频编码管理类,在调用VideoEncodeProcessor的方法前,需要先通过[createVideoEncoderByName()](#media.createvideoencoderbyname8)或[createVideoEncoderByMime()](#media.createvideoencoderbymime8)构建一个[VideoEncodeProcessor(#videoencodeprocessor8)]实例。 视频编码demo可参考:[视频编码开发指导](../../media/video-encoder.md) @@ -1017,7 +1017,7 @@ await videoEncoder.start().then(() => { stop(callback: AsyncCallback\): void -停止编码。 +停止编码。可调用[start()](#videoencodeprocessor_start1)继续编码。 **参数:** -- Gitee From b1f4bec565e6f85feacfc1381aed28af672c662e Mon Sep 17 00:00:00 2001 From: abc12133 Date: Tue, 15 Feb 2022 14:51:07 +0800 Subject: [PATCH 12/14] 1 Signed-off-by: abc12133 --- zh-cn/application-dev/media/video-encoder.md | 2 +- .../reference/apis/js-apis-media.md | 54 +++++++++---------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/zh-cn/application-dev/media/video-encoder.md b/zh-cn/application-dev/media/video-encoder.md index 2bb67663e93..491b6c5f0b3 100644 --- a/zh-cn/application-dev/media/video-encoder.md +++ b/zh-cn/application-dev/media/video-encoder.md @@ -18,7 +18,7 @@ ### 全流程场景 -包含流程:创建编码器、设置监听事件、配置媒体信息、获取surfaceID并配置给数据源、准备编码、开始编码、获取编码后数据的媒体信息、清空缓存、停止编码、重置编码器、销毁编码器 +包含流程:创建编码器、设置监听事件、配置媒体信息、获取surfaceID并配置给数据源、准备编码、开始编码、获取编码后数据的媒体信息、清空缓存、停止编码、重置编码器、销毁编码器。 ```js /* 用于打印编码后数据的媒体信息 */ diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index 78948485796..5c7e8abf6f2 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -95,7 +95,7 @@ await media.createAudioPlayerAsync.then((audio) => { createVideoEncoderByName(name: string, callback: AsyncCallback<[VideoEncodeProcessor](#videoencodeprocessor8)>): void -通过编码器名称,创建指定的视频编码器实例。 +通过编码器名称,创建指定的视频编码器实例。通过注册回调函数获取返回值。 **参数:** @@ -159,13 +159,13 @@ await media.createVideoEncoderByName('avenc_mpeg4').then((encoder) => { createVideoEncoderByMime(codecMime: string, callback: AsyncCallback<[VideoEncodeProcessor](#videoencodeprocessor8)>) -根据[CodecMimeType],创建优选的视频编码器实例。 +根据[CodecMimeType](#codecmimetype8),创建优选的视频编码器实例。通过注册回调函数获取返回值。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | --------- | ------------------------------------------------------------ | ---- | ----------------------------------------------------------- | -| codecMime | string | 是 | MIME类型,具体可参考[CodecMimeType]。 | +| codecMime | string | 是 | MIME类型,具体可参考[CodecMimeType](#codecmimetype8)。 | | callback | AsyncCallback<[VideoEncodeProcessor](#videoencodeprocessor8)> | 是 | 接口调用的回调函数,包含视频编码器实例。| **示例:** @@ -185,13 +185,13 @@ media.createVideoEncoderByMime('video/avc', (error, encoder) => { createVideoEncoderByMime(name: string): Promise<[VideoEncodeProcessor](#videoencodeprocessor8)> -根据[CodecMimeType],创建优选的视频编码器实例。 +根据[CodecMimeType](#codecmimetype8),创建优选的视频编码器实例。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------ | ------ | ---- | ---------------- | -| codecMime | string | 是 | MIME类型,具体可参考[CodecMimeType]。 | +| codecMime | string | 是 | MIME类型,具体可参考[CodecMimeType](#codecmimetype8)。 | **返回值:** @@ -837,7 +837,7 @@ on(type: 'error', callback: ErrorCallback): void ## VideoEncodeProcessor8+ -视频编码管理类,在调用VideoEncodeProcessor的方法前,需要先通过[createVideoEncoderByName()](#media.createvideoencoderbyname8)或[createVideoEncoderByMime()](#media.createvideoencoderbymime8)构建一个[VideoEncodeProcessor(#videoencodeprocessor8)]实例。 +视频编码管理类,在调用VideoEncodeProcessor的方法前,需要先通过[createVideoEncoderByName()](#media.createvideoencoderbyname8)或[createVideoEncoderByMime()](#media.createvideoencoderbymime8)构建一个[VideoEncodeProcessor](#videoencodeprocessor8)实例。 视频编码demo可参考:[视频编码开发指导](../../media/video-encoder.md) @@ -845,7 +845,7 @@ on(type: 'error', callback: ErrorCallback): void configure(desc: [MediaDescription](#mediadescription8), callback: AsyncCallback\): void -配置媒体信息。 +配置媒体信息。通过注册回调函数获取返回值。 **参数:** @@ -915,7 +915,7 @@ await videoEncoder.configure(mediaDescription).then(() => { prepare(callback: AsyncCallback\): void -准备编码。 +准备编码。通过注册回调函数获取返回值。 **参数:** @@ -966,7 +966,7 @@ await videoEncoder.prepare().then(() => { start(callback: AsyncCallback\): void -开始编码。在start()方法调用前需订阅[outputAvailable](#videoencodeprocessor_on_outputavailable)事件。 +开始编码。在start()方法调用前需订阅[outputAvailable](#videoencodeprocessor_on_outputavailable)事件。通过注册回调函数获取返回值。 **参数:** @@ -1017,7 +1017,7 @@ await videoEncoder.start().then(() => { stop(callback: AsyncCallback\): void -停止编码。可调用[start()](#videoencodeprocessor_start1)继续编码。 +停止编码。可调用[start()](#videoencodeprocessor_start1)继续编码。通过注册回调函数获取返回值。 **参数:** @@ -1041,7 +1041,7 @@ videoEncoder.stop((error) => { stop: Promise\ -停止编码。 +停止编码。可调用[start()](#videoencodeprocessor_start1)继续编码。通过注册回调函数获取返回值。 **返回值:** @@ -1068,7 +1068,7 @@ await videoEncoder.stop().then(() => { flush(callback: AsyncCallback\): void -清空缓存队列。调用该接口后,不得使用之前通过[outputAvailable](#videoencodeprocessor_on_outputavailable)获取的buffer。 +清空缓存队列。调用该接口后,不能使用之前通过[outputAvailable](#videoencodeprocessor_on_outputavailable)获取的buffer。通过注册回调函数获取返回值。 **参数:** @@ -1092,7 +1092,7 @@ videoEncoder.flush((error) => { flush(): Promise\ -清空缓存队列。调用该接口后,不得使用之前通过[outputAvailable](#videoencodeprocessor_on_outputavailable)获取的buffer。 +清空缓存队列。调用该接口后,不能使用之前通过[outputAvailable](#videoencodeprocessor_on_outputavailable)获取的buffer。 **返回值:** @@ -1119,7 +1119,7 @@ await videoEncoder.flush().then(() => { reset(callback: AsyncCallback\): void -重置编码器。 +重置编码器。通过注册回调函数获取返回值。 **参数:** @@ -1170,7 +1170,7 @@ await videoEncoder.reset().then(() => { release(callback: AsyncCallback\): void -销毁编码器。应用需手动release,不能依赖内存回收机制。 +释放编码器资源。应用需手动release,不能依赖内存回收机制。通过注册回调函数获取返回值。 **参数:** @@ -1195,7 +1195,7 @@ videoEncoder.release((error) => { release(): Promise\ -销毁编码器。应用需手动release,不能依赖内存回收机制。 +释放编码器资源。应用需手动release,不能依赖内存回收机制。 **返回值:** @@ -1223,7 +1223,7 @@ videoEncoder = undefined; releaseOutput(buffer: [CodecBuffer](#codecbuffer8), callback: AsyncCallback\): void -将输出buffer归还给编码器。 +将输出buffer归还给编码器。通过注册回调函数获取返回值。 **参数:** @@ -1285,7 +1285,7 @@ videoEncoder.on('outputAvailable', (outputBuffer) => { setParameter(desc: [MediaDescription](#mediadescription8), callback: AsyncCallback\): void -动态设置媒体信息,是否生效依赖于硬件平台。 +动态设置媒体信息,是否生效依赖于硬件平台。通过注册回调函数获取返回值。 **参数:** @@ -1349,15 +1349,15 @@ await videoEncoder.setParameter(mediaDescription).then(() => { ### getInputSurface -getInputSurface(callback: AsyncCallback): void +getInputSurface(callback: AsyncCallback\): void -获取用作编码输入源的surface的ID。 +获取用作编码输入源的surface的ID。通过注册回调函数获取返回值。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ----------------------------------------------------- | ---- | ---------------------------------------- | -| callback | AsyncCallback | 是 | 接口调用的回调函数,包含surfaceID。 | +| callback | AsyncCallback\ | 是 | 接口调用的回调函数,包含surfaceID。 | **示例:** @@ -1369,7 +1369,7 @@ videoEncoder.getInputSurface((error, id) => { ### getInputSurface -getInputSurface(): Promise +getInputSurface(): Promise\ 获取用作编码输入源的surface的ID。 @@ -1377,7 +1377,7 @@ getInputSurface(): Promise | 类型 | 说明 | | -------------- | ------------------------------------------- | -| Promise\ | 接口调用的返回值,包含surfaceID。 | +| Promise\ | 接口调用的返回值,包含surfaceID。 | **示例:** @@ -1399,7 +1399,7 @@ await videoEncoder.getInputSurface().then((id) => { getOutputMediaDescription(callback: AsyncCallback<[MediaDescription](#mediadescription8)>): void -获取输出buffer的媒体信息。 +获取输出buffer的媒体信息。通过注册回调函数获取返回值。 **参数:** @@ -1438,7 +1438,7 @@ getOutputMediaDescription(): Promise<[MediaDescription](#mediadescription8)> | 类型 | 说明 | | -------------- | ------------------------------------------- | -| Promise\ | 接口调用的返回值。 | +| Promise<[MediaDescription](#mediadescription8)> | 接口调用的返回值。 | **示例:** @@ -1467,7 +1467,7 @@ await videoEncoder.getOutputMediaDescription().then((mediaDescription) => { getVideoEncoderCaps(callback: AsyncCallback<[VideoCaps](#videocaps8)>): void -获取编码器能力。 +获取编码器能力。通过注册回调函数获取返回值。 **参数:** @@ -1498,7 +1498,7 @@ getVideoEncoder(): Promise<[VideoCaps](#videocaps8)> | 类型 | 说明 | | -------------- | --------------------------------- | -| Promise\ | 接口调用的返回值。 | +| Promise<[VideoCaps](#videocaps8)> | 接口调用的返回值。 | **示例:** -- Gitee From 407594a94d2904d2b5908ba0b7ea7324382c93ad Mon Sep 17 00:00:00 2001 From: abc12133 Date: Tue, 15 Feb 2022 14:51:36 +0800 Subject: [PATCH 13/14] 1 Signed-off-by: abc12133 --- zh-cn/application-dev/reference/apis/js-apis-media.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index 5c7e8abf6f2..0369f20ceaf 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -1588,7 +1588,7 @@ on(type: 'outputAvailable', callback: Callback<[CodecBuffer](#codecbuffer8)>) videoEncoder.on('outputAvailable', (outBuffer) => { console.info('videoEncoder outputAvailable'); /* 根据业务场景消费buffer */ - /* 消费完毕,将buffer归还给编码器,调用该接口后,不得再对buffer进行读写操作 */ + /* 消费完毕,将buffer归还给编码器,调用该接口后,不能再对buffer进行读写操作 */ videoEncoder.releaseOutput(outBuffer, (error) => { if (typeof(error) != 'undefined') { console.log('videoEncoder releaseOutput success'); -- Gitee From 764b918d8600df0bbf45b782ac1acdb0f79fc411 Mon Sep 17 00:00:00 2001 From: abc12133 Date: Tue, 15 Feb 2022 15:01:43 +0800 Subject: [PATCH 14/14] 1 Signed-off-by: abc12133 --- .../reference/apis/js-apis-media.md | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index 0369f20ceaf..a7e9787cf01 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -841,7 +841,7 @@ on(type: 'error', callback: ErrorCallback): void 视频编码demo可参考:[视频编码开发指导](../../media/video-encoder.md) -### configure +### configure8+ configure(desc: [MediaDescription](#mediadescription8), callback: AsyncCallback\): void @@ -872,7 +872,7 @@ videoEncoder.configure(mediaDescription, (error) => { }); ``` -### configure +### configure8+ configure(desc: [MediaDescription](#mediadescription8)): Promise\ @@ -911,7 +911,7 @@ await videoEncoder.configure(mediaDescription).then(() => { }, failureCallback).catch(catchCallback); ``` -### prepare +### prepare8+ prepare(callback: AsyncCallback\): void @@ -935,7 +935,7 @@ videoEncoder.prepare((error) => { }); ``` -### prepare +### prepare8+ prepare(): Promise\ @@ -962,7 +962,7 @@ await videoEncoder.prepare().then(() => { }, failureCallback).catch(catchCallback); ``` -### start +### start8+ start(callback: AsyncCallback\): void @@ -986,7 +986,7 @@ videoEncoder.start((error) => { }); ``` -### start +### start8+ start(): Promise\ @@ -1013,7 +1013,7 @@ await videoEncoder.start().then(() => { }, failureCallback).catch(catchCallback); ``` -### stop +### stop8+ stop(callback: AsyncCallback\): void @@ -1037,7 +1037,7 @@ videoEncoder.stop((error) => { }); ``` -### stop +### stop8+ stop: Promise\ @@ -1064,7 +1064,7 @@ await videoEncoder.stop().then(() => { }, failureCallback).catch(catchCallback); ``` -### flush +### flush8+ flush(callback: AsyncCallback\): void @@ -1088,7 +1088,7 @@ videoEncoder.flush((error) => { }); ``` -### flush +### flush8+ flush(): Promise\ @@ -1115,7 +1115,7 @@ await videoEncoder.flush().then(() => { }, failureCallback).catch(catchCallback); ``` -### reset +### reset8+ reset(callback: AsyncCallback\): void @@ -1139,7 +1139,7 @@ videoEncoder.reset((error) => { }); ``` -### reset +### reset8+ reset(): Promise\ @@ -1166,7 +1166,7 @@ await videoEncoder.reset().then(() => { }, failureCallback).catch(catchCallback); ``` -### release +### release8+ release(callback: AsyncCallback\): void @@ -1191,7 +1191,7 @@ videoEncoder.release((error) => { }); ``` -### release +### release8+ release(): Promise\ @@ -1219,7 +1219,7 @@ await videoEncoder.release().then(() => { videoEncoder = undefined; ``` -### releaseOutput +### releaseOutput8+ releaseOutput(buffer: [CodecBuffer](#codecbuffer8), callback: AsyncCallback\): void @@ -1246,7 +1246,7 @@ videoEncoder.on('outputAvailable', (outputBuffer) => { }); ``` -### releaseOutput +### releaseOutput8+ releaseOutput(buffer: [CodecBuffer](#codecbuffer8)): Promise\ @@ -1281,7 +1281,7 @@ videoEncoder.on('outputAvailable', (outputBuffer) => { }); ``` -### setParameter +### setParameter8+ setParameter(desc: [MediaDescription](#mediadescription8), callback: AsyncCallback\): void @@ -1310,7 +1310,7 @@ videoEncoder.setParameter(mediaDescription, (error) => { }); ``` -### setParameter +### setParameter8+ setParameter(desc: [MediaDescription](#mediadescription8)): Promise\ @@ -1347,7 +1347,7 @@ await videoEncoder.setParameter(mediaDescription).then(() => { }, failureCallback).catch(catchCallback); ``` -### getInputSurface +### getInputSurface8+ getInputSurface(callback: AsyncCallback\): void @@ -1367,7 +1367,7 @@ videoEncoder.getInputSurface((error, id) => { }); ``` -### getInputSurface +### getInputSurface8+ getInputSurface(): Promise\ @@ -1395,7 +1395,7 @@ await videoEncoder.getInputSurface().then((id) => { }, failureCallback).catch(catchCallback); ``` -### getOutputMediaDescription +### getOutputMediaDescription8+ getOutputMediaDescription(callback: AsyncCallback<[MediaDescription](#mediadescription8)>): void @@ -1428,7 +1428,7 @@ videoEncoder.getOutputMediaDescription((error, mediaDescription) => { }); ``` -### getOutputMediaDescription +### getOutputMediaDescription8+ getOutputMediaDescription(): Promise<[MediaDescription](#mediadescription8)> @@ -1463,7 +1463,7 @@ await videoEncoder.getOutputMediaDescription().then((mediaDescription) => { }, failureCallback).catch(catchCallback); ``` -### getVideoEncoderCaps +### getVideoEncoderCaps8+ getVideoEncoderCaps(callback: AsyncCallback<[VideoCaps](#videocaps8)>): void @@ -1488,7 +1488,7 @@ videoEncoder.getVideoEncoderCaps((error, videoCaps) => { }); ``` -### getVideoEncoderCaps +### getVideoEncoderCaps8+ getVideoEncoder(): Promise<[VideoCaps](#videocaps8)> @@ -1515,7 +1515,7 @@ await videoEncoder.getVideoEncoderCaps().then((videoCaps) => { }, failureCallback).catch(catchCallback); ``` -### on('error') +### on('error')8+ on(type: 'error', callback: ErrorCallback<[CodecError](#codecerror8)>): void @@ -1538,7 +1538,7 @@ videoEncoder.on('error', (error) => { }); ``` -### on('outputFormatChanged') +### on('outputFormatChanged')8+ on(type: 'outputFormatChanged', callback: Callback<[MediaDescription](#mediadescription8)>) @@ -1569,7 +1569,7 @@ videoEncoder.on('outputFormatChanged', (format) => { }); ``` -### on('outputAvailable') +### on('outputAvailable')8+ on(type: 'outputAvailable', callback: Callback<[CodecBuffer](#codecbuffer8)>) -- Gitee