MediaPlayer не может воспроизводить видео с URL-адреса

Я использую TextureView для воспроизведения видео с моего сервера App-Engine. Я могу нормально воспроизвести видео, если открою ссылку в браузере. Но в MediaPlay есть следующие ошибки о том, что файл не найден, а затем не собирается воспроизводить видео.

I/MediaPlayer: Need to enable context aware info
 E/MediaPlayer-JNI: QCMediaPlayer mediaplayer NOT present
 D/MediaPlayer: setDataSource IOException happend : 
 D/MediaPlayer: java.io.FileNotFoundException: No content provider: https://companycloud.appspot.com/watchvideo/?videoid=1234567771234567
 D/MediaPlayer:     at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1074)
 D/MediaPlayer:     at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:927)
 D/MediaPlayer:     at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:854)
 D/MediaPlayer:     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1085)
 D/MediaPlayer:     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1059)
 D/MediaPlayer:     at com.company.app.android.fragment.VideoFragment.playNewVideo(VideoFragment.java:411)
 D/MediaPlayer:     at com.company.app.android.fragment.VideoFragment.access$400(VideoFragment.java:63)
 D/MediaPlayer:     at com.company.app.android.fragment.VideoFragment$1.onReceive(VideoFragment.java:120)
 D/MediaPlayer:     at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:297)
 D/MediaPlayer:     at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46)
 D/MediaPlayer:     at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:116)
 D/MediaPlayer:     at android.os.Handler.dispatchMessage(Handler.java:102)
 D/MediaPlayer:     at android.os.Looper.loop(Looper.java:145)
 D/MediaPlayer:     at android.app.ActivityThread.main(ActivityThread.java:5837)
 D/MediaPlayer:     at java.lang.reflect.Method.invoke(Native Method)
 D/MediaPlayer:     at java.lang.reflect.Method.invoke(Method.java:372)
 D/MediaPlayer:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
 D/MediaPlayer:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
 D/MediaPlayer: Couldn't open file on client side, trying server side
10-24 12:25:26.665 6742-7036/com.company.app.android E/MediaPlayer: error (1, -2147483648)
10-24 12:25:26.685 6742-6742/com.company.app.android E/MediaPlayer: Error (1,-2147483648)

person learner    schedule 24.10.2015    source источник
comment
почему бы не использовать VideoView?   -  person Murtaza Khursheed Hussain    schedule 24.10.2015
comment
У меня были большие проблемы с видеопросмотром, поэтому я переключился. Но, конечно, это не решение проблемы. Знаете ли вы, что TextureView нельзя заставить работать?   -  person learner    schedule 24.10.2015


Ответы (1)


Ну, я не могу комментировать, и, поскольку нет никакого справочного кода, вот несколько предложений:

1) Решение работает для Android версии 4.0 и выше.

Инициализируйте объект MediaPlayer внутри метода onSurfaceTextureAvailable() и поместите его в блок try/catch.

Проанализируйте Uri. Поскольку объект Uri обычно используется для передачи ссылки на контент в ContentProvider.

@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i2) {
    Surface surface = new Surface(surfaceTexture);

    try {
        mMediaPlayer= new MediaPlayer(); 
        // parse the URL path
        mMediaPlayer.setDataSource(getApplicationContext(), Uri.parse(URL_PATH));
        mMediaPlayer.setSurface(surface);
        mMediaPlayer.setLooping(true);

        mMediaPlayer.prepareAsync();


        mMediaPlayer.setOnBufferingUpdateListener(this);
        mMediaPlayer.setOnCompletionListener(this);
        mMediaPlayer.setOnVideoSizeChangedListener(this);
        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

        // Play video when the media source is ready for playback.
        mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                mediaPlayer.start();
            }
        });

    } catch (IllegalArgumentException e) {
        Log.d(TAG, e.getMessage());
    } catch (SecurityException e) {
        Log.d(TAG, e.getMessage());
    } catch (IllegalStateException e) {
        Log.d(TAG, e.getMessage());
    } catch (IOException e) {
        Log.d(TAG, e.getMessage());
    }
}

Также для потоков предпочтительнее использовать prepareAsync(), так как он возвращается немедленно, а не блокируется до тех пор, пока не будет буферизовано достаточно данных. вызовите метод MediaPlayer.prepareAsync(), так как вы используете конструктор для создания объекта MediaPlayer.

Не забудьте сделать очистку памяти после того, как закончите воспроизведение видео.

@Override
protected void onDestroy() {
    super.onDestroy();
    if (mMediaPlayer != null) {
        mMediaPlayer.stop();
        mMediaPlayer.release();
        mMediaPlayer = null;
    }
}

Надеюсь, поможет!

person Pavitra Kansara    schedule 24.10.2015
comment
Извините за отсутствие кода. Здесь stackoverflow.com/questions/33288303/. Также я попытался изменить по-вашему и все равно получил те же ошибки. - person learner; 25.10.2015