ffmpeg设置多个headers参数

使用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。

### 使用 FFmpeg 与 EasyDarwin 进行音视频处理或流媒体传输 #### 配置无音频编码 当使用 FFmpeg 处理文件并准备将其推送到 EasyDarwin 流服务器时,可以利用 `-an` 参数来移除输出中的音频部分。此参数指示 FFmpeg 不包含任何音频数据到最终的输出文件中[^1]。 ```bash ffmpeg -i input.mp4 -an output_video_only.mp4 ``` 这段命令会读取 `input.mp4` 文件作为输入源,并创建一个新的名为 `output_video_only.mp4` 的文件,在这个过程中忽略了所有的音频轨道。 #### 设置全局头部信息 对于某些播放器来说,设置外部全局头(out-of-band global headers)可能是必要的,这可以通过添加 `-vglobal 1` 来实现。这种配置有助于提高兼容性和解析效率[^2]。 ```bash ffmpeg -i input.mp4 -an -vglobal 1 output_with_global_headers.mp4 ``` 这条指令不仅去除了音频还设置了视频流采用外挂式的全局头部信息。 #### 调整声道特性 如果用户不是专业的技术人员,则可以在运行 FFmpeg 前通过环境变量调整声道属性,比如反转左声道: ```bash export AUDIO_FLIP_LEFT=1 ``` 之后再执行 FFmpeg 编码操作即可应用这些更改[^3]。 #### 查询采样格式支持情况 为了更好地理解可用的声音样本格式及其位深,可查询 FFmpeg 支持的不同采样格式列表: ```bash ffmpeg -sample_fmts ``` 上述命令将会打印出一系列受支持的数据类型以及它们对应的字节宽度[^4]。 #### 推送至 EasyDarwin 要将本地多媒体资源推送至 EasyDarwin 平台,通常需要指定目标 URL 和相应的协议。假设已经有一个有效的 RTMP 地址用于直播服务,下面是一个简单的例子说明如何发送 H.264+AAC 编码的内容给 EasyDarwin: ```bash ffmpeg -re -i local_file.mp4 -c:v libx264 -c:a aac -f flv rtmp://your.easydarwin.server/live/stream_key ``` 这里的关键在于选择了合适的编解码器组合 (`libx264`, `aac`) 及封装形式(`flv`),并且指定了正确的网络地址来进行实时传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值