📄 rtpsending.html
字号:
</code><a name="109853"> </a><code> = new com.sun.media.rtp.RTPSessionMgr();
</code><a name="109067"> </a>
<a name="109466"> </a><code> // The session manager then needs to be
</code><a name="109473"> </a><code> // initialized and started:
</code><a name="109069"> </a><code> // rtpsm1.initSession(...);
</code><a name="109897"> </a><code> // rtpsm1.startSession(...);
</code></pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="109909"> </a> try {
<a name="109910"> </a> rtpsm1.createSendStream(cloneableDataSource, // Datasource 1
<a name="109911"> </a> 0);
<a name="109912"> </a>
<a name="109913"> </a> } catch (IOException e) {
<a name="109914"> </a> e.printStackTrace();
<a name="109915"> </a> } catch( UnsupportedFormatException e) {
<a name="109916"> </a> e.printStackTrace();
<a name="109917"> </a> }
<a name="109918"> </a>
<a name="109919"> </a> try {
<a name="109920"> </a> cloneableDataSource.connect();
<a name="109921"> </a> cloneableDataSource.start();
<a name="109922"> </a> } catch (IOException e) {
<a name="109923"> </a> e.printStackTrace();
<a name="109924"> </a> }
<a name="109925"> </a>
<a name="109926"> </a> // create the second RTPSessionMgr and hand over the
<a name="109927"> </a> // cloned datasource
<a name="109928"> </a> if (clonedDataSource != null) {
<a name="109929"> </a> SessionManager rtpsm2
<a name="109930"> </a> = new com.sun.media.rtp.RTPSessionMgr();
<a name="109931"> </a>
<a name="109932"> </a> // rtpsm2.initSession(...);
<a name="109933"> </a> // rtpsm2.startSession(...);
<a name="109934"> </a>
<a name="109935"> </a> try {
<a name="109936"> </a> rtpsm2.createSendStream(clonedDataSource,0);
<a name="109937"> </a> } catch (IOException e) {
<a name="109938"> </a> e.printStackTrace();
<a name="109939"> </a> } catch( UnsupportedFormatException e) {
<a name="109940"> </a> e.printStackTrace();
<a name="109941"> </a> }
<a name="109942"> </a> }
<a name="109943"> </a> }
<a name="109944"> </a> else {
<a name="109945"> </a> // we failed to set the encoding to gsm. So deallocate
<a name="109946"> </a> // and close the processor before we leave.
<a name="109947"> </a>
<a name="109948"> </a> processor.deallocate();
<a name="109949"> </a> processor.close();
<a name="109950"> </a> }
</pre>
</font></td>
</tr>
</table>
<br></font>
<p>
<a name="108260"> </a><font face="Palatino, Times New Roman, Times, serif"><a href="RTPSending.html#108499">Example 10-4</a> encodes captured audio in several formats and then sends it out in multiple RTP sessions. It assumes that there is one stream in the input <code>DataSource</code>. </font>
</p>
<p>
<a name="104393"> </a><font face="Palatino, Times New Roman, Times, serif">The input <code>DataSource</code> is cloned and a second processor is created from the clone. The tracks in the two <code>Processors</code> are individually set to gsm and dvi and the output <code>DataSource</code>s are sent to two different RTP session managers. If the number of tracks is greater than 1, this example attempts to set the encoding of one track to gsm and the other to dvi. The same <code>DataSource</code> is handed to two separate RTP session managers with the index of the first stream set to 0 and the index of the second stream set to 1 (for heterogeneous receivers). </font>
</p>
<a name="104394"> </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="108499"> </a>Example 10-4: Encoding and sending data in multiple formats (1 of 3)</font></i></b></caption>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="109593"> </a><code> // Find a capture device that will capture linear 8bit 8Khz
</code><a name="109594"> </a><code> // audio
</code><a name="109595"> </a>
<a name="109596"> </a><code> AudioFormat format = new AudioFormat(AudioFormat.LINEAR,
</code><a name="109597"> </a><code> 8000,
</code><a name="109598"> </a><code> 8,
</code><a name="109599"> </a><code> 1);
</code><a name="109600"> </a><code>
</code><a name="109601"> </a><code> Vector devices= CaptureDeviceManager.getDeviceList( format);
</code><a name="109602"> </a>
<a name="109603"> </a><code> CaptureDeviceInfo di= null;
</code><a name="109604"> </a>
<a name="109605"> </a><code> if (devices.size() > 0) {
</code><a name="109606"> </a><code> di = (CaptureDeviceInfo) devices.elementAt( 0);
</code><a name="109607"> </a><code> }
</code><a name="109608"> </a><code> else {
</code><a name="109609"> </a><code> // exit if we could not find the relevant capture device.
</code><a name="109610"> </a><code> System.exit(-1);
</code><a name="109611"> </a><code> }
</code><a name="109612"> </a><code>
</code><a name="109613"> </a><code> // Since we have located a capturedevice, create a data
</code><a name="109614"> </a><code> // source for it.
</code><a name="109615"> </a>
<a name="109616"> </a><code> DataSource origDataSource= null;
</code><a name="109617"> </a>
<a name="109618"> </a><code> try {
</code><a name="109619"> </a><code> origDataSource = Manager.createDataSource(di.getLocator());
</code><a name="109620"> </a><code> } catch (IOException e) {
</code><a name="109621"> </a><code> System.exit(-1);
</code><a name="109622"> </a><code> } catch (NoDataSourceException e) {
</code><a name="109623"> </a><code> System.exit(-1);
</code><a name="109624"> </a><code> }
</code><a name="109625"> </a><code>
</code><a name="109626"> </a><code> SourceStream streams[] = ((PushDataSource)origDataSource)
</code><a name="109627"> </a><code> .getStreams();
</code><a name="109628"> </a><code>
</code><a name="109629"> </a><code> DataSource cloneableDataSource = null;
</code><a name="109630"> </a><code> DataSource clonedDataSource = null;
</code><a name="110094"> </a>
<a name="110095"> </a><code> if (streams.length == 1) {
</code><a name="110096"> </a><code> cloneableDataSource
</code><a name="110097"> </a><code> = Manager.createCloneableDataSource(origDataSource);
</code></pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="110133"> </a><code> clonedDataSource
</code><a name="110134"> </a><code> = ((SourceCloneable)cloneableDataSource).createClone();
</code><a name="110128"> </a><code> }
</code><a name="110138"> </a><code> else {
</code><a name="110129"> </a><code> // DataSource has more than 1 stream and we should try to
</code><a name="109649"> </a><code> // set the encodings of these streams to dvi and gsm
</code><a name="109650"> </a><code> }
</code><a name="109651"> </a><code>
</code><a name="109652"> </a><code> // at this point, we have a cloneable data source and its clone,
</code><a name="109653"> </a><code> // Create one processor from each of these datasources.
</code><a name="109654"> </a><code>
</code><a name="109655"> </a><code> Processor p1 = null;
</code><a name="109656"> </a>
<a name="109657"> </a><code> try {
</code><a name="109658"> </a><code> p1 = Manager.createProcessor(cloneableDataSource);
</code><a name="109659"> </a><code> } catch (IOException e) {
</code><a name="109660"> </a><code> System.exit(-1);
</code><a name="109661"> </a><code> } catch (NoProcessorException e) {
</code><a name="109662"> </a><code> System.exit(-1);
</code><a name="109663"> </a><code> }
</code><a name="109664"> </a><code>
</code><a name="109665"> </a><code> p1.configure();
</code><a name="109666"> </a><code>
</code><a name="109667"> </a><code> // block until configured.
</code><a name="109668"> </a>
<a name="109669"> </a><code> TrackControl track[] = p1.getTrackControls();
</code><a name="109670"> </a><code> boolean encodingOk = false;
</code><a name="109671"> </a><code>
</code><a name="109672"> </a><code> // Go through the tracks and try to program one of them
</code><a name="109673"> </a><code> // to output gsm data
</code><a name="109674"> </a><code> for (int i = 0; i < track.length; i++) {
</code><a name="109675"> </a><code> if (!encodingOk && track[i] instanceof FormatControl) {
</code><a name="109676"> </a><code> if (((FormatControl)track[i]).
</code><a name="110327"> </a><code> setFormat( new AudioFormat(AudioFormat.GSM_RTP,
</code><a name="110328"> </a><code> 8000,
</code><a name="110329"> </a><code> 8,
</code><a name="110330"> </a><code> 1)) == null) {
</code><a name="109681"> </a>
<a name="109682"> </a><code> track[i].setEnabled(false);
</code><a name="109683"> </a><code> }
</code><a name="109684"> </a><code> else {
</code><a name="109685"> </a><code> encodingOk = true;
</code><a name="109686"> </a><code> }
</code><a name="109687"> </a><code> }
</code><a name="109688"> </a><code> else {
</code><a name="109689"> </a><code> track[i].setEnabled(false);
</code><a name="109690"> </a><code> }
</code><a name="109691"> </a><code> }
</code></pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="110147"> </a><code> if (encodingOk) {
</code><a name="110148"> </a><code> processor.realize();
</code><a name="110149"> </a><code> // block until realized.
</code><a name="110150"> </a><code> // ...
</code><a name="110151"> </a><code> // get the output datasource of the processor
</code><a name="110152"> </a><code> DataSource ds = null;
</code><a name="109707"> </a>
<a name="110155"> </a> try {
<a name="109708"> </a> ds = processor.getDataOutput();
<a name="109709"> </a> } catch (NotRealizedError e) {
<a name="109710"> </a> System.exit(-1);
<a name="109711"> </a> }
<a name="109712"> </a>
<a name="109713"> </a> // Now create the first SessionManager and hand over the
<a name="109714"> </a> // first datasource for SendStream creation .
<a name="109715"> </a>
<a name="109716"> </a> SessionManager rtpsm1
<a name="109717"> </a> = new com.sun.media.rtp.RTPSessionMgr();
<a name="109718"> </a>
<a name="109719"> </a> // rtpsm1.initSession(...);
<a name="109720"> </a> // rtpsm1.startSession(...);
<a name="109721"> </a>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -