ffmpeg 应用(1)

来源:互联网 发布:淘宝上的上海大药房 编辑:程序博客网 时间:2024/05/02 01:21

1,介绍
    它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高

可移植性和编解码质量,libavcodec里很多codec都是从头开发的。 ffmpeg项目由以下几部分组成: 1.ffmpeg 视频文件转换

命令行工具,也支持经过实时电视卡抓取和编码成视频文件. 2.ffserver 基于HTTP、RTSP用于实时广播的多媒体服务器.也支

持时间平移 3.ffplay 用 SDL和FFmpeg库开发的一个简单的媒体播放器 4.libavcodec 一个包含了所有FFmpeg音视频编解码

器的库.为了保证最优性能和高可复用性,大多数编解码器从头开发的. 5.libavformat 一个包含了所有的普通音视格式的解

析器和产生器的库.
2,编译
    在终端输入以下指令: Cd /绝对路径/ffmpeg ./configure (此时,会出现问题。然后重新输入./configure –

disable-yasm-) Make 至此,ffmpeg安装编译通过,可以进行对音视频的操作。ffplay 的编译需要依赖于SDL库,所以要想

编译成功ffplay,必须先安装SDL库,安装方法:下载最新版本的SDL相应版本的SDL源码,编译,即可生成SDL库。

3,运行
./ffmpeg -y -i /rootVideoConverter/123.avi -ab 56 -ar 22050 -b 1500 -r 15 -qscale 10 –s 480x350         

/root/VideoConverter/234.flv

参数说明:
-y (覆盖输出文件,即如果1.***文件已经存在的话,不经提示就覆盖掉了)
 
-i "1.avi"(输入文件是和ffmpeg在同一目录下的1.avi文件,可以自己加路径,改名字)
 
-s (输出的分辨率,注意片源一定要是16:9的不然会变形)图片的长度和宽度,即图片的尺寸

-r 15 每秒显示的图片数 桢速率-bitexact 使用标准比特率,每秒显示的图片数。影响画面流畅度,与画面流畅度成正比:

帧率越大,画面越流畅;帧率越小,画面越有跳动感。

帧率X分辨率=压缩前的每秒数据量(单位应该是若干个字节)
在码率一定的情况下,分辨率与清晰度成反比关系:分辨率越高,图像越不清晰,分辨率越低,图像越清晰。
 在分辨率一定的情况下,码率与清晰度成正比关系,码率越高,图像越清晰;码率越低,图像越不清晰

-b 1500(视频数据流量,用-b xxxx的指令则使用固定码率,数字随便改,1500以上没效果;还可以用动态码率如:-qscale

4和-qscale 6,4的质量比6高) :把每秒显示的图片进行压缩后的数据量

压缩比=压缩前的每秒数据量/码率  对于同一个视频源并采用同一种视频编码算法,则:压缩比越高,画面质量越差、

分辨率x帧率=码率x压缩比  事实情况却不是这么简单。可以这么说:   在码率一定的情况下,分辨率在一定范围内取值都

将是清晰的;同样地,在分辨率一定的情况下,码率在一定范围内取值都将是清晰的。

-acodec aac(音频编码用AAC)
-ar 24000(声音的采样频率,好像PSP只能支持24000Hz)
-ab 128 ( 音频数据流量,音频码率一般选择32、64、96、128)
-ac 2 (声道数1或2)
-av device 设置音频设备比如/dev/dsp
-vd device 设置视频捕获设备。比如/dev/video0
-vc channel 设置视频捕获通道DV1394专用
-f psp (输出psp专用格式)

4,格式转换支持
  ./ffmpeg –i test.avi –r 25 –s 720x400 test.mpg 将avi格式转换为mpg  转化后的格式分辨率为720x400,设置帧频

为25。
    同时还可以在转换格式时进行强制的音视频转换,如–vcodec + 格式,将会强制将视频按指定格式编码,-acodec +格

式,将会强制按指定格式编码音频信息。在转换中有很多其他参数可以指定,如码率、分辨率、帧率等。
    如何在转换视频的时候将音频合成到视频中,且覆盖其原来的音频:
    方法一:需要两条命令实现,先在命令行中输入: ./ffmpeg –i test.avi -an –r 25 test.mpg <回车> 此时将生成

一个没有声音的test.mpg视频,再在命令行中输入: ./ffmpeg –i test.mpg –i test.mp3 –r 25 test1.mpg<回车> 此时

将会生成一个名为test1.mpg的视频。该视频播放时视频为test.avi的视频,但音频变为了test.mp3的音频了。
 
方法二:只要一条指令即可实现。在命令行中输入: ./ffmpeg –i test.avi –i test.mp3 –vcodec copy –acodec copy

–r 25 test2.mpg<回车> 此时将会生成一个名为test2.mpg的视频,播放时其视频为test.avi的视频,音频为test.mp3。–

vcodec copy为force video codec(‘copy’ to copy stream)。有一点需要注意,文件命名不能有空格,否则会导致编译时

不能通过。另外,-an为不能使音频记录。
  截取一张300x200尺寸大小的格式为jpg的一张图片: ./ffmpeg –i test.avi –y –f image2 –t 0.001 –s 300x200

test.jpg 要截取指定时间的图片,如5秒之后的: ./ffmpeg –i test.avi –y –f image2 –ss 5 –t 0.001 –s

300x200 test.jpg 其中,-ss后的单位为秒,也可写成:-ss 00:00:05。
把视频的前30帧转换为一个动态的gif图。需要说明的是,转换成功之后,如果用ffplay播放是看不出效果的,建议换成其他

图片播放器播放。其转换命令为: ./ffmpeg –i test.avi –vframes 30 –pix_fmt rgb24–y –f gif test.gif 也可以

从视频中的第10秒开始截取后面的5秒内容转换为一个无限重播的动态gif图。其命令为: ./ffmpeg –i test.avi –

pix_fmt rgb24 –ss 10 –t 5 –y –f gif test.gif 上面两种动态gif都是只播一次,想让其一直播,可再加一个参

数:-loop_output 0

屏幕录制其命令为: ./ffmpeg -f x11grab -r 25 -s wxga -i :0.0 /tmp/outputFile.mpg 其他相关参数可自行添加。需要

说明的是,各个版本的ffmpeg对屏幕录制的命令不一。如果你只想录制一个应用程序窗口或者桌面上的一个固定区域,那么

可以指定偏移位置和区域大小。使用xwininfo -frame命令可以完成查找上述参数。 注:ffmpeg的屏幕录制功能只能在Linux

环境下有效。并且在配置时需要添加 –enable-x11grub 指令,默认关闭。

把摄像头的实时视频录制下来,存储为文件./ffmpeg -f video4linux -s 320x240 -r 10 -i /dev/video0 test.asf 录音,

其命令为: ./ffmpeg –i /dev/dsp -f oss test.mp3

5,使用ffserver 负责响应客户端的流媒体请求,把流媒体数据发送给客户端。ffmpeg,负责媒体文件的transcode工作,把你服务器上的源媒体文件转换成要发送出去的流媒体文件。
修改ffserver配置信息
 
ffserver配置文件为: /etc/ffserver.conf
启动FFserver
 
在终端中运行: sudo ffserver -f /etc/ffserver.conf 在这个文件中主要是对网络协议,缓存文件feed1.ffm(见下述)和要发送的流媒体文件的格式参数做具体的设定。

启动ffmpeg 本例中,以ffmpeg作为实时摄像头采集输入.
 
在命令行中输入: ./ffmpeg -f video4linux2 -r 25 -i /dev/video0 /tmp/feed1.ffm
feed1.ffm,可以看成是一个流媒体数据的缓存文件,ffmpeg把转码好的数据发送给ffserver,如果没有客户端连接请求,ffserver把数据缓存到该文件中。
 
如果有音频设备,则采集音频的命令如下: ./ffmpeg -f oss -i /dev/dsp -f video4linux2 -r 25 -i /dev/video0

/tmp/feed1.ffm (音频格式参数自己配置)
播放流媒体在浏览器中输入
 
http://127.0.0.1:8090/test1.mpg 即可播放音乐.
 
在终端中输入ffplay http://localhost:8090/test.swf 可播放流媒体.