FFmpeg:视频转码、剪切、合并、播放速调整
安装
去官网按提示安装即可,支持三大操作系统。唯一要吐槽的是,Ubuntu 14.04
等较新的版本,从默认软件列表里移除了 ffmpeg
,转而支持 libav
,可是 libav
又没弄好,很难用——开源社区瞎折腾起来真是无力吐槽。
2017 更新: Ubuntu 16.04
,FFmpeg
又回到了官方仓库:
sudo apt install ffmpeg
转码
最简单命令如下:
ffmpeg -i out.ogv -vcodec h264 out.mp4
ffmpeg -i out.ogv -vcodec mpeg4 out.mp4
ffmpeg -i out.ogv -vcodec libxvid out.mp4
ffmpeg -i out.mp4 -vcodec wmv1 out.wmv
ffmpeg -i out.mp4 -vcodec wmv2 out.wmv
-i
后面是输入文件名。-vcodec
后面是编码格式,h264
最佳,但 Windows
系统默认不安装。如果是要插入 ppt
的视频,选择 wmv1
或 wmv2
基本上万无一失。
附加选项:-r
指定帧率,-s
指定分辨率,-b
指定比特率;于此同时可以对声道进行转码,-acodec
指定音频编码,-ab
指定音频比特率,-ac
指定声道数,例如
ffmpeg -i out.ogv -s 640x480 -b 500k -vcodec h264 -r 29.97 -acodec libfaac -ab 48k -ac 2 out.mp4
剪切
用 -ss
和 -t
选项, 从第 30 秒开始,向后截取 10 秒的视频,并保存:
ffmpeg -i input.wmv -ss 00:00:30.0 -c copy -t 00:00:10.0 output.wmv
ffmpeg -i input.wmv -ss 30 -c copy -t 10 output.wmv
达成相同效果,也可以用 -ss
和 -to
选项, 从第 30 秒截取到第 40 秒:
ffmpeg -i input.wmv -ss 30 -c copy -to 40 output.wmv
值得注意的是,ffmpeg
为了加速,会使用关键帧技术, 所以有时剪切出来的结果在起止时间上未必准确。 通常来说,把 -ss
选项放在 -i
之前,会使用关键帧技术; 把 -ss
选项放在 -i
之后,则不使用关键帧技术。 如果要使用关键帧技术又要保留时间戳,可以加上 -copyts
选项:
ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4
参考:ffmpeg.org
合并
把两个视频文件合并成一个。
简单地使用 concat demuxer
,示例:
$ cat mylist.txt
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'$ ffmpeg -f concat -i mylist.txt -c copy output
更多时候,由于输入文件的多样性,需要转成中间格式再合成:
ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
参考:stackoverflow; ffmpeg.org。
调整播放速度
加速四倍:
ffmpeg -i TheOrigin.mp4 -vf "setpts=0.25*PTS" UpTheOrigin.mp4
四倍慢速:
ffmpeg -i TheOrigin.mp4 -vf "setpts=4*PTS" DownTheOrigin.mp4
FFmpeg精确时间截取视频
简介:
之前用到过FFmpeg
截取过音频和视频发现,截取的视频文件时间不是很准确,今天便系统的学习了一下FFmpeg
截取视频的知识
1.首先明确为什么FFmpeg
截取的视频时间点不精确?
造成这些问题的原因是ffmpeg
无法seek
到非关键帧上。
2.剪切方法:(非重新编码)
ffmpeg -ss [start] -t [duration] -accurate_seek -i [in].mp4 -codec copy [out].mp4参数分析:--[start]起始时间--[duration]需要截取的时长--[in]输入文件名--[out]输出文件名亲测:时间并不精确(我是在Linux下使用ffmpeg),另外这种方式会导致:如果视频结尾不是关键帧,那么视频最后就会出现一段空白。解决方法是: 加入[-avoid_negative_ts 1]ffmpeg -ss [start] -t [duration] -accurate_seek -i [in].mp4 -codec copy -avoid_negative_ts 1 [out].mp4
3.重新编码进行剪切
ffmpeg -ss [start] -t [duration] -i [in].mp4 -c:v libx264 -c:a aac -strict experimental -b:a 98k [out].mp4
相对来说比较精确,可是还是不是特别精确,,什么原因呢?望有人解答
FFmpeg的使用及常用参数
一.下载:
官网:http://ffmpeg.org/
二.demo:
class Program{static void Main(string[] args){string srcFileName = @"F:\资料\Demo\FFmpeg_Demo\videoold\PROMO.wmv";string destFileName = @"F:\资料\Demo\FFmpeg_Demo\videonew\PROMO.mp4";Process p = new Process();p.StartInfo.FileName = @"F:\资料\Demo\FFmpeg_Demo\mencoder\ffmpeg.exe";p.StartInfo.UseShellExecute = false;p.StartInfo.Arguments = "-i " + srcFileName + GenerateDefaultSetting() + destFileName;p.StartInfo.RedirectStandardInput = true;p.StartInfo.RedirectStandardOutput = true;p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);p.Start();p.BeginErrorReadLine();//开始异步读取p.WaitForExit();//阻塞等待进程结束p.Close();//关闭进程p.Dispose();//释放资源Console.WriteLine("ok");Console.ReadKey();}private static void p_ErrorDataReceived(object sender, DataReceivedEventArgs e){Console.WriteLine(e.Data);}private static void p_OutputDataReceived(object sender, DataReceivedEventArgs e){Console.WriteLine(e.Data);}private static string GenerateDefaultSetting(){string setting = string.Empty;setting += " -y ";//setting += " -b 800 ";//-b大于0就模糊【?】setting += " -ab 56 ";setting += " -ar 22050 ";setting += " -qscale 4 ";setting += " -r " + 29.970;setting += " -ac 2 ";setting += " -s " + 640 + "x" + 480 + " ";return setting;}}
三.ffmpeg
各种视频处理:(注意参数顺序)
1.视频转换:
avi-------------------------->flv
ffmpeg -i file.avi output.flv
MPEG-1--------------->MPEG-4
ffmpeg -i inputfile.mpg -f mp4 -acodec libfaac -vcodec mpeg4 -b 256k -ab 64k outputfile.mp4
MP3------------------->MPEG-4
ffmpeg -i inputfile.mp3 -f mp4 -acodec libaac -vn -ab 64k outputfile.mp4
DVD的VOB---------->VideoCD格式的MPEG-1
ffmpeg -i inputfile.vob -f mpeg -acodec mp2 -vcodec mpeg1video -s 352x240 -b 1152k -ab 128k outputfile.mpg
AVI------------------->H.264格式的M4V
ffmpeg -i inputfile.avi -f mp4 -acodec libfaac -vcodec libx264 -b 512k -ab 320k outputfile.m4v
任何------------------->东芝REGZA可辨识的MPEG2
ffmpeg -i inputfile -target ntsc-svcd -ab 128k -aspect 4:3 -s 720x480 outputfile.mpg
2.音频视频合并:ok
ffmpeg -i input1.avi -i input2.mp3 -vcodec copy -acodec copy out.avi
3.拆分音频视频:ok
提取音频:
ffmpeg -i input.flv -vn -acodec copy out.mp3
提取视频:
ffmpeg -i input.flv -an -vcodec copy out.flv okffmpeg -i input.flv out.flv -an -vcodec copy error------->注意参数顺序
音视频都提取:
ffmpeg -i input.flv -an out1.flv -vn out2.mp3
4.提取图片:ok
ffmpeg -i input.avi -y -f image2 -ss 8 -t 0.001 -s 350x240 out.jpg
5.压缩文件:ok
ffmpeg -i input.mp3 -ab 128 out.mp3
6.截取指定的时间间隔的视频:ok
ffmpeg -ss 00:00:10 -t 00:01:22 -i 五月天-突然好想你.mp3 out.mp3
7.屏幕录像:
ffmpeg -f x11grab -s xga -r 10 -i :0.0+0+0 wheer.avi ffmpeg -f x11grab -s 320x240 -r 10 -i :0.0+100+200 wheer.aviffmpeg -f x11grab -s xga -qscale 5 -r 10 -i :0.0+0+0 wheer.avi
8.屏幕录像,同时录音:
ffmpeg -f oss -i /dev/dsp -f x11grab -r 30 -s 1024x768 -i :0.0 output.mkvffmpeg -ac 2 -f oss -i /dev/dsp -f x11grab -r 30 -s 1024x768 -i :0.0 -acodec pcm_s16le -vcodec libx264 -vpre lossless_ultrafast -threads 0 output.mkv
9.屏幕录像,指定窗口:
10.视频连接:
ffmpeg -i input1.avi -i input2.avi output.avi -vcodec copy -acodec copy
11.分割视频:ok
ffmpeg -ss 01:00:00 -i input.mp4 -vcodec copy -acodec copy -t 00:06:00 out.mp4
四.参数:
1.常用参数:
-ab bitrate 设置音频码率-acodec codec 使用codec编解码-ac channels 设置通道,缺省为1-ar freq 设置音频采样率-r fps 设置帧频,缺省25-b bitrate 设置比特率,缺省200kb/s -qscale 6或4 使用动态码率来设置-vcodec libx264 这个应该是个编码设置,网上查到 libx264.dll
2.更多参数:
参考百度百科
参考官网
FFmpeg:视频转码、剪切、合并、播放速调整相关推荐
- java用ffmpeg转码_java运用FFMPEG视频转码技术.doc
java运用FFMPEG视频转码技术 基于windows系统安装FFMPEG转码技术 软件特点: 被转视频基本不失真(支持超清.高清.标清): 转码速度比较现成转码软件快非常多(不管文件有多大,此软件 ...
- Android FFmpeg视频转码并保存到本地
本文讲述在Android中, 如何将FFmpeg视频转码为YUV格式并保存到本地. 首先,我们基于上一篇文章 基于Android Studio3.2实现ffmpeg最简单的例子 来进行配置. 配置好之 ...
- nodejs+ffmpeg视频转码
nodejs+ffmpeg视频转码 const context = require("../core/node_core_ctx"); const {spawn,exec} =re ...
- FFMPEG音频视频开发: 视频转码、合并、修改分辨率、比特率
一.环境介绍 操作系统介绍:win10 64位 FFMPEG版本: 4.4.2 QT版本: 5.12.6 二.FFMPEG下载 ubuntu系统下编译安装ffmpeg: https://blog.c ...
- javaweb中ffmpeg视频转码h264出现卡住不执行的解决办法(看到最后面就是答案了)
郑文亮 专心地钻研编程,每天进步一点点 博客园 首页 新随笔 联系 管理 随笔-1610 文章-3 评论-570 Java+Windows+ffmpeg实现视频转换 最近由于项目需要,研究了一下 ...
- 使用GPU硬件加速FFmpeg视频转码
最近看了些视频处理相关的文章,这里有一篇是讲如何使用Nvidia显卡为视频的编解码进行加速的, 为了方便查阅就转载了: 本文内容包括: 在Linux环境下安装FFmpeg 通过命令行实现视频格式识别和 ...
- Linux使用shell定时任务实现ffmpeg视频转码和截图
最近将.net core系统从windows 环境下迁移到linux中,使用docker容器部署.但是系统中使用了ffmpeg做视频转码和截图.在windows中只需要知道ffmpeg.exe的文件位 ...
- C#调用Process执行ffmpeg视频转码七分钟后就假死了
问题描述 ffmpeg -i /wzfgs_img_storage/tuku.img_linux/upload/20210421_164313_803_a2a2.mov -vcodec h264 /v ...
- 解决ffmpeg视频转码后视频清晰度下降的问题
清晰度 Chrome不支持非h264编码的mp4视频播放,可通过ffmpeg将视频转码成h264编码: ffmpeg -i input.mp4 -vcodec h264 -b:v 0 output.m ...
最新文章
- mysql5.7数据库快照_lvm快照备份数据库(Mysql5.7)
- c hello world_C和C++使用对方编译的动态链接库
- 命令模式应用_命令设计模式的应用
- Linux学习总结(57)——生产环境用户权限管理规范
- centos 7 更换yum源
- GetModuleFileNameA函数与GetCurrentDirectoryA函数
- (转)测试端口通不通(四种方法)
- 自定义 DameK UltraBlue 的 Command Line
- iPhone开发 No IB UITextField 设置圆角
- element表格点击行即选中该行复选框
- 小米note位置服务器,小米Note
- 肿瘤异质性:精准医学需要解决的难题
- 中央空调和普通空调区别
- Adobe Premiere Rush最新升级 终于支持M1芯片了
- 电气专业c语言要学得非常好吗,电气自动化专业需要学C语言吗?
- 2020-03-18HTML
- uoj#386. 【UNR #3】鸽子固定器(乱搞)
- C语言阿拉伯数字转大写汉字,人民币阿拉伯数字转换为汉字大写 code
- 图注意力网络——Graph attention networks (GAT)
- ADNI以及study design简介
热门文章
- 求 1到 100 的阶乘之和
- Android ASM 插桩实践
- ct图像中的金属伪影
- java ajax清除缓存_JS 清除浏览器缓存(转)
- Java基础-1 基础数据类型及常用引用数据类型
- java 逻辑运算_Java逻辑运算
- 深度学习的典型应用和挑战及未来
- IE 8 浏览器 F12 调试功能无法使用
- 苹果电脑拷贝文件到u盘很慢_U盘防拷贝哪家比较好?哪个做得好?
- 直接转矩控制matlab仿真,基于matlab的异步(感应)电机直接转矩控制系统毕业论文+仿真源码+仿真模型...