11

標準のAndroid APIを使用してMPEG-4ビデオファイルのprofile-codeを入手する方法はありますか?AndroidでプログラムでMPEG-4ビデオストリームのプロファイルを取得

サンプルプロファイルコードは、baseline,main,highなどです。

この情報を取得するには、アンドロイドアプリにffmpegバイナリを含めたくありません。

MediaCodecInfo.CodecProfileLevelクラスのプロファイル一覧の参照が見つかりました。これは私が使用すべきであるかどうかを確認することができますか?私はMXプレーヤーアプリに見えた、彼らはffmpegバイナリを使用するように見えるので、私:ここ

MXプレーヤーアプリ Sample data with video profile


  • UPDATE#1から取られた映像情報の一例のスクリーンショットですそれらが安全にprofile-codeを抽出するために使用すると言うことができます。
  • 更新#2:私もExoPlayer v1 APIを調べましたが、この情報を取得するための特定のAPIを持っていないようです。

答えて

1

プロファイルコードは、符号化プロファイルコードはAPIレベル24(ヌガー)から最大でしか入手できないと思わAPI documentationに基づいMediaExtractor

を用いて求めることができます。

ここに私がプロファイルコードを抽出するために書いた方法ですが、あなたのニーズを満たすように自由に変更してください。

/** 
* 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."); 

} 

希望します。 ゼリービーン APIレベル16私に教えてください。参考


、ここでヌガー7.1.1デバイスから採取したビデオトラックのMediaFormatのスナップショットです。 (注:低レベルのAPIは以下の属性が返されます)

MediaFormat Hash Map - Snapshot

その他の参考文献:

関連する問題