📄 rtppresenting.html
字号:
</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 </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 + -