我正在尝试在 python 或 shell 中创建任何类型的命令来从正在播放或在 vlc 上流式传输的视频中提取一个特定的帧。
想象一下这样一个场景:我有一个视频文件,我在 VLC 上打开它并点击播放。我用 python 或 shell 命令提取遇到的第一帧,进行一些处理,处理完成后,我在视频到达的确切时间捕获另一帧。
老实说,如果我甚至可以让 VLC 为我提供我正在播放的视频的当前“时间”(电影中我们经历了多少小时:分钟:秒或任何时间),那就可以了,我可以使用 ffmpeg。
我正在运行 linux 14.04。
答案1
如果我甚至可以让 VLC 为我提供我正在播放的视频的当前“时间”......
这个可以的,VLC提供了很多接口,我们用telnet吧。
步骤 1:在 VLC 中启用 telnet
一次性按需方式:
vlc --extraintf telnet --telnet-port 4212 --telnet-password "foobar" video_file_to_play.avi
或永久配置。运行 VLC,工具->优先(或Ctrl+ P),则:
和
注意:此永久方法需要您重新启动 VLC。
第 2 步:测试
现在,您可以使用 telnet 控制 VLC。出现提示时,输入正确的密码。示例:
$ telnet localhost 4212
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
VLC media player 2.2.2 Weatherwax
Password:
Welcome, Master
> get_time
30
>
如您所见,检索当前播放时间的命令是get_time
。输入help
以了解更多 VLC 命令,quit
退出。也许您会发现snapshot
它很有用。
步骤 3:在脚本中使用
相当简单的管道。这里我使用nc
而不是telnet
(这foobar
是我的密码,请使用您的密码):
printf '%s\n' "foobar" "get_time" | nc localhost 4212
我的 VLC 返回:
VLC media player 2.2.2 Weatherwax Password: ���� Welcome, Master 87 > Bye-bye!
所以我使用head
和tail
仅提取相关行:
printf '%s\n' "foobar" "get_time" | nc localhost 4212 | head -n 4 | tail -n 1
不幸的是时间分辨率是 1 秒。我还没有找到检索当前帧号的命令。