android 加载h264视频
时间: 2023-08-16 16:03:26 浏览: 193
android 播放 h264
4星 · 用户满意度95%
要在 Android 上加载 H264 视频,可以使用 Android 提供的 MediaCodec API 和 SurfaceView 控件。
首先,需要创建一个 MediaExtractor 对象来读取 H264 视频文件。然后,通过 MediaFormat 获取 H264 视频的参数,例如视频的宽度、高度、码率等。接下来,创建一个 MediaCodec 对象,将 H264 视频的参数设置到 MediaCodec 中,并且将一个 SurfaceView 控件传递给 MediaCodec 作为输出。最后,将 H264 视频数据传递给 MediaCodec 进行解码,解码后的视频数据将通过 SurfaceView 控件进行显示。
以下是一个简单的示例代码:
```
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(videoFilePath);
int videoTrackIndex = -1;
for (int i = 0; i < extractor.getTrackCount(); i++) {
MediaFormat format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (mime.startsWith("video/")) {
videoTrackIndex = i;
break;
}
}
extractor.selectTrack(videoTrackIndex);
MediaFormat format = extractor.getTrackFormat(videoTrackIndex);
int width = format.getInteger(MediaFormat.KEY_WIDTH);
int height = format.getInteger(MediaFormat.KEY_HEIGHT);
int bitrate = format.getInteger(MediaFormat.KEY_BIT_RATE);
SurfaceView surfaceView = findViewById(R.id.surface_view);
MediaCodec codec = MediaCodec.createDecoderByType("video/avc");
codec.configure(format, surfaceView.getHolder().getSurface(), null, 0);
codec.start();
ByteBuffer[] inputBuffers = codec.getInputBuffers();
ByteBuffer[] outputBuffers = codec.getOutputBuffers();
BufferInfo info = new BufferInfo();
boolean isEOS = false;
while (!isEOS) {
int inputBufferIndex = codec.dequeueInputBuffer(10000);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
int sampleSize = extractor.readSampleData(inputBuffer, 0);
if (sampleSize < 0) {
isEOS = true;
codec.queueInputBuffer(inputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
} else {
codec.queueInputBuffer(inputBufferIndex, 0, sampleSize, extractor.getSampleTime(), 0);
extractor.advance();
}
}
int outputBufferIndex = codec.dequeueOutputBuffer(info, 10000);
switch (outputBufferIndex) {
case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
outputBuffers = codec.getOutputBuffers();
break;
case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
format = codec.getOutputFormat();
break;
case MediaCodec.INFO_TRY_AGAIN_LATER:
break;
default:
ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];
codec.releaseOutputBuffer(outputBufferIndex, true);
break;
}
if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
isEOS = true;
}
}
codec.stop();
codec.release();
extractor.release();
```
注意:上述代码仅为示例代码,实际使用时需要进行适当的修改和优化。
阅读全文