Android воспроизводит видео в TextureView из raw или ресурсов
У меня раздражающая проблема с воспроизведением видео в TextureView из папки raw или assets... или даже из внешнего хранилища. Код во фрагменте выглядит примерно так
public class MainFragment extends Fragment implements TextureView.SurfaceTextureListener, MediaPlayer.OnBufferingUpdateListener,
MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnVideoSizeChangedListener {
private ParallaxAdapter mAdapter;
private MediaPlayer mMediaPlayer;
private MediaPlayer mMediaPlayer2;
private TextureView tv;
private TextureView tv2;
private ImageView imageview;
private TextureView mTexture;
String path;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) {
super.onCreateView(inflater, container, savedInstance);
View v = inflater.inflate(R.layout.view_fragment, container, false);
path = getArguments().getString("path");
Log.d("Fragment","" + path);
String tag = getArguments().getString("Tag");
imageview = (ImageView) v.findViewById(R.id.imageView);
if (tag == "image") {
imageview.setImageResource(getArguments().getInt("image"));
} else if (tag == "video") {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inDither = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmapThumb = ThumbnailUtils.createVideoThumbnail(path, MediaStore.Images.Thumbnails.FULL_SCREEN_KIND);
imageview.setImageBitmap(bitmapThumb);
tv = (TextureView) v.findViewById(R.id.textureView);
tv.setSurfaceTextureListener(this);
}
return v;
}
public void setAdapter(ParallaxAdapter Adapter) {
mAdapter = Adapter;
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
Surface s = new Surface(surface);
try {
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(path);
mp.setSurface(s);
mp.prepare();
mp.setOnBufferingUpdateListener(this);
mp.setOnCompletionListener(this);
mp.setOnPreparedListener(this);
mp.setOnVideoSizeChangedListener(this);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setVolume(0, 0);
mMediaPlayer.setLooping(true);
mMediaPlayer.start();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Похоже, MediaPlayer не может найти файл из raw:
defpath = "android.resource://" + getPackageName() + "/" + R.raw.video;
или из активов:
AssetFileDescriptor afd = getAssets().openFd(FILE_NAME);
mp.setDataSource(afd.getFileDescriptor());
и я попытался скопировать ресурсы на SDCard с некоторыми кодами из этого обсуждения: Android-как-копировать-файлы-из-папки-папки-на-SDCard
но если я его скопирую, файл как-то поврежден. Я даже не могу воспроизвести его с обычным VideoPlayer на моем устройстве.
Это не ошибка кодека! Если я помещаю видео на свое устройство, как на USB, и устанавливаю путь, и он работает со всеми 3 тестовыми видео. Манифест имеет разрешение на чтение и запись. А VideoView создает еще больше проблем с ViewPager и путями.
Надеюсь, я просто совершил какую-то глупую ошибку... Спасибо!
1 ответ
Только потому, что вы можете воспроизводить видео с помощью видеопроигрывателя по умолчанию на вашем устройстве, не означает, что это не проблема кодека или другая деталь, которая ему не нравится.
Чего мне не хватает здесь, так это MediaPlayer.OnErrorListener
Если вы получите что-то вроде/MediaPlayer﹕ error (1, -2147483648)
, который указывает на MEDIA_ERROR_UNKNOWN
с дополнительной информацией MEDIA_ERROR_SYSTEM (-2147483648) - low-level system error
это, вероятно, проблема с видео.
Вы можете взглянуть на метаданные видео с помощью ffmpeg:
ffmpeg -i video.mp4
Проверить:
- кодер-декодер
- Метаданные (например, видео вращается)
- Слишком большая ширина / высота видео
Не получил разумное сообщение об ошибке ни для одного из них.
Вот официальная информация: Поддерживаемые форматы медиа, которые не очень помогают ИМХО