4

我正在开发一个需要显示远程桌面的流式视频的网络应用程序。我们已经使用 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}'

或者

  • 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}}'

谢谢 - 梅森

4

1 回答 1

5

好的,所以我正在寻找的解决方案以 CVLC 2.0.1 [Console-only VLC] 的形式出现,但也利用了 ffmpeg 的多路复用功能。

这个单行代码将 RTSP 流转码为 FLV,并将其推送到我的 localhost 服务器的指定端口。

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=andfps=属性;如果我需要为了网页而限制流,我只会使用它们。

--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'
    }
   }
} 
});

希望这可以帮助任何遇到类似问题的观众!

石匠

于 2012-07-18T19:35:53.403 回答