2014-01-25 1 views
0

오디오 트랙을 디코딩하기 위해 MediaCodec을 사용하고 있습니다. 내 디코딩 클래스는 오디오 재생에 적합합니다. 전체 트랙 길이와 총 재생 시간을 사용하여 SeekBar에서 트랙의 진행 상태를 표시하려고합니다. 나는 마이크로 세컨드 단위로 트랙의 총 지속 시간을 기록하는 길이와 마이크로 세컨드 단위로 트랙의 총 재생 시간을 기록하는 길이의 두 가지 길이를 가지고 있습니다.샘플의 프리젠 테이션 시간이 총 재생 시간보다 빠르게 커집니다.

내가 겪고있는 문제는 재생 된 시간이 트랙의 총 재생 시간보다 빨리 커집니다. 내가 어디가 잘못 될지 이해하지 못한다. 내가 currentTimeUs에 입력 샘플의 시간을 추가

extractor = new MediaExtractor(); 
extractor.setDataSource(fullPath); 

format = extractor.getTrackFormat(0); 
String mime = format.getString(MediaFormat.KEY_MIME); 
durationUs = format.getLong(MediaFormat.KEY_DURATION); 

방법 : ctor에 총 지속 시간을 결정

private long durationUs; //track duration in us 
private volatile long currentTimeUs; //total played duration thus far 

:

긴 디코딩 클래스의 선언

private void advanceInput() 
{ 
    boolean sawInputEOS = false; 

    int inputBufIndex = codec.dequeueInputBuffer(TIMEOUT_US); 
    if (inputBufIndex >= 0) 
    { 
     ByteBuffer dstBuf = codecInputBuffers[inputBufIndex]; 

     int sampleSize = extractor.readSampleData(dstBuf, 0); 
     long presentationTimeUs = 0; 

     if (sampleSize < 0) 
     { 
      sawInputEOS = true; 
      sampleSize = 0; 
     } 
     else 
     { 
      presentationTimeUs = extractor.getSampleTime(); 
      currentTimeUs += presentationTimeUs; 
     } 

     codec.queueInputBuffer(inputBufIndex, 
       0, 
       sampleSize, 
       presentationTimeUs, 
       sawInputEOS ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0); 
     if (!sawInputEOS) 
     { 
      extractor.advance(); 
     } 
    } 
} 

답변

1

getSampleTime()에서 반환 된 시간은 타임 스탬프이므로 우리는 th 이전 시간부터의 시간입니다.

presentationTimeUs = extractor.getSampleTime(); 
currentTimeUs += presentationTimeUs - lastPresentationTime; 
lastPresentationTime = presentationTimeUs; 
+0

단순히 "currentTimeUs"를 'presentationTimeUs'로 설정하십시오. :) – b005t3r

관련 문제