2016-12-07 48 views
1

오디오를 녹음 한 후 aac 오디오 및 mp4 비디오 파일 (음성없이 음소거 됨)을 병합하고 병합 된 mp4 파일을 공유하려고합니다. 병합 된 mp4 파일 공유는 Samsung J2 및 Xiaomi에서 작동하지만 mp4 파일은 Lenovo, Micromax 및 기타 휴대 전화에서 재생되지 않습니다. 테스트 결과는 여기에 나와 있습니다. https://docs.google.com/spreadsheets/d/1eeJEM-v-smEUzY-bSxwIwFVOsAbv6KT2u3Kz3jdOb8o/edit?usp=sharing 공유 또는 만기일로 인한 문제인지 이해할 수 없습니다. 부적절한 멀티플렉싱 및 문제의 원인을 알려줍니다. 도와주세요. 공유mediamuxer mediacodec 및 mediaextractor (mp4parser없이)를 사용하는 Android가 mp4 및 aac 파일을 병합합니다.

코드는 recordAudio.java에 존재하고 이것이다 :

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 

    } 

코드 멀티플렉싱을 위해 :

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

내가 고정 AMR_NB하는 오디오 출력 형식 및 인코더를 변경하여 코드 블록. SO에서 코드 블록을 포맷하는 가장 쉬운 방법은 질문에 붙여넣고 그것을 선택하고 Ctrl + K를 누르거나'{}'버튼을 누르는 것입니다. 이렇게하면 스택 오버플로가 코드로 취급하도록 지시하는 추가 4 칸만큼 블럭을 들여 쓰기합니다. [도움말 센터] (https://stackoverflow.com/help/formatting)에서 서식에 대해 자세히 읽을 수 있습니다. – Chris

+0

'mediaInfo'라는 도구를 다운로드하고 코덱 설정을 알려주십시오. 동영상의 h.264 프로필이 '높음'인 경우 일부 기기에서 재생되지 않을 수 있습니다. 최대 기기 호환성을 위해 '기준'을 사용합니다. 오디오 AAC 또는 MP3입니까? 또한 오디오의 샘플 속도가 44.1 kilo-hertz인지, 스테레오인지 등도 확인하십시오. –

답변

0