import android.content.Context;
import android.media.MediaCodec;
import android.media.MediaFormat;
import android.util.AttributeSet;
import android.view.SurfaceView;
import java.nio.ByteBuffer;
public class RtspPlayer extends SurfaceView {
MediaCodec mediaCodec;
public RtspPlayer(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
}
public void configure(int width, int height) {
try {
mediaCodec = MediaCodec.createDecoderByType("video/avc");
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", width, height);
mediaCodec.configure(mediaFormat, getHolder().getSurface(), null, 0);
mediaCodec.start();
} catch (Exception e) {
e.printStackTrace();
}
}
public void onVideoFrame(byte[] frame) {
ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers();
int inputBufferIndex = mediaCodec.dequeueInputBuffer(-1);
if (inputBufferIndex < 0)
return;
ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
inputBuffer.clear();
inputBuffer.put(frame, 0, frame.length);
mediaCodec.queueInputBuffer(inputBufferIndex, 0, frame.length, 0, 0);
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 100);
while (outputBufferIndex >= 0) {
mediaCodec.releaseOutputBuffer(outputBufferIndex, true);
outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 0);
}
}
}
configure方法设置视频大小,将MediaCodec与SurfaceView绑定 onVideoFrame方法将rtsp的流数据,通过MediaCodec转码显示在SurfaceView上