gpt4 book ai didi

android - 在 Android 上以编程方式获取 MPEG-4 视频流的配置文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:49:02 28 4
gpt4 key购买 nike

有没有办法得到 MPEG-4 视频文件的 profile-code使用标准的 Android API?

示例配置文件代码为:baselinemainhigh 等。

我不想为了获取此信息而在 android 应用程序中包含 ffmpeg 二进制文件。

我在 MediaCodecInfo.CodecProfileLevel 中找到了配置文件列表的引用类(class)。任何机构都可以确认这是否是我应该使用的吗?

这是从 MX Player 应用中截取的视频信息示例截图 Sample data with video profile


  • 更新 #1:我查看了 MX Player 应用程序,看起来他们使用 ffmpeg 二进制文件,所以我可以肯定地说他们使用它来提取 profile-code
  • 更新 #2:我还调查了 ExoPlayer v1 API,他们似乎也没有特定的 API 来获取此信息。

最佳答案

可以使用 MediaExtractor 找到配置文件代码

基于 API documentation似乎编码 profile-code 仅适用于 API 级别 24 (Nougat) 及更高级别。

这是我写的提取配置文件代码的方法,您可以随意修改以满足您的需要。

/**
* Get video profile-code from video file.
*
* @param videoFilePath Path of the video file.
* @return One of predefined AVC profiles from {@link MediaCodecInfo.CodecProfileLevel} when found, or {@code -1} if
* Android API level does not support extracting profile data.
*/
@TargetApi(21)
public int getVideoEncodingProfile(final String videoFilePath) {
int videoProfileCode = -1;

File inputFile = new File(videoFilePath);
if (!inputFile.canRead()) {
throw new RuntimeException("Unable to read " + inputFile);
}

MediaExtractor mediaExtractor = new MediaExtractor();
// Initialize MediaExtractor and configure/extract video information
try {
mediaExtractor.setDataSource(inputFile.toString());
} catch (IOException e) {
Log.e(TAG, "Unable to set MediaExtractor source.", e);
throw new RuntimeException("Unable to set source.");
}

MediaFormat videoMediaFormat = findVideoMediaFormat(mediaExtractor);
// MediaCodecInfo.CodecProfileLevel of the video track
if (videoMediaFormat != null && videoMediaFormat.containsKey(MediaFormat.KEY_PROFILE)) {
videoProfileCode = videoMediaFormat.getInteger(MediaFormat.KEY_PROFILE);
} else {
// Current API level does not support encoding profile information.
Log.w(TAG, "Video profile code is not supported by current API level.");
}

mediaExtractor.release();
mediaExtractor = null;

return videoProfileCode;
}

/**
* Find video MediaFormat from MediaExtractor.
*
* @param mediaExtractor The MediaExtractor which is used to find video track.
* @return MediaFormat for video track, or {@code null} when video track is not found.
*/
private MediaFormat findVideoMediaFormat(final MediaExtractor mediaExtractor) {
MediaFormat videoTrackMediaFormat = null;
int totalTracks = mediaExtractor.getTrackCount();
for (int i = 0; i < totalTracks; i++) {
MediaFormat trackFormat = mediaExtractor.getTrackFormat(i);
if ((trackFormat.containsKey(MediaFormat.KEY_MIME)
&& trackFormat.getString(MediaFormat.KEY_MIME).contains("video"))
|| (trackFormat.containsKey(MediaFormat.KEY_WIDTH) && trackFormat.containsKey(MediaFormat.KEY_HEIGHT))
) {
videoTrackMediaFormat = trackFormat;
break;
}
}
return videoTrackMediaFormat;
}

这里是关于如何使用它的示例代码。

String TAG = "DEBUG"; // Define your tag
int profileCode = getVideoEncodingProfile(videoInfo.getLocalVideoPath());

switch (profileCode) {
case MediaCodecInfo.CodecProfileLevel.AVCProfileBaseline:
Log.d(TAG, "getVideoEncodingProfile() returned AVCProfileBaseline");
break;
case MediaCodecInfo.CodecProfileLevel.AVCProfileMain:
Log.d(TAG, "getVideoEncodingProfile() returned AVCProfileMain");
break;
case MediaCodecInfo.CodecProfileLevel.AVCProfileExtended:
Log.d(TAG, "getVideoEncodingProfile() returned AVCProfileExtended");
break;
case MediaCodecInfo.CodecProfileLevel.AVCProfileHigh:
Log.d(TAG, "getVideoEncodingProfile() returned AVCProfileHigh");
break;
case MediaCodecInfo.CodecProfileLevel.AVCProfileHigh10:
Log.d(TAG, "getVideoEncodingProfile() returned AVCProfileHigh10");
break;
case MediaCodecInfo.CodecProfileLevel.AVCProfileHigh422:
Log.d(TAG, "getVideoEncodingProfile() returned AVCProfileHigh422");
break;
case MediaCodecInfo.CodecProfileLevel.AVCProfileHigh444:
Log.d(TAG, "getVideoEncodingProfile() returned AVCProfileHigh444");
break;
default:
Log.d(TAG, "getVideoEncodingProfile() returned unsupported profile code or code not found.");

}

希望对您有所帮助。如果您有至少支持 Jelly Bean API 级别 16 的其他方式,请告诉我。


作为引用,这里是从 Nougat 7.1.1 设备获取的视频轨道的 MediaFormat 快照。 (注意:较低级别的 API 将返回较少的属性)

MediaFormat Hash Map - Snapshot

其他引用:

关于android - 在 Android 上以编程方式获取 MPEG-4 视频流的配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41600096/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com