如何在Python中使用youtube_dl设置start_time和end_time下载视频片段
解决youtube_dl无法按指定时间片段下载的问题
你的代码里直接设置start_time和end_time无法生效,原因是这两个参数属于youtube_dl的下载阶段参数,部分视频网站不支持直接请求片段内容;另外当你启用FFmpegExtractAudio后处理器时,需要把截取逻辑传递给FFmpeg来完成后期裁剪,否则下载完整文件后只会转码而不截取。
下面是两种可行的修改方案:
方案一:通过FFmpeg后处理阶段截取(通用兼容所有网站)
直接在音频提取后处理器中添加FFmpeg的截取参数,确保转码时同时裁剪指定片段:
def download_video(i, url, start_time, end_time): # 计算截取时长 duration = end_time - start_time ydl_opts = { 'format': 'bestaudio/best', 'outtmpl': f'./media/{i}.%(ext)s', 'postprocessors': [{ 'key': 'FFmpegExtractAudio', 'preferredcodec': 'mp3', 'preferredquality': '192', # 添加FFmpeg截取参数:-ss 起始时间(秒),-t 时长(秒) 'postprocessor_args': [ '-ss', str(start_time), '-t', str(duration) ] }], 'logger': TerminalLogger(), 'progress_hooks': [download_finished_hook], } with youtube_dl.YoutubeDL(ydl_opts) as ydl: ydl.download([url])
方案二:下载阶段直接请求片段(仅支持部分网站)
如果目标网站支持HTTP范围请求,可以保留start_time和end_time,同时添加force_keyframes_at_cuts=True强制在截取点生成关键帧,避免播放异常:
def download_video(i, url, start_time, end_time): ydl_opts = { 'format': 'bestaudio/best', 'outtmpl': f'./media/{i}.%(ext)s', 'start_time': start_time, 'end_time': end_time, # 强制在截取位置生成关键帧,避免播放异常 'force_keyframes_at_cuts': True, 'postprocessors': [{ 'key': 'FFmpegExtractAudio', 'preferredcodec': 'mp3', 'preferredquality': '192', }], 'logger': TerminalLogger(), 'progress_hooks': [download_finished_hook], } with youtube_dl.YoutubeDL(ydl_opts) as ydl: ydl.download([url])
注意事项
start_time和end_time如果是整数秒直接传数字即可,需要精确到毫秒的话,传递字符串格式(比如'10.5')给FFmpeg参数。- 方案一兼容性最好,适合所有网站,但会先下载完整文件再裁剪;方案二节省流量,但依赖网站的片段下载支持。
内容的提问来源于stack exchange,提问作者icesoup
相关产品推荐
相关产品推荐

