如何连续播放播放列表?

如何连续播放播放列表?

我有一个 20 秒长的视频文件。我把这个视频文件切成这样的片段

video_file_0 -> starts at 0:00, ends at 0:02
video_file_1 -> starts at 0:02, ends at 0:04
video_file_2 -> starts at 0:04, ends at 0:06
video_file_3 -> starts at 0:06, ends at 0:08
video_file_4 -> starts at 0:08, ends at 0:10
video_file_5 -> starts at 0:10, ends at 0:12
video_file_6 -> starts at 0:12, ends at 0:14
video_file_7 -> starts at 0:14, ends at 0:16
video_file_8 -> starts at 0:16, ends at 0:18
video_file_9 -> starts at 0:18, ends at 0:20

所以我的问题是,如何在单个窗口中连续播放这些视频文件,就像从 0:00 到 0:20 播放整个视频文件一样,而无需在每次切换视频文件时关闭并重新打开窗口。我可以使用 ffplay、ffmpeg 或 vlcj 来实现此功能吗?

我试过

find -type f -name "video_file_*" | while read f; do ffplay -autoexit -- "$f"; done

但是这段代码会关闭并重新打开每个视频文件之间的窗口,我不希望这样。我怎样才能做到这一点?

编辑:我正在构建一个 Java 项目,其中的流显示在 JFrame 内。所以我希望这个功能显示在 JFrame 内。

答案1

如何mpv --gapless-audio=yes --loop-playlist=inf video_file_*启用无缝播放手册中记录:

--gapless-audio=<no|yes|weak>

尝试播放连续的音频文件,在文件更改时没有静音或中断。默认值:弱。

no:禁用无缝音频。

yes:使用为播放的第一个文件选择的参数打开音频设备,然后保持打开状态以进行无缝播放。这意味着,如果第一个文件的采样率较低,则后续文件可能会重新采样到相同的低采样率,从而导致音质下降。如果您播放具有不同参数的文件,请考虑使用 --audio-samplerate 和 --audio-format 等选项来明确选择共享输出格式。

weak:通常情况下,音频设备保持打开状态(使用最初初始化时使用的格式)。如果解码器输出的音频格式发生变化,音频设备将关闭并重新打开。
[...]

沿着:

--loop-playlist=<N|inf|force|no>, --loop-playlist

循环播放N次。值为 1 播放一次(默认),2 播放两次,依此类推。inf 表示永远。 no 与 1 相同并禁用循环。如果在命令行上指定了多个文件,则循环整个播放列表。--loop-playlist是相同的 --loop-playlist=inf

mpv还要注意不要在视频窗口中产生任何闪烁。

对于更长的 bu 合理的播放列表video_file_*可以用 替换(使用 的足够变体sort$(printf '%s\n' video_file_* | sort -V),但这不能处理空格和其他字符。

因此,使用find+xargs可以处理任何特殊字符(这可能仍然会令人窒息)多用途车本身)但会扰乱终端control 为交互控制,所以这里人为地用 来恢复</dev/tty

find -type f -name 'video_file_*' -print0 | sort -V -z | xargs -0 -- sh -c 'exec mpv </dev/tty --gapless-audio=yes --loop-playlist=inf -- "$@"'

注意:最新版本mpv已经重定向/dev/tty回自身。


更新:mpv有一个--wid=选项可以将自身嵌入到其他窗口中。因此,如果从已为此准备窗口的应用程序生成,则应用程序只需为其提供目标窗口的参数即可。来自手册:

--wid=<ID>

这告诉 mpv 附加到现有窗口。如果选择支持此选项的 VO,它将使用该窗口进行视频输出。 mpv 会将视频缩放到该窗口的大小,如果视频的宽高比不同,则会添加黑条进行补偿。

在 X11 上,ID 被解释为 X11 上的窗口。
[...]

因此,在 X11 上,不需要太多代码,可以使用xwininfo来检索窗口的 Window id,例如:0xdeadbeef,可以mpv --wid=0xdeadbeef ...将其嵌入到该窗口中。例如,它在简单的xterm.任何更高级的用途可能应该涉及嵌入库文件进入其他程序。这里还有指向 X11 的指针XReparentWindow(但mpv应该负责这样做):

相关内容