构建步骤
# 不是必须,如果出现 SSL 问题可以尝试
export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
# 安装构建工具
mkdir ./bin
curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o bin/repo
chmod a+x bin/repo
echo 'export PATH=/home/hanbings/codec/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
curl -LsSf https://astral.sh/uv/install.sh | sh
uv python install 3.8
uv venv
source .venv/bin/activate
uv python pin 3.8
git clone https://gitee.com/openharmony/build.git build
uv pip install build/hb
uv pip install jinja2
hb help
# 编译器
sudo apt-get update
sudo apt-get install -y \
build-essential \
autoconf \
automake \
libtool \
pkg-config \
m4 \
flex \
bison \
gettext \
libssl-dev \
ccache
# 独立编译和全量编译是二选一的
# 独立编译
mkdir code_sub
cd code_sub
repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify
repo sync -c build multimedia_av_codec multimedia_media_foundation third_party_ffmpeg
bash build/prebuilts_config.sh
hb build av_codec ffmpeg media_foundation -i -t
# 全量编译
mkdir code_full
cd code_full
repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify
repo sync -c
repo forall -c 'git lfs pull'
git clone https://gitee.com/openharmony/build.git build
bash build/prebuilts_download.sh
./build.sh --product-name rk3568 --ccache --no-prebuilt-sdk --build-target av_codec_test
修改源代码
一般会涉及三个仓:ffmpeg(实际解析逻辑实现)、avcodec(解封装插件实现,包含类型映射等)、media_foundation(插件注册、属性声明等公共能力); 修改文件较分散,建议找其他格式、码流的代码或提交进行辅助参考;
功能开发
打开 ffmpeg 使能开关(支持码流格式,若新增码流需要支持码流格式),无特殊需求时,上层通路基本可直接共用,有其他特殊点时单独处理 third_party_ffmpeg/ohos_config.sh,并且根据编译提示,在BUILD.gn中开启对应源文件 third_party_ffmpeg/BUILD.gn
增加插件列表注册信息 multimedia_media_foundation/tree/master/src/plugin/plugin_list.cpp
新增容器格式枚举 media_foundation/interface/inner_api/meta/media_types.h
新增码流格式 media_foundation/interface/inner_api/meta/mime_type.h alt text
增加属性解析:增加容器格式映射GetFileTypeByName、码流映射g_codecIdToMime、属性解析等 multimedia_av_codec/services/media_engine/plugins/ffmpeg_adapter/demuxer/ffmpeg_format_helper.cpp,其中 g_convertFfmpegFileType 是根据 avFormatContext.iformat->name 属性进行容器类型映射,mp4类视频使用单独判断逻辑,无需新增映射;
增加新接口(按需,一般新增码流时需要新增码流类型的key) multimedia_av_codec/frameworks/native/capi/avcodec/native_avcodec_base.cpp
功能验证
需要验证本地流、网络流
初始化正常
属性获取正常:文件级别、轨道级别
读帧正常:帧数正确、帧数据正确、帧属性正确
跳转功能正常:能够按照预期跳转到对应位置关键帧,若不符合预期,需要分析seek行为是否符合ffmpeg当前逻辑效果,是否和容器规格有关,已知规格问题如下:
格式 seek偏差原因
mp3 优先速度,启用fastseek模式,使用稀疏表查表seek
ogg 容器本身为音频段形式,只能seek到分段头
mpegts 文件本身无I帧信息,二分定位
mpegps 文件本身无I帧信息,二分定位
端到端播放效果正常:解析出的帧可正常解码,需要验证正常播放、seek 0、任意位置seek、seek到结尾、重播等场景
已有TDD、XTS正常无影响
注意:不能按照OH的ffmpeg实际结果写用例预期,属性优先和公版ffmpeg保持一下,可使用 ffporbe -i fileName -show_streams 查看,这样才能暴露出OH的ffmpeg缺失的能力,修改使能对应可能需要的codec、parser能力
TDD开发
补充UT、Fuzz,需要覆盖初始化、read、seek等功能,可参考 开发者测试指导
新增码流格式
开发流程同上,最终规格范围取已支持容器和支持该码流容器的交集,例如码流A可使用在容器F1、F2,当前OH支持F1,故解码支持码流A时,需要同步开发验证F1+A的组合场景,具体开发验证同上;
容器开发需要验证的码流范围(和当前容器ffmpeg支持规格取交集):
视频:264(avc)、263、mpeg2、mpeg4、av1、vp8、vp9、vc1、msvideo1、wmv3、mjpeg
拓展 265(hevc)、266(vvc)、HDRVivid
音频:aac、aac_latm、mp2、mp3、opus、vorbis、flac、amr_nb、amr_wb、ape、ac3、eac3、gsm、gsm_ms、wmav1、wmav2、wmapro、alac、pcm_mulaw(g711)、pcm_alaw(a711)、pcm、adpcm
PCM:u8、s16le、s24le、s32le、f32le、s16be、s24be、s32be、f32be、f64be、s8、f64le、s64le、s8_planar、s16le_planar、s16be_planar、s24le_planar、s32le_planar、dvd、bluray
ADPCM:ms、ima_qt、ima_wav、ima_dk3、ima_dk4、ima_ws、ima_smjpeg、ima_dat4、mtaf、adx、afc、aica、ct、dtk、g722、g726、g726le、ima_amv、ima_apc、ima_iss、ima_oki、ima_rad、ima_psx、sbpro_2、sbpro_3、sbpro_4、thp、thp_le、xa、yamaha
拓展:AudioVivid(16bit、24bit)
码流开发需要验证的容器范围(和当前码流ffmpeg支持规格取交集):
视频:MOV、MP4、FMP4、MKV、MPEGTS、FLV、AVI、MPEGPS、WMV、M4V、VOB、3GP、3G2、MTS、M2TS、TRP、WEBM
音频:AAC、MP3、M4A、OGG、FLAC、WAV、AMR、APE、EAC3、WMA
参考PR
格式拓展
https://gitee.com/openharmony/multimedia_av_codec/pulls/4353/files
https://gitee.com/openharmony/multimedia_media_foundation/pulls/1829
https://gitee.com/openharmony/third_party_ffmpeg/pulls/362/files
闭源格式拓展,feature控制
https://gitcode.com/openharmony/multimedia_av_codec/pull/6466
https://gitcode.com/openharmony/multimedia_media_foundation/pull/2194
https://gitcode.com/openharmony/third_party_ffmpeg/pull/478
评论