首页 文章

如何从Java中的FFMpeg通过UDP接收Mpeg-ts流

提问于
浏览
1

我有来自FFMpeg的实时视频流,我很难使用自己的自定义Java应用程序查看流 . 在有人告诉我使用VLC之类的东西之前,我确实想要使用我自己的应用程序 . 我试图读取的流是通过UDP流式传输的H.264编码的Mpeg-ts流 . 我知道如何解码H.264帧,但我只是想知道如何接收Mpeg-ts流 .

2 回答

  • 1

    Jon Kittel提供了一个很好的答案,无论如何在问题评论中都提到了UNICAST通信,所以Jon的代码在这种情况下是不可用的 . 下面提供了简化的单播接收器(原始示例为P. Tellenbach) .

    import java.io.FileOutputStream;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class DatagramServer
    {
       private final static int PACKETSIZE = 2048 ;
    
       public static void main( String args[] )
       {
        // Check the arguments
        //      if( args.length != 1 )
        //      {
        //         System.out.println( "usage: DatagramServer port" ) ;
        //         return ;
        //      }
    
          try
          {
             // Convert the argument to ensure that is it valid
             int port = 1234; //Integer.parseInt( args[0] ) ;
             FileOutputStream output = new FileOutputStream("testStream.ts", true);
    
             // Construct the socket
             DatagramSocket socket = new DatagramSocket( port ) ;
    
             System.out.println( "The server is ready..." ) ;
    
             DatagramPacket packet = new DatagramPacket( new byte[PACKETSIZE], PACKETSIZE ) ;
             for( ;; )
             {
                // Receive a packet (blocking)
                socket.receive( packet );
                try {
                    output.write(packet.getData());
                } finally {
                    output.close();
                }
            }  
         }catch (IOException exception) {
                exception.printStackTrace();
        }
      }
    }
    

    此客户端将侦听本地主机地址(端口1234)上的UDP流,并将每个接收到的数据包写入testStream.ts文件 . 如果流是H.264编码的Mpeg-ts,则可以随时打开输出文件,播放器可以再现截至当时捕获的视频流 .

  • 1

    为了接收多播流,您需要创建一个多播客户端,该客户端具有用于存储视频数据的缓冲区,并使用可以加入和侦听多播流的套接字 .

    这两个属性是多播地址(239.1.1.1)和端口(49410) .

    使用ffmpeg开始将mp4视频文件流式传输到多播地址和端口 .

    ffmpeg -i .\mars.mp4 -c:v libx264 -c:a libmp3lame -f mpegts udp://239.1.1.1:49410
    

    编译并运行使用MulticastSocket类的多类客户端加入组播组并侦听UDP流数据包 . 我们将缓冲区传递给DatagramPacket对象,当套接字收到UDP数据包时,缓冲区将填充mpeg-ts数据 . 然后,您可以将缓冲区复制到应用程序的另一部分以解码数据 .

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.InetAddress;
    import java.net.MulticastSocket;
    import java.net.UnknownHostException;
    
    public class Client {
    
        final static String INET_ADDR = "239.1.1.1";
        final static int PORT = 49410;
    
        public static void main(String[] args) throws UnknownHostException {
            // Get the multicast address that we are going to connect to.
            InetAddress address = InetAddress.getByName(INET_ADDR);
    
            // Create a buffer of bytes, which will be used to store
            // the incoming bytes containing the information from the streaming server
            byte[] buffer = new byte[256];
    
            // Create a new Multicast socket so we can join the multicast group
            try (MulticastSocket clientSocket = new MulticastSocket(PORT)){
                //Joint the Multicast group.
                clientSocket.joinGroup(address);
    
                // do an infinite loop
                while (true) {
                    // Receive the information and print it.
                    DatagramPacket msgPacket = new DatagramPacket(buffer, buffer.length);
                    clientSocket.receive(msgPacket);
    
                    String data = new String(buffer, 0, buffer.length);
    
                    System.out.println("Data ->  " + data);
                }
            } catch (IOException exception) {
                exception.printStackTrace();
            }
        }
    }
    

相关问题