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.mp4FFmpeg精確時間截取視頻
簡介:
之前用到過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].mp43.重新編碼進行剪切
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.flvMPEG-1--------------->MPEG-4
ffmpeg -i inputfile.mpg -f mp4 -acodec libfaac -vcodec mpeg4 -b 256k -ab 64k outputfile.mp4MP3------------------->MPEG-4
ffmpeg -i inputfile.mp3 -f mp4 -acodec libaac -vn -ab 64k outputfile.mp4DVD的VOB---------->VideoCD格式的MPEG-1
ffmpeg -i inputfile.vob -f mpeg -acodec mp2 -vcodec mpeg1video -s 352x240 -b 1152k -ab 128k outputfile.mpgAVI------------------->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.mpg2.音頻視頻合并:ok
ffmpeg -i input1.avi -i input2.mp3 -vcodec copy -acodec copy out.avi3.拆分音頻視頻: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.mp34.提取圖片:ok
ffmpeg -i input.avi -y -f image2 -ss 8 -t 0.001 -s 350x240 out.jpg5.壓縮文件:ok
ffmpeg -i input.mp3 -ab 128 out.mp36.截取指定的時間間隔的視頻:ok
ffmpeg -ss 00:00:10 -t 00:01:22 -i 五月天-突然好想你.mp3 out.mp37.屏幕錄像:
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.avi8.屏幕錄像,同時錄音:
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.mkv9.屏幕錄像,指定窗口:
10.視頻連接:
ffmpeg -i input1.avi -i input2.avi output.avi -vcodec copy -acodec copy11.分割視頻: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.dll2.更多參數:
參考百度百科
參考官網
總結
以上是生活随笔為你收集整理的FFmpeg:视频转码、剪切、合并、播放速调整的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ GDI 中SelectObjec
- 下一篇: Bin与Hex文件解析