如何使用C#

时间:2019-05-24 10:41:18

标签: c# .net-core vlc

我正在运行监视系统,并希望将某些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中是否有每半小时启动一个新文件的选项?

3 个答案:

答案 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块等功能。它将进行更多测试,但到目前为止效果很好。