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

📄 oggvorbistagreader.java

📁 YOYOPlayer MP3播放器 java+JMF实现
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
            }

            //Now should be at start of next packet, check this is the vorbis setup header
            byte[]b = new byte[VorbisHeader.FIELD_PACKET_TYPE_LENGTH + VorbisHeader.FIELD_CAPTURE_PATTERN_LENGTH];
            raf.read(b);
            if(!isVorbisSetupHeader(b))
            {
                throw new CannotReadException("Unable to find setup header(2), unable to write ogg file");
            }

            //Go back to start of setupheader data
            raf.seek(raf.getFilePointer()
                -(VorbisHeader.FIELD_PACKET_TYPE_LENGTH + VorbisHeader.FIELD_CAPTURE_PATTERN_LENGTH));


            //Read data
            if(setupPageHeader.getPacketList().size()>1)
            {
                b = new byte[ setupPageHeader.getPacketList().get(1).getLength()];
                raf.read(b);
                baos.write(b);
            }
            else
            {
                b = new byte[ setupPageHeader.getPacketList().get(0).getLength()];
                raf.read(b);
                baos.write(b);
            }


            //Return Data
             if(!setupPageHeader.isLastPacketIncomplete())
            {
                logger.info("Setupheader finishes on this page");
                return baos.toByteArray();
            }

            //The Setupheader extends to the next page, so should be at end of page already
            //so carry on reading pages until we get to the end of comment
            while(true)
            {
                logger.info("Reading another page");
                OggPageHeader nextPageHeader = OggPageHeader.read (raf);
                b = new byte[ nextPageHeader.getPacketList().get(0).getLength()];
                raf.read(b);
                baos.write(b);

                //Because there is at least one other packet this means the Setupheader Packet has finished
                //on this page so thats all we need and we can return
                if(nextPageHeader.getPacketList().size()>1)
                {
                    logger.info("Setupheader finishes on this page");
                    return baos.toByteArray();
                }

                //There is only the Setupheader packet on page if it has completed on this page we can return
                if(!nextPageHeader.isLastPacketIncomplete())
                {
                    logger.info("Setupheader finish on Page because this packet is complete");
                    return baos.toByteArray();
                }
            }
        }


    /** Calculate the size of the packet data for the comment and setup headers
     *
     * @param raf
     * @return
     * @throws CannotReadException
     * @throws IOException
     */
    public OggVorbisHeaderSizes readOggVorbisHeaderSizes(RandomAccessFile raf) throws CannotReadException, IOException
    {
        logger.fine("Started to read comment and setup header sizes:");
        //Stores filepointers so return file in same state
        long filepointer = raf.getFilePointer();

        long commentHeaderStartPosition=0;
        long setupHeaderStartPosition=0;
        int commentHeaderSize=0;
        int setupHeaderSize=0;
        //1st page = codec infos
        OggPageHeader pageHeader = OggPageHeader.read (raf);
        //Skip over data to end of page header 1
        raf.seek(raf.getFilePointer() + pageHeader.getPageLength());

        //2nd page = comment, may extend to additional pages or not , may also have setup header
        pageHeader = OggPageHeader.read (raf);
        commentHeaderStartPosition = raf.getFilePointer()
            - (OggPageHeader.OGG_PAGE_HEADER_FIXED_LENGTH + pageHeader.getSegmentTable().length);

        //Now at start of packets on page 2 , check this is the vorbis comment header
        byte [] b = new byte[VorbisHeader.FIELD_PACKET_TYPE_LENGTH + VorbisHeader.FIELD_CAPTURE_PATTERN_LENGTH];
        raf.read(b);
        if(!isVorbisCommentHeader (b))
        {
            throw new CannotReadException("Cannot find comment block (no vorbiscomment header)");
        }
        raf.seek(raf.getFilePointer() - (VorbisHeader.FIELD_PACKET_TYPE_LENGTH + VorbisHeader.FIELD_CAPTURE_PATTERN_LENGTH));
        logger.fine("Found start of comment header at:"+raf.getFilePointer());

        //Calculate Comment Size (not inc header)
        while(true)
        {
            List<OggPageHeader.PacketStartAndLength> packetList = pageHeader.getPacketList();
            commentHeaderSize+=packetList.get(0).getLength();
            raf.skipBytes(packetList.get(0).getLength());

            if(packetList.size()>1 ||!pageHeader.isLastPacketIncomplete())
            {
                //done comment size
                logger.fine("Found end of comment:size:"+commentHeaderSize+"finishes at:"+raf.getFilePointer());
                break;
            }
            pageHeader = OggPageHeader.read (raf);
        }

        //Calculate setupHeader Size (should be straight afterwards)
        //TODO need to be more robust in case setup starts on next page
        List<OggPageHeader.PacketStartAndLength> packetList = pageHeader.getPacketList();

        //Now at start of next packet , check this is the vorbis setup header
        b = new byte[VorbisHeader.FIELD_PACKET_TYPE_LENGTH + VorbisHeader.FIELD_CAPTURE_PATTERN_LENGTH];
        raf.read(b);
        if(!isVorbisSetupHeader(b))
        {
            throw new CannotReadException("Cannot find vorbis setup header)");
        }
        raf.seek(raf.getFilePointer() - (VorbisHeader.FIELD_PACKET_TYPE_LENGTH + VorbisHeader.FIELD_CAPTURE_PATTERN_LENGTH));
        logger.fine("Found start of vorbis setup header at:"+raf.getFilePointer());

        //Set this to the  start of the OggPage that setupheader was found on
        setupHeaderStartPosition = raf.getFilePointer()
                   - (OggPageHeader.OGG_PAGE_HEADER_FIXED_LENGTH + pageHeader.getSegmentTable().length)
                   - packetList.get(0).getLength();


        //Add packet data to size to the setup header size
        setupHeaderSize=packetList.get(1).getLength();
        logger.fine("Adding:"+packetList.get(1).getLength() + " to setup header size");
        //Skip over the packet data
        raf.skipBytes(packetList.get(1).getLength());

        if(!pageHeader.isLastPacketIncomplete())
        {
            logger.fine("Found end of setupheader:size:"+setupHeaderSize+"finishes at:"+raf.getFilePointer());
            //done setup size
        }
        else
        {
            pageHeader = OggPageHeader.read (raf);
            packetList = pageHeader.getPacketList();
            while(true)
            {
                setupHeaderSize+=packetList.get(0).getLength();
                logger.fine("Adding:"+packetList.get(0).getLength() + " to setup header size");
                raf.skipBytes(packetList.get(0).getLength());
                if(!pageHeader.isLastPacketIncomplete())
                {
                    //done setup size
                    logger.fine("Found end of setupheader:size:"+setupHeaderSize+"finishes at:"+raf.getFilePointer());
                    break;
                }
                pageHeader = OggPageHeader.read (raf);
            }
        }

        raf.seek(filepointer);
        return new OggVorbisHeaderSizes(commentHeaderStartPosition,setupHeaderStartPosition,commentHeaderSize,setupHeaderSize);
    }

    /**
     * Find the length of the raw packet data and the start position of the ogg page header they start in
     * for the two OggVorbisHeader we need to know about when writing data (sizes included vorbis header)
     */
    public static class OggVorbisHeaderSizes
    {
        private long commentHeaderStartPosition;
        private long setupHeaderStartPosition;
        private int commentHeaderSize;
        private int setupHeaderSize;

        OggVorbisHeaderSizes(long commentHeaderStartPosition,long setupHeaderStartPosition,int commentHeaderSize,int setupHeaderSize)
        {
            this.commentHeaderStartPosition=commentHeaderStartPosition;
            this.setupHeaderStartPosition=setupHeaderStartPosition;
            this.commentHeaderSize=commentHeaderSize;
            this.setupHeaderSize=setupHeaderSize;
        }

        /**
         *
         * @return the size of the raw packet data for the vorbis comment header (includes vorbis header)
         */
        public int getCommentHeaderSize()
        {
            return commentHeaderSize;
        }

        /**
         *
         * @return he size of the raw packet data for the vorbis setup header (includes vorbis header)
         */
        public int getSetupHeaderSize()
        {
            return setupHeaderSize;
        }

        /**
         *
         * @return the start position in the file of the ogg header which contains the start of the Vorbis Comment
         */
        public long getCommentHeaderStartPosition()
        {
            return commentHeaderStartPosition;
        }

        /**
         *
         * @return the start position in the file of the ogg header which contains the start of the Setup Header
         */
        public long getSetupHeaderStartPosition()
        {
            return setupHeaderStartPosition;
        }
    }
}

⌨️ 快捷键说明

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