📄 rtpsending.html
字号:
</code><a name="108188"> </a><code>
</code><a name="108189"> </a><code> // Go through the tracks and try to program one of them to
</code><a name="108190"> </a><code> // output ULAW_RTP data.
</code><a name="108191"> </a><code> for (int i = 0; i < track.length; i++) {
</code><a name="108192"> </a><code> if (!encodingOk && track[i] instanceof FormatControl) {
</code><a name="108193"> </a>
<a name="108194"> </a><code> if (((FormatControl)track[i]).
</code><a name="108195"> </a><code> setFormat( new AudioFormat(AudioFormat.ULAW_RTP,
</code><a name="108196"> </a><code> 8000,
</code><a name="108197"> </a><code> 8,
</code><a name="108198"> </a><code> 1)) == null) {
</code><a name="108199"> </a>
<a name="108200"> </a><code> track[i].setEnabled(false);
</code><a name="108201"> </a><code> }
</code><a name="108202"> </a><code> else {
</code><a name="108203"> </a><code> encodingOk = true;
</code><a name="108204"> </a><code> }
</code><a name="108205"> </a><code> }
</code><a name="108206"> </a><code> else {
</code><a name="108207"> </a><code> // we could not set this track to gsm, so disable it
</code><a name="108208"> </a><code> track[i].setEnabled(false);
</code><a name="108209"> </a><code> }
</code><a name="108210"> </a><code> }
</code></pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="108990"> </a><code> // Realize it and block until it is realized.
</code><a name="108991"> </a><code> processor.realize();
</code><a name="108992"> </a><code>
</code><a name="108993"> </a><code> // block until realized.
</code><a name="108225"> </a><code> // get the output datasource of the processor and exit
</code><a name="108226"> </a><code> // if we fail
</code><a name="108227"> </a><code>
</code><a name="108228"> </a><code> DataSource ds = null;
</code><a name="108229"> </a><code>
</code><a name="108230"> </a><code> try {
</code><a name="108231"> </a><code> ds = processor.getDataOutput();
</code><a name="108232"> </a><code> } catch (NotRealizedError e){
</code><a name="108233"> </a><code> System.exit(-1);
</code><a name="108234"> </a><code> }
</code><a name="108235"> </a><code>
</code><a name="108236"> </a><code> // Create a SessionManager and hand over the
</code><a name="108237"> </a><code> // datasource for SendStream creation.
</code><a name="108238"> </a><code>
</code><a name="108239"> </a><code> SessionManager rtpsm = new com.sun.media.rtp.RTPSessionMgr();
</code><a name="108240"> </a><code>
</code><a name="108241"> </a><code> // The session manager then needs to be initialized and started:
</code><a name="108242"> </a><code> // rtpsm.initSession(...);
</code><a name="108243"> </a><code> // rtpsm.startSession(...);
</code><a name="108244"> </a>
<a name="108245"> </a><code> try {
</code><a name="108246"> </a><code> rtpsm.createSendStream(ds, 0);
</code><a name="108247"> </a><code> } catch (IOException e) {
</code><a name="108248"> </a><code> e.printStackTrace();
</code><a name="108249"> </a><code> } catch( UnsupportedFormatException e) {
</code><a name="108250"> </a><code> e.printStackTrace();
</code><a name="108251"> </a><code> }
</code><a name="108117"> </a>
</pre>
</font></td>
</tr>
</table>
<br></font>
<h4>
<a name="104261"> </a><font color="#003366" face="Palatino, Times New Roman, Times, serif">Sending Captured Audio Out in Multiple Sessions</font>
</h4>
<p>
<a name="104262"> </a><font face="Palatino, Times New Roman, Times, serif"><a href="RTPSending.html#108263">Example 10-3</a> and <a href="RTPSending.html#108499">Example 10-4</a> both encode the captured audio and send it out in multiple RTP sessions. In <a href="RTPSending.html#108263">Example 10-3</a>, the data is encoded in gsm; in <a href="RTPSending.html#108499">Example 10-4</a>, the data is encoded in several different formats.</font>
</p>
<a name="104392"> </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="108263"> </a>Example 10-3: Sending RTP data out in multiple sessions (1 of 4)</font></i></b></caption>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="109006"> </a><code> // First find a capture device that will capture linear audio
</code><a name="109007"> </a><code> // data at 8bit 8Khz
</code><a name="109008"> </a><code>
</code><a name="109009"> </a><code> AudioFormat format= new AudioFormat(AudioFormat.LINEAR,
</code><a name="109010"> </a><code> 8000,
</code><a name="109011"> </a><code> 8,
</code><a name="109012"> </a><code> 1);
</code></pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="109746"> </a><code> Vector devices= CaptureDeviceManager.getDeviceList( format);
</code><a name="109747"> </a>
<a name="109748"> </a><code> CaptureDeviceInfo di= null;
</code><a name="109749"> </a>
<a name="109750"> </a><code> if (devices.size() > 0) {
</code><a name="109751"> </a><code> di = (CaptureDeviceInfo) devices.elementAt( 0);
</code><a name="109752"> </a><code> }
</code><a name="109753"> </a><code> else {
</code><a name="109754"> </a><code> // exit if we could not find the relevant capturedevice.
</code><a name="109755"> </a><code> System.exit(-1);
</code><a name="109756"> </a><code> }
</code><a name="109757"> </a><code>
</code><a name="109758"> </a><code> // Now create a processor for this capturedevice & exit if we
</code><a name="109759"> </a><code> // cannot create it
</code><a name="109760"> </a><code> try {
</code><a name="109761"> </a><code> Processor p = Manager.createProcessor(di.getLocator());
</code><a name="109762"> </a><code> } catch (IOException e) {
</code><a name="109763"> </a><code> System.exit(-1);
</code><a name="109764"> </a><code> } catch (NoProcessorException e) {
</code><a name="109765"> </a><code> System.exit(-1);
</code><a name="109766"> </a><code> }
</code><a name="109767"> </a><code>
</code><a name="109768"> </a><code> // configure the processor
</code><a name="109769"> </a><code> processor.configure();
</code><a name="109770"> </a><code>
</code><a name="109771"> </a><code> // block until it has been configured
</code><a name="109772"> </a><code>
</code><a name="109773"> </a><code> processor.setContentDescriptor(
</code><a name="109774"> </a><code> new ContentDescriptor( ContentDescriptor.RAW));
</code><a name="109775"> </a><code>
</code><a name="109776"> </a><code> TrackControl track[] = processor.getTrackControls();
</code><a name="109777"> </a><code>
</code><a name="109778"> </a><code> boolean encodingOk = false;
</code><a name="109779"> </a><code>
</code><a name="109780"> </a><code> // Go through the tracks and try to program one of them to
</code><a name="109781"> </a><code> // output gsm data.
</code><a name="109782"> </a><code>
</code><a name="109783"> </a><code> for (int i = 0; i < track.length; i++) {
</code><a name="109784"> </a><code> if (!encodingOk && track[i] instanceof FormatControl) {
</code><a name="110308"> </a>
<a name="110309"> </a><code> if (((FormatControl)track[i]).
</code><a name="110319"> </a><code> setFormat( new AudioFormat(AudioFormat.GSM_RTP,
</code><a name="110320"> </a><code> 8000,
</code><a name="110321"> </a><code> 8,
</code><a name="110322"> </a><code> 1)) == null) {
</code><a name="110314"> </a>
<a name="110315"> </a><code> track[i].setEnabled(false);
</code><a name="109793"> </a><code> }
</code><a name="109794"> </a><code> else {
</code><a name="109795"> </a><code> encodingOk = true;
</code><a name="109796"> </a><code> }
</code><a name="109047"> </a><code> }
</code></pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="109807"> </a><code> else {
</code><a name="109808"> </a><code> // we could not set this track to gsm, so disable it
</code><a name="109809"> </a><code> track[i].setEnabled(false);
</code><a name="109810"> </a><code> }
</code><a name="109811"> </a><code> }
</code><a name="109812"> </a><code>
</code><a name="109813"> </a><code> // At this point, we have determined where we can send out
</code><a name="109814"> </a><code> // gsm data or not.
</code><a name="109815"> </a><code> // realize the processor
</code><a name="109816"> </a><code>
</code><a name="109817"> </a><code> if (encodingOk) {
</code><a name="109818"> </a><code> processor.realize();
</code><a name="109819"> </a><code>
</code><a name="109820"> </a><code> // block until realized.
</code><a name="109821"> </a><code>
</code><a name="109822"> </a><code> // get the output datasource of the processor and exit
</code><a name="109823"> </a><code> // if we fail
</code><a name="109824"> </a><code>
</code><a name="109825"> </a><code> DataSource origDataSource = null;
</code><a name="109826"> </a><code>
</code><a name="109827"> </a><code> try {
</code><a name="109828"> </a><code> origDataSource = processor.getDataOutput();
</code><a name="109829"> </a><code> } catch (NotRealizedError e) {
</code><a name="109830"> </a><code> System.exit(-1);
</code><a name="109831"> </a><code> }
</code><a name="109832"> </a><code>
</code><a name="109833"> </a><code> // We want to send the stream of this datasource over two
</code><a name="109834"> </a><code> // RTP sessions.
</code><a name="109835"> </a><code>
</code><a name="109836"> </a><code> // So we need to clone the output datasource of the
</code><a name="109837"> </a><code> // processor and hand the clone over to the second
</code><a name="109838"> </a><code> // SessionManager
</code><a name="109839"> </a><code>
</code><a name="109840"> </a><code> DataSource cloneableDataSource = null;
</code><a name="109841"> </a><code> DataSource clonedDataSource = null;
</code><a name="109842"> </a><code>
</code><a name="109843"> </a><code> cloneableDataSource
</code><a name="109844"> </a><code> = Manager.createCloneableDataSource(origDataSource);
</code><a name="109845"> </a>
<a name="109846"> </a><code> clonedDataSource
</code><a name="109847"> </a><code> = ((SourceCloneable)cloneableDataSource).createClone();
</code><a name="109848"> </a><code>
</code><a name="109849"> </a><code> // Now create the first SessionManager and hand over the
</code><a name="109850"> </a><code> // first datasource for SendStream creation.
</code><a name="109851"> </a><code>
</code><a name="109852"> </a><code> SessionManager rtpsm1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -