文章目錄
- ffmpeg入門教程[https://www.jianshu.com/p/042c7847bd8a](https://www.jianshu.com/p/042c7847bd8a)
- 本文將會持續更新,敬請關注
- 視頻播放器原理
- 命令行詳解可參考ffmpeg入門教程或者參考官網文檔
- 實例來源於《FFmpeg從入門到精通》
- -filter_complex爲視頻添加logo
- movie爲視頻添加logo
- movie實現視頻畫中畫
- movie實現視頻畫中畫跑馬燈
- 視頻添加中文水印的正確姿勢
- 中文水印亂碼
- 視頻添加實時時間水印
- 視頻間隔性添加水印
- 視頻九宮格
- vframes 視頻截圖
- fps濾鏡定時截圖
- 截取關鍵幀圖片
- setpts視頻倍速處理
- 歡迎分享、轉載、聯繫、指正、批評、撕逼
ffmpeg入門教程https://www.jianshu.com/p/042c7847bd8a
本文將會持續更新,敬請關注
視頻播放器原理
———————————————— 版權聲明
此處摘抄部分爲CSDN博主「雷霄驊」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/leixiaohua1020/article/details/18893769
視音頻技術主要包含以下幾點:封裝技術,視頻壓縮編碼技術以及音頻壓縮編碼技術。如果考慮到網絡傳輸的話,還包括流媒體協議技術。
視頻播放器播放一個互聯網上的視頻文件,需要經過以下幾個步驟:解協議,解封裝,解碼視音頻,視音頻同步。如果播放本地文件則不需要解協議,爲以下幾個步驟:解封裝,解碼視音頻,視音頻同步。他們的過程如圖所示。
解協議的作用
就是將流媒體協議的數據,解析爲標準的相應的封裝格式數據。視音頻在網絡上傳播的時候,常常採用各種流媒體協議,例如HTTP,RTMP,或是MMS等等。這些協議在傳輸視音頻數據的同時,也會傳輸一些信令數據。這些信令數據包括對播放的控制(播放,暫停,停止),或者對網絡狀態的描述等。解協議的過程中會去除掉信令數據而只保留視音頻數據。例如,採用RTMP協議傳輸的數據,經過解協議操作後,輸出FLV格式的數據。
解封裝的作用
就是將輸入的封裝格式的數據,分離成爲音頻流壓縮編碼數據和視頻流壓縮編碼數據。封裝格式種類很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是將已經壓縮編碼的視頻數據和音頻數據按照一定的格式放到一起。例如,FLV格式的數據,經過解封裝操作後,輸出H.264編碼的視頻碼流和AAC編碼的音頻碼流。
解碼的作用
就是將視頻/音頻壓縮編碼數據,解碼成爲非壓縮的視頻/音頻原始數據。音頻的壓縮編碼標準包含AAC,MP3,AC-3等等,視頻的壓縮編碼標準則包含H.264,MPEG2,VC-1等等。解碼是整個系統中最重要也是最複雜的一個環節。通過解碼,壓縮編碼的視頻數據輸出成爲非壓縮的顏色數據,例如YUV420P,RGB等等;壓縮編碼的音頻數據輸出成爲非壓縮的音頻抽樣數據,例如PCM數據。
視音頻同步的作用
就是根據解封裝模塊處理過程中獲取到的參數信息,同步解碼出來的視頻和音頻數據,並將視頻音頻數據送至系統的顯卡和聲卡播放出來。
命令行詳解可參考ffmpeg入門教程或者參考官網文檔
https://www.jianshu.com/p/042c7847bd8a
實例來源於《FFmpeg從入門到精通》
-filter_complex爲視頻添加logo
ffmpeg -i C:\Users\Administrator\Desktop\袋熊.mp4
-i F:\表情包\JB`~O0J_SH{U{VA0U{3%X~I.gif
-filter_complex "[1:v]scale=300:300[logo];[0:v][logo]overlay=x=0:y=0"
C:\Users\Administrator\Desktop\filtered_video.mp4
2
個-i
指定2
個輸入文件-filter_complex
複雜濾鏡[1:v]scale=300:300[logo]
將第2
個輸入文件的視頻流(如果是圖片文件,則操作的是圖片)縮放成300x300
大小,並設置標籤[logo]
[0:v][logo]overlay=x=0:y=0
將第1
個輸入文件的視頻流用[logo]
覆蓋在(0,0)
位置(圖片的左上角在視頻的0,0位置)- 最後是
輸出
文件
movie爲視頻添加logo
ffmpeg -y -i C:\Users\cy\Desktop\video.mp4
-vf "movie=C\\:/Users/cy/Desktop/logo.jpg[logo];[in][logo]overlay=100:100[out]"
C:\Users\cy\Desktop\video_filtered.mp4
movie實現視頻畫中畫
ffmpeg -y -i C:\Users\Administrator\Desktop\video.mp4
-vf "movie=C\\:/Users/Administrator/Desktop/video.mp4,scale=480x320[logo];[in][logo]overlay[out]"
C:\Users\Administrator\Desktop\video_filter.mp4
將畫中畫放置於右下角
ffmpeg -y -i C:\Users\Administrator\Desktop\video.mp4
-vf "movie=C\\:/Users/Administrator/Desktop/video.mp4,scale=480x320[logo];
[in][logo]overlay=x=main_w-480:y=main_h-320[out]" C:\Users\Administrator\Desktop\video_filter.mp4
main_w
主視頻寬度main_h
主視頻高度
movie實現視頻畫中畫跑馬燈
ffmpeg -y -i C:\Users\Administrator\Desktop\video.mp4
-vf "movie=C\\:/Users/Administrator/Desktop/video.mp4,scale=480x320[logo];
[in][logo]overlay=x='if(gte(t,1),-w+t*400,NAN)':y=0 [out]"
-vcodec libx264 C:\Users\Administrator\Desktop\video_filtered.flv
t
時間,s[in]
指輸入視頻[out]
指輸出視頻gte(t,1)
如果t>=1
,返回1,否則返回0if(gte(t,1),-w+t*400,NAN)
如果gte(t,1)
非0,返回-w+t*400
,否則返回NAN
,非數,即不顯示跑馬燈視頻。
表示從主視頻播放1s後開始顯示跑馬燈,跑馬燈視頻左上角x座標爲-w+t*400,w是跑馬燈視頻寬度-vcodec
指定編解碼器
視頻添加中文水印的正確姿勢
ffmpeg -y -i C:\Users\cy\Desktop\video.mp4 -vf
"drawtext=fontsize=100:fontfile=C\\:/Windows/Fonts/simhei.ttf:text='傻逼,你好':
fontcolor=green:box=1:boxcolor=yellow:x=20:y=20" C:\Users\cy\Desktop\video_filtered.mp4
-y
強制覆蓋輸出文件-i
指定輸入文件-vf
-filter:v
的別名,爲視頻流添加濾鏡處理drawtext
添加文字水印fontsize
指定字體大小fontfile
指定字體庫text
指定文字內容fontcolor
指定文字顏色box=1
表示爲水印添加背景色boxcolor
指定背景色x=20:y=20
指定水印偏移的位置- 最後是
輸出
文件
fontfile=C\\:/Windows/Fonts/simhei.ttf
指定的字體是黑體
,
windows系統下,字體在C:\Windows\Fonts
下,
注意:指定fontfile路徑時,:
號必須用\\
轉義,路徑不能用\
,必須/
,否則亂碼,因爲路徑指定有誤,ffmpeg無法找到字庫
中文水印亂碼
fontfile=C\\:\Windows\Fonts\simhei.ttf
fontfile=C\:\Windows\Fonts\simhei.ttf
視頻添加實時時間水印
ffmpeg -y -i C:\Users\cy\Desktop\video.mp4 -vf
"drawtext=fontsize=100:text='%{localtime\:%Y-%m-%d %H-%M-%S}':
fontcolor=green:box=1:boxcolor=yellow:x=20:y=20"
C:\Users\cy\Desktop\video_filtered.mp4
%{localtime\:%Y-%m-%d %H-%M-%S}
注意大小寫,否則GG
視頻間隔性添加水印
ffmpeg -y -i C:\Users\cy\Desktop\video.mp4
-vf "drawtext=fontsize=100:text='helloworld':fontcolor=green:
box=1:boxcolor=yellow:x=20:y=20:enable=lt(mod(t\,2)\,1)"
C:\Users\cy\Desktop\video_filtered.mp4
t
時間,smod(t\,2)
計算t%2lt(mod(t\,2)\,1)
如果mod(t\,2)<1
,返回1,否則返回0enable=lt(mod(t\,2)\,1)
每隔1s顯示一次水印,enable=lt(mod(t\,3)\,1)
每隔3s.
注意:逗號需要轉義
視頻九宮格
圖片來源於《FFmpeg從入門到精通》
ffmpeg -y -i C:\Users\Administrator\Desktop\video.mp4 -i C:\Users\Administrator\Desktop\video.mp4
-i C:\Users\Administrator\Desktop\video.mp4 -i C:\Users\Administrator\Desktop\video.mp4
-filter_complex "nullsrc=size=640x480[base];
[0:v]scale=320x240[topleft];
[1:v]scale=320x240[topright];
[2:v]scale=320x240[bottomleft];
[3:v]scale=320x240[bottomright];
[base][topleft]overlay=shortest=1[tmp1];
[tmp1][topright]overlay=shortest=1:x=320[tmp2];
[tmp2][bottomleft]overlay=shortest=1:y=240[tmp3];
[tmp3][bottomright]overlay=shortest=1:x=320:y=240"
-vcodec libx264 C:\Users\Administrator\Desktop\video_filtered.flv
nullsrc
創建畫布
最短的那條流決定了編碼時長
默認情況下,編解碼處理是處理完所有媒體流纔會結束的,也就是最長的那條流決定處理的時長。可以使用 -shortest參數指定最短的那條流決定處理時長。
比如要合併video.avi 和 audio.mp3,音頻audio.mp3時長比視頻video的短,現在要處理完音頻即退出,如下:
ffmpeg -i video.avi -i audio.mp3 -shortest output.mp4 //添加-shortest參數
此處overlay=shortest=1
,表示用作overlay的視頻流結束後,停止編碼(當然要所有用作overlay的視頻流都結束後纔會停止編碼),如果不指定該參數,編碼會永不停止,視頻後面會一直黑屏。
vframes 視頻截圖
ffmpeg -y -i C:\Users\Administrator\Desktop\video.mp4 -ss 00:00:4
-vframes 1 C:\Users\Administrator\Desktop\video.png
-ss
定位時間-vframes
限制輸出的視頻幀數
fps濾鏡定時截圖
ffmpeg -y -i C:\Users\Administrator\Desktop\haibao.mp4 -vf fps=1/2 C:\Users\Administrator\Desktop\haibao%d.png
fps
frame per seconds 幀率fps=1/2
每2s截圖1張 (可理解爲1/2張每s)fps=1
每1s截圖1張fps=2
每1s截圖2張
截取關鍵幀圖片
ffmpeg -y -i C:\Users\Administrator\Desktop\video.mp4
-vf "select='eq(pict_type,PICT_TYPE_I)'" -vsync vfr C:\Users\Administrator\Desktop\thumb%d.png
setpts視頻倍速處理
半速處理
ffmpeg -y -i C:\Users\Administrator\Desktop\video.mp4 -filter_complex "setpts=PTS*2"
C:\Users\Administrator\Desktop\video_.mp4
輸出的視頻文件的時長是原來的2 倍,播放速度當然是原來的1/2
setpts
更改輸入幀的PTS(顯示時間戳)。PTS*2
原來幀在PTS時 顯示,*2
讓幀延遲到PTS*2
時顯示
2倍速處理
ffmpeg -y -i C:\Users\Administrator\Desktop\video.mp4 -filter_complex "setpts=PTS/2"
C:\Users\Administrator\Desktop\video_.mp4
輸出的視頻文件的時長和原來一樣(好奇),播放速度當然是原來的2倍
本文將會持續更新,敬請關注
歡迎分享、轉載、聯繫、指正、批評、撕逼
Github:https://github.com/AnJiaoDe
簡書:https://www.jianshu.com/u/b8159d455c69
CSDN:https://blog.csdn.net/confusing_awakening
ffmpeg入門教程:https://www.jianshu.com/p/042c7847bd8a
微信公衆號
QQ羣