前提:在瀏覽視頻網(wǎng)站的時(shí)候构拳,突然想看看他們是怎么傳輸視頻流的,想扣下來(lái)慢慢欣賞
首先通過(guò)查看請(qǐng)求霞赫,發(fā)現(xiàn)每家視頻網(wǎng)站用的方式都不一樣腮介,例如:
tencent追劇:
非會(huì)員瀏覽視頻試看5分鐘:請(qǐng)求的會(huì)員的.m3u8
文件只包含5分鐘內(nèi)容的視頻內(nèi)容
免費(fèi)視頻:請(qǐng)求的.m3u8
文件里面包含了整個(gè)視頻信息
國(guó)外X:
請(qǐng)求了三份m3u8
文件绩脆,一份是完整的包含音頻視頻的萤厅,一份是有音頻無(wú)視頻的,一份是有視頻無(wú)音頻的靴迫。為什么要這么做呢惕味?
雖然.m3u8
的鏈接可以直接拿來(lái)播放,但是我想下載下來(lái)玉锌,怎么下載視頻呢名挥?
使用ffmpeg
就很方便,以下歸納常用命令
.m3u8
轉(zhuǎn)視頻
簡(jiǎn)單一些的命令: ffmpeg -i url.m3u8 -c copy target.mp4
多些配置項(xiàng):ffmpeg -i url.m3u8 -bsf:a aac_adtstoasc -c copy out2.mp4 -http_persistent 0
-bsf:a: bsf 表示 binary stream filter主守,即二進(jìn)制流過(guò)濾器禀倔,a 表示 audio榄融,指定音頻比特流過(guò)濾器
aac_adtstoasc: 這是一個(gè)特定的比特流過(guò)濾器
-http_persistent 0: 禁用 HTTP 持久連接。默認(rèn)情況下救湖,ffmpeg 可能會(huì)嘗試使用持久連接來(lái)減少重新建立連接的開銷愧杯。但在某些情況下,特別是當(dāng)服務(wù)器不支持或限制持久連接時(shí)鞋既,禁用它可能是有益的
合并音頻和視頻
簡(jiǎn)單一些: ffmpeg -i video_without_audio.mp4 -i audio_only.aac -c copy target.mp4
多些配置:ffmpeg -i video_without_audio.mp4 -i audio_only.aac -c:v copy -c:a aac -strict experimental -map 0:v:0 -map 1:a:0 output_video_with_audio.mp4
-strict experimental在某些版本的ffmpeg中可能是必要的力九,用于啟用AAC編碼。
-map選項(xiàng)用來(lái)指定要包含到輸出文件中的流
0:v:0:選擇第一個(gè)輸入文件(由 -i video_without_audio.mp4 指定)中的第一個(gè)視頻流(索引為0)邑闺。這里的 0 表示輸入文件的索引(從0開始)跌前,v 表示視頻流,0 表示視頻流的索引陡舅。
1:a:0:選擇第二個(gè)輸入文件(由 -i audio_only.aac 指定)中的第一個(gè)音頻流(索引為0)抵乓。這里的 1 表示第二個(gè)輸入文件的索引,a 表示音頻流靶衍,0 表示音頻流的索引灾炭。
通過(guò)這兩個(gè) -map 選項(xiàng),你確保了在輸出文件 output_video_with_audio.mp4 中只包含了第一個(gè)輸入文件的視頻流和第二個(gè)輸入文件的音頻流摊灭。
添加水印
ffmpeg -i out2.mp4 -i out.jpg -filter_complex "overlay=main_w-overlay_w-10:main_h-overlay_h-10" output_with_watermark.mp4
-filter_complex: 用于指定復(fù)雜的濾鏡鏈咆贬。verlay=main_w-overlay_w-10:main_h-overlay_h-10 是 overlay 濾鏡的參數(shù),用于指定水印的位置帚呼。這里,水印被放置在距離視頻右邊和底部各 10 像素的位置
ffmpeg -i out2.mp4 -i out.jpg -filter_complex "overlay=10:10" output_with_watermark.mp4
overlay=10:10 會(huì)將水印放置在視頻的左上角
水印進(jìn)階:設(shè)置水印圖片大小先
ffmpeg -i out2.mp4 -i out.jpg -filter_complex "[1:v]scale=64:48[watermark];[0:v][watermark]overlay=30:10[out]" -map "[out]" output.mp4
[1:v]選擇第二個(gè)文件流皱蹦,也就是out.jpg煤杀,
scale=64:48[watermark],scale濾鏡將上述的圖片設(shè)置比例沪哺,然后取名為watermark沈自,方便后面用。
[0:v]選擇第一個(gè)視頻流辜妓,
[watermark]overlay=30:10選擇上述設(shè)置尺寸的watermark枯途,使用overlay 濾鏡放在主視頻的左邊30,上邊10的位置
[out] 給輸出流取個(gè)名字為out籍滴。 -map "[out]" 是在有多個(gè)輸出進(jìn)行選擇時(shí)有用酪夷,上面使用比較多余
新版都是使用filter_complex
濾鏡, 舊版是movie
濾鏡
ffmpeg -i input.mp4 -vf "movie=logo.png,scale=64:48[watermask];[in][watermask] overlay=30:10 [out]" output.mp4
刪除水印
ffmpeg -i output.mp4 -vf "delogo=x=30:y=10:w=64:h=48" output_without_logo.mp4
-vf 用于指定一個(gè)或多個(gè)視頻濾鏡,并通過(guò)一個(gè)冒號(hào)分隔的列表來(lái)組織它們孽惰;delogo濾鏡晚岭,xy是水印位置, wh是水印尺寸
想知道視頻水印在哪里勋功,可以先截取一幀坦报,再到圖片上量一量库说?
截取視頻中的一幀圖
ffmpeg -i url.mp4 -ss 00:00:50 -frames:v 1 out.jpg
-frames:v 是 FFmpeg 命令中用于設(shè)置輸出視頻幀數(shù)的參數(shù)的簡(jiǎn)寫。它與 -vframes 功能相同片择,都是設(shè)置輸出的視頻幀數(shù)
合并多段視頻
ffmpeg -f concat -i inputs.txt -c copy out.mp4 // txt文件里就是多段視頻潜的,格式為:file '1.mp4'
我們知道.m3u8
文件里面是多段.ts
或者.m4s
文件url,那怎么將一段.ts
切割成含有多段.ts
的.m3u8
文件呢
ffmpeg -i input.ts -codec copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 10 output%03d.ts
-map 0:選擇所有輸入流字管,
-f segment:指定輸出格式為segment夏块,這將生成多個(gè)片段文件。
-segment_list playlist.m3u8: 指定文件名纤掸,
-segment_time 10:設(shè)置每個(gè)片段的時(shí)長(zhǎng)為10秒
output%03d.ts:輸出片段文件的模板脐供。%03d是一個(gè)占位符,用于自動(dòng)插入從000開始的遞增數(shù)字
也可以直接將mp4
轉(zhuǎn)為m3u8
ffmpeg -i input.mp4 -codec:copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 10 output%03d.ts
當(dāng)然也可以先將mp4
轉(zhuǎn)為ts
文件
ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb output.ts
匯總-codec
看了以上的這么多命令借跪,重復(fù)率最高的-c copy
, -c:a copy
等等相似的命令有必要總結(jié)一下
-acodec copy = -c:a copy 表示復(fù)制音頻流而不重新編碼政己。還可以這樣寫-acodec:copy
-c:a aac表示將音頻流編碼為AAC格式
-c:s copy 來(lái)復(fù)制字幕流
-vcodec copy = -c:v copy表示復(fù)制視頻流而不重新編碼 -vcodec:copy
-codec copy = -c copy 表示復(fù)制所有信息不重新編碼 -codec:copy
抽取音頻
ffmpeg -i url.m3u8 -vn -acodec copy audio_only.aac
ffmpeg -i url.mp4 -vn -c:a copy audio_only.aac
-vn選項(xiàng)表示“無(wú)視頻”,
抽取視頻流
ffmpeg -i url.mp4 -an -c:v copy video_only.mp4 // 或者是video_only.h264格式
-an選項(xiàng)表示“無(wú)音頻”
通過(guò)以上的命令掏愁,可以很明顯發(fā)現(xiàn)一些簡(jiǎn)單命令的通用性歇由,只要
ffmpeg -i
選中資源,直接抵達(dá)目標(biāo)就可以了
例如各種資源格式互轉(zhuǎn):直接-c
針對(duì)所有流:ffmpeg -i url.mp4 -c copy video.flv
當(dāng)然你想針對(duì)音頻視頻單獨(dú)處理成什么其他格式果港,也是可以的:ffmpeg -i url.mp4 -c:v copy -c:a copy video.flv
以上就是實(shí)踐ffmpeg
的一些常用命令沦泌,目前到網(wǎng)上轉(zhuǎn)個(gè)視頻用到這些命令也就足夠了