📄 rtpsending.html
字号:
<a name="109722"> </a> try {
<a name="109723"> </a> rtpsm1.createSendStream(ds, // first datasource
<a name="109724"> </a> 0); // first sourcestream of
<a name="109725"> </a> // first datasource
<a name="109726"> </a> } catch (IOException e) {
<a name="109727"> </a> e.printStackTrace();
<a name="109728"> </a> } catch( UnsupportedFormatException e) {
<a name="109729"> </a> e.printStackTrace();
<a name="109730"> </a> }
<a name="109731"> </a> }
<a name="109732"> </a>
<a name="109733"> </a> // Now repeat the above with the cloned data source and
<a name="109734"> </a> // set the encoding to dvi. i.e create a processor with
<a name="109735"> </a> // inputdatasource clonedDataSource
<a name="109736"> </a> // and set encoding of one of its tracks to dvi.
<a name="109737"> </a> // create SessionManager giving it the output datasource of
<a name="108691"> </a> // this processor.
</pre>
</font></td>
</tr>
</table>
<br></font>
<h3>
<a name="108673"> </a><font color="#003366" face="Palatino, Times New Roman, Times, serif">Transmitting RTP Streams with RTPSocket</font>
</h3>
<p>
<a name="106221"> </a><font face="Palatino, Times New Roman, Times, serif">You can also use <code>RTPSocket</code> to transmit RTP media streams. To use <code>RTPSocket</code> for transmission, you create an RTP <code>DataSink</code> with <code>createDataSink</code> by passing in a a <code>MediaLocator</code> with a new protocol that is a variant of RTP, <code>"Ratibor"</code>. Manager attempts to construct a <code>DataSink</code> from: </font>
</p>
<pre>
<a name="106234"> </a><protocol package-prefix>.media.datasink.rtpraw.Handler
</pre>
<p>
<a name="106225"> </a><font face="Palatino, Times New Roman, Times, serif">The session manager prepares individual RTP packets that are ready to be transmitted across the network and sends them to the <code>RTPSocket</code> created from:</font>
</p>
<pre>
<a name="106235"> </a><protocol package-prefix>.media.protocol.rtpraw.DataSource
</pre>
<p>
<a name="106236"> </a><font face="Palatino, Times New Roman, Times, serif">The <code>RTPSocket</code> created at <code><protocol-prefix>.media.protocol.rtpraw.DataSource </code>is your own implementation of <code>RTPSocket</code>. The JMF API does not define a default implementation of <code>RTPSocket</code>. The implementation of <code>RTPSocket</code> is dependent on the underlying transport protocol that you are using. Your <code>RTPSocket</code> class must be located at <code><protocol-prefix>.media.protocol.rtpraw.DataSource.</code></font>
</p>
<p>
<a name="107211"> </a><font face="Palatino, Times New Roman, Times, serif">You're responsible for transmitting the RTP packets out on the underlying network</font>
</p>
<p>
<a name="106241"> </a><font face="Palatino, Times New Roman, Times, serif">In the following example, an <code>RTPSocket</code> is used to transmitting captured audio:</font>
</p>
<a name="106620"> </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="108723"> </a>Example 10-5: Transmitting RTP data with RTPSocket (1 of 3)</font></i></b></caption>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="110163"> </a><code> // Find a capture device that will capture linear audio
</code><a name="110164"> </a><code> // data at 8bit 8Khz
</code><a name="110165"> </a><code>
</code><a name="110166"> </a><code> AudioFormat format = new AudioFormat(AudioFormat.LINEAR,
</code><a name="110167"> </a><code> 8000,
</code><a name="110168"> </a><code> 8,
</code><a name="110169"> </a><code> 1);
</code><a name="110170"> </a><code>
</code><a name="110171"> </a><code> Vector devices= CaptureDeviceManager.getDeviceList( format);
</code><a name="110172"> </a>
<a name="110173"> </a><code> CaptureDeviceInfo di= null;
</code><a name="110174"> </a><code> if (devices.size() > 0) {
</code><a name="110175"> </a><code> di = (CaptureDeviceInfo) devices.elementAt( 0);
</code><a name="110176"> </a><code> }
</code><a name="110177"> </a><code> else {
</code><a name="110178"> </a><code> // exit if we could not find the relevant capture device.
</code><a name="110179"> </a><code> System.exit(-1);
</code><a name="110180"> </a><code> }
</code><a name="110181"> </a>
<a name="110182"> </a><code> // Create a processor for this capturedevice & exit if we
</code><a name="110183"> </a><code> // cannot create it
</code><a name="110184"> </a><code>
</code><a name="110185"> </a><code> try {
</code><a name="110186"> </a><code> processor = Manager.createProcessor(di.getLocator());
</code><a name="110187"> </a><code> } catch (IOException e) {
</code><a name="110188"> </a><code> System.exit(-1);
</code><a name="110189"> </a><code> } catch (NoProcessorException e) {
</code><a name="110190"> </a><code> System.exit(-1);
</code><a name="108764"> </a><code> }
</code></pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="110201"> </a><code> // configure the processor
</code><a name="110202"> </a><code> processor.configure();
</code><a name="110203"> </a><code>
</code><a name="110204"> </a><code> // block until it has been configured
</code><a name="110205"> </a><code>
</code><a name="110206"> </a><code> processor.setContentDescriptor(
</code><a name="110207"> </a><code> new ContentDescriptor( ContentDescriptor.RAW));
</code><a name="110208"> </a><code>
</code><a name="110209"> </a><code> TrackControl track[] = processor.getTrackControls();
</code><a name="110210"> </a><code> boolean encodingOk = false;
</code><a name="110211"> </a><code>
</code><a name="110212"> </a><code> // Go through the tracks and try to program one of them to
</code><a name="110213"> </a><code> // output gsm data.
</code><a name="110214"> </a><code> for (int i = 0; i < track.length; i++) {
</code><a name="110215"> </a><code> if (!encodingOk && track[i] instanceof FormatControl) {
</code><a name="110216"> </a>
<a name="110217"> </a><code> if (((FormatControl)track[i]).
</code><a name="110335"> </a><code> setFormat( new AudioFormat(AudioFormat.GSM_RTP,
</code><a name="110336"> </a><code> 8000,
</code><a name="110337"> </a><code> 8,
</code><a name="110338"> </a><code> 1)) == null) {
</code><a name="110222"> </a>
<a name="110223"> </a><code> track[i].setEnabled(false);
</code><a name="110224"> </a><code> }
</code><a name="110225"> </a><code> else {
</code><a name="110226"> </a><code> encodingOk = true;
</code><a name="110227"> </a><code> }
</code><a name="110228"> </a><code> }
</code><a name="110229"> </a><code> else {
</code><a name="110230"> </a><code> // we could not set this track to gsm, so disable it
</code><a name="110231"> </a><code> track[i].setEnabled(false);
</code><a name="110232"> </a><code> }
</code><a name="110233"> </a><code> }
</code><a name="110234"> </a><code>
</code><a name="110235"> </a><code> // At this point, we have determined where we can send out
</code><a name="110236"> </a><code> // gsm data or not.
</code><a name="110237"> </a><code> // realize the processor
</code><a name="110238"> </a><code> if (encodingOk) {
</code><a name="110239"> </a><code> processor.realize();
</code><a name="110240"> </a><code> // block until realized.
</code><a name="110241"> </a><code> // get the output datasource of the processor and exit
</code><a name="110242"> </a><code> // if we fail
</code><a name="110243"> </a><code> DataSource ds = null;
</code><a name="110244"> </a><code> try {
</code><a name="110245"> </a><code> ds = processor.getDataOutput();
</code><a name="110246"> </a><code> } catch (NotRealizedError e) {
</code><a name="110247"> </a><code> System.exit(-1);
</code><a name="110248"> </a><code> }
</code><a name="110249"> </a>
<a name="110250"> </a><code> // hand this datasource to manager for creating an RTP
</code><a name="110251"> </a><code> // datasink
</code><a name="110252"> </a><code> // our RTP datasimnk will multicast the audio
</code></pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="110266"> </a><code> try {
</code><a name="110267"> </a><code> MediaLocator m = new MediaLocator("rtpraw://");
</code><a name="110268"> </a><code> // here, manager will look for a datasink in
</code><a name="110269"> </a><code> // <protocol.prefix>.media.protocol.rtpraw.DataSink
</code><a name="110270"> </a><code> // the datasink will create an RTPSocket at
</code><a name="110271"> </a><code> // <protocol.prefix>.media.protocol.rtpraw.DataSource
</code><a name="110272"> </a><code> // and sink all RTP data to this socket.
</code><a name="110273"> </a><code>
</code><a name="110274"> </a><code> DataSink d = Manager.createDataSink(ds, m);
</code><a name="110275"> </a><code>
</code><a name="110276"> </a><code> d.open();
</code><a name="110277"> </a><code> d.start();
</code><a name="110278"> </a><code> } catch (Exception e) {
</code><a name="110279"> </a><code> System.exit(-1);
</code><a name="110280"> </a><code> }
</code><a name="108911"> </a><code> }
</code></pre>
</font></td>
</tr>
</table>
<br></font>
</blockquote>
<br clear="all">
<hr>
<a href="JMFTOC.html">CONTENTS</a> |
<a href="RTPPresenting.html">PREV </a> |
<a href="RTPExporting.html">NEXT</a> |
<a href="JMFIX.html">INDEX</a></td>
<br>
<hr>
<em>
<a href="copyright.html">Copyright</a> ©
1998-1999 Sun Microsystems, Inc. All Rights Reserved.
</em>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -