赞
踩
将ffmpeg移植到arm-linux环境(我的是海思HI35XX系列平台:HI3531A, HI3521A, HI3520D等),实现将H264裸流(我的是直接从海思编码模块VENC获取)封装成.mp4或.avi格式的视频文件。
由于嵌入式环境FLASH空间有限,必须将ffmpeg裁剪得足够小。
实现代码: ffmpeg实现将H264裸流封装成.mp4或.avi文件
雷神的ffmpeg工程都是基于VS2010写的,而我用VS2013打开,编译报如下错误:
error LNK2026: 模块对于 SAFESEH 映像是不安全的
我下的是ffmpeg-2.1.3.tar.gz,用这个版本原因:
版本跟雷神教程的差不多(2014年左右的版本);
较新版本(3.x,4.x)很多API都变了,不利于同步雷神的教程学习;
够用就行,没必须追求最新的;
然后,213,你懂的。。。
./configure --prefix=./install
make
make install
(如果提示:yasm/nasm not found or too old. Use --disable-yasm for a crippled build. 就按它说的加 --disable-yasm)
编译后,得到相关头文件和库,把雷神源码拷过来编译即可运行
g++ test_01.cpp -o a.out -I./include/ -L./lib/ -lavformat -lavcodec -lavutil -lpthread -ldl -lm
./configure --prefix=./install --enable-cross-compile --target-os=linux --cpu=cortex-a7 --arch=arm --cross-prefix=arm-hisiv300-linux-
make
make install
arm-hisiv300-linux-g++ test_01.cpp -o a.out -I./include/ -L./lib/ -lavformat -lavcodec -lavutil -lpthread -ldl -lm
①报错:各种"undefined reference to xxx"
办法:我们是C++工程,而ffmpeg是C语言实现的,所有包含的ffmpeg头文件,用extern "C"引用
extern "C"
{
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
}
②报错:error: #error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS
办法:添加__STDC_CONSTANT_MACROS宏(雷神也是这么做的)
#define __STDC_CONSTANT_MACROS
③报错:ffmpeg的time.h和自己工程的time.h冲突,导致时间相关的结构体都出错
error: field ‘st_atim’ has incomplete type
error: field ‘st_mtim’ has incomplete type
error: field ‘st_ctim’ has incomplete type
error: variable ‘timespec time1’ has initializer but incomplete type
................
办法:ffmpeg源码中的time.c和time.h重命名为avtime.c和time.h,当然,ffmpeg源码所有涉及包含此time.h地方也相应改动
④报错:In function ‘int32_t av_clipl_int32_c(int64_t)’:
error: ‘UINT64_C’ was not declared in this scope
办法:在libavutil/common.h添加如下代码:
#ifndef UINT64_C
#define UINT64_C(value) __CONCAT(value, ULL)
#endif
基于上述的③④两点修改源码,并将修改后的源码分享给大家
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。