编译环境: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相关推荐

  1. linux下利用MP4v2封装H264 aac为mp4

    mp4文件格式:https://wenku.baidu.com/view/673482284b73f242336c5f4c.html MP4v2开源库:https://download.csdn.ne ...

  2. 解决使用mp4v2封装的mp4文件在Wowza的hls上无法播放问题

    一.问题:基于海思35xx的嵌入式设备使用mp4v2封装的mp4文件,放在Wowza的点播中,用hls推流出去,无法播放. 二.准备:由于需要使用了wowza作为推流服务器.所以嵌入式设备录制的mp4 ...

  3. 使用 MediaExtractor 和 MediaMuxer API 解析和封装 mp4 文件

    一个音视频文件是由音频和视频组成的,我们可以通过MediaExtractor.MediaMuxer把音频或视频给单独抽取出来,抽取出来的音频和视频能单独播放: 一.MediaExtractor API ...

  4. 转: FFMpeg 封装MP4 文件

    FFmpeg 封装MP4文件的一个例子    项目中用到FFmpeg 将IP摄像头的视频流的保存MP4文件的.之前的大哥将它先存成了H264文件,然后又调用FFMpeg的命令行去实现转码为MP4.感觉 ...

  5. 海思3518ev200处理器封装MP4的音频和视频同步OK

    今天用海思3518ev200处理器封装MP4的音频和视频同步OK,记录一下. 封装mp4用的GPAC开源代码,GitHub上可以搜到. 使用别人封装好的从gpac提取总结的接口函数,网络搜索MP4Wr ...

  6. <整理总结>H264/265码流数据包格式分析(带mp4v2封装H264/265为MP4的源码示例)

    H264/265码流数据包格式分析 前言: 一.H.264码流解析 I帧P帧B帧说明: 二.H.265码流解析 三.主要源码 前言: 最近在学习使用MP4v2将H264/H265码流以及AAC音频封装 ...

  7. Mp4v2封装H264+AAC为MP4

    https://blog.csdn.net/xiaota00/article/details/76332458 https://blog.csdn.net/u011270282/article/det ...

  8. mp4v2 写mp4 java_使用mp4v2将H264+AAC合成mp4文件

    录制程序要添加新功能:录制CMMB电视节目,我们的板卡发送出来的是RTP流(H264视频和AAC音频),录制程序要做的工作是: (1)接收并解析RTP包,分离出H264和AAC数据流: (2)将H26 ...

  9. MP4V2封装h265

    mp4v2一般是用来做h264到mp4的封装,后来经过总结和优化,出现了支持h264/h265的版本,链接如下: mp4v2-h265 从以上链接中下载的MP4V2源码 相关接口如下: MP4V2_E ...

最新文章

  1. 系统集成项目管理工程师-项目沟通管理笔记
  2. 施密特出售Google股票套现3.27亿美元
  3. 小赋诗歌一首,以感学生时代结束
  4. 数据中心机房设计及各专业技术平衡
  5. UML入门之类图教程
  6. 关于多画面窗口切换的刷新重绘问题
  7. python类与对象的内置函数大全(BIF)
  8. java读取照片信息 获取照片拍摄时的经纬度
  9. 网络驱动器无法访问,提示找不到网络路径故障处理过程
  10. 硬链接(hard link)与软链接(soft link/symbolic link)
  11. Animation 动画介绍和实现
  12. redis短信发送限制
  13. [心情]我的心依然很痛
  14. 「2020」拼多多数据分析笔试题 | 附解答
  15. 科林明伦杯 哈尔滨理工大学第十届程序设计竞赛 (补)
  16. MOS管-传输特性曲线的细微之处
  17. 94 年出生,她们如今都是 985 高校博士生导师
  18. 2018年中国软件行业基准数据正式发布
  19. access制作卡片_(2020年编辑)Access入门教程大全
  20. spss入门——简单的数据预处理到时间序列分析系列(二)

热门文章

  1. 外语配音软件“布谷鸟配音“和ffmepg转换软件的使用以及SYD_Calculator提取文件到C语言
  2. | UML(Jude)
  3. jaeger php,全链路监控Jaeger搭建实战
  4. 【名企面试经验-快手-校招提前批】【Java研发工程师】
  5. 【电源设计】12电源芯片详细选型攻略
  6. 计算机台式右上角三个灯作用,键盘右上角的三个灯是什么意思 分别代表什么...
  7. 怎样用360查看计算机使用记录,电脑360浏览器历史记录怎么查看
  8. [MFC] 高仿Flappy bird 桌面版
  9. Gensim官方介绍翻译
  10. 用Python实现自动刷王者荣耀金币,这简直不要太爽了