鸿蒙(API 12 Beta3版)【音视频封装】 文件解析封装

开发者可以调用本模块的Native API接口,完成音视频封装,即将音频、视频等编码后的媒体数据,按一定的格式存储到文件里。

当前支持的封装能力如下:

封装格式视频编解码类型音频编解码类型封面类型
mp4AVC(H.264)、HEVC(H.265)AAC、MPEG(MP3)jpeg、png、bmp
m4a-AACjpeg、png、bmp
mp3-MPEG(MP3)-
amr-AMR-

如果需要对HDRVivid视频码流进行封装,需要配置MimeType为H265 (OH_AVCODEC_MIMETYPE_VIDEO_HEVC),本功能从API version 11开始支持。

适用场景

  • 录像、录音

    保存录像、录音文件时,需要先对音视频流进行编码,再封装为文件。

  • 音视频编辑

    完成编辑后的音视频,需要封装为文件。

  • 音视频转码

    转码后,保存文件时需要封装。

开发指导

说明

如果调用封装能力写本地文件,需要[向用户申请授权]:ohos.permission.READ_MEDIA, ohos.permission.WRITE_MEDIA

在 CMake 脚本中链接动态库

target_link_libraries(sample PUBLIC libnative_media_avmuxer.so)
target_link_libraries(sample PUBLIC libnative_media_core.so)

开发步骤

参考以下示例代码,完成音视频封装的全流程。以封装mp4格式的音视频文件为例。

  1. 添加头文件。
#include <multimedia/player_framework/native_avmuxer.h>
#include <multimedia/player_framework/native_avcodec_base.h>
#include <multimedia/player_framework/native_avformat.h>
#include <multimedia/player_framework/native_avbuffer.h>
#include <fcntl.h>
  1. 调用OH_AVMuxer_Create()创建封装器实例对象。
// 设置封装格式为mp4
OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4;
// 以读写方式创建fd
int32_t fd = open("test.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
OH_AVMuxer *muxer = OH_AVMuxer_Create(fd, format);
  1. (可选)调用OH_AVMuxer_SetRotation()设置旋转角度。
// 旋转角度,视频画面需要旋转的时候设置
OH_AVMuxer_SetRotation(muxer, 0);
  1. 添加音频轨。

    方法一:用OH_AVFormat_Create创建format

int audioTrackId = -1;
uint8_t *buffer = ...; // 编码config data,如果没有可以不传
size_t size = ...;  // 编码config data的长度,根据实际情况配置
OH_AVFormat *formatAudio = OH_AVFormat_Create();
OH_AVFormat_SetStringValue(formatAudio, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_AUDIO_AAC); // 必填
OH_AVFormat_SetIntValue(formatAudio, OH_MD_KEY_AUD_SAMPLE_RATE, 44100); // 必填
OH_AVFormat_SetIntValue(formatAudio, OH_MD_KEY_AUD_CHANNEL_COUNT, 2); // 必填
OH_AVFormat_SetIntValue(formatAudio, OH_MD_KEY_PROFILE, AAC_PROFILE_LC); // 选填
OH_AVFormat_SetBuffer(formatAudio, OH_MD_KEY_CODEC_CONFIG, buffer, size); // 选填

int ret = OH_AVMuxer_AddTrack(muxer, &audioTrackId, formatAudio);
if (ret != AV_ERR_OK || audioTrackId < 0) {
    // 音频轨添加失败
}
OH_AVFormat_Destroy(formatAudio); // 销毁

方法二:用OH_AVFormat_CreateAudioFormat创建format

int audioTrackId = -1;
uint8_t *buffer = ...; // 编码config data,如果没有可以不传
size_t size = ...;  // 编码config data的长度,根据实际情况配置
OH_AVFormat *formatAudio = OH_AVFormat_CreateAudioFormat(OH_AVCODEC_MIMETYPE_AUDIO_AAC, 44100, 2);
OH_AVFormat_SetIntValue(formatAudio, OH_MD_KEY_PROFILE, AAC_PROFILE_LC); // 选填
OH_AVFormat_SetBuffer(formatAudio, OH_MD_KEY_CODEC_CONFIG, buffer, size); // 选填

int ret = OH_AVMuxer_AddTrack(muxer, &audioTrackId, formatAudio);
if (ret != AV_ERR_OK || audioTrackId < 0) {
    // 音频轨添加失败
}
OH_AVFormat_Destroy(formatAudio); // 销毁
  1. 添加视频轨。

    方法一:用OH_AVFormat_Create创建format

int videoTrackId = -1;
uint8_t *buffer = ...; // 编码config data,如果没有可以不传
size_t size = ...;  // 编码config data的长度,根据实际情况配置
OH_AVFormat *formatVideo = OH_AVFormat_Create();
OH_AVFormat_SetStringValue(formatVideo, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_VIDEO_AVC); // 必填
OH_AVFormat_SetIntValue(formatVideo, OH_MD_KEY_WIDTH, 1280); // 必填
OH_AVFormat_SetIntValue(formatVideo, OH_MD_KEY_HEIGHT, 720); // 必填
OH_AVFormat_SetBuffer(formatVideo, OH_MD_KEY_CODEC_CONFIG, buffer, size); // 非必须

int ret = OH_AVMuxer_AddTrack(muxer, &videoTrackId, formatVideo);
if (ret != AV_ERR_OK || videoTrackId < 0) {
    // 视频轨添加失败
}
OH_AVFormat_Destroy(formatVideo); // 销毁

方法二:用OH_AVFormat_CreateVideoFormat创建format

int videoTrackId = -1;
uint8_t *buffer = ...; // 编码config data,如果没有可以不传
size_t size = ...;  // 编码config data的长度,根据实际情况配置
OH_AVFormat *formatVideo = OH_AVFormat_CreateVideoFormat(OH_AVCODEC_MIMETYPE_VIDEO_AVC, 1280, 720);
OH_AVFormat_SetBuffer(formatVideo, OH_MD_KEY_CODEC_CONFIG, buffer, size); // 非必须

int ret = OH_AVMuxer_AddTrack(muxer, &videoTrackId, formatVideo);
if (ret != AV_ERR_OK || videoTrackId < 0) {
    // 视频轨添加失败
}
OH_AVFormat_Destroy(formatVideo); // 销毁
  1. 添加封面轨。

方法一:用OH_AVFormat_Create创建format

int coverTrackId = -1;
OH_AVFormat *formatCover = OH_AVFormat_Create();
OH_AVFormat_SetStringValue(formatCover, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_IMAGE_JPG);
OH_AVFormat_SetIntValue(formatCover, OH_MD_KEY_WIDTH, 1280);
OH_AVFormat_SetIntValue(formatCover, OH_MD_KEY_HEIGHT, 720);

int ret = OH_AVMuxer_AddTrack(muxer, &coverTrackId, formatCover);
if (ret != AV_ERR_OK || coverTrackId < 0) {
    // 添加封面失败
}
OH_AVFormat_Destroy(formatCover); // 销毁

方法二:用OH_AVFormat_CreateVideoFormat创建format

int coverTrackId = -1;
OH_AVFormat *formatCover = OH_AVFormat_CreateVideoFormat(OH_AVCODEC_MIMETYPE_IMAGE_JPG, 1280, 720);

int ret = OH_AVMuxer_AddTrack(muxer, &coverTrackId, formatCover);
if (ret != AV_ERR_OK || coverTrackId < 0) {
    // 添加封面失败
}
OH_AVFormat_Destroy(formatCover); // 销毁
  1. 调用OH_AVMuxer_Start()开始封装。
// 调用start,写封装文件头。start后,不能设置媒体参数、不能添加媒体轨
if (OH_AVMuxer_Start(muxer) != AV_ERR_OK) {
    // 异常处理
}
  1. 调用OH_AVMuxer_WriteSampleBuffer(),写入封装数据。

包括视频、音频、封面数据。

// start后,才能开始写入数据
int size = ...;
OH_AVBuffer *sample = OH_AVBuffer_Create(size); // 创建AVBuffer
// 通过OH_AVBuffer_GetAddr(sample)往sampleBuffer里写入数据参考OH_AVBuffer的使用方法
// 封装封面,必须一次写完一张图片

// 创建buffer info
OH_AVCodecBufferAttr info;
info.pts = ...; // 当前数据的开始播放的时间,单位微秒,相对时间
info.size = size; // 当前数据的长度
info.offset = 0; // 偏移,一般为0
info.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME; // 当前数据的标志。具体参考OH_AVCodecBufferFlags
info.flags |= AVCODEC_BUFFER_FLAGS_CODEC_DATA; // 当annex-b格式的avc包含codec config的标志。
OH_AVBuffer_SetBufferAttr(sample, &info); // 设置buffer的属性.
int trackId = audioTrackId; // 选择写的媒体轨

int ret = OH_AVMuxer_WriteSampleBuffer(muxer, trackId, sample);
if (ret != AV_ERR_OK) {
    // 异常处理
}
  1. 调用OH_AVMuxer_Stop(),停止封装。
// 调用stop,写封装文件尾。stop后不能写入媒体数据
if (OH_AVMuxer_Stop(muxer) != AV_ERR_OK) {
    // 异常处理
}
  1. 调用OH_AVMuxer_Destroy()销毁实例,释放资源。
if (OH_AVMuxer_Destroy(muxer) != AV_ERR_OK) {
    // 异常处理
}
muxer = NULL;
close(fd); // 关闭文件描述符

最后呢

很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

在这里插入图片描述

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细鸿蒙(OpenHarmony )手册(共计1236页)与鸿蒙(OpenHarmony )开发入门视频,帮助大家在技术的道路上更进一步。

  • 《鸿蒙 (OpenHarmony)开发学习视频》
  • 《鸿蒙生态应用开发V2.0白皮书》
  • 《鸿蒙 (OpenHarmony)开发基础到实战手册》
  • OpenHarmony北向、南向开发环境搭建
  • 《鸿蒙开发基础》
  • 《鸿蒙开发进阶》
  • 《鸿蒙开发实战》

在这里插入图片描述

总结

鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值