2016-12-07 8 views
1

Je suis en train d'enregistrer un fichier audio, puis d'essayer de fusionner des fichiers audio aac et mp4 (muet, sans audio) et de partager le fichier mp4 fusionné. Le partage du fichier mp4 fusionné fonctionne dans Samsung J2 et Xiaomi, mais le fichier mp4 ne joue pas dans Lenovo, Micromax et autres téléphones.Les résultats des tests sont mentionnés ici: https://docs.google.com/spreadsheets/d/1eeJEM-v-smEUzY-bSxwIwFVOsAbv6KT2u3Kz3jdOb8o/edit?usp=sharing Je ne comprends pas le problème est due à partager ou en raison à un mauvais muxing et aussi quelle est la cause du problème. S'il vous plaît aider.Android fusionnant les fichiers mp4 et aac en utilisant mediamuxer mediacodec et mediaextractor (sans mp4parser)

Code

pour le partage est présent dans recordAudio.java et est la suivante:

public void shareVroom(View view) { 
// Toast.makeText(this, "Share feature is temporarily disabled", android.widget.Toast.LENGTH_LONG).show(); 

// Toast.makeText(this, "Share feature is enabled", android.widget.Toast.LENGTH_LONG).show(); 
     // Code commented for UAT 

     try { 
      MediaMultiplexer mediaMultiplexer = new MediaMultiplexer(); 
      mediaMultiplexer.startMuxing(this); 

      Toast.makeText(this, "in share",Toast.LENGTH_SHORT).show(); 
      String shareableFileName = ""; 

      Intent intentShareFile = new Intent(Intent.ACTION_SEND); 
      shareableFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
      shareableFileName += getString(R.string.vroom_video_output_file_name); 
      File fileWithinMyDir = new File(shareableFileName); 
      Uri videoUri=Uri.parse(shareableFileName); 
      if (fileWithinMyDir.exists()) { 
       intentShareFile.setType("video/mp4"); 
       intentShareFile.putExtra(Intent.EXTRA_STREAM, videoUri); 
       intentShareFile.putExtra(Intent.EXTRA_SUBJECT, "Listen to my VROOM"); 
       intentShareFile.putExtra(Intent.EXTRA_TEXT, "Vroom attached"); 
       startActivity(Intent.createChooser(intentShareFile, "Share your Vroom with")); 
      } 

     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
      Log.e("tag", e.getMessage(), e); 
      Toast.makeText(this, "could not shared"+e.getMessage(),Toast.LENGTH_SHORT).show(); 
     } 


     //TODO:Use event to identify if muxing is done 

    } 

Code pour muxing:

public class MediaMultiplexer { 
    private static final int MAX_SAMPLE_SIZE = 256 * 1024; 

    public void startMuxing(Context context) { 
     MediaMuxer muxer = null; 
     MediaFormat VideoFormat = null; 
     Resources mResources = context.getResources(); 
     int sourceVideo = R.raw.vid; 
     String outputVideoFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
     outputVideoFileName += context.getString(R.string.vroom_video_output_file_name); 
     try { 
      muxer = new MediaMuxer(outputVideoFileName, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     MediaExtractor extractorVideo = new MediaExtractor(); 
     try { 
      AssetFileDescriptor srcVideoFd = mResources.openRawResourceFd(sourceVideo); 
      extractorVideo.setDataSource(srcVideoFd.getFileDescriptor(), srcVideoFd.getStartOffset(), srcVideoFd.getLength()); 
      int tracks = extractorVideo.getTrackCount(); 
      for (int i = 0; i < tracks; i++) { 
       MediaFormat mf = extractorVideo.getTrackFormat(i); 
       String mime = mf.getString(MediaFormat.KEY_MIME); 
       if (mime.startsWith("video/")) { 
        extractorVideo.selectTrack(i); 
        VideoFormat = extractorVideo.getTrackFormat(i); 
        break; 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     MediaExtractor extractorAudio = new MediaExtractor(); 
     try { 
      String audioFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
      audioFileName += context.getString(R.string.vroom_audio_file_name); 
      extractorAudio.setDataSource(audioFileName); 
      int tracks = extractorAudio.getTrackCount(); 
//   Toast.makeText(context, "No of tracks::::" + String.valueOf(tracks), Toast.LENGTH_SHORT).show(); 
      extractorAudio.selectTrack(0); 

      MediaFormat AudioFormat = extractorAudio.getTrackFormat(0); 
      int audioTrackIndex = muxer.addTrack(AudioFormat); 
      int videoTrackIndex = muxer.addTrack(VideoFormat); 

      boolean sawEOS = false; 
      boolean sawAudioEOS = false; 
      int bufferSize = MAX_SAMPLE_SIZE; 
      ByteBuffer dstBuf = ByteBuffer.allocate(bufferSize); 
      int offset = 100; 
      MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); 
      muxer.start(); 

      while (!sawEOS) { 
       bufferInfo.offset = offset; 
       bufferInfo.size = extractorVideo.readSampleData(dstBuf, offset); 
       if (bufferInfo.size < 0) { 
        sawEOS = true; 
        bufferInfo.size = 0; 
       } else { 
        bufferInfo.presentationTimeUs = extractorVideo.getSampleTime(); 
        bufferInfo.flags = extractorVideo.getSampleFlags(); 
        int trackIndex = extractorVideo.getSampleTrackIndex(); 
        muxer.writeSampleData(videoTrackIndex, dstBuf, bufferInfo); 
        extractorVideo.advance(); 
       } 
      } 
      ByteBuffer audioBuf = ByteBuffer.allocate(bufferSize); 
      while (!sawAudioEOS) { 
       bufferInfo.offset = offset; 
       bufferInfo.size = extractorAudio.readSampleData(audioBuf, offset); 
       if (bufferInfo.size < 0) { 
        sawAudioEOS = true; 
        bufferInfo.size = 0; 
       } else { 
        bufferInfo.presentationTimeUs = extractorAudio.getSampleTime(); 
        bufferInfo.flags = extractorAudio.getSampleFlags(); 
        int trackIndex = extractorAudio.getSampleTrackIndex(); 
        muxer.writeSampleData(audioTrackIndex, audioBuf, bufferInfo); 
        extractorAudio.advance(); 
       } 
      } 
      muxer.stop(); 
      muxer.release(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

    } 

} 
+0

je fixe votre bloc de code. La façon la plus simple de formater un bloc de code sur SO consiste à le coller dans votre question, sélectionnez-le et appuyez sur Ctrl + K ou cliquez sur le bouton '{}'. Cela indentera le bloc par quatre espaces supplémentaires, ce qui indique à Stack Overflow de le traiter comme du code. Vous pouvez en savoir plus sur le formatage dans le [centre d'aide] (https://stackoverflow.com/help/formatting). – Chris

+0

Télécharger un outil appelé 'mediaInfo' et nous dire les paramètres du codec. Si le profil h.264 de la vidéo est "Élevé", il se peut qu'il ne puisse pas être lu sur certains appareils, utilisez "Baseline" pour une compatibilité maximale de l'appareil. Est-ce que votre audio AAC ou MP3? Vérifiez également que l'audio a un 44,1 kilo-hertz pour le taux d'échantillonnage, est stéréo, etc ... –

Répondre

0

a changé le format de sortie audio et encodeur AMR_NB