视频关键帧提取

引子:最近在帮老师做项目,涉及到视频和图形图像处理这方面的内容。我觉得作为一个程序猿,不仅仅着眼于小的细节,对自己整体方向的把握也需要一个比较好的规划,我们的目标是:当一个好的程序猿。

项目整体的架构是:ubuntu+python+django+apache+html+mongodb。


当时卡在视频关键帧提取这一块好长时间,也没人指导我自己该怎么做,谁让我们程序猿自学能力要强呢?

网上找了很多资料,折腾了一个多星期,终于把这件事搞定了。

用的是ffmpeg,它是干啥的呢?大白话就是:能够处理音视频的转换,编码,当然最重要一点就是:能够读取视频,并生成图片,这其中当然有对关键帧的提取。


步骤1:在ubuntu下安装和编译ffmpeg

关于这一步,另外一位朋友已经写得很详细了,这里我就不再多说了。地址是这个:http://blog.csdn.net/liuyangriver/article/details/9566769

(http://blog.csdn.net/jk110333/article/details/8978280,这篇文章的方法安装ffmpeg失败)


编译方法1:

1、下载ffmpeg1.1.2

apt-get install subversion   //安装svn,  

svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg     //下载ffmpeg源代码,保存目录/home/parallels/Documents/ffmpeg/test/ffmpeg.  

   //output:Checked out revision 26402.


apt-get install git//安装git

git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg //http://ffmpeg.org/download.html官方下载ffmpeg方法,Receiving objects: 100% (314377/314377), 77.14 MiB | 145//KiB/s, done.. 

//保存目录://home/parallels/Documents/ffmpeg/test/test/ffmpeg


2、配置ffmpeg

 2.1、./configure --enable-shared --prefix=/usr/local/ffmpeg    //执行该命令,报如下的错误:yasm not found, use --disable-yasm for a crippled build

//解决方法:安装yasm

3、安装yasm

3.1、下载yasm 

http://download.csdn.net/detail/reboot2009/4424607   //yasm是汇编编译器,因为ffmpeg中为了提高效率用到了汇编指令,比如MMX和SSE

3.2、配置yasm

./configure

注意:不要使用prefix指定安装路径什么的,否则后患无穷啊!

3.3、编译yasm

make

3.4、安装yasm

make install

4、重新配置ffmpeg

./configure    //OK

5、编译ffmpeg

make

6、安装ffmpeg

make install




【废弃

1、下载源文件,最新的版本1.2.1

http://ffmpeg.org/releases/ffmpeg-1.2.1.tar.bz2

网上有人用svn下载的,可见ffmpeg是用svn维护的,下载个trunk版本,稳定版!

svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg

我用的是第一种方法下载的


2、解压

tar xvjf ffmpeg-1.2.1.tar.bz2 


3、运行自动配置

./configure --enable-shared --prefix=/usr/local/ffmpeg

  其中:--enable-shared 是允许其编译产生动态库,在以后的编程中要用到这个几个动态库。--prefix设置的安装目录。

期间可能会出错,说少了yasm,请用--disabled-yasm重新运行,在命令中加入这个参数也能成功,不过最好加上,这个和格式转换有关系的!

Yasm是一个完全重写的NASM汇编。目前,它支持x86和AMD64指令集,接受NASM和气体汇编语法,产出二进制, ELF32 , ELF64 , COFF , Mach - O的( 32和64 ) , RDOFF2 ,的Win32和Win64对象的格式,并生成STABS 调试信息的来源,DWARF 2 ,CodeView 8格式。

安装yasm:apt-get install yasm 即可!

在运行配置./configure --enable-shared --prefix=/usr/local/ffmpeg

ok!


4、编译安装

make  && make install

安装之后在/usr/local/ffmpeg会看到有三个目录

  lib 动态链接库位置
  include 编程要用到头文件
  bin 执行文件所在的目录


5、为了以后方便编程,我们把lib中的三个链接库libavcodec.so libavformat.so libavutil.so复制到/usr/lib下。把include目录下的文件夹复制到/usr/include下。
  执行bin目录下的ffmpeg,ffmpeg是一个很好的视频和音频的格式转化工具,可以去处理视频文件了。命令参看http://blog.csdn.net/jk110333/article/details/8978328
另外,bin目录下还有两个文件:ffprobe和ffserver

  网上有很多它的说明文档。如果不想生成ffserver,只要在./configure的时候加--disable-ffserver即可。

运行的时候可能出现下面的问题:

root@jack-desktop:~# ffmpeg --help
ffmpeg: error while loading shared libraries: libavdevice.so.54: cannot open shared object file: No such file or directory

用ldd命令查看缺少什么库

[python]  view plain copy
  1. root@jack-desktop:~# ldd `which ffmpeg`  
  2.         linux-gate.so.1 =>  (0x00a39000)  
  3.         libavdevice.so.54 => not found  
  4.         libavfilter.so.3 => not found  
  5.         libavformat.so.54 => not found  
  6.         libavcodec.so.54 => not found  
  7.         libswresample.so.0 => not found  
  8.         libswscale.so.2 => not found  
  9.         libavutil.so.52 => not found  
  10.         libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x00260000)  
  11.         libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x00d9c000)  
  12.         libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00286000)  
  13.         /lib/ld-linux.so.2 (0x006f6000)  


然后find搜索这些库都在什么地方

[python]  view plain copy
  1. root@jack-desktop:/usr/share# find / -name "libavdevice.so.54"   
  2. /usr/share/ffmpeg/lib/libavdevice.so.54  

去目录下查看发现/usr/share/ffmpeg/lib/下都是ffmpeg运行的库,现在需要加入这些库就行了!

[python]  view plain copy
  1. root@jack-desktop:/usr/share# vim /etc/ld.so.conf                                
  2.   
  3.   include /etc/ld.so.conf.d/*.conf  
  4.   /usr/share/ffmpeg/lib  
其中/usr/share/ffmpeg是刚才安装的位置。

在用命令ldconfig就成功了!~
6、如果写了一个test.c文件,要包含ffmpeg的头文件,可以这样写:
  #include <文件夹名/头文件名>
  编译:gcc -o test test.c -lavformat -lavcodec -lavtuil (前提是有第5步的操作)
  如果没有第5部的操作,则编译的时候如下:
  gcc -o test test.c -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -lavformat -lavcodec -lavtuil
  编译成功之后,执行的时候还是需要动态库的支持,还是要把那三个动态库文件复制到/usr/lib或者/lib中,不然执行的时候会说找不到动态库链接。还有一个方法可以解决这个问题,就是把/usr/local/ffmpeg/lib这个目录加入到/etc/ld.so.config中,然后执行ldconfig,或者重启电脑,这样执行的时候系统就可以从/usr/local/ffmpeg/lib这个目录下去找这三个动态库文件了。
  以上的方式是采用动态库编译ffmpeg的,如果在configure的时候不加上--enable-shared的,则采用静态链接的方式,不会生成那三个动态库。同时生成的ffplay、ffmpeg的执行文件也比较的大,因为他们不需要动态库的支持,就可以执行。但是不利于再次开发,所以我采用动态链接的方式。configure中还有很多的选项,可以通过./configure --help查看,也可以直接查看configure文件。这在配置的时候很重要。





步骤2:在unbuntu下提取视频关键帧

ffmpeg -i yourVideo.mp4 -vf select='eq(pict_type\,I)' -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg

各个参数解释:

-i :输入文件,这里的话其实就是视频

-vf:是一个命令行,表示过滤图形的描述

选择过滤器select会选择帧进行输出:包括过滤器常量

pict_type和对应的类型:PICT_TYPE_I 表示是I帧,即关键帧。

-vsync 2:阻止每个关键帧产生多余的拷贝

-f image2 name_%02d.jpeg:将视频帧写入到图片中,样式的格式一般是:

“%d” 或者 “%0Nd”

-s:分辨率,16*9


注意:必须将-i 输入文件 这个参数放在前面,否则报错。


嗨起来。

你可能感兴趣的:(ffmpeg,视频关键帧提取,ubuntu,视频处理)