/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under GNU GENERAL PUBLIC LICENSE Version 3. */ package com.ttProject.xuggle.flv.test; import org.apache.log4j.Logger; import org.junit.Assert; import org.junit.Test; import com.ttProject.media.flv.FlvHeader; import com.ttProject.media.flv.ITagAnalyzer; import com.ttProject.media.flv.Tag; import com.ttProject.media.flv.TagAnalyzer; import com.ttProject.media.flv.tag.AudioTag; import com.ttProject.media.flv.tag.VideoTag; import com.ttProject.nio.channels.FileReadChannel; import com.ttProject.nio.channels.IFileReadChannel; import com.ttProject.xuggle.flv.FlvPacketizer; import com.xuggle.xuggler.IAudioSamples; import com.xuggle.xuggler.IPacket; import com.xuggle.xuggler.IStreamCoder; import com.xuggle.xuggler.IVideoPicture; /** * デコード動作のテスト * @author taktod * */ public class DecodeTest { private Logger logger = Logger.getLogger(DecodeTest.class); @Test public void h263Test() { // videoDecodeTest("/home/xxx/h263.flv"); } @Test public void vp6Test() { // videoDecodeTest("/home/xxx/vp6.flv"); } @Test public void avcTest() { // videoDecodeTest("/home/xxx/avc.flv"); } @SuppressWarnings("unused") private void videoDecodeTest(String target) { try { IFileReadChannel source = FileReadChannel.openFileReadChannel(target); FlvHeader flvheader = new FlvHeader(); flvheader.analyze(source); logger.info(flvheader); ITagAnalyzer analyzer = new TagAnalyzer(); // sourceをそのまま解析する。 FlvPacketizer packetizer = new FlvPacketizer(); IStreamCoder decoder = null; IPacket packet = null; Tag tag = null; while((tag = analyzer.analyze(source)) != null) { if(tag instanceof VideoTag) { packet = packetizer.getPacket(tag, null); if(packet == null) { continue; } if(decoder == null) { decoder = packetizer.createVideoDecoder(); } int offset = 0; IVideoPicture picture = IVideoPicture.make(decoder.getPixelType(), decoder.getWidth(), decoder.getHeight()); while(offset < packet.getSize()) { int bytesDecoded = decoder.decodeVideo(picture, packet, offset); if(bytesDecoded <= 0) { throw new Exception("デコード中に問題が発生しました。"); } offset += bytesDecoded; if(picture.isComplete()) { logger.info(picture); } } } } decoder.close(); source.close(); } catch (Exception e) { e.printStackTrace(); Assert.fail("例外が発生しました。"); } } @Test public void aacTest() { /* TODO いつか直したところ * いろいろ試したけど。やっぱりwindows8では、aacのデコードのみそのままだときちんと動作しないみたいです。 * で、動作させるにはですが・・・ * いったん別のデコーダーに大きなバッファをいれてエンコード成功させて閉じてしまうか * 別のデコーダーに大きなバッファをいれてエンコード失敗させたまま放置しておいとくかのどちらかでしか動作可能にできない模様です。 * 失敗した場合はデコーダーを閉じてしまうとだめみたいです。 * * どうやらdecoderを2つつくって1つ目をdummyにしてしまえば大丈夫っぽいです。 */ // audioDecodeTest("/home/xxx/aac.flv"); } @Test public void mp3Test() { // audioDecodeTest("/home/xxx/mp3.flv"); } @Test public void nellyTest() { // audioDecodeTest("/home/xxx/nelly.flv"); } @Test public void speexTest() { // audioDecodeTest("/home/xxx/speex.flv"); } @SuppressWarnings("unused") private void audioDecodeTest(String target) { try { IFileReadChannel source = FileReadChannel.openFileReadChannel(target); FlvHeader flvheader = new FlvHeader(); flvheader.analyze(source); ITagAnalyzer analyzer = new TagAnalyzer(); // sourceをそのまま解析する。 FlvPacketizer packetizer = new FlvPacketizer(); IStreamCoder decoder = null; IPacket packet = null; Tag tag = null; while((tag = analyzer.analyze(source)) != null) { if(tag instanceof AudioTag) { packet = packetizer.getPacket(tag, null); if(packet == null) { continue; } if(decoder == null) { decoder = packetizer.createAudioDecoder(); } IAudioSamples samples = IAudioSamples.make(1024, decoder.getChannels()); int offset = 0; while(offset < packet.getSize()) { int bytesDecoded = decoder.decodeAudio(samples, packet, offset); if(bytesDecoded < 0) { throw new Exception("デコード中にエラーが発生しました。"); } offset += bytesDecoded; if(samples.isComplete()) { logger.info(samples); } } } } if(decoder != null) { decoder.close(); decoder = null; } if(source != null) { source.close(); source = null; } } catch (Exception e) { e.printStackTrace(); Assert.fail("例外が発生しました。"); } } }