📄 rawlivestream.java
字号:
/*
* RawLiveStream.java
*
* Created on March 20, 2003, 10:56 AM
*/
package gov.nist.media.protocol.live;
import java.awt.Dimension;
import javax.media.*;
import javax.media.format.*;
import javax.media.protocol.*;
import java.io.*;
/**
* A stream who read directly from an array of byte
* This Stream allow one to play or play back a buffer filled by RAW
* audio data
*
* @author Jean Deruelle <jean.deruelle@nist.gov>
*
* <a href="{@docRoot}/uncopyright.html">This code is in the public domain.</a>
*/
public class RawLiveStream implements PushBufferStream, Runnable {
protected ContentDescriptor cd = new ContentDescriptor(ContentDescriptor.RAW);
protected int maxDataLength;
protected byte [] data;
protected Dimension size;
protected RGBFormat rgbFormat;
protected AudioFormat audioFormat;
protected boolean started;
protected Thread thread;
protected float frameRate = 20f;
protected BufferTransferHandler transferHandler;
protected Control [] controls = new Control[0];
//protected boolean videoData = false;
/**
* Create a new RawLiveStream
*/
public RawLiveStream() {
/*if (videoData) {
int x, y, pos, revpos;
size = new Dimension(320, 240);
maxDataLength = size.width * size.height * 3;
rgbFormat = new RGBFormat(size, maxDataLength,
Format.byteArray,
frameRate,
24,
3, 2, 1,
3, size.width * 3,
VideoFormat.FALSE,
Format.NOT_SPECIFIED);
// generate the data
data = new byte[maxDataLength];
pos = 0;
revpos = (size.height - 1) * size.width * 3;
for (y = 0; y < size.height / 2; y++) {
for (x = 0; x < size.width; x++) {
byte value = (byte) ((y*2) & 0xFF);
data[pos++] = value;
data[pos++] = 0;
data[pos++] = 0;
data[revpos++] = value;
data[revpos++] = 0;
data[revpos++] = 0;
}
revpos -= size.width * 6;
}
} else { */// audio data
audioFormat = new AudioFormat(AudioFormat.LINEAR,
44100.0,
16,
2,
AudioFormat.LITTLE_ENDIAN,
AudioFormat.SIGNED,
8,
Format.NOT_SPECIFIED,
Format.byteArray);
maxDataLength = 822000;
//}
thread = new Thread(this);
thread.setName("RawLiveStream Thread");
}
/***************************************************************************
* SourceStream
***************************************************************************/
/**
* Get the current content type for this stream.
*
* @return The current <CODE>ContentDescriptor</CODE> for this stream.
*/
public ContentDescriptor getContentDescriptor() {
return cd;
}
/**
* Get the size, in bytes, of the content on this stream.
*
* @return The content length in bytes.
*/
public long getContentLength() {
return LENGTH_UNKNOWN;
}
/**
* Obtain the object that implements the specified
* <code>Class</code> or <code>Interface</code>
* The full class or interface name must be used.
* <p>
*
* The control is not supported.
* <code>null</code> is returned.
*
* @return <code>null</code>.
*/
public boolean endOfStream() {
return false;
}
/***************************************************************************
* PushBufferStream
***************************************************************************/
int seqNo = 0;
double freq = 2.0;
/**
* @see javax.media.protocol.PushBufferStream#getFormat()
*/
public Format getFormat() {
/*if (videoData)
return rgbFormat;
else*/
return audioFormat;
}
/**
* Fill the buffer with the raw audio data
*/
public void read(Buffer buffer) throws IOException {
synchronized (this) {
System.out.println("read");
Object outdata = buffer.getData();
if (outdata == null || !(outdata.getClass() == Format.byteArray) ||
((byte[])outdata).length < maxDataLength) {
System.out.println("null buffer, creating the buffer");
maxDataLength=data.length;
outdata = new byte[maxDataLength];
buffer.setData(outdata);
}
/*if (videoData) {
buffer.setFormat( rgbFormat );
buffer.setTimeStamp( (long) (seqNo * (1000 / frameRate) * 1000000) );
int lineNo = (seqNo * 2) % size.height;
int chunkStart = lineNo * size.width * 3;
System.arraycopy(data, chunkStart,
outdata, 0,
maxDataLength - (chunkStart));
if (chunkStart != 0) {
System.arraycopy(data, 0,
outdata, maxDataLength - chunkStart,
chunkStart);
}
}
else {*/
buffer.setFormat( audioFormat );
//buffer.setTimeStamp( 1000000000 / 8 );
for (int i = 0; i < maxDataLength; i++) {
((byte[])outdata)[i] = data[i];
}
//}
System.out.println(((byte[])outdata).length);
buffer.setSequenceNumber( seqNo );
buffer.setLength(maxDataLength);
buffer.setFlags(0);
buffer.setHeader( null );
seqNo++;
}
}
/**
* @see javax.media.protocol.PushBufferStream#setTransferHandler(javax.media.protocol.BufferTransferHandler)
*/
public void setTransferHandler(BufferTransferHandler transferHandler) {
synchronized (this) {
this.transferHandler = transferHandler;
notifyAll();
}
}
/**
* Start the thread
* @param started
*/
void start(boolean started) {
synchronized ( this ) {
this.started = started;
if (started && !thread.isAlive()) {
thread = new Thread(this);
thread.setName("RawLiveStream Thread");
thread.start();
}
notifyAll();
}
}
/***************************************************************************
* Runnable
***************************************************************************/
/**
* the execution method of the thread
*/
public void run() {
while (started) {
synchronized (this) {
while (transferHandler == null && started) {
try {
wait(1000);
}
catch (InterruptedException ie) {}
} // while
}
if (started && transferHandler != null) {
transferHandler.transferData(this);
try {
Thread.currentThread().sleep( 10 );
}
catch (InterruptedException ise) {}
}
} // while (started)
} // run
/**
* Obtain the collection of objects that
* control the object that implements this interface.
* <p>
*
* No controls are supported.
* A zero length array is returned.
*
* @return A zero length array
*/
public Object [] getControls() {
return controls;
}
/**
* Obtain the object that implements the specified
* <code>Class</code> or <code>Interface</code>
* The full class or interface name must be used.
* <p>
*
* The control is not supported.
* <code>null</code> is returned.
*
* @return <code>null</code>.
*/
public Object getControl(String controlType) {
try {
Class cls = Class.forName(controlType);
Object cs[] = getControls();
for (int i = 0; i < cs.length; i++) {
if (cls.isInstance(cs[i]))
return cs[i];
}
return null;
}
catch (Exception e) { // no such controlType or such control
return null;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -