⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtppresenting.html

📁 奉献给多媒体java编程者们。JMF2.1.1最新版本的用户指南。JMF是java用于基于实时多媒体的开发工具
💻 HTML
📖 第 1 页 / 共 4 页
字号:
</p>


<p>
  <a name="107938"> </a><font face="Palatino, Times New Roman, Times, serif">To create a <code>Player</code> for each new receive stream in a session: </font>
</p>

<ol type="1">
  <li value="1"><a name="106644"> </a><font face="Palatino, Times New Roman, Times, serif">Set up the RTP session:</font>
  <ol type="a">
    <li><a name="107959"> </a><font face="Palatino, Times New Roman, Times, serif">Create a <code>SessionManager</code>. For example, construct an instance of <code>com.sun.media.rtp.RTPSessionMgr</code>. (<code>RTPSessionMgr </code>is an implementation of <code>SessionManager</code> provided with the JMF reference implementation.)</font>
    <li><a name="106662"> </a><font face="Palatino, Times New Roman, Times, serif">Call <code>RTPSessionMgr addReceiveStreamListener</code> to register as a listener.</font>
    <li><a name="106230"> </a><font face="Palatino, Times New Roman, Times, serif">Initialize the RTP session by calling <code>RTPSessionMgr initSession</code>.</font>
    <li><a name="106027"> </a><font face="Palatino, Times New Roman, Times, serif">Start the RTP session by calling <code>RTPSessionMgr startSession</code>.</font>
  </ol>
</ol>

<a name="111790"> </a><font  size="1" face="Palatino, Times New Roman, Times, serif">

<table border="1" bordercolorlight="#FFFFFF" bordercolordark="#000000"
       cellpadding="5" cellspacing="0">
  <caption><b><i><font face="Palatino, Times New Roman, Times, serif"><a name="111793"> </a>Example 9-3:   Setting up an RTP session  (1 of 2)</font></i></b></caption>
  <tr>
    <td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="111891"> </a><code>    public SessionManager createManager(String address,
</code><a name="111892"> </a><code>                                        int port,
</code><a name="111893"> </a><code>                                        int ttl,
</code><a name="111894"> </a><code>                                        boolean listener,
</code><a name="111895"> </a><code>                                        boolean sendlistener)
</code><a name="111896"> </a><code>    {
</code><a name="111897"> </a><code>        mgr = (SessionManager)new com.sun.media.rtp.RTPSessionMgr();
</code><a name="111898"> </a><code>        
</code><a name="111899"> </a><code>        if (mgr == null) return null;
</code><a name="111900"> </a>
<a name="111901"> </a><code>        mgr.addFormat(new AudioFormat(AudioFormat.DVI_RTP,
</code><a name="111902"> </a><code>                                      44100,
</code><a name="111903"> </a><code>                                      4,
</code><a name="111904"> </a><code>                                      1),
</code><a name="111905"> </a><code>                      18);
</code><a name="111906"> </a>
<a name="111907"> </a><code>        if (listener) mgr.addReceiveStreamListener(this);
</code><a name="111908"> </a><code>        if (sendlistener) new RTPSendStreamWindow(mgr);
</code><a name="111909"> </a><code>        
</code><a name="111910"> </a><code>        // ask session mgr to generate the local participant's CNAME
</code><a name="111911"> </a><code>        String cname = mgr.generateCNAME();
</code><a name="111912"> </a><code>        String username = null;
</code><a name="111913"> </a>
<a name="111914"> </a><code>        try {
</code><a name="111915"> </a><code>            username = System.getProperty("user.name");
</code><a name="111916"> </a><code>        } catch (SecurityException e){
</code><a name="111917"> </a><code>            username = "jmf-user";
</code><a name="111918"> </a><code>        }
</code><a name="111919"> </a><code>        
</code><a name="111920"> </a><code>        // create our local Session Address
</code><a name="111921"> </a><code>        SessionAddress localaddr = new SessionAddress();
</code><a name="111927"> </a><code>        
</code><a name="111928"> </a><code>        try{
</code><a name="111929"> </a><code>            InetAddress destaddr = InetAddress.getByName(address);
</code><a name="111930"> </a>
<a name="111931"> </a><code>            SessionAddress sessaddr = new SessionAddress(destaddr,
</code><a name="111932"> </a><code>                                                         port,
</code><a name="111933"> </a><code>                                                         destaddr,
</code><a name="111934"> </a><code>                                                         port + 1);
</code><a name="112343"> </a><code>            SourceDescription[] userdesclist= new SourceDescription[]
</code><a name="112344"> </a><code>            {
</code><a name="112345"> </a><code>                new SourceDescription(SourceDescription
</code><a name="112346"> </a><code>                                      .SOURCE_DESC_EMAIL,
</code><a name="112347"> </a><code>                                      "jmf-user@sun.com",
</code></pre>
</font></td>
  </tr>
  <tr>
    <td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="112360"> </a><code>                                      1,
</code><a name="112361"> </a><code>                                      false),
</code><a name="111848"> </a>
<a name="111849"> </a><code>                new SourceDescription(SourceDescription
</code><a name="111850"> </a><code>                                      .SOURCE_DESC_CNAME,
</code><a name="111851"> </a><code>                                      cname,
</code><a name="111852"> </a><code>                                      1,
</code><a name="111853"> </a><code>                                      false),
</code><a name="111854"> </a>
<a name="111855"> </a><code>                new SourceDescription(SourceDescription
</code><a name="111856"> </a><code>                                      .SOURCE_DESC_TOOL,
</code><a name="111857"> </a><code>                                      "JMF RTP Player v2.0",
</code><a name="111858"> </a><code>                                      1,
</code><a name="111859"> </a><code>                                      false)
</code><a name="111860"> </a><code>            };
</code><a name="111861"> </a>
<a name="111862"> </a><code>            mgr.initSession(localaddr,
</code><a name="111863"> </a><code>                            userdesclist,
</code><a name="111864"> </a><code>                            0.05,
</code><a name="111865"> </a><code>                            0.25);
</code><a name="111866"> </a><code>            
</code><a name="111867"> </a><code>            mgr.startSession(sessaddr,ttl,null);
</code><a name="111868"> </a><code>        } catch (Exception e) {
</code><a name="111869"> </a><code>            System.err.println(e.getMessage());
</code><a name="111870"> </a><code>            return null;
</code><a name="111871"> </a><code>        }
</code><a name="111872"> </a><code>        
</code><a name="111873"> </a><code>        return mgr;
</code><a name="111874"> </a><code>    }
</code></pre>
</font></td>
  </tr>
</table>



<br></font>

<ol type="1">
  <li value="2"><a name="107528"> </a><font face="Palatino, Times New Roman, Times, serif">In your <code>ReceiveStreamListener</code> <code>update</code> method, watch for <code>NewReceiveStreamEvent</code>, which indicates that a new data stream has been detected.   </font>
  <li value="3"><a name="107529"> </a><font face="Palatino, Times New Roman, Times, serif">When a <code>NewReceiveStreamEvent</code> is detected, retrieve the <code>ReceiveStream</code> from the <code>NewReceiveStreamEvent </code>by calling <code>getReceiveStream</code>.</font>
  <li value="4"><a name="106054"> </a><font face="Palatino, Times New Roman, Times, serif">Retrieve the RTP <code>DataSource</code> from the <code>ReceiveStream </code>by calling <code>getDataSource</code>. This is a <code>PushBufferDataSource</code> with an RTP-specific <code>Format</code>. For example, the encoding for a DVI audio player will be DVI_RTP.</font>
  <li value="5"><a name="106069"> </a><font face="Palatino, Times New Roman, Times, serif">Pass the <code>DataSource</code> to <code>Manager.createPlayer</code> to construct a <code>Player</code>. For the <code>Player</code> to be successfully constructed, the necessary plug-ins for decoding and depacketizing the RTP-formatted data must be available. (For more information, see <a href="RTPExtending.html#99690">Creating Custom Packetizers and Depacketizers</a>).</font>
</ol>

<a name="107040"> </a><font  size="1" face="Palatino, Times New Roman, Times, serif">

<table border="1" bordercolorlight="#FFFFFF" bordercolordark="#000000"
       cellpadding="5" cellspacing="0">
  <caption><b><i><font face="Palatino, Times New Roman, Times, serif"><a name="111690"> </a>Example 9-4:   Listening for NewReceiveStreamEvents &nbsp;</font></i></b></caption>
  <tr>
    <td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="112814"> </a><code>    public void update( ReceiveStreamEvent event)
</code><a name="112815"> </a><code>    {
</code><a name="112816"> </a><code>        Player newplayer = null;
</code><a name="112817"> </a><code>        RTPPlayerWindow playerWindow = null;
</code><a name="112818"> </a>
<a name="112819"> </a><code>        // find the sourceRTPSM for this event
</code><a name="112820"> </a><code>        SessionManager source = (SessionManager)event.getSource();
</code><a name="112821"> </a>
<a name="112822"> </a><code>        // create a new player if a new recvstream is detected
</code><a name="112823"> </a><code>        if (event instanceof NewReceiveStreamEvent)
</code><a name="112824"> </a><code>        {
</code><a name="112825"> </a><code>            String cname = "Java Media Player";
</code><a name="112826"> </a><code>            ReceiveStream stream = null;
</code><a name="112827"> </a><code>            
</code><a name="112828"> </a><code>            try
</code><a name="112829"> </a><code>            {
</code><a name="112830"> </a><code>                // get a handle over the ReceiveStream
</code><a name="112831"> </a><code>                stream =((NewReceiveStreamEvent)event)
</code><a name="112832"> </a><code>                        .getReceiveStream();
</code><a name="112833"> </a>
<a name="112834"> </a><code>                Participant part = stream.getParticipant();
</code><a name="112835"> </a>
<a name="112836"> </a><code>                if (part != null) cname = part.getCNAME();
</code><a name="112837"> </a>
<a name="112838"> </a><code>                // get a handle over the ReceiveStream datasource
</code><a name="112839"> </a><code>                DataSource dsource = stream.getDataSource();
</code><a name="112840"> </a><code>                
</code><a name="112841"> </a><code>                // create a player by passing datasource to the 
</code><a name="112842"> </a><code>                // Media Manager
</code><a name="112843"> </a><code>                newplayer = Manager.createPlayer(dsource);
</code><a name="112844"> </a><code>                System.out.println("created player " + newplayer);
</code><a name="112845"> </a><code>            } catch (Exception e) {
</code><a name="112846"> </a><code>                System.err.println("NewReceiveStreamEvent exception " 
</code><a name="112847"> </a><code>                                   + e.getMessage());
</code><a name="112848"> </a><code>                return;
</code><a name="112849"> </a><code>            }
</code><a name="112850"> </a>
<a name="112851"> </a><code>            if (newplayer == null) return;
</code><a name="112852"> </a>
<a name="112853"> </a><code>            playerlist.addElement(newplayer);
</code><a name="112854"> </a><code>            newplayer.addControllerListener(this);
</code><a name="112855"> </a><code>           
</code><a name="112856"> </a><code>            // send this player to player GUI
</code><a name="112857"> </a><code>            playerWindow = new RTPPlayerWindow( newplayer, cname);
</code><a name="112858"> </a><code>        }
</code><a name="112374"> </a><code>    }
</code></pre>
</font></td>
  </tr>
</table>



<br></font>


<p>
  <a name="111687"> </a><font face="Palatino, Times New Roman, Times, serif">See <code>RTPUtil</code> in <a href="JMFApp-RTPUtil.html#90599">RTPUtil</a> for a complete example.</font>
</p>


<h4>
  <a name="107799"> </a><font color="#003366" face="Palatino, Times New Roman, Times, serif">Handling RTP Payload Changes</font>
</h4>


<p>
  <a name="107800"> </a><font face="Palatino, Times New Roman, Times, serif">If the payload of a stream in the RTP session changes, the <code>ReceiveStream</code> posts a <code>RemotePayloadChangeEvent</code>. Generally, when the payload changes, the existing <code>Player</code> will not be able to handle the new format and JMF will throw an error if you attempt to present the new payload. To avoid this, your <code>ReceiveStreamListener</code> needs to watch for <code>RemotePayloadChangeEvents</code>. When a <code>RemotePayloadChangeEvent</code> is detected, you need to:</font>
</p>

<ol type="1">
  <li value="1"><a name="107821"> </a><font face="Palatino, Times New Roman, Times, serif">Close the existing <code>Player</code>.</font>
  <li value="2"><a name="107825"> </a><font face="Palatino, Times New Roman, Times, serif">Remove all listeners for the removed <code>Player</code>. </font>
  <li value="3"><a name="107828"> </a><font face="Palatino, Times New Roman, Times, serif">Create a new <code>Player</code> with the same RTP <code>DataSource</code>.</font>
  <li value="4"><a name="107829"> </a><font face="Palatino, Times New Roman, Times, serif">Get the visual and control <code>Components</code> for the new <code>Player</code>.</font>
  <li value="5"><a name="107832"> </a><font face="Palatino, Times New Roman, Times, serif">Add the necessary listeners to the new <code>Player</code>.</font>
</ol>

<a name="112101"> </a><font  size="1" face="Palatino, Times New Roman, Times, serif">

<table border="1" bordercolorlight="#FFFFFF" bordercolordark="#000000"
       cellpadding="5" cellspacing="0">
  <caption><b><i><font face="Palatino, Times New Roman, Times, serif"><a name="112107"> </a>Example 9-5:   Handling RTP payload changes  (1 of 2)</font></i></b></caption>
  <tr>
    <td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="112271"> </a><code>    public void update(ReceiveStreamEvent event) {
</code><a name="112272"> </a><code>        if (event instanceof RemotePayloadChangeEvent) {
</code><a name="112273"> </a><code>            // payload has changed. we need to close the old player
</code><a name="112274"> </a><code>            // and create a new player  
</code><a name="112275"> </a><code>            
</code><a name="112276"> </a><code>            if (newplayer != null) {
</code><a name="112277"> </a><code>                // stop player and wait for stop event
</code><a name="112278"> </a><code>                newplayer.stop();
</code><a name="112279"> </a><code>               
</code><a name="112280"> </a><code>                // block until StopEvent received...
</code><a name="112281"> </a><code>       
</code><a name="112282"> </a><code>                // remove controllerlistener
</code><a name="112283"> </a><code>                newplayer.removeControllerListener(listener);
</code><a name="112289"> </a><code>               
</code><a name="112290"> </a><code>                // remove any visual and control components 
</code><a name="112294"> </a><code>                // attached to this application
</code><a name="112383"> </a><code>                // close the player and wait for close event    
</code><a name="112384"> </a><code>                newplayer.close();
</code><a name="112385"> </a><code>               
</code><a name="112386"> </a><code>                // block until ControllerClosedEvent received...
</code><a name="112387"> </a><code>       
</code><a name="112388"> </a><code>                try {
</code><a name="112389"> </a><code>                    // when the player was closed, its datasource was
</code><a name="112412"> </a><code>                    // disconnected. Now we must reconnect the data-
</code><a name="112413"> </a><code>                    // source before a player can be created for it.
</code></pre>
</font></td>
  </tr>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -