Как закрыть VLC изящно используя C # - PullRequest
1 голос
/ 24 мая 2019

Я использую систему наблюдения и хочу записать видео с некоторых камер видеонаблюдения на мой ПК.

Я могу получить запись, используя командную строку 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,

--qt-start-minimized

, которая запускает его в фоновых процессах, если я смотрю в диспетчере задач.

Мой код делает это,

foreach(Process process in Process.GetProcesses().Where(x => x.ProcessName == "vlc"))
{
    Process.GetProcessById(id).CloseMainWindow();
}

Однако VLC больше не имеет главного окна, поэтому оно не работает.

Если я это сделаю,

Process.GetProcessById(id).Kill();

Видео будет повреждено, потому что VLC не существует изящно.

Я пробовал другие методы Close, Dispose, но они не работают.

Мне кажется, мне нужно сначала развернуть эти окна перед вызовом CloseMainWindow или найти какой-то другой способзавершить их, или если в VLC есть возможность запускать новый файл каждые полчаса?

Ответы [ 3 ]

2 голосов
/ 24 мая 2019

попробуйте вызывать команды vlc через интерфейс RC (удаленная команда).Документация может быть найдена здесь: https://wiki.videolan.org/documentation:modules/rc/ Если вы запускаете vlc с удаленными командами, вы можете затем отправить через websocked команду, чтобы остановить запись или закрыть vlc.

Попробуйте добавить в вашу команду

- intf rc --rc-host = "my-ip: my-port" --rc-quiet --rc-extended

Список доступных команд::

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 с использованием терминала .

Пример использования: http://sureskumar.com/RemoteVLC/#examples (код Arduino, но легко понять)

0 голосов
/ 25 мая 2019

Спасибо 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 и catch и т. Д. Будет больше тестировать, но пока работает хорошо.

0 голосов
/ 24 мая 2019

"Убить - это единственный способ завершить процессы, которые не имеют графических интерфейсов."

Таким образом, в принципе, единственный шанс, что вы должны выполнить эту работу, это проверить, если процесс VLC предлагает способ управления им в фоновом режиме : таким образом, вы можете сначала остановить процесс записи и , а затем завершить процесс .

Я не знаю, какие функции он предоставляет, но Вы могли бы сделать это с VLC HTTP-интерфейсом или, возможно, проверить некоторые dbus команды?

...