MediaCodec+MediaExtractor+TextureView+AudioTrack实现简易视频播放器

本文介绍了如何利用MediaExtractor进行视频解封装,MediaCodec进行解码,TextureView显示解码后的视频帧,以及AudioTrack播放音频数据,从而实现简易视频播放器的功能。详细步骤包括MediaExtractor获取H264数据,MediaCodec解码到Surface,TextureView展示视频,以及MediaExtractor和MediaCodec配合解码音频通过AudioTrack播放。
摘要由CSDN通过智能技术生成

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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值