我正在使用 Kubuntu 22.04。
输出ffmpeg -hide_banner -buildconf
:
configuration:
--extra-libs=-lpthread
--enable-gpl
--enable-gnutls
--enable-libass
--enable-libfreetype
--enable-libmp3lame
--enable-libopus
--enable-libdav1d
--enable-libvpx
--enable-libx264
--enable-libx265
--enable-libpulse
--extra-cflags=-O3
--disable-debug
以下是我-bsf
在 ffplay 上有效使用的尝试:
ffmpeg -i input.webm -bsf:v name=param -c copy -f webm - | ffplay -
但在寻找时,它却像这样中断了:
[matroska,webm @ 0x7faf20000c80] Unknown element A3 at pos. 0x15009 with length 0x165 considered as invalid data. Last known good position 0x1e5, 20 unknown elements in a row
[matroska,webm @ 0x7faf20000c80] Unknown element 82 at pos. 0x1500c with length 0x4480fcd013b5 considered as invalid data. Last known good position 0x1e5, 1 unknown elements in a row
fd:: error while seeking
[matroska,webm @ 0x7faf20000c80] 0x00 at pos 101285 (0x18ba5) invalid as first byte of an EBML number
[matroska,webm @ 0x7faf20000c80] Unknown element A3 at pos. 0x1daa8 with length 0x134 considered as invalid data. Last known good position 0x1e5, 20 unknown elements in a row
[matroska,webm @ 0x7faf20000c80] Unknown element 82 at pos. 0x1daab with length 0x4480fcd1f714 considered as invalid data. Last known good position 0x1e5, 1 unknown elements in a row
fd:: error while seeking
怎样才能有效地做?
根据评论编辑:
OP 表示:管道的使用不是强制性的,管道是我尝试的解决方案。我需要的是使用 ffmpeg 的-bsf
选项,并在 ffplay 中显示结果,同时能够查找它。
答案1
正如一些评论中提到的,由于您想在使用 ffplay 时进行搜索,因此您不能使用管道,但您必须让 ffmpeg.exe 写入一个临时文件,然后将其传递给 ffplay。
该脚本需要执行以下三个步骤:
- 使用所需参数运行 ffmpeg 并将结果写入临时文件
- 在临时文件上运行 ffplay
- 删除临时文件。
您可以使用任何类型的脚本语言。您没有说明您的操作系统,但我使用的是 Windows,因此最简单的方法是编写批处理文件,如下所示。
bsfplay.bat
在您最喜欢的文本编辑器中创建一个名为复制粘贴以下代码并保存文件
ffmpeg.exe -i input.webm -bsf:v %1^=%2^=%3 -c copy temp.webm ffplay.exe temp.webm del temp.webm
请注意
%1
,、、 是批处理文件中将采用命令行参数的变量,并且%2
需要符号来转义。%3
^
=
现在,从命令提示符下,您可以执行类似以下操作
bsfplay remove_extra freq k
来调用-bsf
过滤器-bsf:v remove_extra=freq=k
或者,如果您的视频是 h.264,您可以这样做,
bsfplay h264_metadata crop_left 16
这将调用 bsf 过滤器裁剪视频左侧的 16 个像素并将其保存到临时文件中。然后 ffplay 将读取该文件。一旦您退出 ffplay,临时文件将被删除。
答案2
这个 bash 脚本可以达到这个目的:
ffmpeg -v warning -i "$1" -bsf:v "$2=$3=$4" -c copy "temp.${1##*.}"
ffplay "temp.${1##*.}"
rm "temp.${1##*.}"
感谢@1NN 为我指明正确的方向。
答案3
您遇到的错误似乎与使用 ffplay 的 -bsf(比特流过滤器)选项有关。您使用的选项组合可能会导致输入 webm 文件出现问题。要有效地将 -bsf 与 ffplay 结合使用,您可以尝试以下操作:
ffmpeg -i 输入.webm -c:v 复制 -bsf:v 名称=参数 -c:a 复制 -f webm - | ffplay -