如何有效地使用 ffplay 和 -bsf?

如何有效地使用 ffplay 和 -bsf?

我正在使用 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。

该脚本需要执行以下三个步骤:

  1. 使用所需参数运行 ffmpeg 并将结果写入临时文件
  2. 在临时文件上运行 ffplay
  3. 删除临时文件。

您可以使用任何类型的脚本语言。您没有说明您的操作系统,但我使用的是 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 -

相关内容