我正在运行监视系统,并希望将某些CCTV摄像机的视频录制到我的PC中。
我可以像这样使用VLC命令行进行录制,
vlc rtsp://*username*:*password*@192.168.1.60:554/ch01/0 --qt-start-minimized --sout=#transcode{ab=128,channels=2,samplerate=44100,scodec=none}:file{dst=D:\CCTV\Concord\2019_05_24\2019-05-24_2111_C1.mp4,no-overwrite}
但是我想每半小时停止并重新开始录制,以便获得足够小的文件以供使用。
我编写了一个C#应用程序来执行此操作,它只是杀死了所有VLC进程并启动了新的VLC进程。它由任务调度程序在半小时内触发。
当我运行任务栏中显示的正常VLC实例时,此方法有效。但是,我希望它们不会妨碍系统托盘的放置。我可以通过添加此VLC选项来做到这一点,
--qt-start-minimized
如果我在任务管理器中查看,它将在后台进程中运行。
我的代码可以做到
foreach(Process process in Process.GetProcesses().Where(x => x.ProcessName == "vlc"))
{
Process.GetProcessById(id).CloseMainWindow();
}
但是VLC不再有主窗口,所以它不起作用。
如果我这样做,
Process.GetProcessById(id).Kill();
由于VLC不正常存在,导致视频损坏。
我尝试了其他方法“关闭”,“处置”,但它们不起作用。
在我看来,我需要在调用CloseMainWindow之前首先最大化这些窗口,或者找到其他退出它们的方法,或者在VLC中是否有每半小时启动一个新文件的选项?
答案 0 :(得分:2)
尝试使用RC(远程命令)接口调用vlc命令。 文档可以在这里找到:https://wiki.videolan.org/documentation:modules/rc/ 如果您使用远程命令启动vlc,则可以通过websocked发送命令以停止录制或关闭vlc。
尝试添加到您的命令
-intf rc --rc-host =“ my-ip:my-port” --rc-quiet --rc-extend
可用命令列表为:
longhelp
+----[ Remote control commands ]
|
| add XYZ . . . . . . . . . . . . add XYZ to playlist
| enqueue XYZ . . . . . . . . . queue XYZ to playlist
| playlist . . . . . show items currently in playlist
| play . . . . . . . . . . . . . . . . . . play stream
| stop . . . . . . . . . . . . . . . . . . stop stream
| next . . . . . . . . . . . . . . next playlist item
| prev . . . . . . . . . . . . previous playlist item
| goto . . . . . . . . . . . . . . goto item at index
| repeat [on|off] . . . . toggle playlist item repeat
| loop [on|off] . . . . . . . . . toggle playlist loop
| random [on|off] . . . . . . . toggle random jumping
| clear . . . . . . . . . . . . . . clear the playlist
| status . . . . . . . . . . . current playlist status
| title [X] . . . . . . set/get title in current item
| title_n . . . . . . . . next title in current item
| title_p . . . . . . previous title in current item
| chapter [X] . . . . set/get chapter in current item
| chapter_n . . . . . . next chapter in current item
| chapter_p . . . . previous chapter in current item
|
| seek X . . . seek in seconds, for instance `seek 12'
| pause . . . . . . . . . . . . . . . . toggle pause
| fastforward . . . . . . . . . set to maximum rate
| rewind . . . . . . . . . . . . set to minimum rate
| faster . . . . . . . . . . faster playing of stream
| slower . . . . . . . . . . slower playing of stream
| normal . . . . . . . . . . normal playing of stream
| f [on|off] . . . . . . . . . . . . toggle fullscreen
| info . . . . . information about the current stream
| stats . . . . . . . . show statistical information
| get_time . . seconds elapsed since stream's beginning
| is_playing . . . . 1 if a stream plays, 0 otherwise
| get_title . . . . . the title of the current stream
| get_length . . . . the length of the current stream
|
| volume [X] . . . . . . . . . . set/get audio volume
| volup [X] . . . . . . . raise audio volume X steps
| voldown [X] . . . . . . lower audio volume X steps
| adev [X] . . . . . . . . . . . set/get audio device
| achan [X]. . . . . . . . . . set/get audio channels
| atrack [X] . . . . . . . . . . . set/get audio track
| vtrack [X] . . . . . . . . . . . set/get video track
| vratio [X] . . . . . . . set/get video aspect ratio
| vcrop [X] . . . . . . . . . . . set/get video crop
| vzoom [X] . . . . . . . . . . . set/get video zoom
| snapshot . . . . . . . . . . . . take video snapshot
| strack [X] . . . . . . . . . set/get subtitles track
| key [hotkey name] . . . . . . simulate hotkey press
| menu . . [on|off|up|down|left|right|select] use menu
|
| @name marq-marquee STRING . . overlay STRING in video
| @name marq-x X . . . . . . . . . . . .offset from left
| @name marq-y Y . . . . . . . . . . . . offset from top
| @name marq-position #. . . .relative position control
| @name marq-color # . . . . . . . . . . font color, RGB
| @name marq-opacity # . . . . . . . . . . . . . opacity
| @name marq-timeout T. . . . . . . . . . timeout, in ms
| @name marq-size # . . . . . . . . font size, in pixels
|
| @name logo-file STRING . . .the overlay file path/name
| @name logo-x X . . . . . . . . . . . .offset from left
| @name logo-y Y . . . . . . . . . . . . offset from top
| @name logo-position #. . . . . . . . relative position
| @name logo-transparency #. . . . . . . . .transparency
|
| @name mosaic-alpha # . . . . . . . . . . . . . . alpha
| @name mosaic-height #. . . . . . . . . . . . . .height
| @name mosaic-width # . . . . . . . . . . . . . . width
| @name mosaic-xoffset # . . . .top left corner position
| @name mosaic-yoffset # . . . .top left corner position
| @name mosaic-offsets x,y(,x,y)*. . . . list of offsets
| @name mosaic-align 0..2,4..6,8..10. . .mosaic alignment
| @name mosaic-vborder # . . . . . . . . vertical border
| @name mosaic-hborder # . . . . . . . horizontal border
| @name mosaic-position {0=auto,1=fixed} . . . .position
| @name mosaic-rows #. . . . . . . . . . .number of rows
| @name mosaic-cols #. . . . . . . . . . .number of cols
| @name mosaic-order id(,id)* . . . . order of pictures
| @name mosaic-keep-aspect-ratio {0,1} . . .aspect ratio
|
| help . . . . . . . . . . . . . . . this help message
| longhelp . . . . . . . . . . . a longer help message
| logout . . . . . . . exit (if in socket connection)
| quit . . . . . . . . . . . . . . . . . . . quit vlc
|
+----[ end of help ]
此问题与您的问题相似,并且此特定答案说明了为什么CTRLC不是正确的关闭方法:VLC screen capture using terminal。
用法示例:http://sureskumar.com/RemoteVLC/#examples(Arduino代码,但易于理解)
答案 1 :(得分:0)
“杀死是终止没有图形界面的进程的唯一方法。”
因此,基本上,要做这项工作的唯一机会是检查VLC进程是否提供在后台运行时对其进行控制的方法:这样,您可以首先停止录音过程,然后然后终止该过程。
我不知道它提供了什么功能,但是您可以使用VLC HTTP interface来做到这一点,还是可以检查一些dbus
命令?
答案 2 :(得分:0)
感谢Norcino,您的解决方案效果很好。我添加了您提到的选项,
-I rc --rc-host=192.168.1.4:10001 --rc-quiet
然后我的C#看起来像这样
KillSingleInstance(10001);
public void KillSingleInstance(int port)
{
List<byte> ip = new List<byte>();
ip.Add(192);
ip.Add(168);
ip.Add(1);
ip.Add(4);
IPAddress ipAddress = new IPAddress(ip.ToArray());
IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);
Socket sender = new Socket(ipAddress.AddressFamily,
SocketType.Stream, ProtocolType.Tcp);
sender.Connect(remoteEP);
byte[] msg = Encoding.ASCII.GetBytes("quit\n");
sender.Send(msg);
sender.Shutdown(SocketShutdown.Both);
sender.Close();
}
VLC实例完全在后台运行。
此外,它还具有try and catch块等功能。它将进行更多测试,但到目前为止效果很好。