我有一个 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
应该负责这样做):
- 将属于我启动的独立进程的 X11 窗口嵌入到我自己的窗口中?
- XLib:通过正确翻译的弹出窗口重新设置 Java 窗口的父级(但据我所知,OP的目标是相反的)
xdotool
有一个windowreparent
命令。