2017-02-13 4 views
14

Je veux obtenir le taux de trame de la vidéo, mais je ne veux pas utiliser FFMPEG, JAVACV lib. est-ce possible d'obtenir le taux de trame de la vidéo dans Android? J'ai lu KEY_FRAME_RATE, il est dit que "MediaExtractor fournit spécifiquement une valeur entière correspondant aux informations de fréquence d'images de la piste si spécifié et différent de zéro." mais je ne sais pas comment l'utiliser?comment obtenir le taux de trame de la vidéo dans Android OS?

Si vous savez comment obtenir la fréquence d'images de la vidéo, répondez ici.

Répondre

15
MediaExtractor extractor = new MediaExtractor(); 
int frameRate = 24; //may be default 
try { 
    //Adjust data source as per the requirement if file, URI, etc. 
    extractor.setDataSource(...); 
    int numTracks = extractor.getTrackCount(); 
    for (int i = 0; i < numTracks; ++i) { 
    MediaFormat format = extractor.getTrackFormat(i); 
    String mime = format.getString(MediaFormat.KEY_MIME); 
    if (mime.startsWith("video/")) { 
    if (format.containsKey(MediaFormat.KEY_FRAME_RATE)) { 
     frameRate = format.getInteger(MediaFormat.KEY_FRAME_RATE); 
     } 
    } 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
}finally { 
    //Release stuff 
    extractor.release(); 
} 

Note: Essayez d'exécuter le code ci-dessus dans thread de travail.

Update 1 Qu'est-ce que KEY_FRAME_RATE et peut être en option

KEY_FRAME_RATE Ajouté au niveau de l'API 16 Chaîne KEY_FRAME_RATE Une clé décrivant la fréquence d'images d'un format vidéo dans des cadres /seconde. La valeur associée est normalement un entier lorsque la valeur est utilisée par la plateforme, mais les codecs vidéo acceptent également les valeurs de configuration flottantes. Plus précisément, MediaExtractor fournit une valeur entière correspondant aux informations de fréquence d'images de la piste si elle est spécifiée et non nulle. Sinon, cette clé n'est pas présente. MediaCodec accepte les valeurs float et integer. Cela représente la fréquence d'images de fonctionnement souhaitée si KEY_OPERATING_RATE n'est pas présent et KEY_PRIORITY est 0 (temps réel). Pour les encodeurs vidéo, cette valeur correspond à la fréquence d'images attendue, bien que les encodeurs soient supposés prendre en charge une fréquence d'images variable basée sur l'horodatage du tampon. Cette clé n'est pas utilisée dans les formats d'entrée/sortie MediaCodec ni dans MediaMuxer.

Valeur constante: "frame rate"

Update 2 code de contrôle si pour NPE si KEY_FRAME_RATE pas présent. Voir ci-dessus

+0

il lance 'NullPointerException' à format.getString (MediaFormat.KEY_MIME); –

+0

Publiez le journal pour le même. Mais comment ça peut être si ça va à l'intérieur de la boucle? –

+0

java.lang.NullPointerException: Tentative d'invocation de la méthode virtuelle 'int java.lang.Integer.intValue()' sur une référence d'objet nul 02-16 19: 19: 21.741: E/fra (7900): \t at android. media.MediaFormat.getInteger (MediaFormat.java:591) 02-16 19: 19: 21.741: E/fra (7900): \t à com.exam.activity.VideoPlayActivity.init (VideoPlayActivity.java:101) 02- 16 19: 19: 21.741: E/fra (7900): \t at com.exam.activity.VideoPlayActivity.onCreate (VideoPlayActivity.java:59) –