AVI/MP4 на videoview

Я пытаюсь запустить видео avi/mp4 на видеовиде в моем приложении, но когда появляется открытое приложение "не могу воспроизвести это видео", я тестирую на своем мобильном телефоне.

videoView = (VideoView)findViewById(R.id.videoView);
MediaController mediaController = new MediaController(this);
mediaController.setAnchorView(videoView);
videoView.setMediaController(mediaController);
videoView.setVideoPath("/sdcard/"+file);
videoView.start();

Журнал:

03-28 20:52:30.723    8474-8474/mjksites.loopvideo D/MediaPlayer﹕ getMetadata
03-28 20:52:30.842    8474-8491/mjksites.loopvideo W/MediaPlayer﹕ info/warning (3, 0)
03-28 20:52:32.530    8474-8490/mjksites.loopvideo E/MediaPlayer﹕ error (1, -1004)
03-28 20:52:32.538    8474-8474/mjksites.loopvideo E/MediaPlayer﹕ Error (1,-1004)
03-28 20:52:32.538    8474-8474/mjksites.loopvideo D/VideoView﹕ Error: 1,-1004

1 ответ

Android не поддерживает формат видео контейнера AVI - сообщение, которое вы видите, является обычным сообщением, которое вы получаете, когда пытаетесь воспроизвести неподдерживаемый формат видео.

Смотрите здесь актуальный список поддерживаемых форматов:

Обратите внимание, что вы говорите, что пытаетесь воспроизвести видео "avi/mp4" - это необычно, поскольку AVI и MP4 являются альтернативными контейнерами видео, поэтому видео обычно имеет один формат или другой.

Обновленный ответ

Хорошо, я проверил видео, размещенное ниже в комментариях, и оно определенно будет воспроизводиться на устройстве Android 4.4.2.

Следующий код работает (он воспроизводит ваше видео) и может быть полезен для тестирования в вашем приложении (обновлено, чтобы использовать ваш собственный идентификатор просмотра, путь к видео и т. Д.) Он предназначен для использования во фрагменте, но вы можете изменить его для действия, если это ваш вариант использования:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    rootView = inflater.inflate(R.layout.fragment_item_detail, container, false);

    //Create the video player and set the video path
    videoPlayerView = (VideoView) rootView.findViewById(R.id.video_area);
    if (videoPlayerView == null) {
        Log.d("ItemDetailFragment","onCreateView: videoPlayerView is null");
        return null;
    }

    //Set the video path and make sure the first frame is shown instead of a black screen
    videoPlayerView.setVideoPath(selectedVideoItem.videoPath); 
    videoPlayerView.seekTo(100);

    //Set the MediaController (the video control bar) to match the size of the VideoView - this trick 
    //from a Stackru answer makes sure it is sized correctly, calling setAnchroView after the
    //Video is actually loaded and hence knows it right sze.
    final Context mContext = this.getActivity();
    videoPlayerView.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            //Add a listener for the size change to correctly set the controls
            mp.setOnVideoSizeChangedListener(new OnVideoSizeChangedListener() { 
                @Override
                public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
                    //Add Media Controller and set its position on the screen.
                    mediaController = new MediaController(mContext);
                    videoPlayerView.setMediaController(mediaController);
                    mediaController.setAnchorView(videoPlayerView);
                }
            });
        }
    });

    return rootView;
}

Кроме того, убедитесь, что у вашего приложения есть разрешение на чтение из внешнего хранилища, поскольку ошибки медиаплеера иногда бывают вызваны лежащими в основе проблемами и не очень полезны. Следующая строка должна быть в вашем манифесте:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Другие вопросы по тегам