永发信息网

android使用mediacodec进行编解码 常用吗

答案:1  悬赏:70  手机版
解决时间 2021-03-25 14:07
android使用mediacodec进行编解码 常用吗
最佳答案
应该还是比较常用的。示例如下:

private final String TAG = "MediaCodeSample";
    
    private MediaCodec mMediaCodec;
    
    private MediaExtractor extractor;
    private MediaFormat format;
    private String mime = null;
    private int sampleRate = 0, channels = 0, bitrate = 0;
    private long presentationTimeUs = 0, duration = 0;
    public void decode(String url)
    {
 
        extractor = new MediaExtractor();
        // 根据路径获取源文件
        try
        {
            extractor.setDataSource(url);
        } catch (Exception e)
        {
            Log.e(TAG, " 设置文件路径错误" + e.getMessage());
        }
        try
        {
            // 音频文件信息
            format = extractor.getTrackFormat(0);
            mime = format.getString(MediaFormat.KEY_MIME);
            sampleRate = format.getInteger(MediaFormat.KEY_SAMPLE_RATE);
            // 声道个数:单声道或双声道
            channels = format.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
            // if duration is 0, we are probably playing a live stream
            duration = format.getLong(MediaFormat.KEY_DURATION);
            // System.out.println("歌曲总时间秒:"+duration/1000000);
            bitrate = format.getInteger(MediaFormat.KEY_BIT_RATE);
        } catch (Exception e)
        {
            Log.e(TAG, "音频文件信息读取出错:" + e.getMessage());
            // 不要退出,下面进行判断
        }
        Log.d(TAG, "Track info: mime:" + mime + " 采样率sampleRate:" + sampleRate + " channels:" + channels + " bitrate:"
                + bitrate + " duration:" + duration);
        // 检查是否为音频文件
        if (format == null || !mime.startsWith("audio/"))
        {
            Log.e(TAG, "不是音频文件 end !");
            return;
        }
        // 实例化一个指定类型的解码器,提供数据输出
        // Instantiate an encoder supporting output data of the given mime type
        mMediaCodec = MediaCodec.createDecoderByType(mime);
 
        if (mMediaCodec == null)
        {
            Log.e(TAG, "创建解码器失败!");
            return;
        }
        mMediaCodec.configure(format, null, null, 0);
 
        mMediaCodec.start();
        // 用来存放目标文件的数据
        ByteBuffer[] inputBuffers = mMediaCodec.getInputBuffers();
        // 解码后的数据
        ByteBuffer[] outputBuffers = mMediaCodec.getOutputBuffers();
        // 设置声道类型:AudioFormat.CHANNEL_OUT_MONO单声道,AudioFormat.CHANNEL_OUT_STEREO双声道
        int channelConfiguration = channels == 1 ? AudioFormat.CHANNEL_OUT_MONO : AudioFormat.CHANNEL_OUT_STEREO;
        Log.i(TAG, "channelConfiguration=" + channelConfiguration);
        extractor.selectTrack(0);
        // ==========开始解码=============
        boolean sawInputEOS = false;
        boolean sawOutputEOS = false;
        final long kTimeOutUs = 10;
        MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
        while (!sawOutputEOS)
        {
            try
            {
                if (!sawInputEOS)
                {
                    int inputBufIndex = mMediaCodec.dequeueInputBuffer(kTimeOutUs);
                    if (inputBufIndex >= 0)
                    {
                        ByteBuffer dstBuf = inputBuffers[inputBufIndex];
 
                        int sampleSize = extractor.readSampleData(dstBuf, 0);
                        if (sampleSize < 0)
                        {
                            Log.d(TAG, "saw input EOS. Stopping playback");
                            sawInputEOS = true;
                            sampleSize = 0;
                        } else
                        {
                            presentationTimeUs = extractor.getSampleTime();
                        }
 
                        mMediaCodec.queueInputBuffer(inputBufIndex, 0, sampleSize, presentationTimeUs,
                                sawInputEOS ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
 
                        if (!sawInputEOS)
                        {
                            extractor.advance();
                        }
 
                    } else
                    {
                        Log.e(TAG, "inputBufIndex " + inputBufIndex);
                    }
                } // !sawInputEOS
 
                // decode to PCM and push it to the AudioTrack player
                int res = mMediaCodec.dequeueOutputBuffer(info, kTimeOutUs);
 
                if (res >= 0)
                {
                    int outputBufIndex = res;
                    ByteBuffer buf = outputBuffers[outputBufIndex];
                    final byte[] chunk = new byte[info.size];
                    buf.get(chunk);
                    buf.clear();
                    if (chunk.length > 0)
                    {
 
                        // chunk解码后的音频流
                        // TODO:处理...
                    }
                    mMediaCodec.releaseOutputBuffer(outputBufIndex, false);
                    if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0)
                    {
                        Log.d(TAG, "saw output EOS.");
                        sawOutputEOS = true;
                    }
 
                } else if (res == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED)
                {
                    outputBuffers = mMediaCodec.getOutputBuffers();
                    Log.w(TAG, "[AudioDecoder]output buffers have changed.");
                } else if (res == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED)
                {
                    MediaFormat oformat = mMediaCodec.getOutputFormat();
                    Log.w(TAG, "[AudioDecoder]output format has changed to " + oformat);
                } else
                {
                    Log.w(TAG, "[AudioDecoder] dequeueOutputBuffer returned " + res);
                }
 
            } catch (RuntimeException e)
            {
                Log.e(TAG, "[decodeMP3] error:" + e.getMessage());
            }
        }
        // =================================================================================
        if (mMediaCodec != null)
        {
            mMediaCodec.stop();
            mMediaCodec.release();
            mMediaCodec = null;
        }
        if (extractor != null)
        {
            extractor.release();
            extractor = null;
        }
        // clear source and the other globals
        duration = 0;
        mime = null;
        sampleRate = 0;
        channels = 0;
        bitrate = 0;
        presentationTimeUs = 0;
        duration = 0;
    }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
统一冰红茶里面有类似银耳的异物是什么,都喝
一世无成一无所有!
On December 18, 1620, passengers on the Br
中电二公司怎么样?
过完今天,明天会怎么样
我有一张工商卡2008年严重越期14元上征信了
老天珠现蓝色底怎么回事
买书去哪个网站比较好
江永县永州快乐宝贝购玩具店怎么去啊,谁知道
其他人种有希望在短跑超越黑人吗
全国宣传干部学院怎么样
s蹲什么意思
请问从华为应用市场下载的开心消消乐和从哪个
狗狗取名字安吉宝
缘分真的是天注定吗?我们今生遇见的那些人。
推荐资讯
问:The changing weather has something to
建行信用卡如何申请最快的速度
愁字能组什么词语
从东莞南城车站坐cc8到黄埔客运总站,我要去
二吨增加1/5吨后是几吨列式计算
激战2 人类的裁缝师在哪里?
兰花的兰是什么
《为了五美元的礼物》的作者和故事大意
我家发财树叶片发黄、发焉、枝条下垂,哪位高
湖南澧县工人工资怎么样
男朋友忙得甚至有时候一天一句话的时间都没有
3dsmax怎么做一个喇叭
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?