去官网按提示安装即可,支持三大操作系统。唯一要吐槽的是,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
截取视频的知识
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
相对来说比较精确,可是还是不是特别精确,,什么原因呢?望有人解答
官网:http://ffmpeg.org/
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 ok
ffmpeg -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.avi
ffmpeg -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.mkv
ffmpeg -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.更多参数:
参考百度百科
参考官网