FFmpeg教程(超级详细版)
一、參考資料
通過ffmpeg把圖片轉換成視頻
FFmpeg命令(一)、使用filter_complex命令拼接視頻
FFmpeg 視頻處理入門教程給新手的 20 多個 FFmpeg 命令示例
FFmpeg命令行轉碼
ffmpeg 翻譯文檔 (ffmpeg-all 包含重要組件)
FFmpeg Filters Documentation
FFmpeg命令行濾鏡使用
ffmpeg命令行使用nvidia CUDA scaling高速轉分辨率轉碼(libnpp)
FFmpeg—源碼編譯
FFmpeg常用命令
Linux上的ffmpeg完全使用指南
視頻和視頻幀:FFMPEG 硬件解碼API介紹
二、安裝ffmpeg、ffmpy
安裝ffmpeg
# 更新源 sudo apt update# 添加源 sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next # 安裝ffmpeg sudo apt-get install ffmpeg# 查看版本 ffmpeg -version# 查看編碼器和解碼器 ffmpeg -encoders安裝ffmpy
pip install ffmpy==0.2.2 # 需要權限就添加sudo三、關鍵指令
查看FFmpeg支持的編碼器
ffmpeg configure -encoders查看FFmpeg支持的解碼器
ffmpeg configure -decoders查看FFmpeg支持的通信協(xié)議
ffmpeg configure -protocols查看FFmpeg所支持的音視頻編碼格式、文件封裝格式與流媒體傳輸協(xié)議
ffmpeg configure --help播放視頻
FFmpeg命令行工具學習(二):播放媒體文件的工具ffplay
設置視頻的屏幕高寬比
ffmpeg -i input.mp4 -aspect 16:9 output.mp4 通常使用的寬高比是: 16:9 4:3 16:10 5:4 2:21:1 2:35:1 2:39:1編碼格式轉換
MPEG4編碼轉成H264編碼
ffmpeg -i input.mp4 -strict -2 -vcodec h264 output.mp4H264編碼轉成MPEG4編碼
ffmpeg -i input.mp4 -strict -2 -vcodec mpeg4 output.mp4四、視頻壓縮
ffmpeg -i 2020.mp4 -vcodec h264 -vf scale=640:-2 -threads 4 2020_conv.mp4ffmpeg -i 1579251906.mp4 -strict -2 -vcodec h264 1579251906_output.mp4參數(shù)解釋:
-i 2020.mp4 輸入文件,源文件2020_conv.mp4 輸出文件,目標文件-vf scale=640:-2 改變視頻分辨率,縮放到640px寬,高度的-2是考慮到libx264要求高度是偶數(shù),所以設置成-2,讓軟件自動計算得出一個接近等比例的偶數(shù)高-threads 4 4核運算其他參數(shù):
-s 1280x720 設置輸出文件的分辨率,w*h。-b:v 輸出文件的碼率,一般500k左右即可,人眼看不到明顯的閃爍,這個是與視頻大小最直接相關的。-preset 指定輸出的視頻質量,會影響文件的生成速度,有以下幾個可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。 與 veryslow相比,placebo以極高的編碼時間為代價,只換取了大概1%的視頻質量提升。這是一種收益遞減準則:slow 與 medium相比提升了5%~10%;slower 與 slow相比提升了5%;veryslow 與 slower相比提升了3%。 針對特定類型的源內容(比如電影、動畫等),還可以使用-tune參數(shù)進行特別的優(yōu)化。-an 去除音頻流。-vn 去除視頻流。-c:a 指定音頻編碼器。-c:v 指定視頻編碼器,libx264,libx265,H.262,H.264,H.265。 libx264:最流行的開源 H.264 編碼器。 NVENC:基于 NVIDIA GPU 的 H.264 編碼器。 libx265:開源的 HEVC 編碼器。 libvpx:谷歌的 VP8 和 VP9 編碼器。 libaom:AV1 編碼器。-vcodec copy 表示不重新編碼,在格式未改變的情況采用。-re 以源文件固有幀率發(fā)送數(shù)據。-minrate 964K -maxrate 3856K -bufsize 2000K 指定碼率最小為964K,最大為3856K,緩沖區(qū)大小為 2000K。-y 不經過確認,輸出時直接覆蓋同名文件。-crf 參數(shù)來控制轉碼,取值范圍為 0~51,其中0為無損模式,18~28是一個合理的范圍,數(shù)值越大,畫質越差。五、視頻拼接
將4個視頻拼接成一個很長的視頻(無聲音)
ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex '[0:0][1:0] [2:0][3:0] concat=n=4:v=1 [v]' -map '[v]' output.mp4將4個視頻拼接成一個很長的視頻(有聲音)
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex '[0:0][0:1] [1:0][1:1] [2:0][2:1] concat=n=3:v=1:a=1 [v][a]' -map '[v]' -map '[a]’ output.mp4參數(shù)解釋:
[0:0][0:1] [1:0][1:1] [2:0][2:1] 分別表示第1個輸入文件的視頻、音頻,第2個輸入文件的視頻、音頻,第3個輸入文件的視頻、音頻。concat=n=3:v=1:a=1 表示有3個輸入文件,輸出一條視頻流和一條音頻流。[v][a] 得到的視頻流和音頻流的名字,注意在 bash 等 shell 中需要用引號,防止通配符擴展。橫向拼接2個視頻
ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "[0:v]pad=iw*2:ih*1[a];[a][1:v]overlay=w" out.mp4參數(shù)解釋:
pad 將合成的視頻寬高,這里iw代表第1個視頻的寬,iw*2代表合成后的視頻寬度加倍,ih為第1個視頻的高,合成的兩個視頻最好分辨率一致。overlay 覆蓋,[a][1:v]overlay=w,后面代表是覆蓋位置w:0。豎向拼接2個視頻
ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "[0:v]pad=iw:ih*2[a];[a][1:v]overlay=0:h" out_2.mp4橫向拼接3個視頻
ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -filter_complex "[0:v]pad=iw*3:ih*1[a];[a][1:v]overlay=w[b];[b][2:v]overlay=2.0*w" out_v3.mp4豎向拼接3個視頻
ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -filter_complex "[0:v]pad=iw:ih*3[a];[a][1:v]overlay=0:h[b];[b][2:v]overlay=0:2.0*h" out_v4.mp44個視頻2x2方式排列
ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex "[0:v]pad=iw*2:ih*2[a];[a][1:v]overlay=w[b];[b][2:v]overlay=0:h[c];[c][3:v]overlay=w:h" out.mp4六、視頻幀操作
ffmpeg和H264視頻的編解碼
查看每幀的信息
ffprobe -v error -show_frames gemfield.mp4從pict_type=I可以看出這是個關鍵幀,然后key_frame=1 表示這是IDR frame,如果key_frame=0表示這是Non-IDR frame。
截取視頻中的某一幀
把gemfield.mp4視頻的第1分05秒的一幀圖像截取出來。
# input seeking ffmpeg -ss 00:1:05 -i gemfield.mp4 -frames:v 1 out.jpg # output seeking ffmpeg -i gemfield.mp4 -ss 00:1:05 -frames:v 1 out1.jpg參數(shù)解釋:
-frame:v 1,在video stream上截取1幀。 input seeking使用的是key frames,所以速度很快;而output seeking是逐幀decode,直到1分05秒,所以速度很慢。重要說明:
ffmpeg截取視頻幀有2種 seeking 方式,對應有2種 coding 模式:transcoding 和 stream copying(ffmpeg -c copy)。transcoding 模式:需要 decoding + encoding 的模式,即先 decoding 再encoding。stream copying 模式:不需要decoding + encoding的模式,由命令行選項-codec加上參數(shù)copy來指定(-c:v copy )。在這種模式下,ffmpeg在video stream上就會忽略 decoding 和 encoding步驟。查看視頻總幀數(shù)
ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 gemfield.mp4查看 key frame 幀數(shù)
ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 -skip_frame nokey gemfield.mp4查看 key frame 所在的時間
ffprobe -v error -skip_frame nokey -select_streams v:0 -show_entries frame=pkt_pts_time -of csv=print_section=0 gemfield.mp4查看 key frame 分布的情況
ffprobe -v error -show_frames gemfield.mp4 | grep pict_type查看 key frame 所在的幀數(shù)
ffprobe -v error -select_streams v -show_frames -show_entries frame=pict_type -of csv gemfield.mp4 | grep -n I | cut -d ':' -f 1重新設置 key frame interval
ffmpeg -i gemfield.mp4 -vcodec libx264 -x264-params keyint=1:scenecut=0 -acodec copy out.mp4查看視頻波特率
ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 gemfield.mp4七、圖片與視頻
7.1 圖片轉視頻(規(guī)則的名稱)
ffmpeg -f image2 -i 'in%6d.jpg' -vcodec libx264 -r 25 -b 200k test.mp4參數(shù)解釋:
-r 25 表示每秒播放25幀 -b 200k 指定碼率為200k圖片的文件名為"in000000.jpg",從0開始依次遞增。7.2 圖片轉視頻(不規(guī)則的名稱)
不規(guī)則圖片名稱轉視頻。
7.2.1 方法一
不規(guī)則圖片名稱合成視頻文件。
ffmpeg -framerate 10 -pattern_type glob -i '*.jpg' out.mp4cat *.png | ffmpeg -f image2pipe -i - output.mp4參數(shù)解釋: -framerate 10:視頻幀率 -pattern_type glob:Glob pattern 模糊匹配 -f image2pipe:圖像管道,模糊匹配得到圖片名稱7.2.2 方法二
不規(guī)則圖片名稱合成視頻文件。
7.3 圖片格式轉換
ffmpeg圖片格式轉換
webp轉換成jpg
ffmpeg -i in.webp out.jpgwebp轉換成png
ffmpeg -i in.webp out.pngjpg轉換成png
ffmpeg -i in.jpg out.pngjpg轉換成webp
ffmpeg -i in.jpg out.webppng轉換成webp
ffmpeg -i in.png out.webppng轉換成jpg
ffmpeg -i in.png out.jpg八、硬解碼與軟解碼
總結
以上是生活随笔為你收集整理的FFmpeg教程(超级详细版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文本内容安全审核
- 下一篇: cad道路里程桩号标注_怎么用CAD标注