#android #exoplayer
#Android #exoplayer
Вопрос:
Привет, я изучаю Exoplayer, поэтому я разработал простое приложение, в котором я извлекаю видео из папки raw. Это приложение отлично работает на lollipop, но когда я запускаю то же приложение в версии Kitkat, оно показывает только черный экран с длиной видео на медиа-контроллере. Я пытался найти, но ничего не получил по этой проблеме, нужны некоторые предложения по этой проблеме. Заранее спасибо!
main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="20dp"
tools:context=".MainActivity">
<com.google.android.exoplayer2.ui.PlayerView
android:id="@ id/player_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
Main.java
public class MainActivity extends AppCompatActivity {
private PlayerView playerView;
private SimpleExoPlayer player;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
playerView = findViewById(R.id.player_view);
}
@Override
protected void onStart() {
super.onStart();
player = ExoPlayerFactory.newSimpleInstance(this,new DefaultTrackSelector());
playerView.setPlayer(player);
final RawResourceDataSource rawResourceDataSource = new RawResourceDataSource(this);
DataSpec dataSpec = new DataSpec(RawResourceDataSource.buildRawResourceUri(R.raw.tara));
try {
rawResourceDataSource.open(dataSpec);
DataSource.Factory factory = new DataSource.Factory() {
@Override
public DataSource createDataSource() {
return rawResourceDataSource;
}
};
MediaSource videoSource = new ExtractorMediaSource.Factory(factory).createMediaSource(rawResourceDataSource.getUri());
player.prepare(videoSource);
player.setPlayWhenReady(true);
} catch (RawResourceDataSource.RawResourceDataSourceException e) {
e.printStackTrace();
}
}
}
Ошибка Logcat
E/ACodec: [OMX.google.h264.decoder] ERROR(0x80001001)
E/MediaCodec: Codec reported an error. (omx error 0x80001001, internalError -2147483648)
E/ExoPlayerImplInternal: Internal runtime error.
java.lang.IllegalStateException
at android.media.MediaCodec.dequeueOutputBuffer(Native Method)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.drainOutputBuffer(MediaCodecRenderer.java:1024)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:573)
at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:518)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:301)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:136)
at android.os.HandlerThread.run(HandlerThread.java:61)
Комментарии:
1. Проверьте Logcat и посмотрите, регистрирует ли Exoplayer что-либо, что могло бы объяснить его проблемы.
2. @CommonsWare проверьте, что я добавил информацию о logcat
Ответ №1:
Можете ли вы попробовать эту часть кода в методе OnStart:
TrackSelection.Factory videoTrackSelectionFactory =
new AdaptiveTrackSelection.Factory(null);
player = ExoPlayerFactory.newSimpleInstance(this, new DefaultTrackSelector(videoTrackSelectionFactory));
player.setRepeatMode(Player.REPEAT_MODE_ONE);
player.setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL);
playerView.setUseController(false);
playerView.setPlayer(player);
player.setPlayWhenReady(true);
final RawResourceDataSource rawResourceDataSource = new RawResourceDataSource(this);
DataSpec dataSpec = new DataSpec(RawResourceDataSource.buildRawResourceUri(R.raw.tara));
try {
rawResourceDataSource.open(dataSpec);
DataSource.Factory factory = new DataSource.Factory() {
@Override
public DataSource createDataSource() {
return rawResourceDataSource;
}
};
MediaSource videoSource = new ExtractorMediaSource.Factory(factory).createMediaSource(rawResourceDataSource.getUri());
player.prepare(videoSource);
} catch (RawResourceDataSource.RawResourceDataSourceException e) {
e.printStackTrace();
}
Комментарии:
1. нет, не работает, я использую эмулятор и файл .mp4, он также не работает на lollipop
2. Я рекомендую использовать реальное устройство или альтернативное, которое вы можете использовать Genymotion. Эмулятор не на 100% реалистичен, а Genymotion лучше, чем эмулятор. Кроме того, я работал с Exoplayer ниже API 21 (Lollipop), и он работал нормально.
3. спасибо за ответ на ваш код, работает только тогда, когда я использую видеофайл 3gp, файлы mp4 не работают как решить эту проблему?
4. Я использую свою часть кода также для формата .mp4. Прямо сейчас я не мог найти никаких причин, по которым он не работает для Kitkat и выше уровней API.