首页 > 解决方案 > 使用文件进行输入时无法设置 ffmpeg 标头

问题描述

我正在尝试为我的 ffmpeg命令设置标题(如此处所建议的):concat

ffmpeg \
    -f concat \
    -safe 0 \
    -protocol_whitelist file,http,https,tcp,tls \
    -headers $'Content-Type: audio/wav\r\n' \
    -i 'inputs.txt' \
    -c 'copy' 'output.wav' \
    -v trace

我的输入文件的结构如下:

file 'https://path/to/file1'
file 'https://path/to/file2'
file 'https://path/to/file3'

但是,当我运行命令时,ffmpeg 不会设置标头,如 -v 的输出所示:

[http @ 0x7fa133d01080] request: GET / HTTP/1.1
User-Agent: Lavf/58.20.100
Accept: */*
Range: bytes=0-
Connection: close
Host: localhost:3001
Icy-MetaData: 1

奇怪的是,如果我不是通过输入 txt 而只是通过 -i /path/to file(如下所示)设置我的输入,它就可以正常工作。

ffmpeg \
    -f concat \
    -safe 0 \
    -protocol_whitelist file,http,https,tcp,tls \
    -headers $'Content-Type: audio/wav\r\n' \
    -i 'https://google.com' \
    -c 'copy' 'output.wav' \
    -v trace

-v 的输出:

[https @ 0x7fed3ac03940] request: GET / HTTP/1.1
User-Agent: Lavf/58.20.100
Accept: */*
Range: bytes=0-
Connection: close
Host: google.com
Icy-MetaData: 1
Content-Type: audio/wav

不知道为什么通过文件读取输入会影响发送的标头。目前,解决方法是使用一个字符串连接所有输入(比我想要的有点混乱),但我很好奇是否有人可能知道为什么会发生这种情况。

更新:根据这篇文章,我必须通过文本文件读取输入,所以我回到了原点......

标签: bashshellffmpeg

解决方案


当单个输入被引导到 ffmpeg ( -i) 时,可以在其上设置各种选项,具体取决于输入阅读器允许和识别的内容。

但是,FFmpeg 本身并不从文本文件中读取输入列表。有一个名为 的定制模块concat demuxer,由 调用-f concat,它解析输入列表,打开每个文件并将它们连接起来。对于主要的 ffmpeg 管道,这是由 concat 模块生成的单个输入。并且 concat 模块不识别或继承用于文本文件中列出的单个文件的选项。所有列出的文件只能使用各自的解复用器/解码器/协议..等的默认参数打开。这是一个限制。您可以在 trac.ffmpeg.org 上打开功能请求来更改此设置。

您可以做的是直接读取所有输入。

ffmpeg \
    -headers $'Content-Type: audio/wav\r\n' \
    -i 'https://google1.com' \
    -headers $'Content-Type: audio/wav\r\n' \
    -i 'https://google2.com' \
    -headers $'Content-Type: audio/wav\r\n' \
    -i 'https://google3.com' \
    -headers $'Content-Type: audio/wav\r\n' \
    -i 'https://google4.com' \
    -filter_complex "[0][1][2][3]concat=n=4:v=0:a=1" \
    'output.wav'

对于 WAV 输入,重新编码为 WAV 不会降低质量。


推荐阅读