FFmpeg:视频转码、剪切、合并、播放速调整

怼烎@ 2021-07-04 13:59 702阅读 0赞

安装

去官网按提示安装即可,支持三大操作系统。唯一要吐槽的是,Ubuntu 14.04 等较新的版本,从默认软件列表里移除了 ffmpeg,转而支持 libav,可是 libav 又没弄好,很难用——开源社区瞎折腾起来真是无力吐槽。

2017 更新: Ubuntu 16.04FFmpeg 又回到了官方仓库:

  1. sudo apt install ffmpeg

转码

最简单命令如下:

  1. ffmpeg -i out.ogv -vcodec h264 out.mp4
  2. ffmpeg -i out.ogv -vcodec mpeg4 out.mp4
  3. ffmpeg -i out.ogv -vcodec libxvid out.mp4
  4. ffmpeg -i out.mp4 -vcodec wmv1 out.wmv
  5. ffmpeg -i out.mp4 -vcodec wmv2 out.wmv

-i 后面是输入文件名。-vcodec 后面是编码格式,h264 最佳,但 Windows 系统默认不安装。如果是要插入 ppt 的视频,选择 wmv1wmv2 基本上万无一失。

附加选项:-r 指定帧率,-s 指定分辨率,-b 指定比特率;于此同时可以对声道进行转码,-acodec 指定音频编码,-ab 指定音频比特率,-ac 指定声道数,例如

  1. 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 秒的视频,并保存:

  1. ffmpeg -i input.wmv -ss 00:00:30.0 -c copy -t 00:00:10.0 output.wmv
  2. ffmpeg -i input.wmv -ss 30 -c copy -t 10 output.wmv

达成相同效果,也可以用 -ss-to 选项, 从第 30 秒截取到第 40 秒:

  1. ffmpeg -i input.wmv -ss 30 -c copy -to 40 output.wmv

值得注意的是,ffmpeg 为了加速,会使用关键帧技术, 所以有时剪切出来的结果在起止时间上未必准确。 通常来说,把 -ss 选项放在 -i 之前,会使用关键帧技术; 把 -ss 选项放在 -i 之后,则不使用关键帧技术。 如果要使用关键帧技术又要保留时间戳,可以加上 -copyts 选项:

  1. ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4

参考:ffmpeg.org

合并

把两个视频文件合并成一个。

简单地使用 concat demuxer,示例:

  1. $ cat mylist.txt
  2. file '/path/to/file1'
  3. file '/path/to/file2'
  4. file '/path/to/file3'
  5. $ ffmpeg -f concat -i mylist.txt -c copy output

更多时候,由于输入文件的多样性,需要转成中间格式再合成:

  1. ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
  2. ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
  3. cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg
  4. ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi

参考:stackoverflow; ffmpeg.org。

调整播放速度

加速四倍:

  1. ffmpeg -i TheOrigin.mp4 -vf "setpts=0.25*PTS" UpTheOrigin.mp4

四倍慢速:

  1. ffmpeg -i TheOrigin.mp4 -vf "setpts=4*PTS" DownTheOrigin.mp4

FFmpeg精确时间截取视频

简介:
之前用到过FFmpeg截取过音频和视频发现,截取的视频文件时间不是很准确,今天便系统的学习了一下FFmpeg截取视频的知识

1.首先明确为什么FFmpeg截取的视频时间点不精确?
造成这些问题的原因是ffmpeg无法seek到非关键帧上。

2.剪切方法:(非重新编码)

  1. ffmpeg -ss [start] -t [duration] -accurate_seek -i [in].mp4 -codec copy [out].mp4
  2. 参数分析:
  3. --[start]起始时间
  4. --[duration]需要截取的时长
  5. --[in]输入文件名
  6. --[out]输出文件名
  7. 亲测:时间并不精确(我是在Linux下使用ffmpeg),另外这种方式会导致:如果视频结尾不是关键帧,那么视频最后就会出现一段空白。
  8. 解决方法是: 加入[-avoid_negative_ts 1]
  9. ffmpeg -ss [start] -t [duration] -accurate_seek -i [in].mp4 -codec copy -avoid_negative_ts 1 [out].mp4

3.重新编码进行剪切

  1. 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:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. string srcFileName = @"F:\资料\Demo\FFmpeg_Demo\videoold\PROMO.wmv";
  6. string destFileName = @"F:\资料\Demo\FFmpeg_Demo\videonew\PROMO.mp4";
  7. Process p = new Process();
  8. p.StartInfo.FileName = @"F:\资料\Demo\FFmpeg_Demo\mencoder\ffmpeg.exe";
  9. p.StartInfo.UseShellExecute = false;
  10. p.StartInfo.Arguments = "-i " + srcFileName + GenerateDefaultSetting() + destFileName;
  11. p.StartInfo.RedirectStandardInput = true;
  12. p.StartInfo.RedirectStandardOutput = true;
  13. p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中
  14. p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
  15. p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
  16. p.Start();
  17. p.BeginErrorReadLine();//开始异步读取
  18. p.WaitForExit();//阻塞等待进程结束
  19. p.Close();//关闭进程
  20. p.Dispose();//释放资源
  21. Console.WriteLine("ok");
  22. Console.ReadKey();
  23. }
  24. private static void p_ErrorDataReceived(object sender, DataReceivedEventArgs e)
  25. {
  26. Console.WriteLine(e.Data);
  27. }
  28. private static void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
  29. {
  30. Console.WriteLine(e.Data);
  31. }
  32. private static string GenerateDefaultSetting()
  33. {
  34. string setting = string.Empty;
  35. setting += " -y ";
  36. //setting += " -b 800 ";//-b大于0就模糊【?】
  37. setting += " -ab 56 ";
  38. setting += " -ar 22050 ";
  39. setting += " -qscale 4 ";
  40. setting += " -r " + 29.970;
  41. setting += " -ac 2 ";
  42. setting += " -s " + 640 + "x" + 480 + " ";
  43. return setting;
  44. }
  45. }

三.ffmpeg各种视频处理:(注意参数顺序)

1.视频转换:

avi—————————————>flv

  1. ffmpeg -i file.avi output.flv

MPEG-1———————->MPEG-4

  1. ffmpeg -i inputfile.mpg -f mp4 -acodec libfaac -vcodec mpeg4 -b 256k -ab 64k outputfile.mp4

MP3—————————->MPEG-4

  1. ffmpeg -i inputfile.mp3 -f mp4 -acodec libaac -vn -ab 64k outputfile.mp4

DVD的VOB—————>VideoCD格式的MPEG-1

  1. ffmpeg -i inputfile.vob -f mpeg -acodec mp2 -vcodec mpeg1video -s 352x240 -b 1152k -ab 128k outputfile.mpg

AVI—————————->H.264格式的M4V

  1. ffmpeg -i inputfile.avi -f mp4 -acodec libfaac -vcodec libx264 -b 512k -ab 320k outputfile.m4v

任何—————————->东芝REGZA可辨识的MPEG2

  1. ffmpeg -i inputfile -target ntsc-svcd -ab 128k -aspect 4:3 -s 720x480 outputfile.mpg

2.音频视频合并:ok

  1. ffmpeg -i input1.avi -i input2.mp3 -vcodec copy -acodec copy out.avi

3.拆分音频视频:ok

提取音频:

  1. ffmpeg -i input.flv -vn -acodec copy out.mp3

提取视频:

  1. ffmpeg -i input.flv -an -vcodec copy out.flv ok
  2. ffmpeg -i input.flv out.flv -an -vcodec copy error------->注意参数顺序

音视频都提取:

  1. ffmpeg -i input.flv -an out1.flv -vn out2.mp3

4.提取图片:ok

  1. ffmpeg -i input.avi -y -f image2 -ss 8 -t 0.001 -s 350x240 out.jpg

5.压缩文件:ok

  1. ffmpeg -i input.mp3 -ab 128 out.mp3

6.截取指定的时间间隔的视频:ok

  1. ffmpeg -ss 00:00:10 -t 00:01:22 -i 五月天-突然好想你.mp3 out.mp3

7.屏幕录像:

  1. ffmpeg -f x11grab -s xga -r 10 -i :0.0+0+0 wheer.avi
  2. ffmpeg -f x11grab -s 320x240 -r 10 -i :0.0+100+200 wheer.avi
  3. ffmpeg -f x11grab -s xga -qscale 5 -r 10 -i :0.0+0+0 wheer.avi

8.屏幕录像,同时录音:

  1. ffmpeg -f oss -i /dev/dsp -f x11grab -r 30 -s 1024x768 -i :0.0 output.mkv
  2. 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.视频连接:

  1. ffmpeg -i input1.avi -i input2.avi output.avi -vcodec copy -acodec copy

11.分割视频:ok

  1. ffmpeg -ss 01:00:00 -i input.mp4 -vcodec copy -acodec copy -t 00:06:00 out.mp4

四.参数:

1.常用参数:

  1. -ab bitrate 设置音频码率
  2. -acodec codec 使用codec编解码
  3. -ac channels 设置通道,缺省为1
  4. -ar freq 设置音频采样率
  5. -r fps 设置帧频,缺省25
  6. -b bitrate 设置比特率,缺省200kb/s
  7. -qscale 64 使用动态码率来设置
  8. -vcodec libx264 这个应该是个编码设置,网上查到 libx264.dll

2.更多参数:
参考百度百科
参考官网

发表评论

表情:
评论列表 (有 0 条评论,702人围观)

还没有评论,来说两句吧...

相关阅读

    相关 视频播放

    功能简介: 看视频,追剧,学习,只有两倍速,有点慢,使用脚本调整 建议倍数不要调整太高,你懂得^\_^ 代码特色: 1、精准的倍速控制,(默认精确到0.1倍) 2

    相关 视频播放

    考研视频的语速实在太慢。。。提供一种视频倍速播放的方法。 在电脑浏览器(如果你使用的是chrome的话)中打开视频,按F12进入开发者模式,将下面的代码粘贴到console当