使用pytube库下载YouTube视频播放无声音问题求助
问题根因
- 代码中
yt.streams.filter(progressive=True)这行没有接收返回值,过滤逻辑完全没有生效 - 你手动选择的itag 399是DASH格式的纯视频流,本身就没有封装音轨,下载后播放自然没有声音
YouTube的媒体流分为两类:
- 渐进式流(progressive):音视频封装在同一个文件里,最高分辨率为720P,下载后可以直接正常播放
- DASH自适应流:视频轨、音轨分开存储,1080P及以上分辨率的内容全部采用这种格式,单独下载任意一个轨道都无法得到带声音的完整视频,必须分别下载后合并。
解决方法
方案1:直接下载音视频合并的渐进式流(无需额外工具,最高支持720P)
直接修改下载函数,从过滤后的渐进式流中选择最高分辨率的资源下载即可,替换后的download函数代码:
def download(): # 过滤音视频合并的流,按分辨率降序选第一个 stream = yt.streams.filter(progressive=True).order_by('resolution').desc().first() print("\nProcessing Your Request, Please Wait...\n") stream.download(output_path="C:\\Users\\samsk\\Downloads\\Youtube\\") print("\nDownload Complete :) \n")
如果需要指定分辨率,也可以在filter中增加参数,比如filter(progressive=True, res="720p")即可固定下载720P的带声视频。
方案2:高分辨率视频下载+音轨合并(支持1080P及以上画质)
如果需要1080P及更高清的视频,需要分别下载对应画质的视频轨、最高码率的音轨,再通过ffmpeg合并,操作步骤如下:
- 安装python依赖:执行
pip install ffmpeg-python,同时在本地安装ffmpeg并配置到系统环境变量 - 将download函数替换为如下逻辑:
import ffmpeg import os def download(): save_path = "C:\\Users\\samsk\\Downloads\\Youtube\\" print("\nProcessing Your Request, Please Wait...\n") # 下载itag=399的1080P纯视频轨 video_stream = yt.streams.get_by_itag(399) temp_video = video_stream.download(output_path=save_path, filename="temp_video.mp4") # 下载最高码率的音轨 audio_stream = yt.streams.filter(only_audio=True).order_by('abr').desc().first() temp_audio = audio_stream.download(output_path=save_path, filename="temp_audio.mp4") # 无损合并音视频 video_input = ffmpeg.input(temp_video) audio_input = ffmpeg.input(temp_audio) output_file = os.path.join(save_path, f"{yt.title}.mp4") ffmpeg.output(video_input, audio_input, output_file, vcodec="copy", acodec="copy").run(overwrite_output=True) # 清理临时文件 os.remove(temp_video) os.remove(temp_audio) print("\nDownload Complete :) \n")
内容的提问来源于stack exchange,提问作者skywalkerSam
相关产品推荐
相关产品推荐

