/* * 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.frame; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; import com.ttProject.frame.IAudioFrame; import com.ttProject.frame.IFrame; import com.ttProject.frame.IVideoFrame; import com.ttProject.frame.extra.AudioMultiFrame; import com.ttProject.frame.extra.VideoMultiFrame; import com.ttProject.frame.flv1.Flv1Frame; import com.xuggle.ferry.IBuffer; import com.xuggle.xuggler.ICodec; import com.xuggle.xuggler.IPacket; import com.xuggle.xuggler.IRational; import com.xuggle.xuggler.IStreamCoder; import com.xuggle.xuggler.IStreamCoder.Direction; /** * flameデータをxuggleのpacketに変換するプログラム * @author taktod */ public class XuggleHelper { /** * frameからpacketをつくる動作 * @param frame * @return */ public static List<IPacket> getPackets(IFrame frame, IPacket packet) throws Exception { List<IPacket> result = new ArrayList<IPacket>(); // packetからbyteBufferを取り出してあとは適当に処理する。 if(frame instanceof AudioMultiFrame || frame instanceof VideoMultiFrame) { throw new Exception("マルチフレームからは情報がとれないようになっています"); } if(frame instanceof IAudioFrame) { result.add(getAudioPacket((IAudioFrame)frame, packet)); } else if(frame instanceof IVideoFrame) { result.add(getVideoPacket((IVideoFrame)frame, packet)); } // その他 return result; } /** * 各packetを取り出します。packetが指定されている場合はそのメモリーを使いまわします * @param frame * @param packet * @return * @throws Exception */ private static IPacket getAudioPacket(IAudioFrame frame, IPacket packet) throws Exception { return null; } /** * 各packetを取り出します。packetが指定されている場合はそのメモリーを使いまわします * @param frame * @param packet * @return * @throws Exception */ private static IPacket getVideoPacket(IVideoFrame frame, IPacket packet) throws Exception { if(packet == null) { packet = IPacket.make(); } ByteBuffer buffer = frame.getPackBuffer(); int size = buffer.remaining(); IBuffer bufData = IBuffer.make(null, buffer.array(), 0, size); packet.setData(bufData); packet.setFlags(0); packet.setDts(frame.getDts()); packet.setPts(frame.getPts()); packet.setTimeBase(IRational.make(1, (int)frame.getTimebase())); packet.setComplete(true, size); packet.setKeyPacket(frame.isKeyFrame()); return packet; } /** * frameから対象デコーダーを取得する動作 * @param frame * @return */ public static IStreamCoder getDecoder(IFrame frame, IStreamCoder decoder) { if(frame instanceof Flv1Frame) { if(decoder == null || decoder.getCodecID() != ICodec.ID.CODEC_ID_FLV1) { decoder = IStreamCoder.make(Direction.DECODING, ICodec.ID.CODEC_ID_FLV1); decoder.setTimeBase(IRational.make(1, (int)frame.getTimebase())); } } return decoder; } /** * packetからフレームをつくる動作 * @param packet * @return */ public static IFrame getFrame(IPacket packet) { // TODO これをつくるにはIStreamCoderが必要。(どのコーデックかは、packetからはわからない。) return null; } }