我在 Kubuntu 22.04 上使用 FFmpeg 6.0。
输出ffmpeg -hide_banner -buildconf
:
configuration:
--extra-libs=-lpthread
--enable-gpl
--enable-gnutls
--enable-libass
--enable-libfdk-aac
--enable-libfreetype
--enable-libmp3lame
--enable-libopus
--enable-libdav1d
--enable-libvorbis
--enable-libvpx
--enable-libx264
--enable-libx265
--enable-libpulse
--enable-nonfree
-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 中显示结果,同时能够查找它。
正如一些评论中提到的,由于您想在使用 ffplay 时进行查找,因此不能使用管道,但您必须让 ffmpeg.exe 写入一个临时文件,然后将其传递给 ffplay。
该脚本需要执行以下三个步骤:
您可以使用任何类型的脚本语言。你没有说明你的操作系统,但我在Windows上,所以最简单的方法是编写一个批处理文件,如下所示。
bsfplay.bat
创建一个在您最喜欢的文本编辑器中调用的文件复制粘贴以下代码并保存文件
请注意
%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,临时文件将被删除。这个 bash 脚本可以解决这个问题:
感谢@1NN 将我推向正确的方向。
您遇到的错误似乎与使用 ffplay 的 -bsf (比特流过滤器)选项有关。您使用的选项组合可能会导致输入 webm 文件出现问题。要有效地将 -bsf 与 ffplay 一起使用,您可以尝试以下操作:
ffmpeg -i input.webm -c:v 复制 -bsf:v name=param -c:a 复制 -f webm - | ffplay--