/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.convertprocess.test; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.log4j.Logger; import com.ttProject.container.IContainer; import com.ttProject.container.IReader; import com.ttProject.container.flv.FlvTagReader; import com.ttProject.container.flv.type.AudioTag; import com.ttProject.container.flv.type.VideoTag; import com.ttProject.container.mkv.MkvBlockTag; import com.ttProject.container.mkv.MkvTagReader; import com.ttProject.convertprocess.ProcessHandler; import com.ttProject.convertprocess.ProcessManager; import com.ttProject.nio.channels.FileReadChannel; import com.ttProject.nio.channels.IReadChannel; /** * コンバートを実施する動作テスト * @author taktod */ public class ConvertTest { /** ロガー */ private Logger logger = Logger.getLogger(ConvertTest.class); // @Test public void test() { IReadChannel source = null; try { source = FileReadChannel.openFileReadChannel("http://49.212.39.17/mario.flv"); // Flvなので、FlvReaderで読み取る IReader reader = new FlvTagReader(); IContainer container = null; ProcessManager manager = new ProcessManager(); // ベースとなるプロセス // ProcessHandler handler = manager.getProcessHandler("test"); // handler.setCommand("/usr/local/bin/avconv -y -copyts -i - -acodec copy -vcodec copy -f matroska ffout1.mkv"); // handler.setTargetClass("com.ttProject.convertprocess.process.FlvOutputEntry"); Map<String, String> env = new HashMap<String, String>(); env.put("LD_LIBRARY_PATH", "/usr/local/lib"); // 映像のみ final ProcessHandler videoHandler = manager.getProcessHandler("videoOnly"); videoHandler.setCommand("/usr/local/bin/avconv -y -copyts -i - -an -vcodec mjpeg -s 160x120 -g 10 -q 20 -f matroska -"); videoHandler.setTargetClass("com.ttProject.convertprocess.process.FlvVideoOutputEntry"); videoHandler.setEnvExtra(env); // 音声のみ final ProcessHandler audioHandler = manager.getProcessHandler("audioOnly"); audioHandler.setCommand("/usr/local/bin/avconv -y -copyts -i - -acodec adpcm_ima_wav -ar 22050 -ac 1 -vn -f matroska -"); audioHandler.setTargetClass("com.ttProject.convertprocess.process.FlvAudioOutputEntry"); audioHandler.setEnvExtra(env); manager.start(); ExecutorService executor = Executors.newFixedThreadPool(2); executor.execute(new Runnable() { @Override public void run() { try { IReadChannel channel = videoHandler.getReadChannel(); IReader reader = new MkvTagReader(); IContainer container = null; while((container = reader.read(channel)) != null) { if(container instanceof MkvBlockTag) { MkvBlockTag blockTag = (MkvBlockTag)container; logger.info(blockTag.getFrame()); } } } catch(Exception e) { e.printStackTrace(); } } });// */ executor.execute(new Runnable() { @Override public void run() { try { IReadChannel channel = audioHandler.getReadChannel(); IReader reader = new MkvTagReader(); IContainer container = null; while((container = reader.read(channel)) != null) { if(container instanceof MkvBlockTag) { MkvBlockTag blockTag = (MkvBlockTag)container; logger.info(blockTag.getFrame().getPts()); } } } catch(Exception e) { e.printStackTrace(); } } });// */ // 開始後にデータを取り出すthreadをつくっておく。 while((container = reader.read(source)) != null) { if(container instanceof VideoTag) { manager.pushFrame(((VideoTag) container).getFrame(), 0x09); } else if(container instanceof AudioTag) { manager.pushFrame(((AudioTag) container).getFrame(), 0x08); } } logger.info("10秒まっておく"); Thread.sleep(10000); } catch(Exception e) { e.printStackTrace(); } finally { if(source != null) { try { source.close(); } catch(Exception e) { } source = null; } } } }