一、安装

打开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测试一下:

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

注:新版本安装方式,可以参考Windows下载FFmpeg最新版

二、常用命令

主要参数:

-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学习资料https://docs.qq.com/doc/DWHhNTlVtaFJId0ht
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(音视频技术学习交流群788280672

  • -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 将输入的1920x1080缩小到960x540输出:

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

8.2 为视频添加logo

比如,我有这么一个图片

想要贴到一个视频上,那可以用如下命令:
./ffmpeg -i input.mp4 -i iQIYI_logo.png -filter_complex overlay output.mp4
结果如下所示:

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 1440x1440 -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解决了问题

13.dshow

参考FFMPEG学习(一)---【命令行】采集视频和音频
Windows DirectShow输入设备,用于采集windows下的视频和音频设备。
通过命令 ffmpeg -list_devices true -f dshow -i dummy 查看支持的设备列表,包含设备名称,设备类型等信息。
得到如下结果

[dshow @ 0000022890f18f40] DirectShow video devices (some may be both video and audio devices)
[dshow @ 0000022890f18f40]  "HP TrueVision HD Camera"
[dshow @ 0000022890f18f40]     Alternative name "@device_pnp_\\?
\usb#vid_0408&pid_5365&mi_00#6&193fc2d2&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
[dshow @ 0000022890f18f40] DirectShow audio devices
[dshow @ 0000022890f18f40]  "麦克风阵列 (英特尔® 智音技术)"
[dshow @ 0000022890f18f40]     Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-
00A0C911CE86}\wave_{1F376599-992B-457F-A4B1-45C06BD5C148}"
dummy: Immediate exit requested

使用以下命令录制视频或音频,按Q可以停止。

ffmpeg -f dshow -i video="HP TrueVision HD Camera" -vcodec libx264 001.mp4
ffmpeg -f dshow -i audio="麦克风阵列 (英特尔® 智音技术)"  -ar 16000 -ac 1 lib.wav

音视频联合录制

ffmpeg -f dshow -i video="HP TrueVision HD Camera":audio="麦克风阵列 (英特尔® 智音技术)"
-s 640x360 -b:v 1000k -b:a 128k output.mkv

音视频推流

ffmpeg -f dshow -i video="HP TrueVision HD Camera":audio="麦克风阵列 (英特尔® 智音技术)"
-vcodec libx264 -r 25 -preset:v ultrafast -tune:v zerolatency -f rtsp rtsp://127.0.0.1/test

14.FFmpeg使用gdigrab采集窗口
FFmpeg采集设备(3)

三、小丸工具箱

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

主要功能:

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

参考自小丸FAQ:小丸工具箱是一个x264(taro编译版,现在是7mod)、MP4Box、ffmpeg、MediaInfo等软件的GUI。工具箱只是一个调用其他程序的程序,自己没有压制功能!只是把平常需要命令行完成的工作图形化了!其实一切转换软件都是这个意思。

四、fluent-ffmpeg

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

    npm install --save fluent-ffmpeg//使用js编码的用户,可以忽略下条命令npm install --save @types/fluent-ffmpeg 

五、使用ffmpeg推RTMP直播流

1.安装nignx环境
参考windows使用nginx配置rtmp,hls,httpflv

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进行播放了

六、FFMPEG使用参数详解

-g gop_size 设置图像组大小 这里设置GOP大小,也表示两个I帧之间的间隔

音视频开发系列(10)ffmpeg基础使用相关推荐

  1. 音视频开发系列(5):opencv基础

    由于本项目需要用到opencv开源库,需要用到opencv来打开摄像头和利用opencv来对图像进行处理,首先介绍一下如何在vs中搭建opencv的环境,首先分享一下opencv的库文件. 链接:ht ...

  2. 【音视频开发系列】一学就会,快速掌握音视频开发的第一个开源项目FFmpeg

    快速掌握音视频开发的第一个开源项目:FFmpeg 1.为什么要学FFmpeg 2.FFmpeg面向对象思想分析 3.FFmpeg各种组件剖析 视频讲解如下,点击观看: [音视频开发系列]一学就会,快速 ...

  3. 【音视频开发系列】盘点音视频直播RTSP/RTMP推流一定会遇到的各种坑,教你快速解决

    聊聊RTSP/RTMP推流那些坑 1.推流架构分析 2.推流缓存队列的设计 3.FFmpeg函数阻塞问题分析 [音视频开发系列]盘点音视频直播一定会遇到的各种坑,教你快速解决 更多精彩内容包括:C/C ...

  4. 【音视频开发系列】srs-webrtc-janus开源流媒体服务器分析

    全球最牛开源流媒体服务器源码分析 1.如何学习流媒体服务器 2.全球最牛流媒体服务器架构分析 3.我们能从全球最牛流媒体服务器得到什么 [音视频开发系列]srs-webrtc-janus流媒体服务器分 ...

  5. 音视频开发6. 搭建 ffmpeg Linux远程开发环境

    音视频开发6. 搭建 ffmpeg Linux远程开发环境 一.准备环境 二.操作步骤 1. 在CentOS 编译安装 ffmpeg 2. 编译安装ffmpeg后的环境 3. 本地在vscode安装 ...

  6. 音视频开发系列(65)-FFMPEG进阶系列01-ffplay命令详解

    概述 ffplay是一个基于FFMPEG库和SDL库开发的多媒体播放器.它的主要目的是是用来测试FFMPEG的各种API,比如codec/format/filter等等库. 掌握ffplay的设计逻辑 ...

  7. 音视频开发系列(62)基于FFmpeg实现简单的视频解码器

    一.FFmpeg解码过程流程图和关键的数据结构 FFmpeg解码涉及的知识点比较多,很容易被函数和结构体搞定不知所错,我们先从整体上对解码流程有个认知,画了张解码流程图,如下 1.1 解码流程如下 a ...

  8. 音视频开发系列-H264编码原理

    H264简介 来自百度百科的介绍: H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式. H.264是ITU-T以H.26x系列为名称命名的 ...

  9. 音视频开发系列(16)技术解码 | SRT和RIST协议综述

    概要 近些年来,互联网行业出现了几波和音视频相关的热潮:VR.短视频.直播等.除了VR因技术成熟度问题,还在蓄势待发,短视频和直播持续热度不减,以各种方式进入新的行业应用领域.视频直播方向,RTMP仍 ...

  10. 音视频开发系列--H264编解码总结

    一.概述 H264,通常也被称之为H264/AVC(或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC) 对摄像头采集的每一帧视频需要进行编码,由于视频中存在空间和时间的冗余,需要 ...

最新文章

  1. Android被逼学习小例子1
  2. VS 2008 .NET Framework 3.5 Training Kit
  3. SAP C4C里前台Opportunity搜索的响应明细
  4. Shell编程入门(第二版)(中)
  5. 父组件访问子组件中的数据(父子组件通信案例:父组件访问子组件$refs[‘子组件‘],子组件传递数据给父组件(父组件中使用v-model))
  6. 文字滚动的另一方法 拆分文字来做到文字滚动
  7. mysql操作SQL语句
  8. 关于口令强度等级的设计
  9. 5. laravel 路由(2)
  10. 软件测试 | App测试——Appium实战总结,淘宝App测试项目案例
  11. cad打印去掉边框_CAD打印的时候如何去掉打印线框?
  12. Speex手册----Speex 简介
  13. 华为H3CNE认证题库、教材-热门下载帖汇总!
  14. [Vmware]VCSA部署及遇到的问题
  15. 请为横线处选择合适的程序使得程序的运行结果是123 ( )
  16. narwal机器人_中国黑科技扫地机器人云鲸NARWAL将强势回归国内市场
  17. SPL工业智能:发现时序数据的异常
  18. Dharma家族变体,.adobe后缀勒索病毒解密
  19. 爱快ikuai软路由远程维护用户名
  20. 在idea2021中遇到element tx:attributes is not allowed here的问题

热门文章

  1. 如何通过omnipeek抓取sniffer log
  2. 黄色——网页效果图设计之色彩索引
  3. wxPython控件大全
  4. 《圈外课程学习记录》3.2 数据化强力说服
  5. DIV+CSS布局心得
  6. Java Web高级面试题(二)
  7. 用matlab绘制抛物线y的x平方,利用matlab绘制多重x/y曲线
  8. 本地Git分支出问题,无法找到远程对应分支(fatal: ‘anne-new-dev-3.4.2‘ does not appear to be a git repositoryfatal: Cou)
  9. ** ERROR (nifti_image_write_hdr_img2): cannot open output file
  10. QQ将在下一版本允许注销账号 预计下周发布