JMF RTP สำหรับ ผู้รับ

หลังจากที่มีการนำเสนอการส่งเสียงโดยใช้ JMF ผ่าน RTP แล้ว คราวนี้ก็มาถึงในส่วนของฝั่งรู้รับบ้าง เราสามารถเขียนโปรแกรมได้ดังนี้ครับ

import javax.swing.*;
import java.awt.*;
import java.net.*;
import javax.media.*;
import javax.media.rtp.*;
import javax.media.rtp.event.*;
import javax.media.protocol.*;

public class Receive extends JFrame implements
        ReceiveStreamListener, ControllerListener {

    private Player player;

    public Receive(int destPort) {
        super("Receive RTP Media");

        RTPManager rtpMgr = RTPManager.newInstance();
        rtpMgr.addReceiveStreamListener(this);

        try {
            SessionAddress localAddr =
                    new SessionAddress(InetAddress.getLocalHost(), destPort);
            rtpMgr.initialize(localAddr);
            SessionAddress destAddr =
                    new SessionAddress(InetAddress.getLocalHost(), destPort);
            rtpMgr.addTarget(destAddr);
            System.out.println("test");
        }
        catch (Exception exc ) {
            System.out.println("Cannot initialize RTP Manager");
        }
    }

    public void update(ReceiveStreamEvent evt) {
        if (evt instanceof NewReceiveStreamEvent) {
            ReceiveStream stream = evt.getReceiveStream();
            DataSource source = stream.getDataSource();
            try {
                player = Manager.createPlayer(source);
            }
            catch( Exception exc) {
                System.out.println("Unable to create player");
            }
            player.addControllerListener(this);
            player.start();
        }
    }

    public void controllerUpdate(ControllerEvent evt) {
        if (evt instanceof RealizeCompleteEvent) {
            Component vc,cpc;
            vc = player.getVisualComponent();
            cpc = player.getControlPanelComponent();

            Container c = getContentPane();

            if (vc != null )    c.add(vc,"North");
            if (cpc != null )   c.add(cpc,"South");

            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            pack();
            show();
        }
    }

    public static void main(String[] args) {
        new Receive(8000);
        System.out.println("Wait for incoming data");

      
        try {
            Thread.sleep(30000);
        }
        catch (Exception exc) {
            exc.printStackTrace();
        }
       
    }

}

มีการทำงานดังนี้

  • สร้าง RTPManager ไว้รอรับ audio stream ที่ส่งมาจาก Transmit เราสามารถดักจับเหตุการณ์เมื่อมี audio stream ส่งมาโดยการ addReceiveStreamListener
  • สร้าง SessionAddress ไว้สำหรับเป็น socket รอรับ audioStream โดยให้ RTPManager สั่ง Initialize และ addTarget ไว้
  • เมื่อมี Stream เข้ามาหลังจากที่เรา Listen รอไว้ update(ReceiveStreamEvent evt) จะถูกเรียกขึ้นมาทำงาน เราก็อ่าน stream จาก network โดยใช้ evt.getReceiveStream(); แล้วนำ stream นั้นมาสร้างเป็น DataSource
  • นำ DataSource ทีได้มาสร้างเป็น Player แล้วก็ addControllerListener และ start
  • เมื่อ Player พร้อมจะทำงาน (RealizeCompleteEvent)  เราก็สร้าง Player โดยการ get GUI Component ต่าง ๆ ของมัน และสั่งให้มันได้เลย
  • ในฟังก์ชัน main เราจะให้รอรับ stream ที่ส่งมาเป็นเวลา 30 วินาที ถ้าไม่มีอะไรส่งมาก็จะจบโปรแกรม