MediaCodec,MediaExtractor,TextureView+AudioTrack这四个类的作用就不说了。
https://blog.csdn.net/column/details/15450.html
主要思路流程:
MediaExtractor解封装,拿到H264数据。
MediaCodec把数据解码到Surface中。
TextureView展示Surface中的数据。
MediaExtractor,MediaCodec解码音频数据AudioTrack播放
当然这个还可以用TextureView.getBitmap()获取视频的一帧图片,保存到本地。
1.MediaExtractor解封装,拿到H264数据。
extractor = new MediaExtractor();
extractor.setDataSource(mVideoPath);
for (int i = 0; i < extractor.getTrackCount(); i++) {
MediaFormat format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (mime.startsWith("video/")) {
extractor.selectTrack(i);
break;
}
}
......
int sampleSize = extractor.readSampleData(buffer, 0);
if (sampleSize < 0) {//把数据传给解码器
decoder.queueInputBuffer(inIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
isEOS = true;
}
else {
decoder.queueInputBuffer(inIndex, 0, sampleSize, extractor.getSampleTime(), 0);
extractor.advance();
}
2 .MediaCodec把数据解码到Surface中。
decoder.configure(format, mDecoderSurface, null, 0);
...
decoder.releaseOutputBuffer(outIndex, true);
3. TextureView展示Surface中的数据。
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1)
{
mSurface = new Surface(surfaceTexture);
new Thread(new Runnable()
{
@Override
public void run()
{
VideoDecoder = new VideoDecoder(Environment.getExternalStorageDirectory().getPath()+"/360.mp4",mSurface);
VideoDe