一、简介

从OpenHarmony-v5.0开始,媒体服务层移除了gstreamer引擎,后续使用histreamer引擎提供播放、录制等场景的媒体数据流水线处理,其使用的plugin和filter都位于AVCodec模块,使得AVCodec在多媒体系统中变得越来越重要。
本文将介绍OpenHarmony-v5.0-beta1 AVCodec模块更新的内容及应用的调用流程。

二、更新日志

OpenHarmony-v5.0-Beta1版本更新日志

音视频编解码(AVCodec)

  • 支持ape解码和解封装。
  • 支持mp3编码和封装。
  • 支持SRT格式字幕解析。
  • H.264/H.265硬件编码支持随帧设置长期参考帧,参考帧编码,依赖硬件芯片能力。
  • H.264/H.265硬件编码支持随帧设置编码QP,依赖硬件芯片能力。
  • H.264/H.265硬件编解码支持低时延出帧(one-in-one-out),依赖硬件芯片能力。
  • H.264/H.265硬件编码支持重置码率和帧率,依赖硬件芯片能力。
  • H.264/H.265硬件编码支持分级P分层编码,依赖硬件芯片能力。
  • 支持fmp4文件解析。
  • surface模式下,硬件解码支持surface切换 。

三、更新详情

1、ape解码和解封装

(1)ape是Monkey's Audio提供的一种无损压缩格式。系统服务层使用ffmpeg实现ape的解封装和解码能力
(2)基本定义

const char *OH_AVCODEC_MIMETYPE_AUDIO_APE = "audio/x-ape";
static constexpr std::string_view AUDIO_DECODER_APE_NAME = "OH.Media.Codec.Decoder.Audio.Ape";

(3)音频解码测试程序

audioDec_ = OH_AudioCodec_CreateByMime(OH_AVCODEC_MIMETYPE_AUDIO_APE,false);audioDec_ = 
或
OH_AudioCodec_CreateByName((AVCodecCodecName::AUDIO_DECODER_APE_NAME).data());

(4)解码限制
创建解码器后配置采样率、通道数、采样格式即可正常解码,支持设置声道数1~2。

2、mp3编码和封装

(1)MP3是一种音频压缩技术,全称是“动态影像专家压缩标准音频层面3”(Moving Picture Experts Group Audio Layer III)。
系统服务层使用LAME编码器实现编码功能,通过ffmpeg实现封装能力。
(2)基本定义

const char *OH_AVCODEC_MIMETYPE_AUDIO_MPEG = "audio/mpeg";
static constexpr std::string_view AUDIO_ENCODER_MP3_NAME = "OH.Media.Codec.Encoder.Audio.Mp3";

(3)音频编码测试程序

audioDec_ = OH_AudioCodec_CreateByMime(OH_AVCODEC_MIMETYPE_AUDIO_MPEG,true);
或
audioEnc_ = OH_AudioCodec_CreateByName((AVCodecCodecName::AUDIO_ENCODER_MP3_NAME).data());

(4)编码限制
创建编码码器后必须配置采样率、通道数、采样格式和码率,声道数只支持1~2,采样格式只支持S16LE,采样率和码率只支持下面列表中的值

constexpr int32_t BIT_RATE_PICK[SUPPORT_BIT_RATE] = {8000, 16000, 32000, 40000, 48000, 56000,
                                                 64000, 80000, 96000, 112000, 128000, 160000,
                                                 192000, 224000, 256000, 320000};
constexpr int32_t SAMPLE_RATE_PICK[SUPPORT_SAMPLE_RATE] = {8000, 11025, 12000, 16000, 22050,
                                                       24000, 32000, 44100, 48000};

(5)音频封装测试程序

OH_AVMuxer *muxer = OH_AVMuxer_Create(fdStr.outputFd, AV_OUTPUT_FORMAT_MP3);

创建封装实例后添加轨道,只支持MP3音频轨道,后续按正常流程封装。

3、SRT外挂字幕

(1)SRT字幕通常以srt作为后缀,该格式是基于纯文本的格式,每个字幕段有四部分构成:字幕序号、字幕显示的起始和结束时间、字幕内容(可多行)、空白行(表示本字幕段的结束)。

1
00:00:00,160 --> 00:00:02,160
字幕1

2
00:00:02,240 --> 00:00:04,160
字幕 2

(2)测试程序

int fd = open(“test.srt”, O_RDONLY);
...
OH_AVSource *source = OH_AVSource_CreateWithFD(fd, 0, fileSize);
OH_AVDemuxer *demuxer = OH_AVDemuxer_CreateWithSource(source);
...

上述代码只是理论代码,因为对外头文件定义不全,native接口能否执行成功获取字幕数据待验证。
(3)展望
AVPlayer通过addSubtitleFdSrc可以设置外挂字幕,histreamer引擎需要使用该部分能力来解析外挂字幕文件获取字幕数据后通过subtitleTextUpdate回调给应用。master版本已实现histreamer引擎的字幕功能。

4、编码设置长期参考帧

可参考 长期参考帧特性

5、设置编码QP

(1)基本定义
编码量化参数的范围

/**
 * @brief Key for describing the maximum quantization parameter allowed for video encoder, value type is int32_t.
 * It is used in configure/setparameter or takes effect immediately with the frame.
 */
extern const char *OH_MD_KEY_VIDEO_ENCODER_QP_MAX;
/**
 * @brief Key for describing the minimum quantization parameter allowed for video encoder, value type is int32_t.
* It is used in configure/setparameter or takes effect immediately with the frame.
*/
extern const char *OH_MD_KEY_VIDEO_ENCODER_QP_MIN;

(2)动态配置测试程序

OH_AVFormat *format = OH_AVFormat_Create();
(void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODER_QP_MAX, xxx);
(void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODER_QP_MIN, xxx);
OH_VideoEncoder_SetParameter(venc_, format);

6、随帧设置属性

关于4 5的属性支持随帧设置的说明:
(1)编码新增新的API OH_VideoEncoder_RegisterParameterCallback和OH_VideoEncoder_PushInputParameter
(2)参考用法:在输入buffer是surface模式下注册随帧参数回调,当产生新的输入数据帧,该回调被调用,在回调中可以设置该帧的特定参数。

static void OnNeedInputParameter(OH_AVCodec *codec, uint32_t index, OH_AVFormat *parameter, void *userData)
{
    // 输入帧buffer对应的index,送入InIndexQueue队列
    // 输入帧的数据avformat送入InFormatQueue队列
    OH_AVFormat_SetIntValue(parameter, xxx, xxx);
    OH_AVFormat_SetIntValue(parameter, xxx, xxx);
    // 通知编码器随帧参数配置输入完成
    OH_VideoEncoder_PushInputParameter(codec, index);
}
// 注册随帧参数回调
OH_VideoEncoder_OnNeedInputParameter inParaCb = OnNeedInputParameter;
OH_VideoEncoder_RegisterParameterCallback(codec, inParaCb, nullptr);

(3)系统层实现:从surface中获取到一帧输入后会回调给应用,应用主动调PushInputParameter后才会封装属性将输入buffer传递给OMX。
(4)芯片实现:在调用OMX_EmptyThisBuffer时会把该帧的属性参数填到OMX_BUFFERHEADERTYPE的私有参数中传递给OMX。

7、编解码支持低时延出帧

(1)低延时模式,只能在configure时配置
(2)基本定义

const char *OH_MD_KEY_VIDEO_ENABLE_LOW_LATENCY = "video_enable_low_latency";

(3)解码设置低延时示例

OH_AVFormat *format = OH_AVFormat_Create();
...
OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENABLE_LOW_LATENCY, 1);
OH_VideoDecoder_Configure(videoDec_, format);

(4)芯片实现
OMX_SetParameter 通过扩展属性 OMX_IndexParamLowLatency 实现。

8、编码支持重置码率和帧率

(1)调用start后在运行态支持通过设置属性接口重置码率和帧率
(2)示例:

OH_AVFormat *format = OH_AVFormat_Create(); 
(void)OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, newBitrate);
(void)OH_AVFormat_SetDoubleValue(format, OH_MD_KEY_FRAME_RATE, newFrameRate);
OH_VideoEncoder_SetParameter(venc_, format);

9、支持分级P分层编码

全局时域可层特性,适用于编码稳定和简单的时域分层结构。
可参考全局时域可分层特性

10、支持fmp4文件解析

(1)fmp4(Fragmented MPEG-4) 是基于 MPEG-4 Part 12 的流媒体封装格式,框架服务层使用ffmpeg实现解析能力。
(2)展望:应该是为dash网络协议播放扩展的,master版本已经支持dash协议。

11、硬件解码支持surface切换

在硬件解码运行过程中,可以通过OH_VideoDecoder_SetSurface 设置新的surface,后续仍能正常显示。

三、结语

随着版本不断的更新,AVCodec模块所支持的功能正在变得越来越完善,能够更好地满足用户的多种开发需求和应用场景,为用户提供更广泛和更高效的支持。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐