⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 encoder.java

📁 FMJ(freedom media for java)是java视频开发的新选择
💻 JAVA
字号:
package net.sf.fmj.media.codec.audio.ulaw;import java.util.logging.Logger;import javax.media.Buffer;import javax.media.Format;import javax.media.format.AudioFormat;import net.sf.fmj.codegen.MediaCGUtils;import net.sf.fmj.media.AbstractCodec;import net.sf.fmj.utility.LoggerSingleton;/** *  * @author Ken Larson * */public class Encoder extends AbstractCodec{	private static final Logger logger = LoggerSingleton.logger;	public String getName()	{		return "ULAW Encoder";	}		public Encoder()	{		super();		this.inputFormats = new Format[] {				new AudioFormat(AudioFormat.LINEAR, -1.0, 16, 1, -1, AudioFormat.SIGNED, 16, -1.0, Format.byteArray),				//new AudioFormat(AudioFormat.LINEAR, -1.0, 8, 1, -1, AudioFormat.SIGNED, 8, -1.0, Format.byteArray)					// using 8 bit input is kind of silly, since the whole point of ulaw is to encode 16 bits as 8 bits.				// the quality will be bad, and we are better off using a rate converter to do all of the rate conversion at once.				};				// TODO: if force AudioFormat.LITTLE_ENDIAN, codecs leading up to this seem to freeze up or something.			}		// TODO: move to base class?	protected Format[] outputFormats = new Format[] {new AudioFormat(AudioFormat.ULAW, -1.0, 8, 1, -1, AudioFormat.SIGNED, 8, -1.0, Format.byteArray)};		public Format[] getSupportedOutputFormats(Format input)	{		if (input == null)			return outputFormats;		else		{				if (!(input instanceof AudioFormat))			{	logger.warning(this.getClass().getSimpleName() + ".getSupportedOutputFormats: input format does not match, returning format array of {null} for " + input); // this can cause an NPE in JMF if it ever happens.				return new Format[] {null};			}			final AudioFormat inputCast = (AudioFormat) input;			if (!inputCast.getEncoding().equals(AudioFormat.LINEAR) ||				(inputCast.getSampleSizeInBits() != 16 && inputCast.getSampleSizeInBits() != Format.NOT_SPECIFIED) ||				(inputCast.getChannels() != 1 && inputCast.getChannels() != Format.NOT_SPECIFIED) ||				(inputCast.getSigned() != AudioFormat.SIGNED && inputCast.getSigned() != Format.NOT_SPECIFIED) ||				(inputCast.getFrameSizeInBits() != 16 && inputCast.getFrameSizeInBits() != Format.NOT_SPECIFIED) ||				(inputCast.getDataType() != null && inputCast.getDataType() != Format.byteArray)				)			{					logger.warning(this.getClass().getSimpleName() + ".getSupportedOutputFormats: input format does not match, returning format array of {null} for " + input); // this can cause an NPE in JMF if it ever happens.				return new Format[] {null};			}			final AudioFormat result = new AudioFormat(AudioFormat.ULAW, inputCast.getSampleRate(), 8,					1, -1, AudioFormat.SIGNED, 8, // endian-ness irrelevant for 8 bits					inputCast.getFrameRate(), Format.byteArray);			return new Format[] {result};		}	}	public void open()	{	}		public void close()	{	}		private static final boolean TRACE = false;		public int process(Buffer inputBuffer, Buffer outputBuffer)	{		if (TRACE) dump("input ", inputBuffer);		        if (!checkInputBuffer(inputBuffer))        {            return BUFFER_PROCESSED_FAILED;        }        if (isEOM(inputBuffer))        {            propagateEOM(outputBuffer);	// TODO: what about data? can there be any?            return BUFFER_PROCESSED_OK;        }                final AudioFormat inputAudioFormat = (AudioFormat) inputBuffer.getFormat();                byte[] outputBufferData = (byte []) outputBuffer.getData();        final int requiredOutputBufferLength = inputBuffer.getLength() / 2;        	        if (outputBufferData == null || outputBufferData.length < requiredOutputBufferLength)        {	outputBufferData = new byte[requiredOutputBufferLength];        	outputBuffer.setData(outputBufferData);        }                if (!inputAudioFormat.equals(inputFormat))        	throw new RuntimeException("Incorrect inpout format");                if (inputAudioFormat.getEndian() == -1)        	throw new RuntimeException("Unspecified endian-ness");	// TODO: check in setInputFormat        final boolean bigEndian = inputAudioFormat.getEndian() == AudioFormat.BIG_ENDIAN;	        MuLawEncoderUtil.muLawEncode(bigEndian, (byte []) inputBuffer.getData(), inputBuffer.getOffset(), inputBuffer.getLength(), outputBufferData);        outputBuffer.setLength(requiredOutputBufferLength);        outputBuffer.setOffset(0);        outputBuffer.setFormat(outputFormat);                final int result = BUFFER_PROCESSED_OK;                		if (TRACE)		{	dump("input ", inputBuffer);			dump("output", outputBuffer);					System.out.println("Result=" + MediaCGUtils.plugInResultToStr(result));		}		return result;	}	public Format setInputFormat(Format arg0)	{		// TODO: force sample size, etc		if (TRACE) System.out.println("setInputFormat: " + MediaCGUtils.formatToStr(arg0));		return super.setInputFormat(arg0);	}	public Format setOutputFormat(Format arg0)	{		if (TRACE) System.out.println("setOutputFormat: " + MediaCGUtils.formatToStr(arg0));		return super.setOutputFormat(arg0);	}	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -