/* * 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.test; import com.xuggle.xuggler.ICodec; import com.xuggle.xuggler.IContainer; import com.xuggle.xuggler.IRational; import com.xuggle.xuggler.IStream; import com.xuggle.xuggler.IStreamCoder; import com.xuggle.xuggler.IStreamCoder.Flags; /** * エンコーダー設定支援 * @author taktod */ public class Encoder { /** * mp3 * @param container * @return */ public static IStreamCoder mp3(IContainer container) { IStream stream = container.addNewStream(ICodec.ID.CODEC_ID_MP3); IStreamCoder audioEncoder = stream.getStreamCoder(); audioEncoder.setSampleRate(44100); audioEncoder.setChannels(2); audioEncoder.setBitRate(96000); return audioEncoder; } /** * adpcm_swf * @param container * @return */ public static IStreamCoder adpcm_swf(IContainer container) { IStream stream = container.addNewStream(ICodec.ID.CODEC_ID_ADPCM_SWF); IStreamCoder audioEncoder = stream.getStreamCoder(); audioEncoder.setSampleRate(44100); audioEncoder.setChannels(2); audioEncoder.setBitRate(96000); return audioEncoder; } /** * adpcm_ima_wav * @param container * @return */ public static IStreamCoder adpcm_ima_wav(IContainer container) { IStream stream = container.addNewStream(ICodec.ID.CODEC_ID_ADPCM_IMA_WAV); IStreamCoder audioEncoder = stream.getStreamCoder(); audioEncoder.setSampleRate(44100); audioEncoder.setChannels(2); // audioEncoder.setBitRate(96000); // bitrateは設定する意味ないかも return audioEncoder; } /** * nerrymoser * @param container * @return */ public static IStreamCoder nellymoser(IContainer container) { IStream stream = container.addNewStream(ICodec.ID.CODEC_ID_NELLYMOSER); IStreamCoder audioEncoder = stream.getStreamCoder(); audioEncoder.setSampleRate(44100); audioEncoder.setChannels(2); audioEncoder.setBitRate(96000); return audioEncoder; } /** * nerrymoser * @param container * @return */ public static IStreamCoder speex(IContainer container) { IStream stream = container.addNewStream(ICodec.ID.CODEC_ID_SPEEX); IStreamCoder audioEncoder = stream.getStreamCoder(); audioEncoder.setSampleRate(32000); audioEncoder.setChannels(2); audioEncoder.setBitRate(96000); return audioEncoder; } /** * aac * @param container * @return */ public static IStreamCoder aac(IContainer container) { IStream stream = container.addNewStream(ICodec.ID.CODEC_ID_AAC); IStreamCoder audioEncoder = stream.getStreamCoder(); audioEncoder.setSampleRate(44100); audioEncoder.setChannels(2); audioEncoder.setBitRate(96000); return audioEncoder; } /** * vorbis * @param container * @return */ public static IStreamCoder vorbis(IContainer container) { IStream stream = container.addNewStream(ICodec.ID.CODEC_ID_VORBIS); IStreamCoder audioEncoder = stream.getStreamCoder(); audioEncoder.setSampleRate(44100); audioEncoder.setChannels(2); audioEncoder.setBitRate(96000); return audioEncoder; } /** * h264 * @param container * @return */ public static IStreamCoder h264(IContainer container) { IStream stream = container.addNewStream(ICodec.ID.CODEC_ID_H264); IStreamCoder videoEncoder = stream.getStreamCoder(); IRational frameRate = IRational.make(15, 1); // 15fps videoEncoder.setNumPicturesInGroupOfPictures(5); // gopを5にしておく。keyframeが5枚ごとになる。 videoEncoder.setBitRate(650000); // 650kbps videoEncoder.setBitRateTolerance(9000); videoEncoder.setWidth(320); videoEncoder.setHeight(240); videoEncoder.setGlobalQuality(10); videoEncoder.setFrameRate(frameRate); videoEncoder.setTimeBase(IRational.make(1, 1000)); // 1/1000設定(flvはこうなるべき) videoEncoder.setProperty("level", "30"); videoEncoder.setProperty("coder", "0"); videoEncoder.setProperty("qmin", "10"); videoEncoder.setProperty("bf", "0"); videoEncoder.setProperty("wprefp", "0"); videoEncoder.setProperty("cmp", "+chroma"); videoEncoder.setProperty("partitions", "-parti8x8+parti4x4+partp8x8+partp4x4-partb8x8"); videoEncoder.setProperty("me_method", "hex"); videoEncoder.setProperty("subq", "5"); videoEncoder.setProperty("me_range", "16"); videoEncoder.setProperty("keyint_min", "25"); videoEncoder.setProperty("sc_threshold", "40"); videoEncoder.setProperty("i_qfactor", "0.71"); videoEncoder.setProperty("b_strategy", "0"); videoEncoder.setProperty("qcomp", "0.6"); videoEncoder.setProperty("qmax", "30"); videoEncoder.setProperty("qdiff", "4"); videoEncoder.setProperty("directpred", "0"); videoEncoder.setProperty("profile", "main"); videoEncoder.setProperty("cqp", "0"); videoEncoder.setFlag(Flags.FLAG_LOOP_FILTER, true); videoEncoder.setFlag(Flags.FLAG_CLOSED_GOP, true); return videoEncoder; } /** * vp8 * @param container * @return */ public static IStreamCoder vp8(IContainer container) { IStream stream = container.addNewStream(ICodec.ID.CODEC_ID_VP8); IStreamCoder videoEncoder = stream.getStreamCoder(); IRational frameRate = IRational.make(15, 1); // 15fps videoEncoder.setNumPicturesInGroupOfPictures(5); // gopを5にしておく。keyframeが5枚ごとになる。 videoEncoder.setBitRate(650000); // 650kbps videoEncoder.setBitRateTolerance(9000); videoEncoder.setWidth(320); videoEncoder.setHeight(240); videoEncoder.setGlobalQuality(10); videoEncoder.setFrameRate(frameRate); videoEncoder.setTimeBase(IRational.make(1, 1000)); // 1/1000設定(flvはこうなるべき) return videoEncoder; } /** * flv1 * @return */ public static IStreamCoder flv1(IContainer container) { IStream stream = container.addNewStream(ICodec.ID.CODEC_ID_FLV1); IStreamCoder videoEncoder = stream.getStreamCoder(); IRational frameRate = IRational.make(15, 1); // 15fps videoEncoder.setNumPicturesInGroupOfPictures(5); // gopを5にしておく。keyframeが5枚ごとになる。 videoEncoder.setBitRate(650000); // 650kbps videoEncoder.setBitRateTolerance(9000); videoEncoder.setWidth(320); videoEncoder.setHeight(240); videoEncoder.setGlobalQuality(10); videoEncoder.setFrameRate(frameRate); videoEncoder.setTimeBase(IRational.make(1, 1000)); // 1/1000設定(flvはこうなるべき) return videoEncoder; } /** * theora * @return */ public static IStreamCoder theora(IContainer container) { IStream stream = container.addNewStream(ICodec.ID.CODEC_ID_THEORA); IStreamCoder videoEncoder = stream.getStreamCoder(); IRational frameRate = IRational.make(15, 1); // 15fps videoEncoder.setNumPicturesInGroupOfPictures(5); // gopを5にしておく。keyframeが5枚ごとになる。 videoEncoder.setBitRate(650000); // 650kbps videoEncoder.setBitRateTolerance(9000); videoEncoder.setWidth(320); videoEncoder.setHeight(240); videoEncoder.setGlobalQuality(10); videoEncoder.setFrameRate(frameRate); videoEncoder.setTimeBase(IRational.make(1, 1000)); // 1/1000設定(flvはこうなるべき) return videoEncoder; } /** * mjpeg * @param container * @return */ public static IStreamCoder mjpeg(IContainer container) { IStream stream = container.addNewStream(ICodec.ID.CODEC_ID_MJPEG); IStreamCoder videoEncoder = stream.getStreamCoder(); IRational frameRate = IRational.make(15, 1); videoEncoder.setNumPicturesInGroupOfPictures(5); // mjpegにはkeyFrameしかないので、意味ない? videoEncoder.setBitRate(650000); videoEncoder.setBitRateTolerance(9000); videoEncoder.setWidth(320); videoEncoder.setHeight(240); videoEncoder.setGlobalQuality(10); videoEncoder.setFrameRate(frameRate); videoEncoder.setTimeBase(IRational.make(1, 1000)); return videoEncoder; } }