读书频道 > 网站 > 网页设计 > 想到做到:Android开发关键技术与精彩案例
9.2.5 分割MP3文件
12-08-06    叶孤城
收藏    我要投稿   
这不是一本只讲android开发技术的图书,本书让开发者站在移动互联产业链条上思考自己该怎么做本书按照入门篇、进阶篇和游戏篇三大部分,结合37个案例系统全面地介绍Android应用和游戏开发的知识。结合实践和设计模...立即去当当网订购
前面已经分析了MP3的3个重要组成部分,切割MP3文件就变得不那么复杂了。主要的思路是首先将输入的起始时间点和结束时间点转换为MP3的两个位置点,这项工作可以通过Frames的time2offset()方法完成。获得两个点之后,就可以通过IO操作将数据帧切下来,然后在头部和尾部分别组装ID3V2和ID3V1标签,这样一个新的MP3文件就生成了。
MP3File类的源代码如下所示:
public class MP3File {
    private File file;
    private long length;
    private ID3V2 id3v2;
    private Frames frames;
 
    public static void main(String[] args) {
        try {
            MP3File f = new MP3File("f:/media/mp3/daoxiang.mp3");
            f.cut(10 * 1000, 40 * 1000);
            System.out.println("MP3 file is cut successfully");
        } catch (MP3Exception ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
 
    public MP3File(String path) throws MP3Exception {
        file = new File(path);
        if (file.exists()) {
            length = file.length();
            initialize();
        }
    }
        public long time2offset(long mediaTime){
            if(frames != null)
                return frames.time2offset(mediaTime);
            return -1;
        }
    private void initialize() throws MP3Exception {
        //创建并初始化ID3V2标签
        if (id3v2 == null) {
            id3v2 = new ID3V2(file);
        }
        try {
            id3v2.initialize();
            //创建Frames对象
            frames = new Frames(this);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    public String getPath() {
        if (file != null)
            return file.getPath();
        return null;
    }
    //查询MP3帧的起始位置
    public int getFrameOffset() {
        if (id3v2 != null)
            return id3v2.getTagSize() + 10;
        return -1;
    }
 
    public long getLength() {
        return length;
    }
   
    /**
     * @param start 切割的开始位置,单位是毫秒
     * @param end 切割的终点位置,单位是毫秒
     * @return 新文件的路径
     * @throws FileNotFoundException
     * @throws IOException
     */
    public String cut(long start, long end) throws FileNotFoundException,
            IOException {
        String path = file.getPath();
        //新文件的路径
        String fileName = path.substring(0, path.length() - 4)
                + System.currentTimeMillis() + ".mp3";
        FileInputStream fis = new FileInputStream(new File(path));
        //新文件的输出流
        FileOutputStream fos = new FileOutputStream(new File(fileName));
        int tagSize = getFrameOffset();
        byte[] tag = new byte[tagSize];
        fis.read(tag);
        //将ID3V2的内容写入到新文件的输出流中
        fos.write(tag);
        long off1 = frames.time2offset(start);
        long off2 = frames.time2offset(end);
        fis.skip(off1 - tagSize);
        byte[] buf = new byte[1024];
        int count = 0;
        int ch = -1;
        //避免内存消耗过大,一块一块地读取输入流后再写入到输出流
        while ((count < off2 - off1) && (ch = fis.read(buf)) != -1) {
            fos.write(buf, 0, ch);
            count += ch;
        }
        byte[] id1 = new byte[128];
        fis.skip(length - off2 - 128);
        fis.read(id1);
        //将ID3V1的内容写入到新文件的输出流
        fos.write(id1);
        fos.flush();
        fis.close();
        fos.close();
        return fileName;
    }
}
需要说明的是,这里的代码主要是为了演示如何解决MP3的分割问题,并未经过严格的测试。MP3目前有很多版本,其涉及的规范和文件格式也有较大的差别,这里给出的方案可能考虑不够周全。如果读者希望完成商业应用程序,需要阅读更多的相关规范,对程序进行完善
点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站