如何编写服务器/客户端视频和音频流应用程序?

Posted

技术标签:

【中文标题】如何编写服务器/客户端视频和音频流应用程序?【英文标题】:How can I code a server/client video and audio streaming application? 【发布时间】:2011-01-19 11:22:11 【问题描述】:

我必须创建一个客户端/服务器系统来传输视频和音频。这将非常简单。喜欢 youtube 风格。服务器应首先处理提供媒体列表的客户端,并等待每个客户端的选择开始流式传输媒体。直到创建一个套接字并显示一个简单的列表,我就在上面;)但我不知道我可以使用哪个类来流式传输。该示例基本上是 youtube 风格。我如何开始流式传输,客户端如何暂停再现,如何? 我知道如何流式传输文本,但视频呢?你知道任何教程页面吗? 和这个简单的服务器客户端例子有很大的不同?

import java.io.*; 
import java.io.*;
import java.net.*;

public class ThreadedEchoServer 

   public static void main(String[] args) 
      try 
         int i = 1;
         ServerSocket s = new ServerSocket(8189);

         while(true) 
            Runnable r = new ThreadedEchoHandler(incoming, i);
            Thread t = new Thread(r);
            t.start();
            i++;
         
       catch (IOException e) 
         e.printStackTrace();
      
   


class ThreadedEchoHandler implements Runnable 
   private Socket incoming;
   private int counter;

   public ThreadedEchoHandler(Socket i, int c) 
      incoming = i;
      counter = c;
   

   public void run() 
      try 
         try 
            InputStream inStream = incoming.getInputStream();
            OutputStream outStream = incoming.getOutputStream();

            Scanner in = new Scanner(inStream);
            PrintWriter out = new PrintWriter(outStream);

            out.println("BYE to exit");
            boolean done = false;

            while (!done && in.hasNextLine()) 

               String line = in.nextLine()) 
               out.println("Echo: " + line);

               if (line.trim().equals("BYE"))
                  done = true;
               out.println("BYE to exit");
            
          finally 
            incoming.close();
         
       catch (IOException e) 
         e.printStackTrace();
      

希望你能澄清我的想法。 亲切的问候。

【问题讨论】:

您对 Java 网络有什么体验?例如,您是否已经用 Java 编写了一个简单的 Web 服务器? 【参考方案1】:

对于流式传输和与您的客户交谈,您需要定义一个协议:在网络上搜索 RTP 和 RTSP。它应该让您很好地了解实现这些协议甚至创建自己的协议所需的内容。

至于实现,看red5项目:http://red5.org/

也看看 Xuggler:http://www.xuggle.com/xuggler/ 这个项目将帮助您节省大量代码行。请注意,它的开发已经过时了。

干杯。

【讨论】:

【参考方案2】:

大家非常感谢您的回答和编辑标题。 我是新来的,Java 方面的新手,网络方面的新手。 为什么我要在流媒体上提高我的技能?这是一个学习案例。 我在看很多关于网络的教程,我看到了 RTP,但我没有读到,因为我认为(为了在论坛上阅读)它只是为了实时流媒体,意味着网络摄像头流......但这是我太糊涂了哈哈

Lirik 当然是你说的,我忘了几行代码

while(true) 
   Socket incoming = s.accept();
   Runnable r = new ThreadedEchoHandler(incoming, i);
   ...

还是你说的

while(true) 
  Runnable r = new ThreadedEchoHandler(s.accept(), i); 
  ...

看看你们说的话。 亲切的问候!

【讨论】:

【参考方案3】:

查看 Java Media Framework(它有教程):http://java.sun.com/javase/technologies/desktop/media/jmf/

这还有效吗?

     while(true) 
        Runnable r = new ThreadedEchoHandler(incoming, i);
        Thread t = new Thread(r);
        t.start();
        i++;
     

我认为你的代码会产生一堆带有传入套接字连接的线程......你可能想要做的是:

     while(true) 
        Runnable r = new ThreadedEchoHandler(incoming.accept(), i);
        Thread t = new Thread(r);
        t.start();
        i++;
     

ThreadedEchoHandler 应该采用 Socket 而不是 ServerSocket。在客户端连接之前接受块,否则您将在没有连接的情况下产生无限数量的线程...我认为您目前没有任何东西可以阻止您这样做。

【讨论】:

以上是关于如何编写服务器/客户端视频和音频流应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

ExoPlayer 无法播放 Adob​​e 实时流编码器流式传输的音频/视频 (RTMP)

如何桥接字节数组和音频流?

如何使用 Java 从网络摄像头获取视频和音频流?

Red5 和安卓。流音频

按块加载视频/音频 html

如何识别不同视频流和音频流的rtmp包