使用ffmpeg的过程中发现,有些音视频链接需要携带特定的headers参数才能访问,比如B站,否则会报错Error opening input files: Server returned 403 Forbidden (access denied)
。
只需要指定一个headers的时候还好办,直接-headers
后面加参数就好。可是有时候需要指定多个,要怎么写呢?寻找解决方法的过程中也踩了一些坑,这里记录一下。
在命令行终端运行
参考:【ffmpeg】ffmpeg如何设置header信息亲测
试了网上的各种方法连接headers各参数,都不行,后来才发现因为用的终端是Windows PowerShell,换成Git Bash这种支持Linux命令的就可以了。
解决方法:多个参数用$'\r\n'
连接。
示例:
ffmpeg -headers "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"$'\r\n'"Referer: https://www.bilibili.com/video/BV1gG41117jr/" -i "https://xy61x147x214x12xy.mcdn.bilivideo.cn:4483/upgcxcode/37/64/1370336437/1370336437-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1703229953&gen=playurlv2&os=mcdn&oi=975668002&trid=00000e260b88ef4b4dc5a48bb148bd04c8c3u&mid=0&platform=pc&upsig=485579f34c1f346d149e22f05052ff62&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&mcdnid=2003587&bvc=vod&nettype=0&orderid=0,3&buvid=&build=0&f=u_0_0&agrr=0&bw=5626&logo=A0000002" -c copy test.m4a
在代码中使用
在代码中运行ffmpeg时,上面的方法又失效了,可以把多个参数之间的连接改成\r\n
试看看。
Tips
上面示例中的源链接和headers,可以通过you-get或者yt-dlp获取(个人觉得yt-dlp速度比you-get快),B站的视频源链接获取后过一段时间会失效,所以每次使用都需要实时获取。
you-get:
import subprocess
import json
url = 'https://www.bilibili.com/video/BV1UN411V7qk/'
cmd = 'you-get --json ' + url
json_obj = json.loads(subprocess.check_output(cmd, shell=True))
print(json_obj)
yt-dlp:
import yt_dlp
ydl = yt_dlp.YoutubeDL()
url = 'https://www.bilibili.com/video/BV1UN411V7qk/'
video_info = ydl.extract_info(url, download=False)
pprint(video_info['formats'])
当然,如果只是需要下载视频到本地,这两个工具直接可以一行命令完成,不需要ffmpeg。