使用ffmpeg 对视频截图,和视频转换格式
//执行CMD命令方法
public static void CmdProcess(string command)//调用CMD
{
//实例化一个进程类
Process process = new Process();
process.StartInfo.FileName = "cmd.exe";
//将cmd的标准输入和输出全部重定向到.NET的程序中
process.StartInfo.UseShellExecute = false;//此处必须为false,否则引发异常
process.StartInfo.RedirectStandardInput = true;//标准输入
process.StartInfo.RedirectStandardOutput = true;//标准输出
process.StartInfo.CreateNoWindow = false;//不显示命令行窗口界面
process.Start();//启动线程
process.StandardInput.WriteLine(command);
process.StandardInput.WriteLine("&exit");
process.WaitForExit();//阻塞等待进程结束
process.StandardOutput.ReadToEnd();
process.Close();//关闭进程
process.Dispose();//释放资源
}
//根据视频截图
string ffmpegPath="C:\ffmpeg.exe";
string vodiePath="C:\video\1.mp4";
string imageSize="240x180";
string imagePath="C:\222.jpg";
string newVideoPath="C:\2.flv";
string strImgCmd = string.Format(@"{0} -i {1} -y -f image2 -t 0.1 -s {2} {3} ", ffmpegPath, vodiePath, imageSize,imagePath);
//执行CMD命令
CmdProcess(strImgCmd);
//根据上传的视频转换视频格式
string strVideoCmd = string.Format(@"{0} -i {1} -ab 128 -ac 1 -ar 22050 -r 29.97 -qscale 6 -y {2} ", ffmpegPath,vodiePath, newVideoPath);
//执行CMD命令
CmdProcess(strVideoCmd);
参考网址 http://ferreousbox.iteye.com/blog/163865
我们在将多种格式的视频转换成flv格式的时候,我们关注的就是转换后的flv视频的品质和大小。下面就自己的实践所得来和大家分享一下,主要针对 avi、3gp、mp4和wmv四种格式来进行分析。通常在使用ffmpeg进行视频转换的时候我们使用到的控制音视频的主要参数有如下:
-ab bitrate 设置音频码率
-acodec codec 使用codec编解码
-ac channels 设置通道,缺省为1
-ar freq 设置音频采样率
-r fps 设置帧频,缺省25
-b bitrate 设置比特率,缺省200kb/s
-qscale 6或4 使用动态码率来设置
对于其他诸如-i、-y、-s等参数基本上都是可以很好理解的了。我们上面提到的几个参数前四个主要是用来设置音频的,后三个主要是用来设置视频的。对于
音频的ar(采样率)可以指定为22050、24000、44100或48000,一般来将后两种比较常见;对于音频的ab(码率)一般是选择32、
64、96或128这几种;对音频的acodec则是指定编码方式,可以指定为libmp3lame或aac等,这两种分别是指使用mp3和aac格式的
音频。在实际的测试过程中我发现在使用mp3进行音频编码时指定ab为64或更高和指定ar为22050或更高对实际的视频音质没有什么大的影响,请参见
后面的测试结果。
对于视频的r用来指定帧频,一般设置为29.97;对于视频的b(视频的比特率)可以指定如128、314等数字,对于1500以上则没有效果;对于视频
的qscale,属于动态码率,可以设置为4或6,4的质量比6的要高。在测试的过程中我发现设置-b参数对视频的质量并没有过大的改变(指定大指定小都
差不多或是一样),而设置qscale则完全不一样,如果我们想获取高品质的话应该使用动态码率而不是指定-b参数,当然了,使用动态码率的坏处就是视频
的体积变大了。在使用动态码率的时候使用6的效果和4差不多,但是体积减少了,因此通常建议使用6来设置动态码率。
上面介绍了转换过程中的音视频的配置参数,综合上面,我们在转换的时候通常的命令如下:
高品质:ffmpeg -i infile -ab 128 -acodec libmp3lame -ac 1 -ar 22050 -r 29.97 -qscale 6 -y outfile
低品质:ffmpeg -i infile -ab 128 -acodec libmp3lame -ac 1 -ar 22050 -r 29.97 -b 512 -y outfile
使用这两个命令测试四种格式的视频结果如下,同时在测试的过程中会改变相应的参数进行测试,四个视频的信息如下:
AVI格式的:test.avi 14.1M
3GP格式的:test.3gp 4.30M
MP4格式的:test.mp4 16.4M
WMV格式的:test.wmv 15.0M
1.使用高品质的脚本测试结果如下:
AVI格式转换后的:-qscale 6结果=avi_01.flv 6.61M -qscale 4结果=avi_02.flv 9.30M
3GP格式转换后的:-qscale 6结果=3gp_01.flv 4.21M -qscale 4结果=3gp_02.flv 5.30M
MP4格式转换后的:-qscale 6结果=mp4_01.flv 13.1M -qscale 4结果=mp4_02.flv 17.5M
WMV格式转换后的:-qscale 6结果=wmv_01.flv 15.9M -qscale 4结果=wmv_02.flv 22.3M
2.使用低品质的脚本测试结果如下:
AVI格式转换后的:-b 512结果=avi_03.flv 2.87M -b 1000结果=avi_04.flv 2.87M
3GP格式转换后的:-b 512结果=3gp_03.flv 1.73M -b 1000结果=3gp_04.flv 1.73M
MP4格式转换后的:-b 512结果=mp4_03.flv 5.84M -b 1000结果=mp4_04.flv 5.84M
WMV格式转换后的:-b 512结果=wmv_03.flv 6.17M -b 1000结果=wmv_04.flv 6.17M
3.压缩率比较如下:
AVI格式转换后的:-qscale 6结果=53.12% -qscale 4结果=34.04% -b 512/1000结果=79.65%
3GP格式转换后的:-qscale 6结果=2.093% -qscale 4结果=123.1% -b 512/1000结果=59.77%
MP4格式转换后的:-qscale 6结果=20.12% -qscale 4结果=106.7% -b 512/1000结果=64.39%
WMV格式转换后的:-qscale 6结果=106.0% -qscale 4结果=148.7% -b 512/1000结果=58.87%
通过比较前后的压缩大小我们可以看到在音频保持一致的情况下,使用高品质的转换和使用低品质的转换的巨大差异,同时对于不同格式的视频在转换的过程中也会
出现比较大的差异。当然了,这些数据并不一定代表所有这些格式的视频都是如此,具体的要看大家的应用了。不过,我们可以确定的是AVI格式的视频在转换成
FLV格式后其压缩率最大,不过对于不同编码的AVI其结果就不一定了。同时我们也还看到,对于某些格式的视频在转换后其体积比原先的还大了,这个我们在
应用的时候就需要注意了。
这里没有测试RM和RMVB格式的,因为ffmpeg无法直接转换这两种格式的视频,下次我将使用mencoder来测试转换RM和RMVB格式的视频为FLV的分析。以下是转换前后截取的图片,可以参考看一下.
1.AVI格式截取前、使用-qscale 6和-b 512三个的截图分别如下:


2.3GP格式截取前、使用-qscale 6和-b 512三个的截图分别如下:


3.MP4格式截取前、使用-qscale 6和-b 512三个的截图分别如下:



4.WMV格式截取前、使用-qscale 6和-b 512三个的截图分别如下:



使用ffmpeg 对视频截图,和视频转换格式的更多相关文章
- iOS 对网络视频采集视频截图
在播放网络视频是 经常可以看到播放按钮下面是该制品的某个截图 : 一般情况下 后台服务器是可以把视频截图一起返回给你 你直接拿到图片显示就可以了 但是当后台没有提供时 我们也可以根据视频地址 自 ...
- Java Web 中使用ffmpeg实现视频转码、视频截图
Java Web 中使用ffmpeg实现视频转码.视频截图 转载自:[ http://www.cnblogs.com/dennisit/archive/2013/02/16/2913287.html ...
- ffmpeg快速获取视频截图
使用ffmpeg可以非常方便的生成视频截图,命令行下的mplayer也可以做视频截图,只不过mplayer在本质上还是调用ffmpeg来实现.ffmpeg 通过指定 -vcodec 参数为 mjpeg ...
- indows下PHP通过ffmpeg给上传的视频截图详解
windows下PHP通过ffmpeg给上传的视频截图详解,php_ffmpeg.dll安装下载,找了很久php_ffmpeg.dll的下载地址和应用,发现有用的资源很少,现在问题解决了,贴出来跟大家 ...
- javacpp-FFmpeg系列补充:FFmpeg拉流截图实现在线演示demo(视频截图并返回base64图像,支持jpg/png/gif/bmp等多种格式)
javacpp-ffmpeg系列: javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片 javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转 ...
- 视频截图Util
VideoToPicUtil.java package com.zhwy.util; import java.io.File; import java.util.ArrayList; impor ...
- .NET读取视频信息、视频截图
在.NET中处理视频是一件痛苦的事情,.NET并没有提供视频处理的类.于是咱们只能找一些第三方的类库或者自己实现,在项目时间比较赶的情况下,自己实现是不可能的了,而且说不定会留下很多坑.所以一般情况下 ...
- Java实现视频网站的视频上传、视频转码、及视频播放功能(ffmpeg)
视频网站中提供的在线视频播放功能,播放的都是FLV格式的文件,它是Flash动画文件,可通过Flash制作的播放器来播放该文件.项目中用制作的player.swf播放器. 多媒体视频处理工具FFmpe ...
- centos8上安装ffmpeg4.2.2并做视频截图
一,ffmpeg的作用: FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序. 它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库l ...
随机推荐
- BZOJ 2005: [Noi2010]能量采集( 数论 + 容斥原理 )
一个点(x, y)的能量损失为 (gcd(x, y) - 1) * 2 + 1 = gcd(x, y) * 2 - 1. 设g(i)为 gcd(x, y) = i ( 1 <= x <= ...
- Windows Phone 9再见了!
因为需要准备注册电气工程师考试,因此Windows Phone 8初学者教程的翻译只能就此打住了,在考完后,也许就是Windows Phone 9发布的时候还会回来! Bye bye!
- 组件接口(API)设计指南[4]-通知(Notifications)
*返回文件夹阅读其它章节: http://blog.csdn.net/cuibo1123/article/details/39894477 通知(Notifications) 通知是托付协议的还有一半 ...
- CSS中position详解与常见应用实现
在web前台开发时候,我们必不可少的会用到postion属性进行布局定位.今天总结了一下position知识点,与常用功能与大家分享,欢迎大家交流指正. 首先我们对postion属性进行详解. 在CS ...
- IIS中asp网站播放flv视频技术
播放flv视频文件需要使用flvplayer.swf程序(32K). HTML嵌入代码: <div id="FlashFile"> <object type=&q ...
- 14.10.3 InnoDB Checkpoints InnoDB 检查点:
14.10.3 InnoDB Checkpoints InnoDB 检查点: 你的log files 变的很大可能会降低磁盘性能在checkpointing的时候, 它通常设置设置log files总 ...
- unix domain IPC 进程间通信简析
Linux系统有多种进程间通信方式,如信号.消息队列.管道等,socket是其中一种,socket使用unix domain 模式进行进程间通信 //服务端代码 #include <stdio. ...
- HDU4549 M斐波那契数
M斐波那契数列 题目分析: M斐波那契数列F[n]是一种整数数列,它的定义例如以下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 如今给 ...
- 几个前端博客 good
http://www.cnblogs.com/JustinYoung/archive/2011/02/24/fresh-free-html-templates-2010.html http://www ...
- Boost Thread学习笔记
thread自然是boost::thread库的主 角,但thread类的实现总体上是比较简单的,前面已经说过,thread只是一个跨平台的线程封装库,其中按照所使用的编译选项的不同,分别决定使用 W ...