From 1bb909cab3254b7d4a3a4f05d34991e1e082a1ea Mon Sep 17 00:00:00 2001 From: SuRuoyan Date: Sat, 8 Feb 2025 10:49:41 +0800 Subject: [PATCH] add demo code and api comment for audio output format change Signed-off-by: SuRuoyan --- .../media/avcodec/audio-decoding.md | 16 ++++++++++++++-- .../media/avcodec/audio-encoding.md | 2 +- .../reference/apis-avcodec-kit/_codec_base.md | 5 ++--- .../apis-avcodec-kit/native__avcodec__base_8h.md | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/zh-cn/application-dev/media/avcodec/audio-decoding.md b/zh-cn/application-dev/media/avcodec/audio-decoding.md index 65fe2f860f0..f78ca606325 100644 --- a/zh-cn/application-dev/media/avcodec/audio-decoding.md +++ b/zh-cn/application-dev/media/avcodec/audio-decoding.md @@ -97,7 +97,7 @@ target_link_libraries(sample PUBLIC libnative_media_acodec.so) 注册回调函数指针集合OH_AVCodecCallback,包括: - OH_AVCodecOnError:解码器运行错误。 - - OH_AVCodecOnStreamChanged:码流信息变化,如声道变化等。 + - OH_AVCodecOnStreamChanged:码流信息变化回调,包括采样率变化、声道数变化、音频采样格式变化,支持检测此变化的解码格式有:AAC,FLAC,MP3,VORBIS。(API 15开始支持) - OH_AVCodecOnNeedInputBuffer:运行过程中需要新的输入数据,即解码器已准备好,可以输入数据。 - OH_AVCodecOnNewOutputBuffer:运行过程中产生了新的输出数据,即解码完成。 @@ -118,8 +118,20 @@ target_link_libraries(sample PUBLIC libnative_media_acodec.so) static void OnOutputFormatChanged(OH_AVCodec *codec, OH_AVFormat *format, void *userData) { (void)codec; - (void)format; (void)userData; + // 解码输出参数变化后的回调处理,应用根据实际情况进行处理 + int32_t sampleRate; + int32_t channelCount; + int32_t sampleFormat; + if (OH_AVFormat_GetIntValue(format, OH_MD_KEY_AUD_SAMPLE_RATE, &sampleRate)) { + // 判断采样率是否发生变化,进行对应处理 + } + if (OH_AVFormat_GetIntValue(format, OH_MD_KEY_AUD_CHANNEL_COUNT, &channelCount)) { + // 判断声道数是否发生变化,进行对应处理 + } + if (OH_AVFormat_GetIntValue(format, OH_MD_KEY_AUDIO_SAMPLE_FORMAT, &sampleFormat)) { + // 判断音频采样格式是否发生变化,进行对应处理 + } } // OH_AVCodecOnNeedInputBuffer回调函数的实现 static void OnInputBufferAvailable(OH_AVCodec *codec, uint32_t index, OH_AVBuffer *data, void *userData) diff --git a/zh-cn/application-dev/media/avcodec/audio-encoding.md b/zh-cn/application-dev/media/avcodec/audio-encoding.md index dad9973f21b..07802dadc50 100644 --- a/zh-cn/application-dev/media/avcodec/audio-encoding.md +++ b/zh-cn/application-dev/media/avcodec/audio-encoding.md @@ -98,7 +98,7 @@ target_link_libraries(sample PUBLIC libnative_media_acodec.so) 注册回调函数指针集合OH_AVCodecCallback,包括: - OH_AVCodecOnError:编码器运行错误。 - - OH_AVCodecOnStreamChanged:码流信息变化,如声道变化等。 + - OH_AVCodecOnStreamChanged:音频编码器暂未支持此回调。 - OH_AVCodecOnNeedInputBuffer:运行过程中需要新的输入数据,即编码器已准备好,可以输入PCM数据。 - OH_AVCodecOnNewOutputBuffer:运行过程中产生了新的输出数据,即编码完成。 diff --git a/zh-cn/application-dev/reference/apis-avcodec-kit/_codec_base.md b/zh-cn/application-dev/reference/apis-avcodec-kit/_codec_base.md index 4e67402bc1a..b20a0bb18de 100644 --- a/zh-cn/application-dev/reference/apis-avcodec-kit/_codec_base.md +++ b/zh-cn/application-dev/reference/apis-avcodec-kit/_codec_base.md @@ -176,7 +176,7 @@ CodecBase模块提供用于音视频封装、解封装、编解码基础功能 | typedef struct NativeWindow [OHNativeWindow](#ohnativewindow) | 为图形接口定义native层对象。 | | typedef struct [OH_AVCodec](#oh_avcodec) [OH_AVCodec](#oh_avcodec) | 为音视频编解码接口定义native层对象。 | | typedef void(\* [OH_AVCodecOnError](#oh_avcodeconerror)) ([OH_AVCodec](#oh_avcodec) \*codec, int32_t errorCode, void \*userData) | 当OH_AVCodec实例运行出错时,会调用来上报具体的错误信息的函数指针。 | -| typedef void(\* [OH_AVCodecOnStreamChanged](#oh_avcodeconstreamchanged)) ([OH_AVCodec](#oh_avcodec) \*codec, [OH_AVFormat](_core.md#oh_avformat) \*format, void \*userData) | 当解码输入码流分辨率或者编码输出码流的分辨率发生变化时,将调用此函数指针报告新的流描述信息。 | +| typedef void(\* [OH_AVCodecOnStreamChanged](#oh_avcodeconstreamchanged)) ([OH_AVCodec](#oh_avcodec) \*codec, [OH_AVFormat](_core.md#oh_avformat) \*format, void \*userData) | 当视频解码输入码流分辨率或者视频编码输出码流的分辨率发生变化时,将调用此函数指针报告新的流描述信息。
从API 15开始,支持音频解码时,码流采样率、声道数或者音频采样格式发生变化时,将调用此函数指针报告新的流描述信息,支持检测此变化的解码格式有:AAC,FLAC,MP3,VORBIS。| | typedef void(\* [OH_AVCodecOnNeedInputData](#oh_avcodeconneedinputdata)) ([OH_AVCodec](#oh_avcodec) \*codec, uint32_t index, [OH_AVMemory](_core.md#oh_avmemory) \*data, void \*userData) | 当OH_AVCodec在运行过程中需要新的输入数据时,将调用此函数指针,并携带可用的缓冲区来填充新的输入数据。(API11废弃)| | typedef void(\* [OH_AVCodecOnNewOutputData](#oh_avcodeconnewoutputdata)) ([OH_AVCodec](#oh_avcodec) \*codec, uint32_t index, [OH_AVMemory](_core.md#oh_avmemory) \*data, [OH_AVCodecBufferAttr](_o_h___a_v_codec_buffer_attr.md) \*attr, void \*userData) | 当OH_AVCodec运行过程中生成新的输出数据时,将调用此函数指针,并携带包含新输出数据的缓冲区。(API11废弃)| | typedef void(\* [OH_AVCodecOnNeedInputBuffer](#oh_avcodeconneedinputbuffer)) ([OH_AVCodec](#oh_avcodec) \*codec, uint32_t index, [OH_AVBuffer](_core.md#oh_avbuffer) \*buffer, void \*userData) | 当OH_AVCodec在运行过程中需要新的输入数据时,将调用此函数指针,并携带可用的缓冲区来填充新的输入数据。 | @@ -551,8 +551,7 @@ typedef void(* OH_AVCodecOnNewOutputData) (OH_AVCodec *codec, uint32_t index, OH typedef void(* OH_AVCodecOnStreamChanged) (OH_AVCodec *codec, OH_AVFormat *format, void *userData) ``` **描述** -当解码输入码流分辨率或者编码输出码流的分辨率发生变化时,调用此函数指针报告新的流描述信息。需要注意的是, -OH_AVFormat指针的生命周期只有在函数指针被调用时才有效,调用结束后禁止继续访问。 +当视频解码输入码流分辨率或者视频编码输出码流的分辨率发生变化时,调用此函数指针报告新的流描述信息。
从API 15开始,支持音频解码时,码流采样率、声道数或者音频采样格式发生变化时,将调用此函数指针报告新的流描述信息,支持检测此变化的解码格式有:AAC,FLAC,MP3,VORBIS。
需要注意的是,OH_AVFormat指针的生命周期只有在函数指针被调用时才有效,调用结束后禁止继续访问。 **系统能力:** SystemCapability.Multimedia.Media.CodecBase diff --git a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcodec__base_8h.md b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcodec__base_8h.md index 61f1ff0ae34..b0b7d7579a0 100644 --- a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcodec__base_8h.md +++ b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcodec__base_8h.md @@ -29,7 +29,7 @@ | 名称 | 描述 | | -------- | -------- | | typedef void(\* [OH_AVCodecOnError](_codec_base.md#oh_avcodeconerror)) (OH_AVCodec \*codec, int32_t errorCode, void \*userData) | 当OH_AVCodec实例运行出错时,会调用来上报具体的错误信息的函数指针。 | -| typedef void(\* [OH_AVCodecOnStreamChanged](_codec_base.md#oh_avcodeconstreamchanged)) (OH_AVCodec \*codec, OH_AVFormat \*format, void \*userData) | 当解码输入码流分辨率或者编码输出码流的分辨率发生变化时,调用此函数指针报告新的流描述信息。 | +| typedef void(\* [OH_AVCodecOnStreamChanged](_codec_base.md#oh_avcodeconstreamchanged)) (OH_AVCodec \*codec, OH_AVFormat \*format, void \*userData) | 当视频解码输入码流分辨率或者视频编码输出码流的分辨率发生变化时,调用此函数指针报告新的流描述信息。
从API 15开始,支持音频解码时,码流采样率、声道数或者音频采样格式发生变化时,将调用此函数指针报告新的流描述信息,支持检测此变化的解码格式有:AAC,FLAC,MP3,VORBIS。 | | typedef void(\* [OH_AVCodecOnNeedInputData](_codec_base.md#oh_avcodeconneedinputdata)) (OH_AVCodec \*codec, uint32_t index, OH_AVMemory \*data, void \*userData) | 当OH_AVCodec在运行过程中需要新的输入数据时,将调用此函数指针,并携带可用的缓冲区来填充新的输入数据。(API11废弃) | | typedef void(\* [OH_AVCodecOnNewOutputData](_codec_base.md#oh_avcodeconnewoutputdata)) (OH_AVCodec \*codec, uint32_t index, OH_AVMemory \*data, [OH_AVCodecBufferAttr](_o_h___a_v_codec_buffer_attr.md) \*attr, void \*userData) | 当OH_AVCodec运行过程中生成新的输出数据时,将调用此函数指针,并携带包含新输出数据的缓冲区。(API11废弃) | | typedef void(\* [OH_AVCodecOnNeedInputBuffer](_codec_base.md#oh_avcodeconneedinputbuffer)) (OH_AVCodec \*codec, uint32_t index, OH_AVBuffer \*buffer, void \*userData) | 当OH_AVCodec在运行过程中需要新的输入数据时,将调用此函数指针,并携带可用的缓冲区来填充新的输入数据。 | -- Gitee