2016-12-07 3 views
1

J'essaie de décoder les fichiers codés AAC dans mon application et d'initialiser l'objet MediaFormat utilisé pour initialiser mon objet MediaCodec, Ceci est le code pour configurer le variables pour l'objet MediaFormatMediaFormat.getByteBuffer ("csd-0") Retourne null sur certains appareils

MediaExtractor mediaExtractor = new MediaExtractor(); 
     try { 
      mediaExtractor.setDataSource(audioFilePath); 
     } catch (IOException e) { 
      return false; 
     } 
     Log.d(TAG, "Number of tracks in the file are:" + mediaExtractor.getTrackCount()); 

     MediaFormat mediaFormat = mediaExtractor.getTrackFormat(0); 

     Log.d(TAG, "mediaFormat:" + mediaFormat.toString()); 

     mSampleRate = mediaFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE); 
     Log.d(TAG, "mSampleRate: " + mSampleRate); 


     mChannels = mediaFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT); 

     Log.d(TAG, "mChannels number of channels: " + mChannels); 

     // Reading the duration from the file and converting from micro seconds to milliseconds. 
     mDuration = (int) (mediaFormat.getLong(MediaFormat.KEY_DURATION)/1000); 

     Log.d(TAG, "duration: " + mDuration); 

     // Getting the csd-0 info from the file .. 
     mCSDBuffer = mediaFormat.getByteBuffer("csd-0"); 

le problème que je suis face est que la déclaration mCSDBuffer = mediaFormat.getByteBuffer("csd-0") me va chercher null pour le même fichier sur certains appareils. L'application est en production et je vois cette erreur sur les appareils de processeurs armabi-v7a/armabi avec niveau d'API Android de 17, 18 et 19 et la plupart de ces erreurs sont sur les appareils Samsung. Toute direction à ce sujet?

Répondre

2

Si le tampon csd-0 est nul, alors je m'attendrais à ce qu'il se décode correctement lorsqu'il est passé dans MediaCodec. Est-ce que, si vous choisissez simplement de ne pas définir les données csd-0 en entrée de MediaCodec, si elle est null? En général, vous devriez être en mesure de décoder la sortie MediaExtractor si vous la redirigez directement vers MediaCodec. Le format réel de la sortie de données de MediaExtractor n'est pas très strictement spécifié, donc en pratique, il est connu que certains fabricants (principalement Samsung) changent cela d'une manière que seul leur propre décodeur gère. Voir par exemple https://code.google.com/p/android/issues/detail?id=74356 pour un autre cas de la même chose.

Idéalement, les tests Android CTS seraient plus stricts pour s'assurer que MediaExtractor se comporte de manière cohérente, permettant son utilisation dans un contexte plus générique, ou utilise un autre décodeur que MediaCodec. (Par exemple, avec les problèmes actuels de Samsung, vous ne pouvez pas utiliser MediaExtractor sur un périphérique, envoyer les données extraites sur un réseau à un autre périphérique et le décoder là.)

+0

J'ai également une fonction personnalisée à l'aide de laquelle je génère le tampon "csd-0" comme mentionné dans http://stackoverflow.com/a/32154154/2606411. Puis-je l'utiliser pour définir manuellement l'info? – Swapnil

+0

Vous pourriez être en mesure d'utiliser cela. Mais si vous le faites, vous devriez probablement également retirer les en-têtes ADTS des paquets audio réels. IMO, si MediaExtractor choisit de renvoyer des données au format ADTS (c'est-à-dire pas d'en-têtes 'csd-0' et ADTS dans les paquets), alors MediaCodec devrait être capable de le gérer, donc je ne pense pas que vous devriez tout. – mstorsjo

+0

Nous avons nous-mêmes encodé les fichiers que nous utilisons et nous avons défini des en-têtes ADTS pour chacun d'entre eux, donc je suppose qu'il est logique de définir cet en-tête manuellement. – Swapnil