您的位置:首页 > 其它

多媒体编解码学习: ffmpeg(更新ffmpeg库使用方法)

2016-08-26 16:14 239 查看
文中内容部分参考大牛博客进行边操作边总结

一、ubuntu安装ffmpeg

1. 从ffmpeg官网:https://www.ffmpeg.org/download.html下载源代码,ffmpeg-3.1.3.tar.bz2

  先安装yasm,ffmpeg编译中为了提高编译速度,使用了汇编指令,于是需要使用这个工具,并且只有先安装yasm,才能安装ffmpeg
  可以直接运行 yum
-y install yasm直接安装,或者官网http://yasm.tortall.net/Download.html下载源码yasm-1.3.0.tar.gz安装,解压进入yasm-1.3.0目录后直接运行./configure
&& make && make install即可。

2. 解压文件

$tar -jxvf ffmpeg-3.1.3.tar.bz2


3. 安装步骤

进入解压目录:

$cd ffmpeg-3.1.3


配置makefile:

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


其中--enable-share生产动态链接库,编程使用,并且相关可执行程序也依赖这些动态库;--prefix=/usr/local/ffmpeg制定安装目录为/usr/local/ffmpeg

编译:

$make


我电脑是4核8G内存,大概10分钟编译完成

 

安装:

$sudo make install


make install会把ffmpeg相关执行程序、头文件、lib库安装在/usr/local/ffmpeg下

$ ls /usr/local/ffmpeg/ -l
总用量 16
drwxr-xr-x 2 root root 4096 2016-08-26 14:06 bin
drwxr-xr-x 9 root root 4096 2016-08-26 14:06 include
drwxr-xr-x 3 root root 4096 2016-08-26 14:06 lib
drwxr-xr-x 4 root root 4096 2016-08-26 14:06 share


软连接ffmpeg相关执行文件:

$sudo ln -s /usr/local/ffmpeg/bin/ffmpeg /usr/local/bin/
$sudo ln -s /usr/local/ffmpeg/bin/ffprobe /usr/local/bin/
$sudo ln -s /usr/local/ffmpeg/bin/ffserver /usr/local/bin/


这样就不需要用./来执行ffmpeg、ffprobe、ffserver了

 

指定ffmpeg的lib路径:

在/etc/ld.so.conf.d
目录下vi创建一个ffmpeg.conf,并添加/usr/local/ffmpeg/lib,运行ldconfig,这样运行ffmpeg相关执行程序时,就不会出现找不到lib*的错误。

输入ffmpeg --help,显示以下ffmpeg版本信息和help信息,说明安装成功

$ ffmpeg --help
4000
ffmpeg version 3.1.2 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1)
configuration: --enable-shared --prefix=/usr/local/ffmpeg
libavutil      55. 28.100 / 55. 28.100
libavcodec     57. 48.101 / 57. 48.101
libavformat    57. 41.100 / 57. 41.100
libavdevice    57.  0.101 / 57.  0.101
libavfilter     6. 47.100 /  6. 47.100
libswscale      4.  1.100 /  4.  1.100
libswresample   2.  1.100 /  2.  1.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Getting help:
-h      -- print basic options
-h long -- print more options
-h full -- print all options (including all format and codec specific options, very long)
-h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter
See man ffmpeg for detailed description of the options.

Print help / information / capabilities:
-L                  show license
-h topic            show help
-? topic            show help
-help topic         show help
--help topic        show help
-version            show version
-buildconf          show build configuration
-formats            show available formats
-devices            show available devices
......
......
......


二、ffmpeg相关库功能

$ ls /usr/local/ffmpeg/lib/ -l
总用量 130440
-rw-r--r-- 1 root root 70401082 2016-08-26 14:06 libavcodec.a
lrwxrwxrwx 1 root root       23 2016-08-26 14:06 libavcodec.so -> libavcodec.so.57.48.101
lrwxrwxrwx 1 root root       23 2016-08-26 14:06 libavcodec.so.57 -> libavcodec.so.57.48.101
-rwxr-xr-x 1 root root 13904780 2016-08-26 14:06 libavcodec.so.57.48.101
-rw-r--r-- 1 root root  1037868 2016-08-26 14:06 libavdevice.a
lrwxrwxrwx 1 root root       23 2016-08-26 14:06 libavdevice.so -> libavdevice.so.57.0.101
lrwxrwxrwx 1 root root       23 2016-08-26 14:06 libavdevice.so.57 -> libavdevice.so.57.0.101
-rwxr-xr-x 1 root root    63844 2016-08-26 14:06 libavdevice.so.57.0.101
-rw-r--r-- 1 root root  8925172 2016-08-26 14:06 libavfilter.a
lrwxrwxrwx 1 root root       23 2016-08-26 14:06 libavfilter.so -> libavfilter.so.6.47.100
lrwxrwxrwx 1 root root       23 2016-08-26 14:06 libavfilter.so.6 -> libavfilter.so.6.47.100
-rwxr-xr-x 1 root root  1601956 2016-08-26 14:06 libavfilter.so.6.47.100
-rw-r--r-- 1 root root 30086672 2016-08-26 14:06 libavformat.a
lrwxrwxrwx 1 root root       24 2016-08-26 14:06 libavformat.so -> libavformat.so.57.41.100
lrwxrwxrwx 1 root root       24 2016-08-26 14:06 libavformat.so.57 -> libavformat.so.57.41.100
-rwxr-xr-x 1 root root  2244728 2016-08-26 14:06 libavformat.so.57.41.100
-rw-r--r-- 1 root root  1415736 2016-08-26 14:06 libavutil.a
lrwxrwxrwx 1 root root       22 2016-08-26 14:06 libavutil.so -> libavutil.so.55.28.100
lrwxrwxrwx 1 root root       22 2016-08-26 14:06 libavutil.so.55 -> libavutil.so.55.28.100
-rwxr-xr-x 1 root root   447884 2016-08-26 14:06 libavutil.so.55.28.100
-rw-r--r-- 1 root root   396728 2016-08-26 14:06 libswresample.a
lrwxrwxrwx 1 root root       24 2016-08-26 14:06 libswresample.so -> libswresample.so.2.1.100
lrwxrwxrwx 1 root root       24 2016-08-26 14:06 libswresample.so.2 -> libswresample.so.2.1.100
-rwxr-xr-x 1 root root   111992 2016-08-26 14:06 libswresample.so.2.1.100
-rw-r--r-- 1 root root  2328734 2016-08-26 14:06 libswscale.a
lrwxrwxrwx 1 root root       21 2016-08-26 14:06 libswscale.so -> libswscale.so.4.1.100
lrwxrwxrwx 1 root root       21 2016-08-26 14:06 libswscale.so.4 -> libswscale.so.4.1.100
-rwxr-xr-x 1 root root   570744 2016-08-26 14:06 libswscale.so.4.1.100
drwxr-xr-x 2 root root     4096 2016-08-26 14:06 pkgconfig


看到ffmpeg相关的库主要是以下7个

libavutil:用于多媒体编程,主要包含安全合适的字符串操作函数、数学运算函数、随机数字生产器、数据结构、多媒体处理的相关函数(如对像素和采样格式的计数)等,但它不是libavcodec和libavformat所需的库代码;

libavcodec、libavformat:有些视频文件格式(如AVI)没有指出应该使用哪种编码(如h.264)来解析音频和视频数据,它们只是按视频格式封装音视频数据,所以经常碰到打开视频文件只能听到声音而没有画面,则用libavformat来解析视频文件并将编码流分离出来,libavcodec对流进行解码;

Libavdevice:为一些常见的多媒体输入或输出设备提供了抓取和渲染的通用架构,并且很多输入和输出设备,如Video4Linux2, VfW, DShow, and ALSA;

libavfilter:提供了一个通用规定音视频过滤架构,包括一些过滤器、源、汇(什么是源、汇,我也没搞清楚,待研究)

libswscale:执行高度优化的图像缩放、色彩、像素格式转换操作

libswresample:执行高度优化的音频重采样、重换算、样本格式转换操作

 

初步觉得ffmpeg的主要功能就在这些lib中,重点弄清楚lib中重要的接口。

三、代码调用ffmpeg库接口函数

代码文件ffmpegmain.c中

#include <stdio.h>
#include "<span style="font-family: Arial, Helvetica, sans-serif; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">libavcodec/avcodec.h</span><span style="font-family: Arial, Helvetica, sans-serif;">"</span>
int
main(int argc, char **argv)
{
printf("ffmpeg test!!!\n");
avcodec_register_all();
return 0;
}


其中avcodec_register_all();是要使用的接口,要包含"libavcodec/avcodec.h"头文件,运行gcc
-o ffmpegmain ffmpegmain.c -lavcodec -L/usr/local/ffmpeg/lib -I/usr/local/ffmpeg/include即可

所以进行ffmpeg开发,则根据情况条用相关接口功能实现所需要的功能。

四、ffmpeg命令工具简单使用

1. MP4格式转换成avi视频格式:

 


运行后,会将mp4格式的视频文件转换成avi格式。

五、代码结构(待续)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ffmpeg 多媒体