上一篇文章介紹了海思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還有很多理解不到的地方,這需要在今後慢慢熟悉、理解、掌握……