清遠(yuǎn)建設(shè)網(wǎng)站seo招聘要求
文章目錄
- 一、ffmpeg
- 1.1 安裝
- 1.2 基本參數(shù)
- 二、ffprobe
- 2.1 查編碼格式
- 2.2 查視頻時長
- 五、視頻轉(zhuǎn)流
- 5.1 MP4轉(zhuǎn)H264
- 5.2 H264轉(zhuǎn)MP4
- 5.3 AVI轉(zhuǎn)MP4
- 5.4 MP4轉(zhuǎn)H265
- 六、視頻文件
- 6.1 播放
- 6.2 filter 過濾器
- 6.2.1 crop
- 6.3 視頻截取
- 6.4 視頻拼接
- 6.5 獲取分辨率
- 七、視頻和圖
- 7.1 視頻抽幀
- 7.2 視頻加圖片水印
- 7.3 生成 gif
- 7.4 視頻幀預(yù)覽
- 八、視頻和音頻
- 8.1 音量

ffmpeg中文文檔
常見測試視頻
ffmpeg 大神筆記
一、ffmpeg
ffmpeg -h
ffmpeg -h long
ffmpeg -h full #可重定向到文件查看
ffmpeg -h full | grep h264 # 按關(guān)鍵字grep
ffmpeg -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter/bsf/protocol
1.1 安裝
ffmpeg 的 release 是 Linux Static Build ,即靜態(tài)庫(各庫已被打包到可執(zhí)行程序中),而不是動態(tài)鏈接庫(共享機(jī)器上的 so),所以非常方便部署(sqlite 也是這樣),這是ffmpeg官網(wǎng)下載地址
1.2 基本參數(shù)
-threads 并行線程數(shù)(如ffmpeg -threads 4 -i input.mp4 output.mp4)
二、ffprobe
2.1 查編碼格式
ffprobe a.mp4 -show_streams -select_streams v -print_format json | jq{ "streams": [ { "index": 0, "codec_name": "h264", "codec_long_name": "H.264/AVC/MPEG-4 AVC/MPEG-4 part 10", "profile": "Main", "codec_type": "video"}]
}
2.2 查視頻時長
# 容器時長 container duration (和播放軟件看到的時長一樣)
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i input.mp4 # 輸出單位是秒# 音視頻流時長 stream duration
ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 input.mp4# 容器時長和音視頻流時長略有差異
# 一個媒體文件里邊有多個音視頻流,各個流的時長也未必一樣,一般播放器會以video stream的時長作為播放時長
# 另外,并不是所有格式的視頻,會在音視頻流級別保存了時長,這時可能會拿不到時長# 解碼后的文件播放時長(get duration by decoding), 是最準(zhǔn)確的, 但因需解碼所以耗時較長
ffmpeg -i input.mp4 -f null - | grep time # 輸出形如time=00:02:02.33
五、視頻轉(zhuǎn)流
rtsp-simple-server用法
ffmpeg -i a.mp4 -an -c h264 a_h264.mp4
ffplay 可播放本地文件
windows 下的格式工廠可修復(fù)視頻文件格式
5.1 MP4轉(zhuǎn)H264
ffmpeg -i input.mp4 -vcodec copy -bf 0 -an -bsf: h264_mp4toannexb -f h264 input.h264 # mp4轉(zhuǎn)h264
# -vcodec copy 使用原視頻的編碼
# -bf 0 移除b幀
# -an 移除音頻
# -bsf bitstream_filters A comma-separated list of bitstream filters。其中 h264_mp4toannexb 是mp4解封裝時必須加的參數(shù)(PS: 而封裝為mp4時不需要加)
# -f h264 指定格式
注意,該命令會找時間點(diǎn)附近的 i 幀,所以如果視頻本身有 i 幀丟失的話(警告如下),截取的視頻會比期望的長:
按時間截取H264,且各段以i幀開頭
ffmpeg -i input.h264 -ss 0:05 -to 0:40 -c:v copy -c:a copy a.h264
查看首幀是否為i幀
ffprobe -v quiet -show_frames -select_streams v a.h264 | grep pict_type
將各小h264拼接為大h264
# 寫程序?qū)崿F(xiàn),讀各h264到內(nèi)存,內(nèi)存拼接,寫文件
# 或者用 ffmpeg
echo "file '1.h264'\nfile '2.h264'" > videos.txt
ffmpeg -y -safe 0 -f concat -i videos.txt -c copy o.h264 # -y 無需交互式確認(rèn), -c copy指定不需重新編碼, -safe 0 指定不檢查各文件名稱(防止報錯無意義的Unsafe file name)
5.2 H264轉(zhuǎn)MP4
ffmpeg -f h264 -i a.h264 -vcodec copy output.mp4
如果報錯Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly則無需理會,因?yàn)?ffmpeg 的這個警告不久以后將會被移除。參考
5.3 AVI轉(zhuǎn)MP4
ffmpeg -i 4k-01.avi -c:v h264 4k-01.mp4
5.4 MP4轉(zhuǎn)H265
如果原始視頻就是 H265,則我們通過 -v copy 沿用其視頻編碼格式,防止非常耗時的編解碼,所以我們希望把 H265 編碼的 MP4 直接轉(zhuǎn)為 H265 裸流。
ffmpeg -i a.mp4 -vcodec copy -bf 0 -an -bsf: hevc_mp4toannexb -f hevc input.h265
# -bsf: hevc_mp4toannexb: 從mp4拷貝到annexB封裝
六、視頻文件
6.1 播放
ffplay -rtsp_transport tcp rtsp://192.168.2.99/mystream
6.2 filter 過濾器
# 每個 filter 的各參數(shù)用冒號分隔。各 filter 之間用逗號分隔。形如下例:
-vf "scale=256:256,transpose=1"
6.2.1 crop
ffmpeg -i a.mp4 -c:v libx264 -vf crop="400:400:100:100" output.mp4 # crop="w:h:x:y" 從視頻的x,y處截取w和h的畫面。-c:v libx264 是以 h264 重新編碼視頻
ffmpeg -i a.mp4 -c:v libx264 -vf "crop=iw/3:ih/3" o.mp4 # iw指input width, 設(shè)置為了原視頻的三分之一。ih 同理
6.3 視頻截取
ffmpeg -i input.mp4 -ss 1:05 -t 10 output.mp4
# -ss(即position) 5指定從輸入視頻第1:05秒開始截取,-t(即duration) 10指明最多截取10秒
# -ss在-i后則會精確定位到1:05秒開始,而且會播放到第1:05后才執(zhí)行使得更慢運(yùn)行完
# -t可使用秒數(shù)(如-t 10),也可用-t 02:00:10ffmpeg -ss 1:05 -i input.mp4 -t 10 -c:v copy -c:a copy output.mp4
# 把-ss 1:05放到-i前面則會在第1:05附近的i幀開始,而且會直接找到1:05秒使得更快運(yùn)行完
# -c:v 和 -c:a分別指定視頻和音頻的編碼格式。
# -c:v copy -c:a copy標(biāo)示視頻與音頻的編碼不發(fā)生改變,而是直接復(fù)制,這樣會大大提升速度。
6.4 視頻拼接
echo "file '1.mp4'\nfile '2.mp4'" > videos.txt
ffmpeg -f concat -i videos.txt -c copy o.mp4 # -c copy指定不需重新編碼
6.5 獲取分辨率
ffmpeg -hide_banner -rtsp_transport tcp -i rtsp://192.168.2.99/a 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}' #正則的{m,n}指: 最少匹配 n 次且最多匹配 m 次# 可能的流分辨率如下:
1920*1080 或 1920 * 1088, 即200w(即1080P)
2560 * 2048, 即400w(即2K), 即2倍1080P的算力
3072 * 2048, 即3倍1080P的算力
3840 * 2160, 即800w(即4K), 即4倍1080P的算力
4096 * 2160, 即5倍1080P的算力
七、視頻和圖
7.1 視頻抽幀
ffmpeg -i a.mp4 -vf "fps=1/10,scale=-2:720" thumbnail-03%d.jpg
# -vf 指定過濾器(filter)
# fps設(shè)置輸出幀率為十分之一,即每十秒輸出一幀
# scale設(shè)置輸出文件的大小,-2 即 width 自動計(jì)算出匹配的偶數(shù), 720 即 指定的 heightffmpeg -i 666051400.mp4 -r 1 -q:v 2 ./%08d.jpg # 指定幀率1
7.2 視頻加圖片水印
ffmpeg -i a.mp4 -i lenna.png -filter_complex "overlay=100:100" output.mp4
# overlay=100:100 指定將 圖放在視頻的 100:100 像素的位置
7.3 生成 gif
注意:gif 自身格式限制了,視頻不要太長
ffmpeg -i a.mp4 -ss 0 -t 5 -acodec copy -vcodec copy output.mp4 # 截取視頻
ffmpeg -i output.mp4 -s 640x480 -f gif output.gif # -s指定圖片分辨率
7.4 視頻幀預(yù)覽
# 預(yù)覽首幀
ffmpeg -rtsp_transport tcp -i rtsp://192.168.2.99:3355/mystream -frames:v 1 -q:v 1 -y a.jpg
八、視頻和音頻
8.1 音量
ffmpeg -i a.mp4 -an o.mp4 # 刪除音頻軌(-vn 刪除視頻軌、-sn 刪除字幕、-db 刪除數(shù)據(jù)流)
ffmpeg -i a.mp4 -af "volume=1.5" o.mp4 # 設(shè)置音量大小為 1.5 倍(親測 99.0 倍也可生效)
ffmpeg -i a.mp4 -af "loudnorm=I=-5:LRA=1" o.mp4 # 統(tǒng)一視頻音量
ffmpeg -i a.mp4 -af "equalizer=f=1000:width_type=h:width=200:g=-1" o.mp4 # 添加equalizer(均衡器)
參考