Python 在VLC中记录UDP流的丑陋黑客。

Python 在VLC中记录UDP流的丑陋黑客。,python,stream,udp,vlc,recording,Python,Stream,Udp,Vlc,Recording,最近,我不得不学习我已经相当生疏的编码知识,尝试创建一个简单的脚本来记录我们舞台摄影机的文档流,这样,就不用有人整天呆在那里,创建繁琐的录制时间表,你只需在调度程序中运行show name可执行文件,就可以录制流,重命名并传输到可公开访问的文件夹 我在录制过程中遇到了一些问题,主要是在确保脚本运行时不会出错。最理想的情况是,计算机不需要像.setFocus这样的选项来向VLC发送命令,因为如果有人在VLC即将发送记录命令时取消选择VLC会怎么样 我在这里花了大约一周的时间做研究之后写了这段代码,

最近,我不得不学习我已经相当生疏的编码知识,尝试创建一个简单的脚本来记录我们舞台摄影机的文档流,这样,就不用有人整天呆在那里,创建繁琐的录制时间表,你只需在调度程序中运行show name可执行文件,就可以录制流,重命名并传输到可公开访问的文件夹

我在录制过程中遇到了一些问题,主要是在确保脚本运行时不会出错。最理想的情况是,计算机不需要像.setFocus这样的选项来向VLC发送命令,因为如果有人在VLC即将发送记录命令时取消选择VLC会怎么样

我在这里花了大约一周的时间做研究之后写了这段代码,这段代码非常简单,但是我非常感谢所有关于如何优化它的反馈。显然,在我们找到一个专门的api程序员将东西与硬件集成之前,这更像是一个阿尔法阶段,但我一直喜欢自动化任务

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的控制台版本,我认为它是Windows上的
cvlc.exe
。该示例适用于
MPEG-TS
输入流:

cvlc <input> --play-and-exit --run-time 9000 \
--sout="#std{access=file,mux=ts,dst='/path/to/output.ts'}"
cvlc——播放和退出——运行时\
--sout=“#std{access=file,mux=ts,dst=”/path/to/output.ts'}”

您可以制作一个脚本来配置输入、持续时间、目标路径和文件名,并直接在那里进行记录。

我不太确定您要做什么,请尝试澄清一下您的场景。如果你想让VLC在一段时间后停止,你可以通过`--run-time=9000`选项。这正是我想要的反馈!如何提高这种杂乱无章的意大利面代码的有效性。我将讨论--run-time选项。只是想澄清一下:我本质上是告诉VLC打开一个包含udp流地址的播放列表,录制一段给定的时间,然后停止录制。当VLC在记录中间关闭时,看到一个非损坏的文件,这看起来是最简单的方法。现在,剧本很管用;我在脚本末尾得到一个重命名、移动和工作的视频文件,但VLC显示异常的运行时终止。我会看看@aergistal的建议是否会有所改善。app.Kill_()似乎是一种野蛮的工作方式……太棒了。我刚开始胡闹,但谢谢你的澄清。当我想将流转码到m4v时,我仍然无法处理--sout。显然,这不仅仅是mux=mp4v…您可以将mux转换为
mp4
。如果你真的想转码看看