FFmpeg – 多媒体处理工具使用教程-梦想未来
智启佳工作室
做你喜爱的网站

FFmpeg – 多媒体处理工具使用教程

一、装置

翻开https://ffmpeg.zeranoe.com/builds/,该网站中的FFMPEG分为3个版别:Static,Shared,Dev。

前两个版别能够直接在指令行中运用,他们的差异在于:Static里边只要3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe,每个exe的体积都很大,相关的Dll现已被编译到exe里边去了。Shared里边除了3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe之外,还有一些Dll,比方说avcodec-54.dll之类的。Shared里边的exe体积很小,他们在运转的时分,到相应的Dll中调用功用。Dev版别是用于开发的,里边包含了库文件xxx.lib以及头文件xxx.h,这个版别不包含exe文件。

这儿下载了static版别,是个zip紧缩文件,解压到指定目录,去配置环境变量,比方e:\ffmpeg20180919\bin,这样bin下面的ffmpeg.exe就能够在指令行中运用了,能够用ffmpeg -version测试一下:

image.png
放一个mp4视频,然后把声响提取到output.acc,用指令测试一下:ffmpeg -i mov_bbb.mp4 -acodec copy -vn output.aac

二、常用指令

主要参数:

-i 设定输入流 
-f 设定输出格局 
-ss 开端时刻 

视频参数:

-b 设定视频流量(码率),默以为200Kbit/s 
-r 设定帧速率,默以为25 
-s 设定画面的宽与高 
-aspect 设定画面的比例 
-vn 不处理视频 
-vcodec 设定视频编解码器,未设守时则运用与输入流相同的编解码器 

音频参数:

-ar 设定采样率 
-ac 设定声响的Channel数 
-acodec 设定声响编解码器,未设守时则运用与输入流相同的编解码器 
-an 不处理音频 
1. 视频格局转化

(其实格局转化说法不太精确,但我们都这么叫,精确的说,应该是视频容器转化)
比方一个avi文件,想转为mp4,或许一个mp4想转为ts。
ffmpeg -i input.avi output.mp4
ffmpeg -i input.mp4 output.ts
插个号外:某天我在知乎上看到一段视频,想转给微信老友看,怎样操作呢。这儿参阅怎样全自动下载知乎上的视频到本地(留意不要滥用),先翻开要观看的视频页面,再F12清空,然后开端播映视频,就能看到类似https://vdn.vzuu.com/SD/49c84c7c-c61a-11e8-8bad-0242ac112a0a.mp4?auth_key=1539832492-0-0-c61c22f39c&expiration=1539832492&disable_local_cache=1这样的字符串,然后用ffmpeg -i “https://vdn.vzuu.com/SD/49c8…” output.mp4即可下载。弄到电脑上,用电脑QQ发送到手机QQ上,在手机QQ上点击挑选保存到手机上。然后在微信里选相片就能看到这个视频了(留意视频文件不要超过20M,另外最开端用的不是电脑QQ,而是百度网盘,发现不可……)。

2. 提取音频

比方我有一个“晓松奇谈”,但是我不想看到他的脸,我只想听声响, 地铁上能够听,咋办?
ffmpeg -i 晓松奇谈.mp4 -acodec copy -vn output.aac
上面的指令,默认mp4的audio codec是aac,假如不是会犯错,咱能够暴力一点,不管什么音频,都转为最常见的aac。
ffmpeg -i 晓松奇谈.mp4 -acodec aac -vn output.aac

(-vn 不处理视频 )

3. 提取视频

我目测有些IT员工,特别是做嵌入式的,比方机顶盒,想debug一下,没有音频的情况下,播映一个视频几天几夜会不会crash,这时分你需求一个纯视频文件,能够这么干。
ffmpeg -i input.mp4 -vcodec copy -an output.mp4

-an 不处理音频

4. 视频剪切

经常要测试视频,但是只需求测几秒钟,但是视频却有几个G,咋办?切啊!
下面的指令,就能够从时刻为00:00:15开端,截取5秒钟的视频。
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
-ss表明开端切开的时刻,-t表明要切多少。上面便是从开端,切5秒钟出来。

摘自运用 MediaSource 搭建流式播映器

留意一个问题,ffmpeg 在切开视频的时分无法做到时刻绝对精确,由于视频编码中关键帧(I帧)和跟从它的B帧、P帧是无法分割开的,否则就需求进行从头帧内编码,会让视频体积增大。所以,假如切开的方位刚好在两个关键帧中心,那么 ffmpeg 会向前/向后切开,所以最终切开出的 chunk 长度总是会大于等于应有的长度。

5. 码率操控

码率操控关于在线视频比较重要。由于在线视频需求考虑其能提供的带宽。

那么,什么是码率?很简略:bitrate = file size / duration

比方一个文件20.8M,时长1分钟,那么,码率便是:
biterate = 20.8M bit/60s = 20.8*1024*1024*8 bit/60s= 2831Kbps
一般音频的码率只要固定几种,比方是128Kbps, 那么,video的便是
video biterate = 2831Kbps -128Kbps = 2703Kbps。

说完背景了。好了,来说ffmpeg怎样操控码率。 ffmpg操控码率有3种挑选,-minrate -b:v -maxrate

  • -b:v主要是操控平均码率。 比方一个视频源的码率太高了,有10Mbps,文件太大,想把文件弄小一点,但是又不破坏分辨率。ffmpeg -i input.mp4 -b:v 2000k output.mp4上面把码率从原码率转成2Mbps码率,这样其实也直接让文件变小了。目测接近一半。
  • 不过,ffmpeg官方wiki比较建议,设置b:v时,一起加上 -bufsize
    -bufsize 用于设置码率操控缓冲器的巨细,设置的优点是,让整体的码率更趋近于期望的值,减少动摇。(简略来说,比方1 2的平均值是1.5, 1.49 1.51 也是1.5, 当然是第二种比较好)ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4
  • -minrate -maxrate就简略了,在线视频有时分,期望码率动摇,不要超过一个阈值,能够设置maxrate。
    ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4
6. 视频编码格局转化

比方一个视频的编码是MPEG4,想用H264编码,咋办?
ffmpeg -i input.mp4 -vcodec h264 output.mp4
相反也一样
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4

当然了,假如ffmpeg当时编译时,增加了外部的x265或许X264,那也能够用外部的编码器来编码。(不知道什么是X265,能够Google一下,简略的说,便是她不包含在ffmpeg的源码里,是独立的一个开源代码,用于编码HEVC,ffmpeg编码时能够调用它。当然了,ffmpeg自己也有编码器)
ffmpeg -i input.mp4 -c:v libx265 output.mp4
ffmpeg -i input.mp4 -c:v libx264 output.mp4

7. 只提取视频ES数据

这个可能做开发的人会用到,趁便提一下吧。
ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264

8. 过滤器的运用

这个我在另一篇博客提到了,具体参阅ffmpeg filter过滤器 基础实例及全面解析

8.1 将输入的1920×1080缩小到960×540输出:

ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
//ps: 假如540不写,写成-1,即scale=960:-1, 那也是能够的,ffmpeg会告诉缩放滤镜在输出时保持原始的宽高比。

8.2 为视频增加logo

比方,我有这么一个图片

image.png
想要贴到一个视频上,那能够用如下指令:
./ffmpeg -i input.mp4 -i iQIYI_logo.png -filter_complex overlay output.mp4
成果如下所示:

image.png

9. 抓取视频的一些帧,存为jpeg图片

比方,一个视频,我想提取一些帧,存为图片,咋办?
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg

-r 表明每一秒几帧
-q:v表明存储jpeg的图像质量,一般2是高质量。

如此,ffmpeg会把input.mp4,每隔一秒,存一张图片下来。假设有60s,那会有60张。60张?什么?这么多?不要不要。。。。。不要咋办?? 能够设置开端的时刻,和你想要截取的时刻呀。
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg

-ss 表明开端时刻
-t表明共要多少时刻。

如此,ffmpeg会从input.mp4的第20s时刻开端,往下10s,即20~30s这10秒钟之间,每隔1s就抓一帧,一共会抓10帧。

10.输出YUV420原始数据

关于一下做底层编解码的人来说,有时分常要提取视频的YUV原始数据。 怎样坐?很简答:ffmpeg -i input.mp4 output.yuv怎样样,是不是太简略啦?!!!哈哈(假如你想问yuv的数据,怎样播映,我不会告诉你,RawPlayer挺好用的!!)

那假如我只想要抽取某一帧YUV呢? 简略,你先用上面的方法,先抽出jpeg图片,然后把jpeg转为YUV。 比方: 你先抽取10帧图片。ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
成果:

-rw-rw-r-- 1 chenxf chenxf    296254  7月 20 16:08 pic-001.jpeg
-rw-rw-r-- 1 chenxf chenxf    300975  7月 20 16:08 pic-002.jpeg
-rw-rw-r-- 1 chenxf chenxf    310130  7月 20 16:08 pic-003.jpeg
-rw-rw-r-- 1 chenxf chenxf    268694  7月 20 16:08 pic-004.jpeg
-rw-rw-r-- 1 chenxf chenxf    301056  7月 20 16:08 pic-005.jpeg
-rw-rw-r-- 1 chenxf chenxf    293927  7月 20 16:08 pic-006.jpeg
-rw-rw-r-- 1 chenxf chenxf    340295  7月 20 16:08 pic-007.jpeg
-rw-rw-r-- 1 chenxf chenxf    430787  7月 20 16:08 pic-008.jpeg
-rw-rw-r-- 1 chenxf chenxf    404552  7月 20 16:08 pic-009.jpeg
-rw-rw-r-- 1 chenxf chenxf    412691  7月 20 16:08 pic-010.jpeg 

然后,你就随意挑一张,转为YUV:ffmpeg -i pic-001.jpeg -s 1440×1440 -pix_fmt yuv420p xxx3.yuv假如-s参数不写,则输出巨细与输入一样。当然了,YUV还有yuv422p啥的,你在-pix_fmt 换成yuv422p就行啦!

11.H264编码profile & level操控

举3个例子吧

ffmpeg -i input.mp4 -profile:v baseline -level 3.0 output.mp4
ffmpeg -i input.mp4 -profile:v main -level 4.2 output.mp4
ffmpeg -i input.mp4 -profile:v high -level 5.1 output.mp4 

假如ffmpeg编译时加了external的libx264,那就这么写:
ffmpeg -i input.mp4 -c:v libx264 -x264-params “profile=high:level=3.0” output.mp4
从紧缩比例来说,baseline< main < high,关于带宽比较限制的在线视频,可能会挑选high,但有些时分,做个小视频,期望所有的设备基本都能解码(有些低端设备或前期的设备只能解码baseline),那就献身文件巨细吧,用baseline。自己取舍吧!

12.旋转视频

在手机上录的视频,在电脑放,是颠倒的,需求旋转90度。运用格局工厂失败了……
参阅ffmpeg视频的翻转vflip、hflip,旋转rotate、transpose
运用ffmpeg -i 3.mp4 -vf rotate=PI/2 rotate8.mp4画面确实旋转过来了,但是尺寸不对,变成横屏后,两侧的画面看不到了。改用ffmpeg -i 3.mp4 -vf transpose=1 rotate8.mp4解决了问题

三、小丸工具箱

小丸工具箱是一款用于处理音视频等多媒体文件的软件。是一款x264、ffmpeg等指令行程序的图形界面。它的目标是让视频限制变得简略、轻松。

主要功用:

  • 高质量的H264+AAC视频限制
  • ASS/SRT字幕内嵌到视频
  • AAC/WAV/FLAC/ALAC音频转化
  • MP4/MKV/FLV的无损抽取和封装

参阅自小丸FAQ:小丸工具箱是一个x264(taro编译版,现在是7mod)、MP4Box、ffmpeg、MediaInfo等软件的GUI。工具箱仅仅一个调用其他程序的程序,自己没有限制功用!仅仅把往常需求指令行完成的工作图形化了!其实全部转化软件都是这个意思。

四、fluent-ffmpeg

参阅自
[FFmpeg探秘]Ep.(1) 什么是FFmpeg?
[FFmpeg探秘]Ep.(2) 从node-fluent-ffmpeg开端
NODEJS根据FFMPEG视频推流测试

该nodejs包封装了ffmpeg的指令行调用部分,加强了代码的可读性,若熟悉ffmpeg 指令行运用手册,亦可不运用该包。

npm install --save fluent-ffmpeg //运用js编码的用户,能够疏忽下条指令 npm install --save @types/fluent-ffmpeg 

image.png

五、运用ffmpeg推RTMP直播流

1.装置nignx环境
弄个WINDOWS版别的Nginx吧,参照Linux&Windows搭建根据nginx的视频点播服务器,运用了nginx-rtmp-win32做了本地点播测试。具体步骤参照原文,为了节约时刻,最好去CSDN下载作者那个DEMO

2.参阅手把手教你搭建Nginx-rtmp流媒体服务器+运用ffmpeg推流
在上述下载的demo中,看一下conf/nginx.conf配置文件:

rtmp { server { listen 1935; application live { live on; } application vod { play video; } application hls { live on; hls on; hls_path temp/hls; hls_fragment 8s; } } } 

其中rtmp便是rtmp服务器模块,端口是1935,application我理解为一个途径。能够经过访问rtmp://localhost/live来访问live这个资源。live on 表明这是实时的传输,这不同于点播,点播就比方我在某视频网站上想看一个视频,无论我什么时分去点击,它会从头开端播映。而实时传输(直播),便是比方看电视,我在19:20去翻开电视(翻开直播路),视频不会从头开端播映,而是从当时(19:20)的视频数据开端播映。

然后在nginx.exe途径下指令行运转nginx -s reload从头加载配置。

3.运用ffmpeg推流
参阅运用FFmpeg在B站直播的姿态
ffmpeg -re -i 1.mp4 -vcodec copy -f flv rtmp://localhost/live
或许

ffmpeg -re -i 1.mp4 -vcodec copy -acodec copy -b:v 800k -b:a 32k -f flv rtmp://localhost/live 

-re : 表明运用文件的原始帧率进行读取,由于ffmpeg读取视频帧的速度很快,假如不运用这个参数,ffmpeg能够在很短时刻就把video.mp4中的视频帧全部读取完并进行推流,这样就无法体现出视频播映的作用了。官方文档中对这个参数的解释是:

-re (input)
Read input at native frame rate. Mainly used to simulate a grab device, or live input stream (e.g. when reading from a file). Should not be used with actual grab devices or live input streams (where it can cause packet loss). By default ffmpeg attempts to read the input(s) as fast as possible. This option will slow down the reading of the input(s) to the native frame rate of the input(s). It is useful for real-time output (e.g. live streaming).

-vcodec copy : -vcodec表明运用的视频编解码器 ,前缀v表明video。后边紧跟的copy 表明仿制运用源文件的视频编解码器,比方原文件的编解码器(codec)是h264,则这儿就运用h264。

-acodec copy : -acodec表明运用的音频编解码器,前缀a表明audio。后边的copy 表明运用源文件的音频编解码器。

-b:v 800k : -b:v表明视频的比特率(bitrate) ,为800k。

-b:a 32k : 表明音频的比特率为32k。

-f flv : -f表明format ,便是强制输出格局为flv,这一步其实也叫封装(mux),封装要做的事便是把视频和音频混合在一起,进行同步。紧跟在后边的rtmp://localhost/live表明输出的”文件名”,这个文件名能够是一个本地的文件,也能够指定为rtmp流媒体地址。指定为rtmp流媒体地址后,则ffmpeg就能够进行推流。

4.能够运用VLC或ffplay进行播映了

赞(0) 打赏
未经允许不得转载:梦想未来 » FFmpeg – 多媒体处理工具使用教程
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

--