在 VLC 中记录 UDP 流的丑陋黑客。
Posted
技术标签:
【中文标题】在 VLC 中记录 UDP 流的丑陋黑客。【英文标题】:Ugly hack for recording a UDP stream in VLC. 【发布时间】:2015-11-16 08:19:20 【问题描述】:我最近不得不学习我相当生疏的编码知识来尝试创建一个简单的脚本来录制我们舞台摄像机的文档流,这样,您就可以不必整天呆在身边并制定繁琐的录制时间表了只需在调度程序中运行 show name 可执行文件,流就会被记录、重命名并传输到可公开访问的文件夹。
我在录制过程中遇到了一些问题,主要是确保脚本运行时不会出现任何问题。理想情况下,计算机不需要诸如 .setFocus 之类的选项来向 VLC 发送命令,因为,如果有人在 VLC 即将发送记录命令时取消选择 VLC 怎么办?
我在这里花了大约一周的时间研究后编写了这段代码,它非常简单,但我很感激所有关于如何优化它的反馈。显然,在我们找到专门的 api 程序员将东西与我们的硬件集成之前,这更像是一个 alpha 阶段,但我一直喜欢自动化任务。
import time, SendKeys, os
# Start VLC using a udp stream playlist file
from pywinauto.application import Application
app = Application().Start(
cmd_line=u'"C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc.exe" '
u'--started-from-file "C:\\Program Files (x86)\\VideoLAN\\VLC\\udp.xspf"')
qwidget = app.QWidget
qwidget.Wait('ready')
qwidget.SetFocus()
time.sleep(3)
# Record for 9000 seconds = 2h30m
SendKeys.SendKeys("+r")
time.sleep(9000)
# Quit VLC, leaving a non-corrupted .ts video file
app.Kill_()
# Ugly hack code for renaming the file. The folder is supposedly empty given that the code, if successful in
# creating a file here, must also be successful in moving the same file to the final directory.
# File is renamed with camera name, show name and date and time for the recording.
# The original naming format for VLC is something like
# vlc-record-2015-11-16-08h59m01s-udp___xxx.xxx.xxx.xxx_xxxx-.ts
# (Optimally I'd like to change the file output format to mp4 or similar, but couldn't figure out
# a way to use both Start from Playlist file and --sout options in the command line interface.
os.chdir(r"C:/VLC")
# Necessary?
FileName = str(os.listdir("C:/VLC"))[2:59]
ShowName = str("Swanlake")
os.rename(FileName, "Scenbild " + ShowName + " " + FileName[13:29] + ".ts")
# Using os.rename to move the renamed file to the new location.
NewFileName = str(os.listdir("C:/VLC"))[2:39]
OldFileLocation = str(r"C:/VLC/")
NewFileLocation = str(r"C:/videotest/svansjon/")
time.sleep(3)
os.rename(OldFileLocation + NewFileName, NewFileLocation + NewFileName)
【问题讨论】:
我不太确定您要做什么,请尝试澄清一下您的情况。如果你想让 VLC 在一段时间后停止,你可以传递 `--run-time=9000` 选项。 这正是我正在寻找的反馈!如何提高这种乱七八糟的意大利面条代码的效率。我会弄乱 --run-time 选项。 澄清一下:我实际上是在告诉 VLC 打开一个包含 udp 流地址的播放列表,将其录制一段给定的时间长度,然后停止录制。看到 VLC 在录制过程中关闭时会留下未损坏的文件,这似乎是最简单的方法。现在,脚本有效;我在脚本末尾得到一个重命名、移动和工作的视频文件,但 VLC 显示异常运行时终止。我会看看@aergistal 的建议是否会有所改善。 app.Kill_() 似乎是一种野蛮的工作方式...... 【参考方案1】:您可以在一行中完成。请注意,我使用的是 VLC 的控制台版本,我认为它在 Windows 上是 cvlc.exe
。该示例适用于 MPEG-TS
输入流:
cvlc <input> --play-and-exit --run-time 9000 \
--sout="#stdaccess=file,mux=ts,dst='/path/to/output.ts'"
您可以编写脚本来配置输入、持续时间、目标路径和文件名并直接在那里记录。
【讨论】:
太棒了。我刚刚开始搞乱this guide,但感谢您的澄清。当我想将流转码为 m4v 时,我仍然遇到 --sout 问题。显然不仅仅是 mux=mp4v... 你可以复用到mp4
。如果你真的想转码看wiki.videolan.org/Transcode以上是关于在 VLC 中记录 UDP 流的丑陋黑客。的主要内容,如果未能解决你的问题,请参考以下文章
如何构建一个包含图像的视差样式/可拉伸的表格视图标题,而不会出现丑陋的黑客攻击?