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" />