上一篇文章介绍了海思Hi3519交叉编译gpac的步骤。成功后会在gpac/bin/gcc下生成许多文件,这里不一一详述了,网上有很多参考资料,这里只说会用到的文件:MP4Box,libgpac.so.8,libgpac.so.8.0.0。其中 :MP4Box是可执行文件,也就是样例主程序。libgpac.so.8和libgpac.so.8.0.0是主程序运行需要的动态库文件。
需要将libgpac.so.8和libgpac.so.8.0.0放入/usr/local/lib/下(或者其他LD_LIBRARY_PATH能找到的位置,也可以自行修改LD_LIBRARY_PATH增加路径)。否则运行MP4Box时会有如下提示:
# ./MP4Box -h
./MP4Box: can't load library 'libgpac.so.8'
放入库文件之后,再次运行以上命令,可以看到帮助信息,说明主程序正常运行了。如下所示:
# ./MP4Box -h
MP4Box [option] input [option]
-h general general options help
-h hint hinting options help
-h dash DASH segmenter help
-h import import options help
-h encode encode options help
-h meta meta handling options help
-h extract extraction options help
-h dump dump options help
-h swf Flash (SWF) options help
-h crypt ISMA E&A options help
-h format supported formats help
-h rtp file streamer help
-h live BIFS streamer help
-h atsc ATSC3 reader help
-h all all options are printed
-nodes lists supported MPEG4 nodes
-node NodeName gets MPEG4 node syntax and QP info
-xnodes lists supported X3D nodes
-xnode NodeName gets X3D node syntax
-snodes lists supported SVG nodes
-languages lists supported ISO 639 languages
-boxes lists all supported ISOBMF boxes and their syntax
-quiet quiet mode
-noprog disables progress
-v verbose mode
-logs set log tools and levels, formatted as a ':'-separated list of toolX[:toolZ]@levelX
-log-file FILE sets output log file. Also works with -lf FILE
-log-clock or -lc logs time in micro sec since start time of GPAC before each log line.
-log-utc or -lu logs UTC time in ms before each log line.
-version gets build version
-- INPUT escape option if INPUT starts with - character
程序能够运行只是万里长征走完了第一步。前方还有很多艰难险阻。
笔者在运行命令将一个h264格式的文件转为mp4时遇到了问题,如下所示:
/mnt/nfs # ./MP4Box -add stream_chn0.h265 stream_chn0.mp4
HEVC import - frame size 3840 x 2160 at 25.000 FPS
Error writing data (No space left on device): 1 blocks to write but 0 blocks written
Error importing stream_chn0.h265: I/O Error
很明显是磁盘空间不够了。但令人费解的是笔者所选取的是/mnt/nfs路径,应该空间很大,理论上不存在空间不够的问题。而且通过df、top、free等命令也没有什么异常。到底是什么原因?网上搜索,都只是停留在介绍MP4Box如何运行,以及gpac库怎样编译,看来这个问题是鲜有人遇到了,只能靠自己解决了。
在板子上运行telnetd命令,这样就可以通过telnet登录打开一个新的终端了。串口终端再次运行以上命令,telnet终端通过df命令进行监视,发现“/”下的剩余空间一直在减少,到上述命令运行后出现的进度条的7%左右空间就满了(笔者开发环境中的rootfs空间较小),程序也就退出了。
程序退出的原因找到了,但是为什么在/mnt/nfs/下运行的程序,源文件和目标文件也都保存在/mnt/nfs下,过程中仍然会占用“/”下的空间?这恐怕就要深入研究gpac的源码了,那是个大工程……
这回也不用上网找解决办法了,之前捎带脚帖子都看过了,都是一些基本的使用命令举例,没有一个特别深入讲解的帖子。
看gpac程序中的帮助提示,发现有一个-tmp选项:" -tmp dirname specifies directory for temporary file creation\n"。抱着试一试的态度,笔者在之前的命令后加入了 这个选项,新命令如下:
/mnt/nfs # ./MP4Box -add stream_chn0.h265 stream_chn0.mp4 -tmp /mnt/nfs
HEVC import - frame size 3840 x 2160 at 25.000 FPS
HEVC Import results: 1104 samples (1252 NALUs) - Slices: 37 I 1067 P 0 B - 37 SEI - 37 IDR
Saving stream_chn0.mp4: 0.500 secs Interleaving
这次很快就成功完成了,问题解决。通过这个问题,可以看出由于是刚刚接触,对于gpac还有很多理解不到的地方,这需要在今后慢慢熟悉、理解、掌握……