b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

十分钟完成安卓MediaCodec视频解码

电脑杂谈  发布时间:2019-07-21 23:07:11  来源:网络整理

完美解码安卓版_视频安卓版_安卓版短信轰炸器

以上就是我机网小编给大家带来的三星gear2刷机android教程(附带安卓刷机rom包及工具)相关教程,看起来是比较的麻烦,不过小编感觉安卓系统太耗电,为避免刷机成了板砖,还是建议大家使用原生态的tizen系统。完美解码 10.01完美解码是一款能实现各种流行视频、hdtv回放及编码的全能型影音解码包,完美解码自带 media player classic、kmplayer、potplayer 三款流行播放器,支持简、英语言平台下安装,能播放avi、vcd、dvd、mpg、mp4、rmvb、ts、tp、evo、m2ts、mkv、ogm、mov、scm、csf、flv等众多种格式的影音文件。完美解码是一款能实现各种流行视频、hdtv播放及编码的全能型影音解码包,自带mediaplayerclassic、kmplayer、potplayer。

但由于部分厂商的的设计视频安卓版,在某些手机上,H.264解码帧会缓存几帧再渲染,造成7帧左右的延迟现象。如果对解码实时性要求较高,可以通过减少IDR帧间隔来解决(三星的Exynos除外)。

现在主流的视频格式是mp4,mp4视频格式的兼容性好,几乎所有的播放器都支持播放mp4格式的视频,但也有不少其它视频格式,这就需要用到迅捷视频转换器了。率先支持h.264.、mpeg1,2/4、divx、xvid、vc1等高清格式解码,支持mkv/.ts/.m2ts/.mts/.tp/.wmv/.ifo/.iso/.vob/.dat/.avi/.mpg/.mp4/.mov/.divx/.xvid/.rm/.rmvb/.flv等视频格式,不但弥补了sigma等方案高清播放机不能解码real高清格式的遗憾,更为消费带来高清全格式的普及浪潮。5、系统支持蓝光播放和常用的视频格式播放,2d、3d自由切换,视频支持“1920*1860”高清分辨率输出视频安卓版,支持蓝光3d解码,支持h.264格式的硬件编码,1080p的分辨率下帧率可达60,画质的极致之美。

MediaCodec的使用场景是:当你的项目需要用加密的协议来传输视频流,或者需要和视频裸流打交道的时候。

那么,阅读了上面这些啰嗦话,仍然决定要使用MediaCodec的话,就继续读下去吧

在系统实施阶段,依赖关系通常通过三种方式来实现,第一种也是最常用的一种方式是如图1所示的将一个类的对象作为另一个类中方法的参数,第二种方式是在一个类的方法中将另一个类的对象作为其局部变量,第三种方式是在一个类的方法中调用另一个类的静态方法。 } 类厂本身是一个管理组件实例化的类. 在 xpcom 中, 类厂要实现 nsifactory 接口, 它们就象上面的代码一样要使用类厂设计模式来封装对象的构造和初始化.封装构造函数 的例子是一个简单的无状态的类厂版本, 实际的编程要复杂一些, 一般的类厂都需要保存状态. 类厂至少应该保存那些对象已经被创建了的信息. 如果类厂管理的实例被存放在一个动态联接库中, 还需要知道什么时候可以卸载这个动态联接库. 当类厂保存了这样的信息, 就可以向类厂查询一个对象是否已经被创建.另一个需要保存的信息是关于单件. 如果一个类厂已经创建了一个单件类型的类, 后续的创建该单件的函数调用将返回已经创建的对象. 尽管有更好的工具和方式来管理单件, 开发人员可能仍然需要通过这种方式来保证只有一个单件对象被创建.厂模式可以完全利用函数来做, 状态可以保存在全局变量中。在array.prototype.slice.call(arguments,0)中,array.prototype.slice调用的是array的原型方法,对于正真的数组是有slice()方法,但是对于像arguments或者自己定义的一些类数组对象虽然存在length等若干属性,但是并没有slice()方法,所以对于这种类数组对象就得使用原型方法来使用slice()方法,即array.prototype.slice(如果在自定义中的类数组对象中自定义了slice()方法,那么自然可以直接调用)。

        //首先我们需要一个显示视频的SurfaceView
        SurfaceView surfaceView;
        //根据视频编码创建,这里是解码AVC编码的视频
        MediaCodec mediaCodec = MediaCodec.createDecoderByType(MediaFormat.MIMETYPE_VIDEO_AVC);
        //设置宽高,初始化时设置为最小宽高
        width = 128;
        height = 128;
        //创建视频格式信息
        MediaFormat mediaFormat = MediaFormat.createVideoFormat(mimeType, width, height);
        //!!!注意,这行代码需要界面绘制完成之后才可以调用!!!
        mediaCodec.configure(mediaFormat, surfaceView.getHolder().getSurface(), null, 0);
        mediaCodec.start();

注意,surfaceView的Holder是在界面绘制完成后才可以使用的,如果你把configure方法写在OnCreate里面……等着崩吧~

视频安卓版_完美解码安卓版_安卓版短信轰炸器

当然,如果你想要进入页面就开始解码的话,诶也不是不可以~

configure方法写在SurfaceView的生命周期里就好了:

SurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder surfaceHolder) {
                mediaCodec.configure(mediaFormat, surfaceHolder.getSurface(), null, 0);
                mediaCodec.start();
            }
            @Override
            public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
            }
            @Override
            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
                stop();
            }
        });

MediaCodec支持的编码可以在MediaFormat类的常量中找到:

首先要准备好MediaCodec.BufferInfo,

这个类在整个解码过程中都只要使用一个实例,

因此只要放在初始化方法里就好(onCreate也行):


    MediaCodec.BufferInfo mediaCodecBufferInfo = new MediaCodec.BufferInfo();
 

接下来编写解码函数:

完美解码安卓版_安卓版短信轰炸器_视频安卓版


    //为减少卡顿,此方法应在子线程下被执行
    public void onFrame(byte[] buf) {
            try {
                //获取MediaCodec的输入流
                ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers();
                //设置解码等待时间,0为不等待,-1为一直等待,其余为时间单位
                int inputBufferIndex = mediaCodec.dequeueInputBuffer(0);
                //填充数据到输入流
                if (inputBufferIndex >= 0) {
                ByteBuffer inputBuffer;
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
                    inputBuffer = mediaCodec.getInputBuffer(inputBufferIndex);
                } else {
                    //兼容安卓5.0以下,如不需要可以删掉
                    inputBuffer = mediaCodec.getInputBuffers()[inputBufferIndex];
                }
                inputBuffer.put(buf);
                mediaCodec.queueInputBuffer(inputBufferIndex, 0, length, stamp, 0);
                    inputBuffer.put(buf, 0, buf.length);
                    mediaCodec.queueInputBuffer(inputBufferIndex, 0, buf.length, System.nanoTime() / 1000, 0);
                }
                //解码数据到surface,实际项目中最好将以下代码放入另一个线程,不断循环解码以降低延迟
                int outputBufferIndex = mediaCodec.dequeueOutputBuffer(mediaCodecBufferInfo, 0);
                if (outputBufferIndex >= 0) {
                    mediaCodec.releaseOutputBuffer(outputBufferIndex, true);
                } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
                    //此处可以或得到视频的实际分辨率,用以修正宽高比
                    //fixHW();
                }
            } catch (IllegalStateException e) {
                e.printStackTrace();
            }
       
    }

由于其中包含对数据流的操作,请将这个方法写在子线程里。

在解码时可能会涉及到线程冲突、解码失败的问题,所以这个方法要catch掉IllegalStateException,不然~

代码中注释写的很完整,这里就不多赘述了【反正你们其实就是想复制粘贴是吧!

到这里,你已经完成了解码操作了,对,就是这么简单!

你以为到这里就结束了吗?科科~


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-114728-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...