Android MediaExtractor的使用

我们知道多媒体文件当中包含很多流,比如视频流,音频流等。我们可以通过

MediaExtractor获取到相关的信息。下面是具体用法。
package com.yuanxuzhen.androidmedia.demux;

import android.media.MediaExtractor;
import android.media.MediaFormat;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;

import com.yuanxuzhen.androidmedia.DirUtil;
import com.yuanxuzhen.androidmedia.databinding.ActivityDemuxBinding;

import java.io.File;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class DemuxActivity extends AppCompatActivity {
    ActivityDemuxBinding mainBinding;
    ExecutorService mExecutorService;
    private String mediaPath;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mainBinding = ActivityDemuxBinding.inflate(getLayoutInflater());
        setContentView(mainBinding.getRoot());
        mExecutorService = Executors.newCachedThreadPool();
        mediaPath = DirUtil.getCacheDir() + File.separator + "in.mp4";
        mainBinding.print.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mExecutorService.execute(new Runnable() {
                    @Override
                    public void run() {
                          /*打印通道信息*/
//                        printMediaCount(mediaPath);
//                        int videoIndex = getTrackIndex("video", mediaPath);
//                        printLog("videoIndex="+videoIndex);
                        printVideoMeidaInfo(mediaPath);
                        printAudioMeidaInfo(mediaPath);
                    }
                });
            }
        });
    }

    private void printLog(String msg){
        Log.e("DemuxAcYuan", msg);
    }
    private  void printMediaCount(String path){
        try{
            MediaExtractor extractor = new MediaExtractor();//实例一个MediaExtractor
            extractor.setDataSource(path);
            int count = extractor.getTrackCount();//获取轨道数量
            printLog("printMediaInfo count="+count);
            for (int i = 0; i < count; i++){
                MediaFormat mediaFormat = extractor.getTrackFormat(i);
                printLog(i+"编号通道格式 = "+mediaFormat.getString(MediaFormat.KEY_MIME));
            }

        }catch (Exception e){
            e.printStackTrace();
        }

    }

    private int getTrackIndex(String targetTrack, String path) {
        MediaExtractor extractor = new MediaExtractor();//实例一个MediaExtractor
        try {
            extractor.setDataSource(path);//设置添加MP4文件路径
        } catch (IOException e) {
            e.printStackTrace();
        }
        int trackIndex = -1;
        int count = extractor.getTrackCount();//获取轨道数量
        for (int i = 0; i < count; i++) {
            MediaFormat mediaFormat = extractor.getTrackFormat(i);
            String currentTrack = mediaFormat.getString(MediaFormat.KEY_MIME);
            if (currentTrack.startsWith(targetTrack)) {
                trackIndex = i;
                break;
            }
        }
        return trackIndex;

    }


    private void printVideoMeidaInfo(String path){
        int index = getTrackIndex("video", path);
        if(index < 0){
            return;
        }
        try{
            MediaExtractor extractor = new MediaExtractor();//实例一个MediaExtractor
            extractor.setDataSource(path);
            MediaFormat mediaFormat = extractor.getTrackFormat(index);
            VideoMediaInfo videoMediaInfo = new VideoMediaInfo();
            videoMediaInfo.language = mediaFormat.getString(MediaFormat.KEY_LANGUAGE);//获取语言格式内容
            videoMediaInfo.width = mediaFormat.getInteger(MediaFormat.KEY_WIDTH);
            videoMediaInfo.height = mediaFormat.getInteger(MediaFormat.KEY_HEIGHT);
            videoMediaInfo.durationTime = mediaFormat.getLong(MediaFormat.KEY_DURATION);

            videoMediaInfo.maxByteCount = mediaFormat.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE);//获取视频缓存输出的最大大小
            try{
                Integer bitRate = mediaFormat.getInteger(MediaFormat.KEY_BIT_RATE);//获取比特
            }catch (Exception e){
                e.printStackTrace();
            }

            try{
                videoMediaInfo.colorFormat = mediaFormat.getInteger(MediaFormat.KEY_COLOR_FORMAT);//颜色格式
            }catch (Exception e){
                e.printStackTrace();
            }

            try{
                videoMediaInfo.frameRate = mediaFormat.getInteger(MediaFormat.KEY_FRAME_RATE);//帧率

            }catch (Exception e){
                e.printStackTrace();
            }
            try{
                videoMediaInfo. tileWidth = mediaFormat.getInteger(MediaFormat.KEY_TILE_WIDTH);//图块分辨率

            }catch (Exception e){
                e.printStackTrace();
            }
            try{
                videoMediaInfo. tileHeight = mediaFormat.getInteger(MediaFormat.KEY_TILE_HEIGHT);//图块分辨率

            }catch (Exception e){
                e.printStackTrace();
            }
            try{
                videoMediaInfo.gridRows = mediaFormat.getInteger(MediaFormat.KEY_GRID_ROWS);//网格行

            }catch (Exception e){
                e.printStackTrace();
            }
            try{
                videoMediaInfo.gridColumns = mediaFormat.getInteger(MediaFormat.KEY_GRID_COLUMNS);//网格列

            }catch (Exception e){
                e.printStackTrace();
            }

            printLog("printVideoMeidaInfo " + videoMediaInfo);

        }catch (Exception e){
            e.printStackTrace();
        }


    }


    private void printAudioMeidaInfo(String path){
        int index = getTrackIndex("audio", path);
        if(index < 0){
            return;
        }
        try{
            MediaExtractor extractor = new MediaExtractor();//实例一个MediaExtractor
            extractor.setDataSource(path);
            MediaFormat mediaFormat = extractor.getTrackFormat(index);
            AudioMediaInfo mediaINfo = new AudioMediaInfo();
            try{
                 mediaINfo.bitRate = mediaFormat.getInteger(MediaFormat.KEY_BIT_RATE);//获取比特
            }catch (Exception e){
                e.printStackTrace();
            }

            try{
//                mediaINfo.pcmEncoding = mediaFormat.getInteger(MediaFormat.KEY_PCM_ENCODING);//PCM-编码 模拟信号编码
                mediaINfo.sampleRate =  mediaFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE);
                        mediaINfo.channelCount = mediaFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
            }catch (Exception e){
                e.printStackTrace();
            }


            try{
                mediaINfo.isAdts = mediaFormat.getInteger(MediaFormat.KEY_IS_ADTS);
            }catch (Exception e){
                e.printStackTrace();
            }
            try{
                mediaINfo.keyChannelMask = mediaFormat.getInteger(MediaFormat.KEY_CHANNEL_MASK);//图块分辨率
            }catch (Exception e){
                e.printStackTrace();
            }
            try{
                mediaINfo.aacProfile = mediaFormat.getInteger(MediaFormat.KEY_AAC_PROFILE);//图块分辨率
            }catch (Exception e){
                e.printStackTrace();
            }


            printLog("printAudioMeidaInfo " + mediaINfo);

        }catch (Exception e){
            e.printStackTrace();
        }


    }



}
package com.yuanxuzhen.androidmedia.demux;

public class VideoMediaInfo {
    public String language; //语言
    public int width; //视频宽
    public int height; //视频高
    public long durationTime;//视频时间
    public int maxByteCount;
    public int colorFormat;
    public int frameRate;
    public int tileWidth;
    public int  tileHeight;
    public int gridRows;
    public int  gridColumns;

    @Override
    public String toString() {
        return "VideoMediaInfo{" +
                "language='" + language + '\'' +
                ", width=" + width +
                ", height=" + height +
                ", durationTime=" + durationTime +
                ", maxByteCount=" + maxByteCount +
                ", colorFormat=" + colorFormat +
                ", frameRate=" + frameRate +
                ", tileWidth=" + tileWidth +
                ", tileHeight=" + tileHeight +
                ", gridRows=" + gridRows +
                ", gridColumns=" + gridColumns +
                '}';
    }
}
package com.yuanxuzhen.androidmedia.demux;

public class AudioMediaInfo {
    int bitRate;
    int pcmEncoding;
    int sampleRate;
    int channelCount;
    int isAdts;
    int keyChannelMask;
    int aacProfile;


    @Override
    public String toString() {
        return "AudioMediaInfo{" +
                "bitRate=" + bitRate +
                ", pcmEncoding=" + pcmEncoding +
                ", sampleRate=" + sampleRate +
                ", channelCount=" + channelCount +
                ", isAdts=" + isAdts +
                ", keyChannelMask=" + keyChannelMask +
                ", aacProfile=" + aacProfile +
                '}';
    }
}

gitee地址

https://gitee.com/creat151/android-media.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值