VLC播放画质延迟改善方法

来源:互联网 发布:如何做域名cname解析 编辑:程序博客网 时间:2024/04/30 12:22

         前几天写的android录制视频h263编码通过rtp打包,服务器接收数据并转发,VLC通过rtsp协议请求服务器播放画质较差。后来通过以下方法改善了下画质质量以及延迟。

 1、设置合适的帧率,在这里使用24帧每秒。一般来说,这个值较大,画质较好。

2、设置合适的缓冲区,服务器接收数据的速率远大于服务器中转的速率,在接收的时候设置一个合适的缓冲区很重要,缓冲区设置过小,服务器来不及转发数据,就会出现丢帧现象。缓冲区设置过大,VLC观看会有较大的延迟。在这里,服务器接收数据的缓冲区最好比转发数据的缓冲区大得多,在这里,设置接收数据缓冲区大小是1500*10 ,转发缓冲区大小为每个packet的大小。

    

   DatagramSocket RTPsocket;; //socket to be used to send and receive UDP packets  DatagramPacket receivedp; //UDP packet containing the video frames  byte[] buf = new byte[15000]; private Thread t;public H263Packetizer() throws IOException {    super();      }public void start() throws IOException { RTPsocket= new DatagramSocket(Config.video_port);if (!running) {running = true;t = new Thread(this);t.start();}}public void run() {   while(true)   {   try    {   receivedp = new DatagramPacket(buf,buf.length);   //senddp = new DatagramPacket(buf1,buf1.length); RTPsocket.receive(receivedp);            if(receivedp.getData().length>0)           {                      //   System.out.println("video length is: "+receivedp.getLength());        //   System.out.println("port is"+getRtpSocket().getPort());           buffer=receivedp.getData();           getRtpSocket().upack.setData(buffer);           getRtpSocket().send(receivedp.getLength());           }         } catch (SocketException e) {// TODO Auto-generated catch blockSystem.out.println("Error : H263 run()");e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}


 

        通过这些修改,现在VLC播放实时视频,延迟缩小到3秒以内,画质有明显的改善。

        接下来,考虑android录制音频实时播放的问题,因为spydroid里的音频编码,VLC没有效果显示。且个人认为,mediaRecorder用于语音通话等方面会有噪音等问题,打算看看speex编码库,参照sipdroid 、android recorder来实现。

原创粉丝点击