使用mp4v2封装mp4
编译环境:Ubuntu16.04 64位
交叉编译工具:arm-hisiv500-linux-gcc
文章目录
- 1. 交叉编译mp4v2
- 2. sample代码
- 2.1 创建文件
- 2.2 关闭文件
- 2.3 写数据
1. 交叉编译mp4v2
下载合适版本的mp2v2源码,我下载的是2.0.0的bz包mp4v2_2.0.0~dfsg0.orig.tar.bz2
tar jxf mp4v2_2.0.0~dfsg0.orig.tar.bz2
cd mp4v2-2.0.0;./configure --host=arm-hisiv500-linux CC=arm-hisiv500-linux-gcc CXX=arm-hisiv500-linux-g++ --disable-debug
make
生成的libmp4v2.a在目录.libs
头文件位于include/mp4v2目录,头文件需要拷贝完全,代码中仅需要包含mp4v2.h
#include "mp4v2/mp4v2.h"
注意:移植后,链接libmp4v2.a需要加上-lstdc++选项。
2. sample代码
注意:代码基于hi3519平台。
2.1 创建文件
MP4FileHandle hMP4File = MP4CreateEx(fileName, 0, 1, 1, 0, 0, 0, 0);
MP4SetTimeScale(hMP4File, 90000);
2.2 关闭文件
MP4Close(hMP4File, 0);
2.3 写数据
typedef struct _MP4ENC_NaluUnit
{int type;int size;unsigned char *data;
}MP4ENC_NaluUnit;typedef struct _MP4ENC_INFO
{unsigned int u32FrameRate;unsigned int u32Width;unsigned int u32Height;unsigned int u32Profile;
}MP4ENC_INFO;static HI_S32 Sample_MP4_ReadNalu(HI_U8 *pPack, HI_U32 nPackLen, unsigned int offSet, MP4ENC_NaluUnit *pNaluUnit)
{int i = offSet;while (i < nPackLen){if (pPack[i++] == 0x00 && pPack[i++] == 0x00 && pPack[i++] == 0x00 && pPack[i++] == 0x01)// 开始码{int pos = i;while (pos < nPackLen){if (pPack[pos++] == 0x00 && pPack[pos++] == 0x00 && pPack[pos++] == 0x00 && pPack[pos++] == 0x01)break;}if (pos == nPackLen)pNaluUnit->size = pos - i;elsepNaluUnit->size = (pos - 4) - i;pNaluUnit->type = pPack[i] & 0x1f;pNaluUnit->data = (unsigned char *)&pPack[i];return (pNaluUnit->size + i - offSet);}}return 0;
}static HI_S32 Sample_MP4_WRITE(MP4FileHandle hFile, MP4TrackId *pTrackId,VENC_STREAM_S *pstStream, MP4ENC_INFO *stMp4Info)
{int i = 0;for (i = 0; i < pstStream->u32PackCount; i++){HI_U8 *pPack = pstStream->pstPack[i].pu8Addr + pstStream->pstPack[i].u32Offset;HI_U32 nPackLen = pstStream->pstPack[i].u32Len - pstStream->pstPack[i].u32Offset;MP4ENC_NaluUnit stNaluUnit;memset(&stNaluUnit, 0, sizeof(stNaluUnit));int nPos = 0, nLen = 0;while ((nLen = Sample_MP4_ReadNalu(pPack, nPackLen, nPos, &stNaluUnit)) != 0){switch (stNaluUnit.type){case H264E_NALU_SPS:if (*pTrackId == MP4_INVALID_TRACK_ID){*pTrackId = MP4AddH264VideoTrack(hFile, 90000, 90000 / stMp4Info->u32FrameRate, stMp4Info->u32Width, stMp4Info->u32Height, stNaluUnit.data[1], stNaluUnit.data[2], stNaluUnit.data[3], 3);if (*pTrackId == MP4_INVALID_TRACK_ID){return HI_FAILURE;}MP4SetVideoProfileLevel(hFile, stMp4Info->u32Profile);MP4AddH264SequenceParameterSet(hFile,*pTrackId,stNaluUnit.data,stNaluUnit.size);}break;case H264E_NALU_PPS:if (*pTrackId == MP4_INVALID_TRACK_ID){break;}MP4AddH264PictureParameterSet(hFile,*pTrackId,stNaluUnit.data,stNaluUnit.size);break;case H264E_NALU_IDRSLICE:case H264E_NALU_PSLICE:{if (*pTrackId == MP4_INVALID_TRACK_ID){break;}int nDataLen = stNaluUnit.size + 4;unsigned char *data = (unsigned char *)malloc(nDataLen);data[0] = stNaluUnit.size >> 24;data[1] = stNaluUnit.size >> 16;data[2] = stNaluUnit.size >> 8;data[3] = stNaluUnit.size & 0xff;memcpy(data + 4, stNaluUnit.data, stNaluUnit.size);if (!MP4WriteSample(hFile, *pTrackId, data, nDataLen, MP4_INVALID_DURATION, 0, 1)){free(data);return HI_FAILURE;}free(data);}break;default :break;}nPos += nLen;}}return HI_SUCCESS;
}
以上代码没有封装音频,可以稍作修改,用作其他平台。
mp4v2貌似不支持h265,后续将使用其他的开源库做封装,详见我的另一篇博客《使用gpac封装mp4》。
转载请注明出处,如有错漏之处,敬请指正。
使用mp4v2封装mp4相关推荐
- linux下利用MP4v2封装H264 aac为mp4
mp4文件格式:https://wenku.baidu.com/view/673482284b73f242336c5f4c.html MP4v2开源库:https://download.csdn.ne ...
- 解决使用mp4v2封装的mp4文件在Wowza的hls上无法播放问题
一.问题:基于海思35xx的嵌入式设备使用mp4v2封装的mp4文件,放在Wowza的点播中,用hls推流出去,无法播放. 二.准备:由于需要使用了wowza作为推流服务器.所以嵌入式设备录制的mp4 ...
- 使用 MediaExtractor 和 MediaMuxer API 解析和封装 mp4 文件
一个音视频文件是由音频和视频组成的,我们可以通过MediaExtractor.MediaMuxer把音频或视频给单独抽取出来,抽取出来的音频和视频能单独播放: 一.MediaExtractor API ...
- 转: FFMpeg 封装MP4 文件
FFmpeg 封装MP4文件的一个例子 项目中用到FFmpeg 将IP摄像头的视频流的保存MP4文件的.之前的大哥将它先存成了H264文件,然后又调用FFMpeg的命令行去实现转码为MP4.感觉 ...
- 海思3518ev200处理器封装MP4的音频和视频同步OK
今天用海思3518ev200处理器封装MP4的音频和视频同步OK,记录一下. 封装mp4用的GPAC开源代码,GitHub上可以搜到. 使用别人封装好的从gpac提取总结的接口函数,网络搜索MP4Wr ...
- <整理总结>H264/265码流数据包格式分析(带mp4v2封装H264/265为MP4的源码示例)
H264/265码流数据包格式分析 前言: 一.H.264码流解析 I帧P帧B帧说明: 二.H.265码流解析 三.主要源码 前言: 最近在学习使用MP4v2将H264/H265码流以及AAC音频封装 ...
- Mp4v2封装H264+AAC为MP4
https://blog.csdn.net/xiaota00/article/details/76332458 https://blog.csdn.net/u011270282/article/det ...
- mp4v2 写mp4 java_使用mp4v2将H264+AAC合成mp4文件
录制程序要添加新功能:录制CMMB电视节目,我们的板卡发送出来的是RTP流(H264视频和AAC音频),录制程序要做的工作是: (1)接收并解析RTP包,分离出H264和AAC数据流: (2)将H26 ...
- MP4V2封装h265
mp4v2一般是用来做h264到mp4的封装,后来经过总结和优化,出现了支持h264/h265的版本,链接如下: mp4v2-h265 从以上链接中下载的MP4V2源码 相关接口如下: MP4V2_E ...
最新文章
- 系统集成项目管理工程师-项目沟通管理笔记
- 施密特出售Google股票套现3.27亿美元
- 小赋诗歌一首,以感学生时代结束
- 数据中心机房设计及各专业技术平衡
- UML入门之类图教程
- 关于多画面窗口切换的刷新重绘问题
- python类与对象的内置函数大全(BIF)
- java读取照片信息 获取照片拍摄时的经纬度
- 网络驱动器无法访问,提示找不到网络路径故障处理过程
- 硬链接(hard link)与软链接(soft link/symbolic link)
- Animation 动画介绍和实现
- redis短信发送限制
- [心情]我的心依然很痛
- 「2020」拼多多数据分析笔试题 | 附解答
- 科林明伦杯 哈尔滨理工大学第十届程序设计竞赛 (补)
- MOS管-传输特性曲线的细微之处
- 94 年出生,她们如今都是 985 高校博士生导师
- 2018年中国软件行业基准数据正式发布
- access制作卡片_(2020年编辑)Access入门教程大全
- spss入门——简单的数据预处理到时间序列分析系列(二)
热门文章
- 外语配音软件“布谷鸟配音“和ffmepg转换软件的使用以及SYD_Calculator提取文件到C语言
- | UML(Jude)
- jaeger php,全链路监控Jaeger搭建实战
- 【名企面试经验-快手-校招提前批】【Java研发工程师】
- 【电源设计】12电源芯片详细选型攻略
- 计算机台式右上角三个灯作用,键盘右上角的三个灯是什么意思 分别代表什么...
- 怎样用360查看计算机使用记录,电脑360浏览器历史记录怎么查看
- [MFC] 高仿Flappy bird 桌面版
- Gensim官方介绍翻译
- 用Python实现自动刷王者荣耀金币,这简直不要太爽了