注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一个博客

两个标题

 
 
 

日志

 
 

倒着播放的播放器  

2008-12-21 14:41:25|  分类: 声音 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        不知道是不是自己太无聊了,怎么又这种念头?网上搜索了一下也没有找到这种播放器,所以自己写一个吧。

准备工作:

        查了查用JAVA写播放器要使用第三方JAR包:JMF。下载地址:http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/download.html

        顺便浏览了一下,播放MP3好像还有一个插件也要下下来:MP3 support for JMF(安装方式:把插件解压到JRE目录下(Unzip the JavaMP3plugin.zip in the JRE directory of your choice.))

下载地址:http://java.sun.com/javase/technologies/desktop/media/jmf/mp3/download.html

        哎,他们为什么不能放在一起呢。

        下载完毕后,先安装jmf-2_1_1e-windows-i586.exe文件。里面好像已经带一个播放器了,本来想看看有没有源代码的,发现是EXE...哎,还是自己动手吧。再安装那个MP3的插件,可能会装不上去,重新下一遍就可以了。

开工:

        找到JMF的API http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/apidocs/

        先凑合着写个简单的:

        package org.hzh.mid;

import java.io.IOException;

import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoPlayerException;
import javax.media.Player;
import javax.media.Time;

public class MidPlayer {
 
 /**
  * 文件的路径
  */
 private static String path = "file:/E:/A.MP3";
 
 /**
  * 播放器
  */
 private static Player player;
 
 /**
  * 播放长度
  */
 private static Time stopTime;
 
 /**
  * 正在播放的时间
  */
 private static Time playTime;
 
 public static void main(String[] args) {
  //文件位置
  MediaLocator ml = new MediaLocator(path);
  try {
   player = Manager.createPlayer(ml.getURL());
  } catch (NoPlayerException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
  if(player == null) {
   System.out.println("err");
   return;
  }
  
  stopTime = player.getStopTime();
  
  playTime = player.getMediaTime();
  
  player.prefetch();//媒体预提取
  player.start();
  
  try {
   //没有这个就没声音
   Thread.sleep(stopTime.getNanoseconds());
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  
  player.stop();
  player.close();
 }
}
只是实现了简单的播放功能,并没有实现倒播放的功能,然后慢慢摸索一下,看看怎么搞定他。

 额。。。查找了一下MP3的格式,发现是不可能实现的,因为MP3的格式是每一帧26毫秒(出处:http://blog.csdn.net/jmxuan/archive/2004/08/03/59827.aspx防止失效,考虑转载)

所以应该是不可以的,所以退而求其次,写了个修改MP3文件,达到倒着播放的DEMO

 

package test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class TestMP3 {
 private static String path = "E:/A.MP3";
 
 private static String aftetPath = "E:/B.MP3";
 
 public static void main(String[] args) throws Exception {
  File file = new File(path);
  
  //做一些初始化
  File after = new File(aftetPath);
  after.createNewFile();
  BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
  
  BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(aftetPath));
  
  //FrameSize=32768 bits
  int FrameSize = 32768 / 8;
  int frame = (int)(file.length() - 128) / FrameSize;
  int id3_1_length = (int)(file.length() - 128) % FrameSize;
  
  byte[] temp = new byte[(int)(file.length() - 128 - id3_1_length)];
  byte[] id3_1 = new byte[id3_1_length];
  byte[] id3_2 = new byte[128];
  
  //读取文件
  bis.read(id3_1, 0, id3_1_length);
  bis.read(temp, 0, (int)(file.length() - 128 - id3_1_length));
  bis.read(id3_2, 0, 128);
  
  bis.close();
  
  //写到新文件里面
  bos.write(id3_1);
  
  for (int i = frame; i > 0; i--) {
   byte[] before = new byte[FrameSize];
   for(int j=FrameSize - 1; j > 0; j--) {
    before[FrameSize-1 - j] = temp[i*FrameSize - j];
   }
   bos.write(before);
  }

  bos.write(id3_2);
  bos.flush();
  bos.close();
 }
}

  评论这张
 
阅读(202)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017