以下内容源于朱有鹏课程的学习与整理,如有侵权请告知删除。
前言
本文首先移植MP4V2库,然后运行修改后的sample代码以生成MP4文件。
利用MP4v2库,可以将编码方式为H264的视频码流打包、封装为MP4格式的文件。
一、移植MP4v2库
1、下载MP4v2库并解压
(1)下载地址:2.0.0~dfsg0-6 : mp4v2 package : Ubuntu。
(2)将源码包解压至/home/xjh/iot/hisi_development/mp4/mp4v2-2.0.0目录。
root@ubuntu:/home/xjh/iot/hisi_development/mp4/mp4v2-2.0.0# ls
aclocal.m4 configure COPYING GNUmakefile.am include libplatform project src
autoaux configure.ac doc GNUmakefile.in INSTALL libutil README util
root@ubuntu:/home/xjh/iot/hisi_development/mp4/mp4v2-2.0.0#
2、配置与编译
(1)在/home/xjh/iot/hisi_development/mp4/mp4v2-2.0.0目录下创建_install文件夹(作为安装目录),然后执行以下命令(即执行该目录下的configure脚本,并传一些参数进去)。
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/xjh/iot/hisi_development/mp4/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
(2)执行make,然后执行make install。
执行make时如果出错如下,则执行“source /etc/profile”。
./libtool: line 984: arm-hisiv300-linux-gcc: command not found
make: *** [src/3gp.lo] Error 1
(3)如果安装成功,在_install目录下会生成一些待部署的文件。其中bin目录下是一些可执行的二进制文件,lib目录下是库文件(其中.a文件与静态链接库有关,编译与链接时使用;.so文件与动态链接库有关,链接与运行时使用),include目录下的文件在编译时会用到。
root@ubuntu:/home/xjh/iot/hisi_development/mp4/mp4v2-2.0.0/_install# ls
bin include lib share
root@ubuntu:/home/xjh/iot/hisi_development/mp4/mp4v2-2.0.0/_install#
3、部署相关文件
(1)将上面生成的lib目录下的所有文件,拷贝到Hi3518E_SDK_V1.0.3.0/mpp/lib目录中。
root@ubuntu:/home/xjh/iot/hisi_development/mp4/mp4v2-2.0.0/_install/lib# ls
libmp4v2.a libmp4v2.la libmp4v2.so libmp4v2.so.2 libmp4v2.so.2.0.0
root@ubuntu:/home/xjh/iot/hisi_development/mp4/mp4v2-2.0.0/_install/lib# cp * /home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/mpp/lib/
root@ubuntu:/home/xjh/iot/hisi_development/mp4/mp4v2-2.0.0/_install/lib#
(2)将上面生成的include目录下的所有文件,拷到Hi3518E_SDK_V1.0.3.0/mpp/include目录中。
root@ubuntu:/home/xjh/iot/hisi_development/mp4/mp4v2-2.0.0/_install/include# ls
mp4v2
root@ubuntu:/home/xjh/iot/hisi_development/mp4/mp4v2-2.0.0/_install/include# cp * /home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/mpp/include/ -rf
root@ubuntu:/home/xjh/iot/hisi_development/mp4/mp4v2-2.0.0/_install/include#
(3)将上面生成的lib目录下的*so*文件,拷贝到板载系统的/lib目录中。
此时因为spiflsh容量不足而报错,为了腾出spiflash空间,分别做了两方面的工作。
第一,使用strip工具缩小动态链接库的文件大小。
动态链接库即.so文件中包含着调试符号信息,这些符号会占用一定的空间。在传统的嵌入式系统中flash空间是有限的,为了节省flash空间,需要把这些符号信息去掉。之所以可以将这些符号信息去掉,是因为这些信息是用来调试的,在程序运行时是没用的。
root@ubuntu:/home/xjh/iot/hisi_development/mp4/mp4v2-2.0.0/_install/lib# ls
libmp4v2.a libmp4v2.la libmp4v2.so libmp4v2.so.2 libmp4v2.so.2.0.0
root@ubuntu:/home/xjh/iot/hisi_development/mp4/mp4v2-2.0.0/_install/lib# arm-linux-strip *so*
root@ubuntu:/home/xjh/iot/hisi_development/mp4/mp4v2-2.0.0/_install/lib#
第二,挂载TF卡,然后将/ko目录内容移动到TF卡中。
1)将TF卡格式化为FAT32文件系统(在windows中进行快速格式化时选择这个选项)。
2)把TF卡插进开发板,确保TF卡可用(blk是块设备的简写,mmcblk就是mmc或者sd卡,0就是这个mmc或者sd卡的顺序编号,p1就是分区)。
/mnt # himci: card disconnected! #拔掉卡时显示的信息
mmc1: card aaaa removed
himci: card connected! #将卡插入卡槽显示的信息
himci: mmc1: valid phase shift [1, 7] Final Phase 4
mmc1: new ultra high speed SDR104 SDHC card at address aaaa
mmcblk0: mmc1:aaaa SC16G 14.8 GiB mmcblk0: p1/mnt # ls /dev/mmc* #确保被识别、可用
/dev/mmcblk0 /dev/mmcblk0p1
/mnt #
3)首先在板载系统上创建/usr/mmc目录,然后执行“mount -t vfat /dev/mmcblk0p1 /usr/mmc”,挂载成功后,将/ko目录剪切到/usr/mmc目录中。
4)在开发板的/etc/profle文件末尾添加内容如下:
mount -t vfat /dev/mmcblk0p1 /usr/mmccd /usr/mmc/ko
./load3518e -i -sensor ar0130 -osmem 32 -total 64mount -t nfs -o nolock 192.168.1.141:/home/xjh/iot/hisi_development/hisi_rootfs /mntcd /mnt
二、将H.264码流打包成MP4格式文件
(1)完成上面操作后,将提供的sample目录复制到虚拟机Hi3518E_SDK_V1.0.3.0/mpp目录下,修改目录名为“sample_mp4_ar0130”(只是为了区别之前实验的sample目录)。
(2)进入sample_mp4_ar0130/venc目录下,修改Makefile文件如下(即修改lib的路径,要根据自己实际的lib路径修改):
$(TARGET):%:%.o $(COMM_OBJ)$(CC) $(CFLAGS) -lpthread -lm -o $@ $^ $(MPI_LIBS) $(AUDIO_LIBA) $(SENSOR_LIBS) -lmp4v2 -lstdc++ -lm -L /home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/mpp/lib
(3)在venc目录下执行make,将samp_venc文件拷至/home/xjh/iot/hisi_development/hisi_rootfs目录下(方便将来在开发板的/mnt目录下执行)。
(4)在板载系统/mnt目录下执行“ ./sample_venc ”。注意让它一直执行,直到显示“close mp4 file”时才可以按“ctrl+c”终止程序,否则最终的视频文件打不开。
/mnt # ./sample_venc
MPP Ver HI_VERSION=Hi3518EV200_MPP_V1.0.3.0 B040 Release
RTSP:-----Init Rtsp server
s32ChnNum = 1
=============SAMPLE_COMM_VI_SetMipiAttr enWDRMode: 0
linear mode
Aptina AR0130 sensor 720P30fps init success!
please press twice ENTER to exit this sample
s32ChnTotal =1
Write sps =================
Write pps -------------------
Write date type = 6 isSyncSample = 0
Write date type = 5 isSyncSample = 1
Write date type = 1 isSyncSample = 0
Write date type = 1 isSyncSample = 0
Write date type = 1 isSyncSample = 0
Write date type = 1 isSyncSample = 0
Write date type = 1 isSyncSample = 0//省略部分close mp4 file
(5)在板载系统的/usr/mmc/目录下(源码规定的目录)可以看到test.mp4文件。将该文件复制到板载系统的/mnt目录,则可以在虚拟机中/home/xjh/iot/hisi_development/hisi_rootfs目录下看到该文件,把它移动到共享文件夹,在windows主机中打开该文件。