現在大部分是視頻網站都是用m3u8的形式播放視頻。要注意的是其實m3u8本身並不是視頻文件,而是一個視頻文件的目錄索引而已,它規定了分段視頻的播放順序,所以即使下載m3u8文件是不能直接播放視頻的,那我們要怎么做才能得到可以直接播放過的視頻文件呢?
安裝ffmpeg
mac
brew install ffmpeg // 安裝ffmpeg(可能報錯無法連接外網資源)
curl -O https://evermeet.cx/ffmpeg/ffmpeg-4.4.zip //安裝ffmpeg(直接官網下載ffmpeg-4.4,本地解壓后的可執行文件直接使用)
linux
apt install ffmpeg
m3u8轉mp4
遠程的m3u8以mp4保存到本地
(本方法親測過,推薦使用)
ffmpeg -i "https://xx.xx.com/xxxxxxxx/index.m3u8" -c copy ~/video/out.mp4
本地資源轉mp4
(本方法沒有全部測試完,建議自行測試下)
(需要注意有的m3u8文件中分段視頻可能不是ts后綴結尾的,有的是可以直接改后綴名即可)
curl -O https://xxx.com/index.m3u8
sh ts_download.sh //執行ts文件下載腳本
sh ts_merge.sh //執行ts文件合並腳本,得到new.ts
ffmpeg -i new.ts -c:v copy -c:a libfaac out.mp4 //ts轉mp4
ffmpeg -i new.ts -c:v libx264 -crf 24 -c:a libfaac out.mp4 //ts轉mp4
ts_download.sh
while read myline
do
if [[ $myline =~ "http" ]]
then
# 下載所有ts文件
right=${myline##*/}
curl -o ts/${myline##*/} $myline
echo "LINE : ${right} "
else
continue
fi
done < index.m3u8
ts_merge.sh
all_str=""
while read myline
do
if [[ $myline =~ "http" ]]
then
# ts文件順序(按index.m3u8的順序合並,這里只讀取文件名就好)
right=${myline##*/}
echo "LINE : ${right} "
all_str=$all_str" "${right}
else
continue
fi
done < index.m3u8
# 將多個ts文件合並成一個(eg: cat 111.ts 222.ts > new.ts)
touch new.ts
cd ts
cat $all_str > ../new.ts