OpenHarmony AVCodec模块分析(六):速看5.0-Beta1更新了什么
一、简介 从OpenHarmony-v5.0开始,媒体服务层移除了gstreamer引擎,后续使用histreamer引擎提供播放、录制等场景的媒体数据流水线处理,其使用的plugin和filter都位于AVCodec模块,使得AVCodec在多媒体系统中变得越来越重要。本文将介绍OpenHarmony-v5.0-beta1 AVCodec模块更新的内容及应用的调用流程。 二、更新日志 OpenH
一、简介
从OpenHarmony-v5.0开始,媒体服务层移除了gstreamer引擎,后续使用histreamer引擎提供播放、录制等场景的媒体数据流水线处理,其使用的plugin和filter都位于AVCodec模块,使得AVCodec在多媒体系统中变得越来越重要。
本文将介绍OpenHarmony-v5.0-beta1 AVCodec模块更新的内容及应用的调用流程。
二、更新日志
音视频编解码(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模块所支持的功能正在变得越来越完善,能够更好地满足用户的多种开发需求和应用场景,为用户提供更广泛和更高效的支持。
更多推荐
所有评论(0)