11

Standart Android API kullanarak MPEG-4 video fils'in profile-code sürümünü almanın bir yolu var mı?Android'de MPEG-4 video akışı profilini programlı olarak alın

Örnek profil kodları şunlardır: baseline, main, high vb.

Sadece bu bilgileri almak için android uygulamasında ffmpeg ikili içermek istemiyorum.

MediaCodecInfo.CodecProfileLevel sınıfındaki profillerin listesi referansını buldum. Kullanması gereken kişi varsa herhangi bir vücut onaylayabilir mi? İşte

MX Player app Sample data with video profile


  • GÜNCELLEME 1. alınan bir video bilgi örneği ekran görüntüsü: Ben MX Oynatıcı uygulaması içine baktım onlar ffmpeg ikili kullanmak benziyor, bu yüzden profile-code'u ayıklamak için kullandığını güvenle söyleyebilirler.
  • GÜNCELLEME # 2: Ayrıca ExoPlayer v1 API'lerine de baktım, ayrıca bu bilgileri almak için belirli bir API'ye sahip değiller.

cevap

1

profil kodu MediaExtractor

API documentation dayanarak kodlayan profil kod kadar API seviyesi 24 (koz helvası) ve sadece mevcut olduğu görülmektedir kullanılarak bulunabilir.

İşte profil kodunu ayıklamak için yazdım, ihtiyacınızı karşılamak için değiştirmek için çekinmeyin.

/** 
* 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; 
} 

Ve burada nasıl kullanılacağı hakkında örnek kod.

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

} 

Yardım edin. En azından Jelly Bean API düzeyini destekleyen başka bir yol varsa 16 bildirin. Başvuru için


, burada nugat7.1.1 cihaz alınan video pistin MediaFormat bir anlık görüntüsüdür. :

MediaFormat Hash Map - Snapshot

Diğer referanslar (NOT Alt seviye API az özelliklerini dönecektir):

İlgili konular