FFmpeg命令行工具学习(三):媒体文件转换工具ffmpeg
一、简述
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
输出结果:
File formats:
D. = Demuxing supported
.E = Muxing supported
--
D 3dostr 3DO STR
E 3g2 3GP2 (3GPP2 file format)
E 3gp 3GP (3GPP file format)
D 4xm 4X Technologies
E a64 a64 - video for Commodore
D aa Audible AA format files
D aac raw ADTS AAC (Advanced Audio Coding)
DE ac3 raw AC-
省略......
D xbin eXtended BINary text (XBIN)
D xmv Microsoft XMV
D xpm_pipe piped xpm sequence
D xvag Sony PS3 XVAG
D xwma Microsoft xWMA
D yop Psygnosis YOP
DE yuv4mpegpipe YUV4MPEG pipe
2. 剪切一段媒体文件,可以是音频或者视频文件
相关命令:
ffmpeg -i pm.mp4 -ss ::50.0 -codec copy -t output.mp4
命令说明:
表示将文件pm.mp4从第50s开始剪切20s的时间,输出到output.mp4中,其中-ss指定偏移时间(time Offset),-t指定的时长(duration)。
但是直接这样执行命令,固然我们能截取出来音视频的文件,但是当我们播放的时候,我们会发现虽然ffmepg剪切视频,很方便,但是也有很大缺陷:
(1). 剪切时间点不精确
(2). 有时剪切的视频开头有黑屏
造成这些问题的原因是ffmpeg无法seek到非关键帧上。
命令层面定位的话就是如果把-ss, -t参数放在-i参数之后,是对输出文件执行的seek操作
输入文件会逐帧解码,直到-ss设置的时间点为止,这么操作会很慢,虽然时间点是准确的,但是很容易出现黑屏问题。
所以:我们优化了一下上面的那个命令,让视频的剪切更加精确:
ffmpeg -ss -t -accurate_seek -i pm.mp4 -codec copy output.mp4
注意:accurate_seek必须放在-i参数之前。
但是,可能又会有人发现,还是存在剪切不准确的现象,那是因为,上述命令只是进行了数据的转封装,会受到关键帧的影响,所以如果需要特别准确的剪切,只能使用ffmpeg进行重新编解码的操作了,命令行如下:
ffmpeg -i input.mp4 -ss ::03.123 -t -c:v libx264 -c:a aac out.mp4
此命令行相对上面的转封装的剪切来说,速度明显变慢,是因为对视频数据重新编解码了,但是精度相对转封装来说是大大提高了。
3. 提取视频文件中的音频数据,并保存为文件
相关命令:
ffmpeg -i pm.mp4 -vn -acodec copy output.m4a
命令说明:
将文件pm.mp4的视频流禁用掉(参数为:-vn,如果禁用音频流参数为-an,禁用字母流参数为-sn )。
然后将pm.mp4中的音频流的数据封装到output.m4a文件中,音频流的编码格式不变。
4. 将视频中的音频静音,只保留视频
相关命令:
ffmpeg -i pm.mp4 -an -vcodec copy output.mp4
命令说明:
将文件pm.mp4的音频流禁用掉(参数为:-an )。
然后将pm.mp4中的视频流的数据封装到output.mp4文件中,视频流的编码格式不变。
5. 从mp4文件中抽取视频流导出为裸H264数据:
相关命令:
ffmpeg -i pm.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb output.h264
命令说明:
在指令中,我们舍弃了音频数据(-an),视频数据使用mp4toannexb这个bitstreasm filter来转换为原始的H264数据。(注:同一编码也会有不同的封装格式)。
验证播放:
可以使用ffplay命令进行尝试播放,如果能播放成功,则说明生效。
6. 将视频推送到流媒体服务器上:
ffmpeg -re -i pm.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 pm.mp4 -i xxx.png -filter_complex "overlay=5:5" out.mp4
命令说明:
使用ffmpeg滤镜功能,将对mp4添加水印。
9. 倒放音视频
// 1.视频倒放,无音频
ffmpeg.exe -i inputfile.mp4 -filter_complex [: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 -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 .mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb .ts
ffmpeg -i .mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb .ts
ffmpeg -i .mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb .ts
ffmpeg -i .mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb .ts
ffmpeg -i .mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb .ts
ffmpeg -i .mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb .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命令行工具学习(三):媒体文件转换工具ffmpeg的更多相关文章
- FFmpeg命令行工具学习(一):查看媒体文件头信息工具ffprobe
一.简述 ffprobe是ffmpeg命令行工具中相对简单的,此命令是用来查看媒体文件格式的工具. 二.命令格式 在命令行中输入如下格式的命令: ffprobe [文件名] 三.使用ffprobe查看 ...
- FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑
FFmpeg_Tutorial FFmpeg工具和sdk库的使用demo 一.使用FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑 1.基本介绍 对于每一个从事音视频技术开发的工程师,想必没 ...
- FFmpeg命令行工具学习(四):FFmpeg 采集设备
在使用 FFmpeg 作为编码器时,可以使用FFmpeg采集本地的音视频采集设备的数据,然后进行编码.封装.传输等操作. 例如,我们可以采集摄像头的图像作为视频,采集麦克风的数据作为音频,然后对采集的 ...
- Mac OS环境下媒体文件分割工具mediafilesegmenter的简单使用(生成M3U8 TS文件)
mediafilesegmenter是苹果开发的一款用于分割媒体文件的工具,其功能与mediastreamsegmenter相似,但操作更简单. * 具体可以对比博客中的另一篇简介<Mac OS ...
- FFmpeg命令行map参数选择音视频流
FFmpeg命令行map参数选择音视频流 介绍 -map参数告诉ffmpeg要从输入源中选择/拷贝哪个stream流到输出,可以从输入源中选择多个音视频流作为输出. 不加-map参数,ffmpeg默认 ...
- java命令行导出、导入sql文件
@IocBean public class SqlCommandModel{ //用户名 @Inject("java:$conf.get('jdbc.username')") pr ...
- ResHacker 用命令行方式修改 windows PE文件版本号
由于工作需要在詹金斯(genkins)集成环境打包,打包避免不了需要修改版本号,写入版本号最简单的方式通过修改windows rc文件 这就意味着,每次构建新版本前需要修改一次源文件 这个在用詹金斯集 ...
- 【Andorid】短视频拍摄SDK——Vitamio Recorder 2.0 发布(支持ffmpeg命令行)
简介 VCamera SDK Android 版(短视频拍摄SDK)是炫一下(北京)科技有限公司推出的软件开发工具包,为Android开发者提供简单.快捷的接口,帮助开发者实现Android平台上的短 ...
- 如何使用命令行编译和运行java文件
相信大家现在一般都在使用IDE环境来开发运行java文件,但我觉得可以在命令行里面简单运行java文件,技多不压身. 接下来我来说一下编译和运行java文件: 第一步,首先下一个入门程序(注意:一定要 ...
随机推荐
- javaweb c3p0连接oracle12c
最近在搞javaweb,在连接池上碰到了一系列的问题,在Junit测试时,oracle12c报错: ORA-28040: 没有匹配的验证协议 百度解决:修改 $ORACLE_HOME/network/ ...
- selenium截图
文件结构 1.DateUtil.py # cncoding = utf-8 import time from datetime import datetime ''' 本文件主要用于获取当前的日期以及 ...
- 强连通分量Kosaraju
#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #i ...
- Spring 源码学习系列
前言 Spring框架之于 JavaEE 程序员来说,犹如锄头之于农民.Java 程序员每天都要使用Spring框架,Spring框架也确实是个可手的工具. 最初使用Spring的时候,我们需要配置m ...
- mysql免解压版的配置
很多朋友在安装mysq解压版l时出现: “mysql 服务无法启动 服务没报告任何错误” 以前我安装时也是遇到这样的问题: 其实mysql在5.6后就没有了data目录,很多朋友按照以前的版本安装会去 ...
- 在VUE-CLI 3下的第一个Element-ui项目(菜鸟专用)
vue-cli3.0使用及配置 (https://www.cnblogs.com/xzqyun/p/10779891.html ) 以上是 vue-cli3.0使用及配置 这里我们来引用基于v ...
- Desert King POJ - 2728(最优比率生产树/(二分+生成树))
David the Great has just become the king of a desert country. To win the respect of his people, he d ...
- Linux-day1-pdf课件
1.掌握Linux目录结构 2.掌握基础文件操作指令 3.vim常用操作命令 4.Linux用户和组
- bs4库学习
# -*- coding:utf-8 -*- import bs4 import requests def tags_val(tag, key='', index=0): ''' tag指HTML元素 ...
- mysql数据库 ,java 代码巧妙结合提升系统性能。
查询频繁的表t_yh_transport_task 保证数据量最少,增加查询效率, 常用于查询的字段增加索引, 每日定时移动数据 <!-- 医院系统预约任务历史删除定时器 --> & ...