腳本一:Youtube影片獲取 (Continued...)
3) 合并音視頻
? ? 上文中,我們成功把Youtube上1080p的視頻和128kbps的音頻下載了下來,文件名分別是v1080p.webm和audio.mp4,接下來的任務(wù)就是用python把他們合成一個有畫面有聲音的高清影片。這里就需要使用一個跨平臺的高性能音視頻處理工具FFmpeg,它有非常強大的功能包括視頻采集功能、視頻格式轉(zhuǎn)換、視頻抓圖、給視頻加水印,加字幕等。FFmpeg包括其原創(chuàng)強大的libavcodec庫都是開源的,提供基于命令行的可執(zhí)行文件進行使用,同時也提供庫功能供程序內(nèi)部使用。更加詳細的信息可以訪問主頁:https://ffmpeg.org/ 。由于其功能之強大,除了合并視頻,后面還會有不少使用它的機會。首先我們先確保環(huán)境里安裝了FFmpeg:
安裝FFmpeg
$ ffmpeg -version
ffmpeg version N-107626-g1368b5a725-tessus Copyright (c) 2000-2022 the FFmpeg developers ...
? ? 如沒有打印出版本信息,那我們需要先進行安裝,各個操作系統(tǒng)的安裝包,可執(zhí)行文件和源碼都可以在官網(wǎng)下載到:
https://ffmpeg.org/download.html
Ubuntu,Debian的用戶可以直接使用apt-get下載安裝:
$ sudo apt-get install ffmpeg
? ? MacOS用戶可以在https://evermeet.cx/ffmpeg/中直接下載bin文件,解壓后得到ffmpeg和ffprobe兩個文件,保存到合適位置比如~/opt/ffmpeg/bin/。建議同時配置系統(tǒng)默認路徑,具體做法就是打開~/.bash_profile文件:
vim ~/.bash_profile
? ?在該文件的最后添加一句:
export PATH="/Users/你的用戶名/opt/ffmpeg/bin:$PATH"
? ? 其他操作系統(tǒng)的用戶請參考官網(wǎng)下載安裝,這里不詳述了。
合并影片
? ? 回到合并影片,剛剛說到FFmpeg提供系統(tǒng)執(zhí)行和程序調(diào)用兩種方式,但嘗試下來程序調(diào)用功能還是比較有限,所以我們使用系統(tǒng)執(zhí)行的方式,好在Python可以很方便地調(diào)用OS來執(zhí)行外部應(yīng)用軟件。為了測試功能,我們先直接在命令行中執(zhí)行一句ffmpeg指令合并v1080p.webm和audio.mp4兩個文件,并生成一個叫做"v1080p+audio.mp4"的文件:
$ ffmpeg -y -i v1080p.webm -i audio.mp4 -shortest v1080p+audio.mp4
? ?接下來會有很多的打印,來顯示視頻處理的過程,具體打印內(nèi)容我們可以忽略,只要耐心等待一段時間(取決于計算機處理性能),執(zhí)行完成后,就可以在同目錄下找到“v1080p+audio.mp4”文件,播放,你會發(fā)現(xiàn)音視頻合并完成!
? ?命令行執(zhí)行成功后,我們就可以把它集成到我們的Python代碼里,讓合并功能自動執(zhí)行,代碼也是非常簡單:
import os
os.system("ffmpeg -y -i v1080p.webm -i audio.mp4 -shortest v1080p+audio.mp4")
? ?由于我們并不能確定Youtube分辨率最高的影片究竟有沒有包含acode即音軌,因此在搬運實戰(zhàn)中可以在代碼中對該stream的字典里查詢acode是否存在,或?qū)λ姓业降淖罡叻直媛视捌宦啥己喜udio stream,由于即使stream里有acode,它和audio stream的聲音也是一樣的,所以合并并不會影響聲音播放。
? ?另外,真正實戰(zhàn)中對于ffmpeg指令中的文件名也可以用字符串拼裝來靈活處理輸入輸出文件,如:
fmpeg_command = "ffmpeg -y -i %s -i %s -shortest %s" % (video_input, audio_input, file_output)
os.system(ffmpeg_command)
? ?順便提一句,掌握了油管的下載,有興趣的話也是可以建一個小站,專門提供油管視頻的下載服務(wù),以后可能我會出一期搭建這種小站的文章,具體就如這種:

? ?下一篇,我們將示范如何進行Youtube頻道相關(guān)的操作。
進入下一篇:《躺著就能漲粉?Python自動化短視頻搬運(三)|頻道監(jiān)測》
返回上一篇:《躺著就能漲粉?Python自動化短視頻搬運(一)|下載影片》
本篇和上篇合并用到的代碼
import os
from pytube import YouTube
def download_complete_handler(stream, file_path):
print ("File: " + stream.title + "downloaded completed in " + file_path)
video = YouTube("https://www.youtube.com/watch?v=WZbKAFP1090",
on_complete_callback=download_complete_handler)
print("Video_title = " + video.title)
print("Video_author = " + video.author)
print("Video_length = " + str(video.length))
current_res = 0
stream_highest_res = video.streams[0]
for everystream in video.streams.filter(type="video"):
if int(everystream.resolution[:-1]) > 1080:
continue
if int(everystream.resolution[:-1]) > current_res:
current_res = int(everystream.resolution[:-1])
stream_highest_res = everystream
print("Highest stream: ", stream_highest_res)
stream_highest_res.download(filename='v1080p.webm')
stream_audio = video.streams.filter(type="audio", abr="128kbps")[0]
print(stream_audio)
stream_audio.download(filename='audio.mp4')
os.system("ffmpeg -y -i v1080p.webm -i audio.mp4 -shortest v1080p+audio.mp4")
merge_video.py