如何获取youtube-dl合并后文件的扩展名及完整路径?
解决youtube-dl合并文件路径与扩展名的问题
一、获取合并后文件的完整路径
有两种可靠的方法可以拿到合并后的mkv文件路径:
方法1:利用进度钩子(Progress Hook)
你可以在ydl_opts里添加progress_hooks,监听下载完成的事件,此时就能直接获取到最终合并后的文件路径。代码示例如下:
import youtube_dl files_path = "/home/tmp/" video_url = "你的视频URL" def download_hook(d): if d['status'] == 'finished': # 这里的d['filename']就是合并后的完整文件路径 print(f"下载完成,文件路径:{d['filename']}") # 你可以在这里把路径存下来供后续使用 ydl_opts = { 'outtmpl': files_path + '%(id)s.%(ext)s', 'progress_hooks': [download_hook], } with youtube_dl.YoutubeDL(ydl_opts) as ydl: ydl.download([video_url])
当下载完成时,钩子函数会触发,d['filename']就是ffmpeg合并后生成的最终文件路径,完全符合你的需求。
方法2:下载后通过视频ID拼接路径(需确认合并格式)
如果已经知道合并后的格式是mkv(从日志里看到的),你也可以直接通过视频ID拼接路径:
# 先通过extract_info拿到视频ID with youtube_dl.YoutubeDL({}) as ydl: info = ydl.extract_info(video_url, download=False) video_id = info['id'] merged_file_path = f"{files_path}{video_id}.mkv"
不过这种方法有局限性——如果youtube-dl在某些情况下合并成其他格式(比如mp4),就会出错,所以还是钩子方法更稳妥。
二、解决extract_info返回扩展名与实际合并格式不符的问题
你遇到的这个情况是因为download=False时,extract_info返回的是原始流的信息(比如视频流是mp4格式),但youtube-dl会自动合并不同编码的视频和音频流,最终生成mkv格式的文件(这是youtube-dl的默认合并格式)。
要拿到合并后的实际格式,你可以这样做:
方法1:让extract_info模拟下载流程获取合并信息
可以在extract_info时利用prepare_filename方法,获取youtube-dl计划生成的文件名,里面包含了正确的扩展名:
ydl_opts = { 'outtmpl': files_path + '%(id)s.%(ext)s', } with youtube_dl.YoutubeDL(ydl_opts) as ydl: info = ydl.extract_info(video_url, download=False) # 用prepare_filename方法获取计划生成的文件名,包含正确的扩展名 planned_filename = ydl.prepare_filename(info) print(f"计划生成的文件路径:{planned_filename}")
这里的planned_filename会和实际下载后的文件路径一致,扩展名就是合并后的mkv。
方法2:下载完成后重新提取文件信息
如果已经完成下载,你可以直接读取文件的实际扩展名:
import os # 假设已经通过钩子拿到了merged_file_path file_ext = os.path.splitext(merged_file_path)[1][1:] # 拿到mkv print(f"实际文件扩展名:{file_ext}")
这样就能完美解决你遇到的两个问题啦!
内容的提问来源于stack exchange,提问作者pembrock
相关产品推荐
相关产品推荐

