Android使用MediaExtractor读取媒体信息

Android使用MediaExtractor读取媒体信息


Refrence
  1. Android 判断字符串是否为url
  2. 用来测试的在线小视频url地址

Source Code

public class BottomActivity extends AppCompatActivity {
    
    private static final String TAG = "BGBottomActivity";
    private TextView tvInfo;
    private Button btnOpenFile;
    private BGMediaInfo mbgMediaInfo;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bottom);
        
        if (mbgMediaInfo == null) {
            mbgMediaInfo = new BGMediaInfo();
        }
        initComponentView();
    }
    
    private void initComponentView() {
        tvInfo = (TextView) findViewById(R.id.tv_Info);
        EditText etUrl = (EditText) findViewById(R.id.et_Url);
        btnOpenFile = (Button) findViewById(R.id.btn_OpenFile);
        
        etUrl.setOnEditorActionListener((v, actionId, event) -> dealUrl(v, actionId));
        btnOpenFile.setOnClickListener(v -> onBtnClick());
        
    }
    
    private boolean dealUrl(TextView view, int actionId) {
        CharSequence str = view.getText();
        Log.d(TAG, "actionId is: " + actionId + ", content is: " + str);
        
        if (TextUtils.isEmpty(str) || !isHttpUrl(str.toString())) {
            btnOpenFile.setClickable(true);
            Toast.makeText(this, "请正确输入网址", Toast.LENGTH_SHORT).show();
            return false;
        }
        btnOpenFile.setClickable(false);
        try {
            tvInfo.setText(mbgMediaInfo.deal("https://v-cdn.zjol.com.cn/278587.mp4"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        return false;
    }
    
    
    private void onBtnClick() {
        Log.d(TAG, "onBtnClick: ");
        
        // TODO 打开本地媒体文件
    }
    
    
    /**
     * 判断字符串是否为URL
     *
     * @param urls 需要判断的String类型url
     * @return true:是URL;false:不是URL
     */
    private boolean isHttpUrl(String urls) {
        boolean isurl = false;
        
        if (urls.isEmpty() || urls.contains(" ")) {
            return isurl;
        }
        //设置正则表达式
        String regex = "(((https|http)?://)?([a-z0-9\\-]+[.])|(www.))"
                + "\\w+[.|\\/]([a-z0-9]{0,})?[[.]([a-z0-9]{0,})]+((/[\\S&&[^,;\u4E00-\u9FA5]]+)+)?([.][a-z0-9]{0,}+|/?)";
        // 对比
        Pattern pat = Pattern.compile(regex.trim());
        Matcher mat = pat.matcher(urls.trim());
        // 判断是否匹配
        isurl = mat.matches();
        
        return isurl;
    }
}
public class BGMediaInfo {
    
    private static final String TAG = "BGMediaInfo";
    private StringBuilder strBuilder;
    private int trackCount = 0;
    private MediaExtractor mediaExtractor;
    
    public BGMediaInfo() {
        if (strBuilder == null) {
            strBuilder = new StringBuilder();
        }
    }
    
    public String deal(String url) throws IOException {
        if (mediaExtractor == null) {
            mediaExtractor = new MediaExtractor();
        }
        strBuilder.delete(0, strBuilder.length());
        mediaExtractor.setDataSource(url);
        trackCount = mediaExtractor.getTrackCount();
        if (trackCount < 1) {
            Log.e(TAG, url + " has no track!");
        }
        for (int i = 0; i < trackCount; i++) {
            MediaFormat mediaFormat = mediaExtractor.getTrackFormat(i);
            if (mediaFormat.getString(MediaFormat.KEY_MIME).contains("video")) {
                // Log.d(TAG, "track " + i + " is video track. track info is: " + mediaFormat.toString());
                int width = mediaFormat.getInteger(MediaFormat.KEY_WIDTH, -1);
                int height = mediaFormat.getInteger(MediaFormat.KEY_HEIGHT, -1);
                long duration = mediaFormat.getLong(MediaFormat.KEY_DURATION, -1);
                int frameRate = mediaFormat.getInteger(MediaFormat.KEY_FRAME_RATE, -1);
                strBuilder.append("视频尺寸:" + width + "*" + height + "\n帧率:" + frameRate + "fps\n时长:" + duration / 1000 / 1000 + "秒\n");
                Log.i(TAG, "视频尺寸:" + width + "*" + height + ",帧率:" + frameRate + "fps,时长:" + duration / 1000 / 1000 + "秒");
                String mime = mediaFormat.getString(MediaFormat.KEY_MIME, "err");
                int profile = mediaFormat.getInteger(MediaFormat.KEY_PROFILE, -1);
                int level = mediaFormat.getInteger(MediaFormat.KEY_LEVEL, -1);
                int maxInputSize = mediaFormat.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE, -1);
                strBuilder.append("视频格式为:" + mime + "\n配置:" + profile + "\n配置等级:" + level + "\n最大单帧缓冲区:" + maxInputSize);
                Log.i(TAG, "视频格式为:" + mime + ",配置:" + profile + ",配置等级:" + level + ",最大单帧缓冲区:" + maxInputSize);
                
                
            } else if (mediaFormat.getString(MediaFormat.KEY_MIME).contains("audio")) {
                // Log.d(TAG, "track " + i + " is audio track. track info is: " + mediaFormat.toString());
                int samplerate = mediaFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE, -1);
                int bitrate = mediaFormat.getInteger(MediaFormat.KEY_BIT_RATE, -1);
                long duration = mediaFormat.getLong(MediaFormat.KEY_DURATION, -1);
                strBuilder.append("音频采样率:" + samplerate + "\n比特率:" + bitrate + "\n时长:" + duration / 1000 / 1000 + "秒\n");
                Log.i(TAG, "音频采样率:" + samplerate + ",比特率:" + bitrate + ",时长:" + duration / 1000 / 1000 + "秒");
                String mime = mediaFormat.getString(MediaFormat.KEY_MIME, "err");
                int profile = mediaFormat.getInteger(MediaFormat.KEY_PROFILE, -1);
                int aacprofile = mediaFormat.getInteger(MediaFormat.KEY_AAC_PROFILE, -1);
                int level = mediaFormat.getInteger(MediaFormat.KEY_LEVEL, -1);
                int maxInputSize = mediaFormat.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE, -1);
                strBuilder.append("音频格式:" + mime + "\n配置:" + profile + "\n配置等级:" + level + "\n最大单帧缓冲区:" + maxInputSize);
                Log.i(TAG, "音频格式:" + mime + ",配置:" + profile + ",配置等级:" + level + ",最大单帧缓冲区:" + maxInputSize);
            }
            strBuilder.append("\n--------\n");
        }
        strBuilder.append("配置详情请查询 MediaCodecInfo.CodecProfileLevel \n");
        
        mediaExtractor.release();
        mediaExtractor = null;
        
        return strBuilder.toString();
    }
}

媒体信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值