/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.convert.ffmpeg.test; import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.log4j.Logger; import org.junit.Test; import com.ttProject.container.IContainer; import com.ttProject.container.flv.FlvTagReader; import com.ttProject.convert.ffmpeg.FfmpegConvertManager; import com.ttProject.convert.ffmpeg.ProcessHandler; 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() throws Exception { // データ元 IReadChannel fc1 = FileReadChannel.openFileReadChannel("http://49.212.39.17/mario.mp4"); // 保存先 final FileOutputStream fos = new FileOutputStream("output.flv"); // 変換マネージャー FfmpegConvertManager manager = new FfmpegConvertManager(); // 変換動作プロセス取得 ProcessHandler handler = manager.getProcessHandler("test"); // processHandlerを複数つくって、複数取り出す形にしておけばよい // 変換出力データの処理 /* handler.addListener(new IConvertListener() { @Override public void receiveData(ByteBuffer buffer) { try { // 応答をうけとったらファイルに書き出す。 logger.info("応答をうけとりました。"); fos.getChannel().write(buffer); } catch (Exception e) { e.printStackTrace(); } } });*/ // 処理させる動作コマンド handler.setCommand("/usr/local/bin/avconv -i - -acodec libmp3lame -vcodec flv1 -f flv -"); // Map<String, String> map = new HashMap<String, String>(); // map.put("DYLD_LIBRARY_PATH", "/usr/local/lib"); // handler.setEnvExtra(map); // 処理開始 manager.start(); // スタート後にIReadChannelを取得することができるが、別threadとして動作させないとだめ ExecutorService executorService = Executors.newCachedThreadPool(); final IReadChannel resultChannel = handler.getReadChannel(); executorService.execute(new Runnable() { @Override public void run() { // ここで処理を実行します。 try { FlvTagReader reader = new FlvTagReader(); IContainer container = null; while((container = reader.read(resultChannel)) != null) { logger.info(container); } } catch(Exception e) { logger.error("例外が発生しておわってしまいました。", e); } logger.info("変換の出力の取得処理がおわりました。"); } }); ByteBuffer buf; while(true) { // ソースファイルからデータ読み込み buf = ByteBuffer.allocate(65536); fc1.read(buf); buf.flip(); if(buf.remaining() != 0) { // データがある場合は変換プログラムにデータを送る logger.info("流し込む"); manager.applyData(buf); } // 読み込み元ファイルを読み切ったらおわり。 if(fc1.position() == fc1.size()) { break; } } // ちょっと待っとく。 Thread.sleep(2000); // 後処理 fc1.close(); fos.close(); } }