在mini2440上移植使用ffmpeg录像

来源:互联网 发布:重新发现社会知乎 编辑:程序博客网 时间:2024/05/17 03:26
    最近想在板子上插个摄像头,录个像,搞了两三天,算是能用人家的ffmpeg程序在自己的板子上摄像,然后将文件.avi格式保存到PC机上了。过程有些曲折,但是也算乱撞了。
    (1)编译x264
    官网上下了个最新的x264,地址http://www.videolan.org/developers/x264.html。解压之后,参考【1】用了个./configure --disable-asm,改写了下config.mak,改写ARCH=ARM SYS=LINUX CC=arm-linux-gcc,其中CC写成你自己的交叉编译环境位置,相应的AR、RANLIB也是,我的部分修改的config.mak如下:
prefix=/usr/local
exec_prefix=${prefix}
bindir=${exec_prefix}/bin
libdir=${exec_prefix}/lib
includedir=${prefix}/include
ARCH=ARM
SYS=LINUX
CC=arm-linux-gcc
CFLAGS=-Wshadow -O3 -ffast-math  -Wall -I. -std=gnu99 -fomit-frame-pointer -fno-tree-vectorize
DEPMM=-MM -g0
DEPMT=-MT
LD=arm-linux-gcc -o 
LDFLAGS= -lm -lpthread
LIBX264=libx264.a
AR=arm-linux-ar rc 
RANLIB=arm-linux-ranlib
然后,make make install一下。
    (2)编译ffmpeg
    官网上下载FFmpeg 0.8.2,地址:http://ffmpeg.org/download.html,然后参考【2】编译使用。将下载的包解压之后运行./configure,后面的记不清了,从config.log中复制出来,如下:
./configure --cross-prefix=arm-linux- --enable-cross-compile --target-os=linux --cc=arm-linux-gcc --arch=arm --prefix=/usr/local/ffmpeg --enable-shared --disable-static --enable-gpl --enable-nonfree --enable-ffmpeg --disable-ffplay --enable-ffserver --enable-swscale --enable-pthreads --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-yasm --disable-stripping
这里没有使用ffplay,需要的可以自己加上,参考【2】中说要用到SDL库,可以试试。在--cc  --prefix根据自己的目录修改,然后就是make 和 make install ,之后在--prefix下找到自己要用到的lib include文件夹。
    (3)使用ffmpeg录像

    将生成的ffmpeg库拷贝到mini2440上,我是用nfs的TCP(参数上加个-o -tcp就可以了,默认是UDP的会断)拷贝的,还好板子闪存够大,近30M东西啊(有空了看能不能精简下)!我是把lib目录下的库文件拷到了板子的默认lib下,所以也就省了export。当然还有ffmpeg程序,保持着nfs,用如下命令试下:#./ffmpeg -f video4linux2 -s 320x240 -i /dev/video0 /mnt/test.avi

补充说明下,我用的是USB摄像头,mini2440支持,生成的是/dev/video0,nfs到主机的跟目录,所以/mnt/test.avi是在主机根目录下生成的。
    好了,运行之后看以看到传输,终止程序,能看到生成的test.avi,播放一下(我的是复制到windows下播放的),没调镜头,模糊的图凑合看下吧!


    直接在板子上也使用了(没用nfs连接),输出结果如下:

    [root@FriendlyARM /]# ./ffmpeg -f video4linux2 -s 320x240 -i /dev/video0 /test.avi
ffmpeg version 0.8.2.git, Copyright (c) 2000-2011 the FFmpeg developers
  built on Sep  7 2011 18:15:56 with gcc 4.3.2
  configuration: --cross-prefix=arm-linux- --enable-cross-compile --target-os=li
nux --cc=arm-linux-gcc --arch=arm --prefix=/usr/local/ffmpeg --enable-shared --d
isable-static --enable-gpl --enable-nonfree --enable-ffmpeg --disable-ffplay --e
nable-ffserver --enable-swscale --enable-pthreads --disable-armv5te --disable-ar
mv6 --disable-armv6t2 --disable-yasm --disable-stripping
  libavutil    51. 16. 0 / 51. 16. 0
  libavcodec   53. 13. 0 / 53. 13. 0
  libavformat  53. 11. 0 / 53. 11. 0
  libavdevice  53.  3. 0 / 53.  3. 0
  libavfilter   2. 37. 0 /  2. 37. 0
  libswscale    2.  1. 0 /  2.  1. 0
  libpostproc  51.  2. 0 / 51.  2. 0
[video4linux2 @ 0x2eae0] Estimating duration from bitrate, this may be inaccurat
e
Input #0, video4linux2, from '/dev/video0':
  Duration: N/A, start: 1331454393.212519, bitrate: 4915 kb/s
    Stream #0.0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 320x240, 4915 kb/
s, 4 fps, 4 tbr, 1000k tbn, 4 tbc
Incompatible pixel format 'yuyv422' for codec 'mpeg4', auto-selecting format 'yu
v420p'
[buffer @ 0x314f0] w:320 h:240 pixfmt:yuyv422 tb:1/1000000 sar:0/1 sws_param:
[buffersink @ 0x2ffa0] auto-inserting filter 'auto-inserted scaler 0' between th
e filter 'src' and the filter 'out'
[scale @ 0x302d0] w:320 h:240 fmt:yuyv422 -> w:320 h:240 fmt:yuv420p flags:0x4
Output #0, avi, to '/test.avi':
  Metadata:
    ISFT            : Lavf53.11.0
    Stream #0.0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 320x240, q=2-31, 200
 kb/s, 4 tbn, 4 tbc
Stream mapping:
  Stream #0.0 -> #0.0 (rawvideo -> mpeg4)
Press [q] to stop, [?] for help
frame=    3 fps=  0 q=2.0 size=      13kB time=00:00:00.75 bitrate= 137.2kbits/s
frame=    5 fps=  3 q=2.0 size=      17kB time=00:00:01.50 bitrate=  91.5kbits/s
frame=    7 fps=  3 q=2.0 size=      21kB time=00:00:02.25 bitrate=  74.9kbits/s
frame=    9 fps=  3 q=2.0 size=      25kB time=00:00:02.75 bitrate=  74.0kbits/s
frame=   11 fps=  3 q=2.0 size=      29kB time=00:00:03.50 bitrate=  68.0kbits/s
frame=   13 fps=  3 q=1.6 size=      37kB time=00:00:04.00 bitrate=  75.2kbits/s
frame=   13 fps=  3 q=1.6 Lsize=      37kB time=00:00:04.00 bitrate=  75.8kbits/
s
video:31kB audio:0kB global headers:0kB muxing overhead 19.076962%
Received signal 2: terminating.
[root@FriendlyARM /]# ls
bin         home        mnt         sbin        udisk
dev         lib         opt         sys         usr
etc         linuxrc     proc        test.avi    var
ffmpeg      lost+found  root        tmp         www

    可能有些摄像头不支持v4l2或者板子本身不支持造成无法使用,希望注意,找到解决方法的留言告知,十分感谢!

    最后想说下的是,我下的ffmpeg中怎么没有网上说的Output_example.c等例程,希望知道的人告诉我一下,谢谢!有问题的请留言!

参考文章:
【1】http://club.topsage.com/thread-2127234-1-1.html
【2】http://blog.csdn.net/liaozc/article/details/6025610
【3】http://blog.csdn.net/dongliqiang2006/article/details/5869002
原创粉丝点击