音视频封装
开发者可以调用本模块的Native API接口,完成音视频封装,即将音频、视频等编码后的媒体数据,按一定的格式存储到文件里。
当前支持的封装能力如下:
封装格式 | 视频编解码类型 | 音频编解码类型 | 封面类型 |
---|---|---|---|
mp4 | AVC(H.264)、HEVC(H.265) | AAC、MPEG(MP3) | jpeg、png、bmp |
m4a | - | AAC | jpeg、png、bmp |
mp3 | - | MPEG(MP3) | - |
amr | - | AMR | - |
如果需要对HDRVivid视频码流进行封装,需要配置MimeType为H265 (OH_AVCODEC_MIMETYPE_VIDEO_HEVC),本功能从API version 11开始支持。
适用场景
-
录像、录音
保存录像、录音文件时,需要先对音视频流进行编码,再封装为文件。
-
音视频编辑
完成编辑后的音视频,需要封装为文件。
-
音视频转码
转码后,保存文件时需要封装。
开发指导
详细的API说明请参考API文档。
说明
如果调用封装能力写本地文件,需要向用户申请授权: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格式的音视频文件为例。
- 添加头文件。
#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>
- 调用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);
- (可选)调用OH_AVMuxer_SetRotation()设置旋转角度。
// 旋转角度,视频画面需要旋转的时候设置
OH_AVMuxer_SetRotation(muxer, 0);
-
添加音频轨。
方法一:用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); // 销毁
-
添加视频轨。
方法一:用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 &