一、简述

ffmpeg是一个非常强大的工具,它可以转换任何格式的媒体文件,并且还可以用自己的AudioFilter以及VideoFilter进行处理和编辑。有了它,我们就可以对媒体文件做很多我们想做的事情了。

二、命令行参数

1. 通用参数

-f fmt : 指定格式
-i filename:指定输入文件名
-y:覆盖已有文件
-t duration:指定时长
-fs limit_size:设置文件大小的上限
-ss time_off: 从指定的时间开始
-re:代表按照时间戳读取或发送数据,尤其在作为推流工具的时候一定要加上该参数,否则ffpmeg会按照最高速率向流媒体不停的发送数据。
-map:指定输出文件的流映射关系。例如:“-map 1:0 -map 1:1”要求按照第二个输入的文件的第一个流和第二个流写入输出文件。如果没有设置此项,则ffpmeg采用默认的映射关系。

2. 视频参数

-b:指定比特率(bit/s),ffmpeg默认采用的是VBR的,若指定的该参数,则使用平均比特率。
-bitexact:使用标准比特率。
-vb:指定视频比特率(bit/s)
-r rate:帧速率(fps)
-s size:指定分辨率(320x240)
-aspect aspect:设置视频长宽比(4:3、16:9或1.33333、1.77777)
-croptop size:设置顶部切除尺寸(in pixels)
-cropleft size:设置左切除尺寸(in pixels)
-cropbottom size:设置地步切除尺寸(in pixels)
-cropright size:设置右切除尺寸(in pixels)
-padtop size:设置顶部补齐尺寸(in pixels)
-padleft size:设置左补齐尺寸(in pixels)
-padbottom size:设置地步补齐尺寸(in pixels)
-padright size:设置右补齐尺寸(in pixels)
-padcolor color:设置补齐颜色
-vn:取消视频的输出
-vcodec codec:强制使用codec编码方式

3. 音频参数

-ab:设置比特率(bit/s),对于MP3的格式,想要听到较高品质的声音,建议设置160Kbit/s(单声道80Kbit/s)以上。
-aq quality:设置音频质量
-ar ratre:设置音频采样率(Hz)
-ac channels:设置声道数,1就是单声道,2就是立体声
-an:取消音频输出
-acodec codec:强制使用codec编码方式
-vol volume:设置录制音量大小

以上就是在日常开发中经常用到的音视频参数及通用参数。下面会针对常见的开发场景进行实践和说明。

三、实践学习

1. 列出ffmpeg支持的所有格式

相关命令:

ffmpeg -formats

2. 剪切一段媒体文件,可以是音频或者视频文件

相关命令:

ffmpeg -i test.mp4 -ss 00:00:50.0 -codec copy -t 20 output.mp4

命令说明:

表示将文件test.mp4从第50s开始剪切20s的时间,输出到output.mp4中,其中-ss指定偏移时间(time Offset),-t指定的时长(duration)。

但是直接这样执行命令,固然我们能截取出来音视频的文件,但是当我们播放的时候,我们会发现虽然ffmepg剪切视频,很方便,但是也有很大缺陷:

(1). 剪切时间点不精确

(2). 有时剪切的视频开头有黑屏

造成这些问题的原因是ffmpeg无法seek到非关键帧上。

命令层面定位的话就是如果把-ss, -t参数放在-i参数之后,是对输出文件执行的seek操作

输入文件会逐帧解码,直到-ss设置的时间点为止,这么操作会很慢,虽然时间点是准确的,但是很容易出现黑屏问题。

所以:我们优化了一下上面的那个命令,让视频的剪切更加精确:

ffmpeg -ss 10 -t 15 -accurate_seek -i test.mp4 -codec copy output.mp4

注意:accurate_seek必须放在-i参数之前。

但是,可能又会有人发现,还是存在剪切不准确的现象,那是因为,上述命令只是进行了数据的转封装,会受到关键帧的影响,所以如果需要特别准确的剪切,只能使用ffmpeg进行重新编解码的操作了,命令行如下:

ffmpeg -i input.mp4 -ss 00:00:03.123 -t 10 -c:v libx264 -c:a aac out.mp4

此命令行相对上面的转封装的剪切来说,速度明显变慢,是因为对视频数据重新编解码了,但是精度相对转封装来说是大大提高了。

3. 提取视频文件中的音频数据,并保存为文件

相关命令:

ffmpeg -i test.mp4 -vn -acodec copy output.m4a

命令说明:

将文件test.mp4的视频流禁用掉(参数为:-vn,如果禁用音频流参数为-an,禁用字母流参数为-sn )。

然后将test.mp4中的音频流的数据封装到output.m4a文件中,音频流的编码格式不变。

4. 将视频中的音频静音,只保留视频

相关命令:

ffmpeg -i test.mp4 -an -vcodec copy output.mp4

命令说明:

将文件test.mp4的音频流禁用掉(参数为:-an )。

然后将test.mp4中的视频流的数据封装到output.mp4文件中,视频流的编码格式不变。

5. 从mp4文件中抽取视频流导出为裸H264数据:

相关命令:

ffmpeg -i test.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb output.h264

命令说明:

在指令中,我们舍弃了音频数据(-an),视频数据使用mp4toannexb这个bitstreasm filter来转换为原始的H264数据。(注:同一编码也会有不同的封装格式)。

验证播放:

可以使用ffplay命令进行尝试播放,如果能播放成功,则说明生效。

6. 将视频推送到流媒体服务器上:

ffmpeg -re -i test.mp4 -acodec copy -vcodec copy -f flv rtmp://127.0.0.1/rh/mylive

命令说明:

将mp4文件的音视频数据的编码格式不变,按照rtmp的方式,将视频推送到流媒体服务器上。

7. 将流媒体服务器上的流dump到本地:

ffmpeg -i rtmp://127.0.0.1/rh/mylive -acodec copy -vcodec copy -f flv test.flv

命令说明:

将流媒体服务器的数据,不进行转码,通过转封装的方式保存到本地。

8. 给视频添加水印

ffmpeg -i test.mp4 -i xxx.png -filter_complex "overlay=5:5" out.mp4

命令说明:

使用ffmpeg滤镜功能,将对mp4添加水印。

9. 倒放音视频

// 1.视频倒放,无音频
ffmpeg.exe -i inputfile.mp4 -filter_complex [0:v]reverse[v] -map [v] -preset superfast reversed.mp4
// 2.视频倒放,音频不变
ffmpeg.exe -i inputfile.mp4 -vf reverse reversed.mp4
// 3.音频倒放,视频不变
ffmpeg.exe -i inputfile.mp4 -map 0 -c:v copy -af "areverse" reversed_audio.mp4
// 4.音视频同时倒放
ffmpeg.exe -i inputfile.mp4 -vf reverse -af areverse -preset superfast reversed.mp4

10. 将几个MP4视频文件合并为1个视频.

实现思路:

1.先将MP4文件转化为同样编码形式的ts流(ts流支持concate)

2.第二步,连接(concate)ts流

3.最后,把连接好的ts流转化为MP4.

// 转换为ts流ffmpeg -i 0.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 0.ts
ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i 3.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 3.ts
ffmpeg -i 4.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 4.ts
ffmpeg -i 5.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 5.ts
// 合并ts流为mp4
ffmpeg -i "concat:0.ts|1.ts|2.ts|3.ts|4.ts|5.ts" -acodec copy -vcodec copy -absf aac_adtstoasc FileName.mp4

直接将两个视频合并成一个视频

ffmpeg -i '11.mp4' -i 22.mp4 -filter_complex  "[0:v] [0:a] [1:v] [1:a]concat=n=2:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" output.mp4

FFmpeg命令行之ffmpeg的更多相关文章

  1. FFMPEG 命令行工具- ffmpeg

    ffmpeg 简介 ffmpeg 用于转码的应用程序,命令格式: ffmpeg [options] [[infile options] -i infile]... {[outfile options] ...

  2. FFmpeg 命令行

    FFmpeg命令行帮助 #>ffmpeg -h #>ffmpeg -h long #>ffmpeg -h full 将视频按照指定的宽高输出 #>ffmpeg -i input ...

  3. 【Andorid】短视频拍摄SDK——Vitamio Recorder 2.0 发布(支持ffmpeg命令行)

    简介 VCamera SDK Android 版(短视频拍摄SDK)是炫一下(北京)科技有限公司推出的软件开发工具包,为Android开发者提供简单.快捷的接口,帮助开发者实现Android平台上的短 ...

  4. FFmpeg命令行工具学习(一):查看媒体文件头信息工具ffprobe

    一.简述 ffprobe是ffmpeg命令行工具中相对简单的,此命令是用来查看媒体文件格式的工具. 二.命令格式 在命令行中输入如下格式的命令: ffprobe [文件名] 三.使用ffprobe查看 ...

  5. FFmpeg命令行工具学习(四):FFmpeg 采集设备

    在使用 FFmpeg 作为编码器时,可以使用FFmpeg采集本地的音视频采集设备的数据,然后进行编码.封装.传输等操作. 例如,我们可以采集摄像头的图像作为视频,采集麦克风的数据作为音频,然后对采集的 ...

  6. FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑

    FFmpeg_Tutorial FFmpeg工具和sdk库的使用demo 一.使用FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑 1.基本介绍 对于每一个从事音视频技术开发的工程师,想必没 ...

  7. FFmpeg命令行map参数选择音视频流

    FFmpeg命令行map参数选择音视频流 介绍 -map参数告诉ffmpeg要从输入源中选择/拷贝哪个stream流到输出,可以从输入源中选择多个音视频流作为输出. 不加-map参数,ffmpeg默认 ...

  8. FFmpeg命令行工具学习(三):媒体文件转换工具ffmpeg

    一.简述 ffmpeg是一个非常强大的工具,它可以转换任何格式的媒体文件,并且还可以用自己的AudioFilter以及VideoFilter进行处理和编辑.有了它,我们就可以对媒体文件做很多我们想做的 ...

  9. FFmpeg命令行工具学习(二):播放媒体文件的工具ffplay

    一.简述 ffplay是以FFmpeg框架为基础,外加渲染音视频的库libSDL构建的媒体文件播放器. 在使用ffplay之前必须要安装到系统中,MAC的安装教程为:http://www.cnblog ...

  10. 使用FFMpeg命令行录屏推rtmp流

    最近在做局域网内屏幕分享方面的东西,要把录制一台设备的屏幕然后实时推送给内网的一个或多个用户. 做了很多实验,效果还没有达到要求,这里分享一下推rtmp流的实验. 实验使用到的各种工具:FFmpeg. ...

随机推荐

  1. P3509 [POI2010] ZAB-Frog 题解

    题目链接:ZAB-Frog 基于一个根据距离第 \(k\) 大的事实: 容易知道,对于红色的点而言,与它相近最近的 \(k\) 个点是连续的.而第 \(k\) 远的要么是最左侧要么是最右侧.而我们注意 ...

  2. Delphi库单元结构

    单元(unit)是组成Pascal 程序的单独的源代码模块,单元由函数和过程组成,这些函数和过程能被主程序调用. 一个标准的单元文件格式如下: unit Unit1: //单元头 interface ...

  3. Excel-批量填充数字

    1.一般情况下,都是使用鼠标左右键拖动来实现数据的填充的 2.但是填充1200列,下拉拖动就非常麻烦,可以首先定位到A200. 在屏幕左侧中央处找到剪切板下方的"A1"字样,鼠标单 ...

  4. NC24858 [USACO 2009 Nov S]Job Hunt

    题目链接 题目 题目描述 Bessie is running out of money and is searching for jobs. Farmer John knows this and wa ...

  5. Ubuntu18.04 Server部署Flannel网络的Kubernetes

    准备服务器 ESXi6.5安装Ubuntu18.04 Server, 使用三台主机, 计划使用hostname为 kube01, kube02, kube03, 配置为2核4G/160G, K8s要求 ...

  6. 利用LiveReload插件实现vscode和谷歌浏览器实时刷新

    说明 最近在研究CSS希望可以提升一个层次.在写DEMO练习的时候老是需要去谷歌浏览器手动刷新页面才能看到更改后的效果次数多了 我也受不了,这不我又请来了个帮手: LiveReload,名如其人,这家 ...

  7. P1536 村村通(并查集)

    村村通 题目描述 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府 "村村通工程" 的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接 ...

  8. 理解[].forEach.call()并说明为什么要使用[].forEach.call()

    [].forEach.call(elems, callback) 相当于: Array.prototype.forEach.call(elems, callback) 又相当于: function(e ...

  9. day07---系统命令

    课程知识概述--系统命令 seq cat less more head tail grep tr alias 复习 1.echo -e 激活特殊的意义 \n 表示回车 \t tab键 [root@ol ...

  10. 【LeetCode栈与队列#01】队列的基本操作:用栈模拟队列和用队列模拟栈

    用栈实现队列 力扣题目链接(opens new window) 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部. pop() -- 从队列首部移除元素. peek() -- ...