目录

  • 一、MP4文件格式解析
    • 1、视频文件总体介绍
    • 2、MP4格式总体介绍
    • 3、MP4学习路线
    • 4、正式开始MP4的组织形式的学习
  • 二、MP4Info工具使用
  • 三、mp4v2移植和播放实战
    • 1、下载mp4v2
    • 2、配置并编译
    • 3、部署
    • 4、编译sample
    • 6、准备TF卡
    • 7、运行和测试
  • 四、MP4打包源码解析
  • 五、mp4v2结合MP4Info学习分析
    • 1、思路
    • 2、实践1:去掉sps
    • 3、实践2:去掉pps
  • 六、添加网络telnet调试
    • 1、为什么添加telnet调试
    • 2、telnet调试的原理
    • 3、在HI3518E开发板上telnet远程登录调试实战
  • 七、海思proc文件系统调试接口(现在大部分被sys文件系统取代了)
    • 1、proc文件系统的原理
    • 2、海思proc文件系统调试的文档说明
    • 3、额外提供的调试经验文档

一、MP4文件格式解析

1、视频文件总体介绍

(1)视频文件的本质:记录压缩后的视频帧并且能被播放器还原 解码播放(关键是找到视频的I帧,P帧)

(2)视频文件的关键:高效率记录信息、兼容性

(3)视频文件的信息:索引信息、有效信息

2、MP4格式总体介绍

(1)MP4由MP3(纯audio)升级而来,包含video和audio在内

(2)MP4是h.264的最主流打包格式

(3)MP4文件内部**采用网络字节序(大端模式) **

3、MP4学习路线

(1)学习MP4的组织形式和box解析

(2)移植和使用mp4v2开源库来打包MP4

(3)进一步研究MP4解包播放和mp4v2源码

(4)自己编程进行MP4的打包、解包、分割等。

4、正式开始MP4的组织形式的学习

参考学习(必读):https://www.cnblogs.com/ranson7zop/p/7889272.html

  MP4视频文件封装格式是基于QuickTime容器格式定义的,因此参考QuickTime的格式定义对理解MP4文件格式很有帮助。MP4文件格式是一个十分开放的容器,几乎可以用来描述所有的媒体结构,MP4文件中的媒体描述与媒体数据是分开的,并且媒体数据的组织也很自由,不一定要按照时间顺序排列,甚至媒体数据可以直接引用其他文件。同时,MP4也支持流媒体(通过网络来边下载边播放)。MP4目前被广泛用于封装h.264视频和AAC音频,是高清视频的代表。

(1)整个MP4文件由若干个各种不同的box组成,打包和解包时都是以box为单位的

(2)MP4中有且只有一个ftyp box(file type box),该box位于整个MP4的开头位置

二、MP4Info工具使用

所用到的软件及资料链接:

链接:https://pan.baidu.com/s/1DFbZPI4ch_y33RUAE6whiA
提取码:pu15
--来自百度网盘超级会员V5的分享

第一步:打开该软件

第二步:使用该软件打开一个MP4视频文件,就会出现下面的情况:

图中右半部分的信息通过解析box得到。

该软件无法打开太大的视频文件,只能打开一些小的视频文件用于分析。

三、mp4v2移植和播放实战

  mp4v2 库是一个专用于处理mp4容器的开源项目,其使用c++编写,并提供c语言接口。

1、下载mp4v2

(1)https://launchpad.net/ubuntu/+source/mp4v2/2.0.0~dfsg0-6

(2)解压,并在目录内创建_install目录作为安装目录

2、配置并编译

(1)导出环境变量,使得可以找到交叉编译链:
sudo PATH=$PATH:/opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin CC=arm-hisiv300-linux-gcc CXX=arm-hisiv300-linux-gcc 进行配置:
./configure --host=arm-hisiv300-linux --prefix=/home/aston/sambashare/mp4v2-2.0.0/_install  --disable-option-checking --disable-debug --disable-optimize --disable-fvisibility --disable-gch --disable-largefile --disable-util --disable-dependency-tracking --disable-libtool-lock注:_install  这个文件夹需要我们手动创建,最终编译生成的文件会存放在这个文件夹中
(2)make
(3)make install
(4)检查各必要文件

3、部署

(1)生成的lib加到mpp lib里面

(2)生成的include下文件添加到海思SDK 中的mpp/include中去

(3)生成的lib/的动态库文(* so *)件加到开发板lib目录下(通过开发板挂载到主机的那个目录)

  若出现存储空间不够用的情况,可将一些不用的文件(如usb网卡驱动)删除掉或者放在开发板挂载的/mnt目录中。

cp ~/sambashare/mp4v2-2.0.0/_install/lib/* ./cp ~/sambashare/mp4v2-2.0.0/_install/include/* ./ -rf

4、编译sample

(1)用提供的sample文件夹替换掉原来的sample,或者给提供的文件夹起个新的名字sample_mp4

链接:https://pan.baidu.com/s/1LMNPxBzWeI-94L8zKCVhpA
提取码:gu90
--来自百度网盘超级会员V5的分享

(2)make

6、准备TF卡

参考学习(了解扩充):https://blog.csdn.net/li_wen01/article/details/79929730
(1)TF卡格式化为FAT32文件系统,若失败可试试低层格式化软件如SDFormat之类

(2)开机后将TF卡进行挂载

 mount -t vfat /dev/mmcblk0p1 /usr/mmc


  要是内存卡太大,如16G则并不一定能用,无法识别到分区,不能工作。我用了一张8G的成功了。

(3)先检测下TF卡可用,如在电脑创建一个文件,在开发板去读写。

7、运行和测试

(1)运行上边步骤中make编译生成的sample_venc可执行文件,使用rtsp方式测试,确认有图像

(2)终止程序,取出TF卡用读卡器接电脑,通过电脑的视频播放软件查看

注:在进行功能测试试,rtsp并未正常工作,但mp4视频打包成功了,分析猜测原因可能是进行视频打包时打印信息太多影响了rtsp的正常工作。

四、MP4打包源码解析

源码:即上边那个网盘链接,将mpp文件中的所有文件通过sourceinsight软件建立工程进行分析。

参考学习:https://blog.csdn.net/weixin_42462202/article/details/90108485

HI_S32 SAMPLE_COMM_VENC_MP4(VENC_STREAM_S *stStream)//该函数运行一次只负责将一帧数据打包
{static int nRecordFlag = 0x00;//这些static变量的值只有在第一次程序运行被初始化static int recording = 0x1;   //之后的每次调用,都会使用上次保留下来的值static int spsflag = 0;static int ppsflag = 0;static MP4TrackId video = 0;static MP4FileHandle hMP4File = NULL;static char recordfish = 0x1;int j = 0;int len = 0;char *pData = NULL;char isSyncSample = 0;if(recordfish == 0x00){return 0;}if(hMP4File == NULL){//第一次进入的时候hMP4File = MP4CreateEx("/usr/mmc/test.mp4",0, 1, 1, 0, 0, 0, 0);//创建一个mp4文件if (hMP4File == MP4_INVALID_FILE_HANDLE)    {printf("open file fialed.\n");return -1;}MP4SetTimeScale(hMP4File, 90000);//设置时间戳}//recording:表示正在记录,正在打包,一个序列由1sps+1pps+sei+1I帧+29P帧if(recording && stStream->u32Seq > 30){  //丢弃前30帧,也可以不丢弃,都是为了确保从I帧开始if(stStream->u32PackCount >= 3){//sps,pps,sei,从I帧开始编码,保证文件开始就能播放nRecordFlag = 1;}if(nRecordFlag){for(j = 0;j < stStream->u32PackCount;j++){len  = stStream->pstPack[j].u32Len - stStream->pstPack[j].u32Offset;pData = (stStream->pstPack[j].pu8Addr + stStream->pstPack[j].u32Offset);                      if(stStream->pstPack[j].DataType.enH264EType == H264E_NALU_SPS){if(spsflag == 0x00){spsflag = 0x1;//写spsprintf("Write sps =================\n"); //添加track,相当于添加一路流   video = MP4AddH264VideoTrack(hMP4File, 90000, 90000 / 30, 1280, 720,pData[4+1], //sps[1] AVCProfileIndicationpData[4+2], //sps[2] profile_compatpData[4+3], //sps[3] AVCLevelIndication3); // 4 bytes length before each NAL unitMP4SetVideoProfileLevel(hMP4File, 0x7F);//视频的级别MP4AddH264SequenceParameterSet(hMP4File, video, pData+4, len-4); //添加sps到mp4文件                                     }continue;}if(stStream->pstPack[j].DataType.enH264EType == H264E_NALU_PPS){if(ppsflag == 0x00){ppsflag = 0x1;//添加pps                                    printf("Write pps -------------------\n");                                        MP4AddH264PictureParameterSet(hMP4File, video, pData+4, len-4);//添加pps到mp4文件}continue;}isSyncSample = (stStream->pstPack[j].DataType.enH264EType == H264E_NALU_ISLICE)   ?  (1) : (0);pData[0] = (len - 4) >> 24;//构建网络字节序,减四,去掉了分隔符0001的长度pData[1] = (len - 4) >> 16;pData[2] = (len - 4) >> 8;pData[3] = len - 4;                          printf("Write date type = %d  isSyncSample = %d\n",stStream->pstPack[j].DataType.enH264EType,isSyncSample);                              MP4WriteSample(hMP4File, video, pData, len , MP4_INVALID_DURATION, 0, isSyncSample);//写入nalu}                   }}if((recording && stStream->u32Seq > 900)){//控制文件时长recording = 0x00;printf("Close mp4 file\n");                       MP4Close(hMP4File, 0);//关闭mp4文件,在写入mp4文件后必须调用此函数,不然mp4文件会损坏hMP4File = NULL;video = 0;recordfish = 0x00;}}

五、mp4v2结合MP4Info学习分析

1、思路

(1)修改MP4打包源码,用MP4Info查看录制的MP4细节

(2)再深度:修改mp4v2源码中细节,编译执行,再打包MP4视频查看分析

2、实践1:去掉sps

  通过测试,去掉sps后的视频VLC播放器以及其他影视播放器(腾讯等),均无法播放。

3、实践2:去掉pps

  通过测试,去掉pps后的视频VLC播放器以及其他影视播放器(腾讯等),均无法播放。

图中自上而下依次是完整MP4视频,去掉sps,去掉pps。

六、添加网络telnet调试

1、为什么添加telnet调试

(1)嵌入式linux系统的用户界面就是commandline,本质上由busybox提供

(2)busybox的命令行只有1个,一旦前台被占用就无法做其他操作

(3)解决方案有2个:一个是建立多个commandline,一个是开放其他用户界面。

2、telnet调试的原理


(1)在开发板中提前运行telnetd(这个软件在海思提供的系统中已经自带了)

telnet:客户端程序,是开发板远程登陆别的服务器使用的
telnetd:服务器程序,是一个守护进程,是其他客户端登陆开发板使用的

(2)远程通过telnet的client连接server,构建一个用户界面

(3)这是非常传统典型的远程登录的方式···其实用过的

3、在HI3518E开发板上telnet远程登录调试实战

(1)命令行执行 telnetd &,然后Windows打开SecureCRT(其他具有相同功能的软件也可,如MobaXterm)配置SSH至192.168.1.10,即开发板网口


(2)在CRT界面输入:

用户名ssid:root
password:因为我的开发板没有设置密码,直接回车,进入


(3)问题:若遇到不断重启,将etc/profile 中的加载项移至/etc/init.d中的rcS文件中。这是因为因为开启telnet服务会多次加载profile(挂载上一次后无法再次挂载)

profile文件:

可以将这些内容移至/etc/init.d中的rcS文件中。

(4)可以将telnetd &加入rcS中开机默认加载

七、海思proc文件系统调试接口(现在大部分被sys文件系统取代了)

1、proc文件系统的原理

参考学习:
https://www.cnblogs.com/lidabo/p/5628020.html
https://blog.csdn.net/weixin_29202687/article/details/116963940

2、海思proc文件系统调试的文档说明

链接:https://pan.baidu.com/s/1zDDRvTl3gx4GhHE4kgx-zA
提取码:pfp8
--来自百度网盘超级会员V5的分享

3、额外提供的调试经验文档

链接:https://pan.baidu.com/s/1Eu3LmkO3-y3YDsEARnikbw
提取码:oifi
--来自百度网盘超级会员V5的分享

注:本文章参考了《朱老师物联网大讲堂》课程笔记,并结合了自己的实际开发经历以及网上他人的技术文章,综合整理得到。如有侵权,联系删除!水平有限,欢迎各位在评论区交流。

视频打包为MP4格式并存储到TF卡的实现相关推荐

  1. 视频教程-视频打包为MP4格式并存储到TF卡的实现-第7/11季-嵌入式

    视频打包为MP4格式并存储到TF卡的实现-第7/11季 互联网课程品牌<朱老师物联网大讲堂>创始人.精通U-Boot.Linux kernel移植及驱动程序开发;精通C.C++.Java. ...

  2. 如何将OGV格式的视频转换成MP4格式

    在日常生活中,看视频是必定会做的事情,但有时因为无法播放视频,有些可能是视频文件损坏,但一般都是视频格式比较特殊,播放器不支持某种视频格式的编码所以才无法播放.比如非常少见的OGV格式.OGV视频HT ...

  3. uc浏览器下载的视频php格式,如何将UC缓存的视频转化为通用的MP4格式?将缓存的视频转化为MP4格式的方法...

    用户在使用uc浏览器的时候,总会需要下载视频,那么用户要如何使用才能将浏览器缓存的视频转化成平常使用的mp4格式呢?用户可以将格式转换,在需要互相传递的时候就会更加的方便,如果你也喜欢这个服务,想要使 ...

  4. 怎么把video文件改成mp4_如何把视频转换成mp4格式?

    要想把视频转换成mp4格式,这就看你原视频是什么格式了.这里推荐一个视频格式转换类型比较齐全的一款. 烁光视频转换器烁光视频转换器​www.ivideotools.com 专业视频格式转换器,支持视频 ...

  5. b站电脑客户端_如何将B站的flv格式的视频转换成mp4格式

    经常看到B站有精彩的视频片段,于是想把这些视频下载保存到电脑,但是发现没有下载按钮,是不是很悲催.有些时候想从优酷.土豆网这些视频网站下载视频,结果却提示要先下载视频客户端才能继续下载视频,运气差的话 ...

  6. 电脑视频转换成mp4格式,视频格式转换器转换

    怎么把电脑视频转换成mp4格式?使用视频转换器,可以转换来自各种设备的音视频格式,包括相机.手机.视频播放器.电视.平板电脑等.因此,音视频爱好者都可以使用它在各种设备上播放或在社交平台上分享. 主要 ...

  7. php怎么转mp4,php使用memcoder将视频转成mp4格式的方法

    本文实例讲述了php使用memcoder将视频转成mp4格式的方法.分享给大家供大家参考.具体实现方法如下: 代码如下: convertTo( "some-input-video.avi&q ...

  8. 怎样将wmv格式的视频转换成mp4格式

    WMV视频格式的全称为:Windows Media Video,是微软开发的一系列视频编解码和其相关的视频编码格式的统称,是微软Windows媒体框架的一部分.也是一种有着高压缩率.体积小等优势的视频 ...

  9. flv视频转换成mp4格式怎么转?

    flv视频转换成mp4格式怎么转?相信正在阅读文章的你,一定接触到了flv视频文件.flv是一种新型的小体积视频格式,因为体积小的特点使得flv的加载速度特别快,从而实现了在线观看浏览视频也很顺畅的愿 ...

  10. avi视频怎么转mp4格式?

    avi视频怎么转mp4格式?接触视频文件久了你就会发现一个问题,视频文件不仅仅限于MP4,,mov等格式,罗列一下视频文件的格式不下百余种.那在使用的时候,既要保证视频文件的可用性,又要保证视频的分辨 ...

最新文章

  1. AndoridSQLite数据库开发基础教程(5)
  2. .NET设计模式(15):结构型模式专题总结
  3. 科大星云诗社动态20210512
  4. MySQL ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
  5. uni-app微信小程序动态样式设置;微信小程序style行内式无效;微信小程序style行内式编译报错;微信小程序:style设置样式
  6. C++ primer第六章函数的学习
  7. LeetCode20——Valid Parentheses(括号匹配问题,使用栈的知识)
  8. SpringCloud教程 | 第四篇:断路器(Hystrix)
  9. 对fragment的学习
  10. Java 类加载机制概述、类加载流程、自定义类加载器
  11. 使用sever2008做DHCP中继代理
  12. javaweb JAVA JSP员工绩效考核管理系统(员工考核管理系统)员工考勤管理系统人事考勤
  13. java过载保护_微服务过载保护原理与实战「纯干货」
  14. horner算法matlab实现,使用Euclid和Horner算法的多项式求值
  15. Maven-仓库概念,下载与配置
  16. 期货基本面分析:乙二醇期货库存减少,甲醇期货企业库存升至年内最高水平
  17. typec扩展坞hdmi没反应_全功能扩展坞Type-C Docking (扩展坞) 方案讲解-可实现拔插不掉屏...
  18. 图形算法:圆形生成算法
  19. 怎么找网图本人_怎么通过照片找人-请问如何用相片在网络查找个人资料就是利用相 – 手机爱问...
  20. php atlas,使用Atlas实现读写分离

热门文章

  1. 聊天室群聊以及私聊功能的实现
  2. 安卓基础-day06-20180131
  3. Aho-Corasick(AC自动机)
  4. 基于Java+Springboot+vue体育用品销售商城平台设计和实现
  5. matlab地震频谱分析,《基于MATLAB的地震数据的分析》.doc
  6. php alt什么意思,img标签的alt属性是什么意思?
  7. 扒一扒 ScheduledThreadPoolExecutor
  8. 5G+智能电网应用项目开建,将带来何种“活力”?
  9. 领导力有哪些方面?什么是领导力?
  10. 光电耦合器的隔离作用是什么?