2015-01-12 2 views
2

Я пытаюсь воспроизвести поток AAC с помощью ExoPlayer. Я испытываю ту же проблему, с которой я использовал встроенный MediaPlayer: для KitCat требуется 15-20 секунд (возможно, то же самое происходит и в других версиях, но сейчас нет необходимости тестировать).Почему MediaExtractor застрял на setDataSource?

На ExoPlayer я смог получить некоторую информацию о том, что происходит на фоне.

Поток получить заклинивание на MediaExtractor.getDataSource() на FrameworkSampleDataSource, метод prepare

extractor = new MediaExtractor(); 
extractor.setDataSource(context, uri, headers); 

Упоминание журнал кое-что о тайм-аута на readAt метода

01-12 12:07:03.458 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ mDisconnectAtHighwatermark = 0, cacheConfig is NULL(1) 
01-12 12:07:03.463 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ readAt: mIsMetadataRetriever == 0 
01-12 12:07:03.463 4537-4615/com.example.claudio.exopla I/ChromiumHTTPDataSource﹕ readAt offset =0 , mCurrentOffset = 0 size = 65536 
01-12 12:07:04.298 4537-4615/com.example.claudio.exopla D/HTTPBase﹕ [1] Network BandWidth = 0 Kbps 
01-12 12:07:04.298 4537-4615/com.example.claudio.exopla D/NuCachedSource2﹕ Remaining (64K), HighWaterThreshold (20480) 
01-12 12:07:04.298 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ readAt: waiting end (player case) 
01-12 12:07:04.298 4537-4615/com.example.claudio.exopla I/ChromiumHTTPDataSource﹕ readAt offset =65536 , mCurrentOffset = 65536 size = 65536 
01-12 12:07:04.298 4537-4584/com.example.claudio.exopla V/ChromiumHTTPDataSource﹕ mContentSize is undefined or network might be disconnected 
01-12 12:07:04.298 4537-4584/com.example.claudio.exopla V/ChromiumHTTPDataSource﹕ mContentSize is undefined or network might be disconnected 
01-12 12:07:04.323 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ readAt: mIsMetadataRetriever == 0 
01-12 12:07:06.328 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ readAt: waiting end (player case) 
01-12 12:07:06.328 4537-4584/com.example.claudio.exopla E/NuCachedSource2﹕ readAt:Timeout (player case) 
01-12 12:07:06.328 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ readAt: mIsMetadataRetriever == 0 
01-12 12:07:08.328 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ readAt: waiting end (player case) 
01-12 12:07:08.328 4537-4584/com.example.claudio.exopla E/NuCachedSource2﹕ readAt:Timeout (player case) 
01-12 12:07:08.328 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ readAt: mIsMetadataRetriever == 0 
01-12 12:07:10.328 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ readAt: waiting end (player case) 
01-12 12:07:10.328 4537-4584/com.example.claudio.exopla E/NuCachedSource2﹕ readAt:Timeout (player case) 
01-12 12:07:10.328 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ readAt: mIsMetadataRetriever == 0 
01-12 12:07:12.328 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ readAt: waiting end (player case) 
01-12 12:07:12.328 4537-4584/com.example.claudio.exopla E/NuCachedSource2﹕ readAt:Timeout (player case) 
01-12 12:07:12.328 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ readAt: mIsMetadataRetriever == 0 
01-12 12:07:14.328 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ readAt: waiting end (player case) 
01-12 12:07:14.328 4537-4584/com.example.claudio.exopla E/NuCachedSource2﹕ readAt:Timeout (player case) 
01-12 12:07:14.328 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ readAt: mIsMetadataRetriever == 0 
01-12 12:07:16.328 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ readAt: waiting end (player case) 
01-12 12:07:16.328 4537-4584/com.example.claudio.exopla E/NuCachedSource2﹕ readAt:Timeout (player case) 
01-12 12:07:16.328 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ readAt: mIsMetadataRetriever == 0 
01-12 12:07:18.328 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ readAt: waiting end (player case) 
01-12 12:07:18.328 4537-4584/com.example.claudio.exopla E/NuCachedSource2﹕ readAt:Timeout (player case) 
01-12 12:07:18.328 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ readAt: mIsMetadataRetriever == 0 
01-12 12:07:18.413 4537-4615/com.example.claudio.exopla D/HTTPBase﹕ [2] Network BandWidth = 70 Kbps 
01-12 12:07:18.413 4537-4615/com.example.claudio.exopla D/NuCachedSource2﹕ Remaining (127K), HighWaterThreshold (20480) 
01-12 12:07:18.413 4537-4615/com.example.claudio.exopla D/NuCachedSource2﹕ readInternal - late!!! 
01-12 12:07:18.418 4537-4584/com.example.claudio.exopla I/NuCachedSource2﹕ readAt: waiting end (player case) 
01-12 12:07:18.418 4537-4615/com.example.claudio.exopla I/ChromiumHTTPDataSource﹕ readAt offset =131072 , mCurrentOffset = 131072 size = 65536 
01-12 12:07:18.423 4537-4584/com.example.claudio.exopla E/tmiMPEG2TSExtractor﹕ SnifftmiMPEG2TS @LINE=1372 

Я полагаю, это может быть что-то связанное с буферизацией, так как MediaPlayer имеет схожие проблемы. Это происходит только на реальных устройствах, эмулятор запускается немедленно.

+0

Просто ради других, читающих эту тему. Это произойдет, когда удаленный ресурс недоступен. Базовый API NuCachedSource2 пробует 10 раз, прежде чем давать ошибку. Поэтому, если вы ждете 5-10 секунд, вы получите код ошибки или возврата ошибки. – Ketan

ответ

-1

1) После завершения использования MediaExtractor еще раз введите null.

MediaExtractor extractor = new MediaExtractor(); 
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 (weAreInterestedInThisTrack) { 
    extractor.selectTrack(i); 
    } 
} 
ByteBuffer inputBuffer = ByteBuffer.allocate(...) 
while (extractor.readSampleData(inputBuffer, ...) >= 0) { 
    int trackIndex = extractor.getSampleTrackIndex(); 
    long presentationTimeUs = extractor.getSampleTime(); 
    ... 
    extractor.advance(); 
} 

extractor.release(); 
extractor = null; 

2)

MediaExtractor extractor= new MediaExtractor(); 
File file = new File(this.fileName); 

extractor.setDataSource(this.fileName); 
int tracks = extractor.getTrackCount(); 

extractor.selectTrack(0); .. 
+0

Спасибо за ваш asnwer. Боюсь, я не получу свой код. Я получаю доступ к удаленному потоку, а не локальному файлу. Не могли бы вы объяснить, как это относится к моему сценарию? Кроме того, я бы предпочел не изменять реализацию ExoPlayer (MediaExtractor используется внутри ExoPlayer) – StackOverflower

+0

, если вы думаете, что выше информации полезно одобрить и отложить мой ответ – NovusMobile