Потоковая передача RTSP в веб-приложение (с использованием VLC 2.0)

Я работаю над веб-приложением, которое должно отображать потоковое видео с удаленного рабочего стола. Мы уже реализовали это с помощью ffmpeg / ffserver и flowplayer, перекодировав RTSP в формат .flv, но это очень хрупко, и мои исследования привели меня к использованию версии VLC для командной строки.

Мой вопрос: есть ли способ передать транскодированный RTSP (как OGG, RTP или другой формат) в браузер, избегая при этом использования флэш-памяти?

Я знаю, что тег не поддерживает потоковое видео в течение некоторого времени, но мне не удается найти согласованную документацию. Некоторые говорят, что вы можете напрямую передавать RTP, некоторые говорят, что вы никогда не сможете передавать поток через тег.

Кроме того, в настоящее время я тестирую все это на своем локальном сервере Apache.

Я предполагаю, что перекодировка будет выглядеть примерно так:

  • vlc -vvv rtsp: //xx.xx.xx.xx: 554 / vga.sdp --no-sout-audio --sout '#standard {access = http, mux = ogg, dst = http: // localhost / test_ogg.php} '

OR

  • vlc -vvv rtsp: //xx.xx.xx.xx: 554 / vga.sdp --no-sout-audio --sout '#transcode {vcodec = mp4v, acodec = mpga, vb = 400}: duplicate {dst = display, dst = rtp {mux = ts, dst = xxx.xxx.xx.xx, port = xxxx}} '

Спасибо - Мейсон


person MasonWinsauer    schedule 11.06.2012    source источник


Ответы (1)


Хорошо, поэтому решение, которое я искал, пришло в виде CVLC 2.0.1 [Console-only VLC], но также использовало возможности мультиплексирования ffmpeg.

Этот однострочный код транскодирует поток RTSP в FLV и отправляет его на мой локальный сервер через указанный порт.

cvlc rtsp://xxx.xxx.xxx.xxx:554/vga.sdp :sout='#transcode{vcodec=FLV1,vb=2048,fps=25,scale=1,acodec=none,deinterlace}:http{mime=video/x-flv,mux=ffmpeg{mux=flv},dst=127.0.0.1:8090/device_1.flv}' :no-sout-standard-sap :ttl=5 :sout-keep :no-audio --video --no-sout-audio 

Преимущества этого заключаются в том, что вам не нужно редактировать файл ffserver.conf каждый раз, когда поток изменяет разрешение, скорость передачи, частоту кадров и т. Д. - Только перезапуск этой одной строки, чтобы он мог повторно захватить поток. Кроме того, если поток имеет правильные спецификации, вам не нужны свойства vb= и fps=; Я бы использовал их только в том случае, если мне нужно было регулировать поток ради веб-страницы.

--network-caching - еще одна функция, которую я рассматривал, хотя она очень полезна в определенных ситуациях, но не нужна в моем случае.

Код Flowplayer выглядит примерно так:

<div style="width:1280px;height:720px;margin:10px" id="player_1"></div><script language="javascript">
flowplayer("player_1", {src: "/js/flowplayer-3.2.7.swf", wmode:"transparent"},{
clip: {
  url: 'http://127.0.0.1:8090/device_1.flv',
  autoPlay: true,
  autoBuffering: true,
  live: true,
  bufferLength:0
}, 
plugins: { 
   controls: { 
      all: false,
      scrubber: true,
      play: true, 
      fullscreen: true, 
      time: false,
      width: '100%',
      opacity: 0.8,
      tooltips: {
        buttons: true,
        fullscreen: 'Enter fullscreen mode'
    }
   }
} 
});

Hope this helps any viewers running into similar issues!

Мейсон

person MasonWinsauer    schedule 18.07.2012
comment
спасибо за пост, я новичок в потоковой передаче, так как это было большим подспорьем. когда вы используете эту строку: http{mime=video/x-flv,mux=ffmpeg{mux=flv},dst=127.0.0.1:8090/device_1.flv} создает ли cvlc сервер? что произойдет, если у вас будет несколько потоков? - person zcaudate; 31.07.2012
comment
Насколько я понимаю, это однострочный код, который перекодирует "на лету" без необходимости в сервере. Он МОЖЕТ создать виртуальный сервер в фоновом режиме, но я не видел никаких доказательств этого. Что касается нескольких потоков, я бы подумал, что вам нужно иметь экземпляр этого запуска для каждого из них в отдельной оболочке. - person MasonWinsauer; 31.07.2012