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

📄 jmfapp-demux.html

📁 奉献给多媒体java编程者们。JMF2.1.1最新版本的用户指南。JMF是java用于基于实时多媒体的开发工具
💻 HTML
📖 第 1 页 / 共 3 页
字号:
</code><a name="89699"> </a>
</pre>
</font></td>
  </tr>
  <tr>
    <td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="90004"> </a><code>            duration = new Time(durationSeconds);
</code><a name="90005"> </a><code>            maxLocation = contentLength;
</code><a name="90006"> </a>
<a name="90012"> </a><code>        } else {
</code><a name="90013"> </a><code>            maxLocation = Long.MAX_VALUE;
</code><a name="90014"> </a><code>        }
</code><a name="90015"> </a><code>
</code><a name="90016"> </a><code>        boolean signed = true;
</code><a name="90017"> </a><code>        boolean bigEndian = false;
</code><a name="90018"> </a><code>        format = new AudioFormat(AudioFormat.GSM,
</code><a name="90019"> </a><code>                                 8000,  // sampleRate,
</code><a name="90020"> </a><code>                                 16,    // sampleSizeInBits,
</code><a name="90021"> </a><code>                                 1,     // channels,
</code><a name="90022"> </a><code>                                 bigEndian ? AudioFormat.BIG_ENDIAN : 
                                 AudioFormat.LITTLE_ENDIAN,
</code><a name="90023"> </a><code>                                 signed ? AudioFormat.SIGNED : 
                                 AudioFormat.UNSIGNED,
</code><a name="90024"> </a><code>                                 (blockSize * 8), // frameSizeInBits
</code><a name="90025"> </a><code>                                 Format.NOT_SPECIFIED,  
</code><a name="90026"> </a><code>                                 Format.byteArray);
</code><a name="90027"> </a><code>    }
</code><a name="90028"> </a><code>
</code><a name="90029"> </a><code>    // Contains 1 audio track
</code><a name="90030"> </a><code>    public String getTrackLayout() {
</code><a name="90031"> </a><code>        return "A";
</code><a name="90032"> </a><code>    }
</code><a name="90033"> </a><code>
</code><a name="90034"> </a><code>    public Time setPosition(Time where, int rounding) {
</code><a name="90035"> </a><code>        if (! seekable ) {
</code><a name="90036"> </a><code>            return getMediaTime();
</code><a name="90037"> </a><code>        }
</code><a name="90038"> </a><code>
</code><a name="90039"> </a><code>        long time = where.getNanoseconds();
</code><a name="90040"> </a><code>        long newPos;
</code><a name="90041"> </a><code>
</code><a name="90042"> </a><code>        if (time &lt; 0)
</code><a name="90043"> </a><code>            time = 0;
</code><a name="90044"> </a><code>
</code><a name="90045"> </a><code>        double newPosd = time * bytesPerSecond / 1000000000.0;
</code><a name="90046"> </a><code>        double remainder = (newPosd % blockSize);
</code><a name="90047"> </a><code>        
</code><a name="90048"> </a><code>        newPos = (long) (newPosd - remainder);
</code><a name="90049"> </a><code>
</code><a name="90050"> </a><code>        if (remainder &gt; 0) {
</code><a name="90051"> </a><code>            switch (rounding) {
</code><a name="90052"> </a><code>            case Positionable.RoundUp:
</code><a name="90053"> </a><code>                newPos += blockSize;
</code><a name="90059"> </a><code>                break;
</code><a name="90060"> </a><code>            case Positionable.RoundNearest:
</code><a name="90061"> </a><code>                if (remainder &gt; (blockSize / 2.0))
</code><a name="90062"> </a><code>                    newPos += blockSize;</code>
</pre>
</font></td>
  </tr>
  <tr>
    <td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="90076"> </a><code>                break;
</code><a name="90077"> </a><code>            }
</code><a name="90078"> </a><code>        }
</code><a name="90079"> </a><code>
</code><a name="90080"> </a><code>        if ( newPos &gt; maxLocation )
</code><a name="90081"> </a><code>            newPos = maxLocation;
</code><a name="90082"> </a><code>        
</code><a name="90083"> </a><code>        newPos += minLocation;
</code><a name="90084"> </a><code>        ((BasicTrack) tracks[0]).setSeekLocation(newPos);
</code><a name="90085"> </a><code>        return where;
</code><a name="90086"> </a><code>    }
</code><a name="90087"> </a><code>
</code><a name="90088"> </a><code>    public Time getMediaTime() {
</code><a name="90089"> </a><code>        long location;
</code><a name="90090"> </a><code>        long seekLocation = ((BasicTrack) tracks[0]).getSeekLocation();
</code><a name="90091"> </a><code>        if (seekLocation != -1)
</code><a name="90092"> </a><code>            location = seekLocation - minLocation;
</code><a name="90093"> </a><code>        else
</code><a name="90094"> </a><code>            location = getLocation(stream) - minLocation;
</code><a name="90095"> </a><code>
</code><a name="90096"> </a><code>        return new Time( location / (double) bytesPerSecond );
</code><a name="90097"> </a><code>    }
</code><a name="90098"> </a><code>
</code><a name="90099"> </a><code>    public Time getDuration() {
</code><a name="90100"> </a><code>        if ( duration.equals(Duration.DURATION_UNKNOWN) &amp;&amp;
</code><a name="90101"> </a><code>             ( tracks[0] != null ) ) {
</code><a name="90102"> </a><code>            long mediaSizeAtEOM = ((BasicTrack) 
                                  tracks[0]).getMediaSizeAtEOM();
</code><a name="90103"> </a><code>            if (mediaSizeAtEOM &gt; 0) {
</code><a name="90104"> </a><code>                double durationSeconds = mediaSizeAtEOM / bytesPerSecond;
</code><a name="90105"> </a><code>               duration = new Time(durationSeconds);
</code><a name="90106"> </a><code>            }
</code><a name="90107"> </a><code>        }
</code><a name="90108"> </a><code>        return duration;
</code><a name="90109"> </a><code>    }
</code><a name="90110"> </a><code>
</code><a name="90111"> </a><code>    /**
</code><a name="90112"> </a><code>     * Returns a descriptive name for the plug-in.
</code><a name="90113"> </a><code>     * This is a user readable string.
</code><a name="90114"> </a><code>     */
</code><a name="90115"> </a><code>    public String getName() {
</code><a name="90116"> </a><code>        return "Parser for raw GSM";
</code><a name="90122"> </a><code>    }
</code><a name="90123"> </a><code>
</code><a name="90124"> </a><code>    /**
</code><a name="90125"> </a><code>     * Read numBytes from offset 0
</code><a name="90126"> </a><code>     */
</code><a name="90127"> </a><code>    public int readBytes(PullSourceStream pss, byte[] array,
</code><a name="90128"> </a><code>                         int numBytes) throws IOException {
</code><a name="90129"> </a><code>
</code><a name="90130"> </a><code>        return readBytes(pss, array, 0, numBytes);
</code><a name="90131"> </a><code>    }</code>
</pre>
</font></td>
  </tr>
  <tr>
    <td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="90139"> </a><code>    public int readBytes(PullSourceStream pss, byte[] array,
</code><a name="90140"> </a><code>                         int offset,
</code><a name="90141"> </a><code>                         int numBytes) throws IOException {
</code><a name="90142"> </a><code>        if (array == null) {
</code><a name="90143"> </a><code>            throw new NullPointerException();
</code><a name="90144"> </a><code>        } else if ((offset &lt; 0) || (offset &gt; array.length) ||  
                   (numBytes &lt; 0) ||
</code><a name="90145"> </a><code>                   ((offset + numBytes) &gt; array.length) || 
                   ((offset + numBytes) &lt; 0)) {
</code><a name="90146"> </a><code>            throw new IndexOutOfBoundsException();
</code><a name="90147"> </a><code>        } else if (numBytes == 0) {
</code><a name="90148"> </a><code>            return 0;
</code><a name="90149"> </a><code>        }
</code><a name="90150"> </a><code>
</code><a name="90151"> </a><code>        int remainingLength = numBytes;
</code><a name="90152"> </a><code>        int actualRead = 0;
</code><a name="90153"> </a><code>
</code><a name="90154"> </a><code>        remainingLength = numBytes;
</code><a name="90155"> </a><code>        while (remainingLength &gt; 0) {
</code><a name="90156"> </a><code>
</code><a name="90157"> </a><code>            actualRead = pss.read(array, offset, remainingLength);
</code><a name="90158"> </a><code>            if (actualRead == -1) {// End of stream
</code><a name="90159"> </a><code>                if (offset == 0) {
</code><a name="90160"> </a><code>                    throw new IOException("SampleDeMux: readBytes():
                              Reached end of stream while trying to read " + 
                              numBytes + " bytes");
</code><a name="90161"> </a><code>                } else {
</code><a name="90162"> </a><code>                    return offset;
</code><a name="90163"> </a><code>                }
</code><a name="90164"> </a><code>            } else if (actualRead == 
             com.sun.media.protocol.BasicSourceStream.LENGTH_DISCARD) {
</code><a name="90165"> </a><code>                return 
                   com.sun.media.protocol.BasicSourceStream.LENGTH_DISCARD;
</code><a name="90166"> </a><code>            } else if (actualRead &lt; 0) {
</code><a name="90167"> </a><code>                throw new IOException("SampleDeMux: readBytes() 
                          read returned " + actualRead);
</code><a name="90168"> </a><code>            }
</code><a name="90169"> </a><code>            remainingLength -= actualRead;
</code><a name="90170"> </a><code>            offset += actualRead;
</code><a name="90171"> </a><code>            synchronized(sync) {
</code><a name="90172"> </a><code>                currentLocation += actualRead;
</code><a name="90173"> </a><code>            }
</code><a name="90174"> </a><code>        }
</code><a name="90175"> </a><code>        return numBytes;
</code><a name="90194"> </a><code>    }
</code><a name="90195"> </a><code>
</code><a name="90196"> </a><code>    protected final long getLocation(PullSourceStream pss) {
</code><a name="90197"> </a><code>        synchronized(sync) {
</code><a name="90198"> </a><code>            if ( (pss instanceof Seekable) )
</code><a name="90199"> </a><code>                return ((Seekable)pss).tell();</code>
</pre>
</font></td>
  </tr>
  <tr>
    <td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="90211"> </a><code>            else
</code><a name="90212"> </a><code>                return currentLocation;
</code><a name="90213"> </a><code>        }
</code><a name="90214"> </a><code>    }
</code><a name="90220"> </a><code>
</code><a name="90221"> </a><code>    ////////////////////////////////////////////////////////////
</code><a name="90222"> </a><code>    // Inner classes begin
</code><a name="90223"> </a><code>    abstract private class BasicTrack implements Track {
</code><a name="90224"> </a><code>
</code><a name="90225"> </a><code>        private Format format;
</code><a name="90226"> </a><code>        private boolean enabled = true;
</code><a name="90227"> </a><code>        protected Time duration;
</code><a name="90228"> </a><code>        private Time startTime;
</code><a name="90229"> </a><code>        private int numBuffers;
</code><a name="90230"> </a><code>        private int dataSize;
</code><a name="90231"> </a><code>        private PullSourceStream stream;
</code><a name="90232"> </a><code>        private long minLocation;
</code><a name="90233"> </a><code>        private long maxLocation;
</code><a name="90234"> </a><code>        private long maxStartLocation;
</code><a name="90235"> </a><code>        private SampleDeMux parser;
</code><a name="90236"> </a><code>        private long sequenceNumber = 0;
</code><a name="90237"> </a><code>        private TrackListener listener;
</code><a name="90238"> </a><code>        private long seekLocation = -1L;
</code><a name="90239"> </a><code>        private long mediaSizeAtEOM = -1L; // update when EOM 
                                           // implied by IOException occurs
</code><a name="90240"> </a><code>
</code><a name="90241"> </a><code>        BasicTrack(SampleDeMux parser,
</code><a name="90242"> </a><code>                   Format format, boolean enabled, 
                   Time duration, Time startTime,
</code><a name="90243"> </a><code>                   int numBuffers, int dataSize, 
                   PullSourceStream stream) {
</code><a name="90244"> </a><code>            this(parser, format,  enabled,  duration,  startTime,
</code><a name="90245"> </a><code>                 numBuffers, dataSize, stream,
</code><a name="90246"> </a><code>                 0L, Long.MAX_VALUE);
</code><a name="90247"> </a><code>        }
</code><a name="90248"> </a><code>
</code><a name="90249"> </a><code>
</code><a name="90250"> </a><code>        /**
</code><a name="90251"> </a><code>         * Note to implementors who want to use this class.
</code><a name="90252"> </a><code>         * If the maxLocation is not known, then
</code><a name="90253"> </a><code>         * specify Long.MAX_VALUE for this parameter
</code><a name="90254"> </a><code>         */
</code><a name="90255"> </a><code>        public BasicTrack(SampleDeMux parser,
</code><a name="90256"> </a><code>                          Format format, boolean enabled, 
                          Time duration, Time startTime,
</code><a name="90257"> </a><code>                          int numBuffers, int dataSize, 
                          PullSourceStream stream,
</code><a name="90258"> </a><code>                          long minLocation, long maxLocation) {
</code><a name="90264"> </a><code>
</code><a name="90265"> </a><code>            this.parser = parser;</code>
</pre>
</font></td>
  </tr>
  <tr>
    <td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="90279"> </a><code>            this.format = format;
</code><a name="90280"> </a><code>            this.enabled = enabled;
</code><a name="90281"> </a><code>            this.duration = duration;
</code><a name="90282"> </a><code>            this.startTime = startTime;
</code><a name="90283"> </a><code>            this.numBuffers = numBuffers;
</code><a name="90284"> </a><code>            this.dataSize = dataSize;
</code><a name="90285"> </a><code>            this.stream = stream;
</code><a name="90286"> </a><code>            this.minLocation = minLocation;
</code><a name="90287"> </a><code>            this.maxLocation = maxLocation;
</code><a name="90288"> </a><code>            maxStartLocation = maxLocation - dataSize;
</code><a name="90289"> </a><code>        }
</code><a name="90290"> </a><code>
</code><a name="90291"> </a><code>        public Format getFormat() {
</code><a name="90292"> </a><code>            return format;
</code><a name="90293"> </a><code>        }
</code><a name="90294"> </a><code>
</code><a name="90295"> </a><code>        public void setEnabled(boolean t) {
</code><a name="90296"> </a><code>            enabled = t;
</code><a name="90297"> </a><code>        }
</code><a name="90298"> </a><code>
</code><a name="90299"> </a><code>        public boolean isEnabled() {
</code><a name="90300"> </a><code>            return enabled;
</code><a name="90301"> </a><code>        }
</code><a name="90302"> </a><code>
</code><a name="90303"> </a><code>        public Time getDuration() {
</code><a name="90304"> </a><code>            return duration;

⌨️ 快捷键说明

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