引进外部类库:xuggle-xuggler.jar 文件
下载地址:http://www.xuggle.com/xuggler/downloads/
也可以直接从本文这里点击链接下载:
32 Bit, Java 1.5 or later | xuggle-xuggler-setup.exe |
下载完成之后安装,然后进安装目录 \Xuggle\share\java\jars ,
将目录下的 xuggle-xuggler.jar 文件导入到eclipse buildpath userLibrary里,
然后再进入 \Xuggle\bin 目录,将所有文件拷贝到 项目工程目录的 \bin 路径下(或者拷贝到你的JDK安装目录里的那个 \bin 目录下 也可以!)
以FLV转无损的WAV为例,贴上代码:
public class Main implements IMediaListener{ IMediaWriter writer; boolean flag=false; public static void main(String[] args) { new Main().doIt(); } public void doIt() { IMediaReader reader = ToolFactory.makeReader("E:\\aaa.flv");//E:\\aaa.rmvb E:\\aaa.flv writer = ToolFactory.makeWriter("e:\\out.wav", reader); int sampleRate = 22050;//48000 22050 int channels = 2; writer.addAudioStream(0, 0, ICodec.ID.CODEC_ID_PCM_S16LE, channels, sampleRate); reader.addListener(this); while (reader.readPacket() == null) { } } @Override public void onAddStream(IAddStreamEvent event) { // TODO Auto-generated method stub writer.onAddStream(event); } /**音频解码在这里*/ @Override public void onAudioSamples(IAudioSamplesEvent event) { // TODO Auto-generated method stub writer.onAudioSamples(event); } @Override public void onClose(ICloseEvent event) { // TODO Auto-generated method stub writer.onClose(event); } @Override public void onCloseCoder(ICloseCoderEvent event) { // TODO Auto-generated method stub writer.onCloseCoder(event); } @Override public void onFlush(IFlushEvent event) { // TODO Auto-generated method stub writer.onFlush(event); } @Override public void onOpen(IOpenEvent event) { // TODO Auto-generated method stub writer.onOpen(event); } @Override public void onOpenCoder(IOpenCoderEvent event) { // TODO Auto-generated method stub writer.onOpenCoder(event); } @Override public void onReadPacket(IReadPacketEvent event) { // TODO Auto-generated method stub writer.onReadPacket(event); } @Override public void onVideoPicture(IVideoPictureEvent event) { // TODO Auto-generated method stub //这里屏蔽了Video的输出 } @Override public void onWriteHeader(IWriteHeaderEvent event) { // TODO Auto-generated method stub writer.onWriteHeader(event); } @Override public void onWritePacket(IWritePacketEvent event) { // TODO Auto-generated method stub writer.onWritePacket(event); } @Override public void onWriteTrailer(IWriteTrailerEvent event) { // TODO Auto-generated method stub writer.onWriteTrailer(event); } public class MyCoder extends ICodec{ protected MyCoder(long cPtr, boolean cMemoryOwn) { super(cPtr, cMemoryOwn); // TODO Auto-generated constructor stub } } }
解码后的WAV文件在使用foobar2000播放时,效果如下图所示:
注意:常见的WAV文件必须使用ICodec.ID.CODEC_ID_PCM_S16LE编码,channels 是声道数量,sampleRate 是采样率,
当使用ICodec.ID.CODEC_ID_PCM_S16LE给WAV文件编码时,
必须和源文件采样率一致,否则会出现播放时间缩短、播放速度加快或者相反的异常结果!