Android使用MediaExtractor读取媒体信息
Refrence
- Android 判断字符串是否为url
- 用来测试的在线小视频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: ");
}
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")) {
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")) {
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();
}
}