Как воспроизводить видео в Android из папки активов или сырой папки? - PullRequest
67 голосов
/ 12 июня 2010

Я пытаюсь воспроизвести видео в эмуляторе Android. У меня есть видео в папке с активами, а также в папке raw. Но после некоторых исследований я не могу воспроизвести видео в моем эмуляторе, я работаю на Android 2.1. Мой формат видеоmp4, так что я не думаю, что это должно быть проблемой. Может ли кто-нибудь просто дать мне пример кода, чтобы я мог понять немного больше?

Проблема в том, что VideoView, который мне нужен для отображения видео, будет приниматьтолько URI или путь к файлу, указывающий на видео.

Если я сохраняю видео в папке raw или assets, я могу получить только входной поток или дескриптор файла, и, похоже, ничего этого нельзя использовать для инициализации VideoView.

Обновление

Я более внимательно посмотрел пример MediaPlayer и попытался запустить MediaPlayer с FileDescriptor для файлов ресурсов, как показано в коде ниже:

SurfaceView videoView = (SurfaceView) findViewById(gettingStarted)
SurfaceHolder holder = videoView.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
final MediaPlayer player = new MediaPlayer();
player.setDisplay(holder);

player.setDataSource(getAssets().openFd(fileName).getFileDescriptor());
player.prepareAsync();
player.setOnPreparedListener(new OnPreparedListener() {

   @Override
   public void onPrepared(MediaPlayer mp) {
      mp.start();
   }
});

Теперь яполучите следующее исключение:

java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed

Кажется, нет другого способа, кроме как скопировать файл на SD-карту при запуске, и это кажется пустой тратой времени и памяти.

Ответы [ 13 ]

114 голосов
/ 23 декабря 2011

## Отлично работает с Android 1.6 ##

getWindow().setFormat(PixelFormat.TRANSLUCENT);
VideoView videoHolder = new VideoView(this);
//if you want the controls to appear
videoHolder.setMediaController(new MediaController(this));
Uri video = Uri.parse("android.resource://" + getPackageName() + "/" 
+ R.raw.your_raw_file); //do not add any extension
//if your file is named sherif.mp4 and placed in /raw
//use R.raw.sherif
videoHolder.setVideoURI(video);
setContentView(videoHolder);
videoHolder.start();

## Проверить полное руководство ##

11 голосов
/ 05 марта 2013
String UrlPath="android.resource://"+getPackageName()+"/"+R.raw.ur file name;
videocontainer.setVideoURI(Uri.parse(UrlPath));
videocontainer.start();

где видеоконтейнер типа videoview.

10 голосов
/ 25 августа 2011

Попробуйте:

AssetFileDescriptor afd = getAssets().openFd(fileName);
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength());
8 голосов
/ 18 декабря 2013

PlayVideoActivity.java:

public class PlayVideoActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_play_video);

        VideoView videoView = (VideoView) findViewById(R.id.video_view);
        MediaController mediaController = new MediaController(this);
        mediaController.setAnchorView(videoView);
        videoView.setMediaController(mediaController);
        videoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.documentariesandyou));
        videoView.start();
    }
}

activity_play_video.xml:

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center" >

    <VideoView
        android:id="@+id/video_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </VideoView>

</LinearLayout>
4 голосов
/ 21 августа 2010

Если я хорошо помню, у меня была такая же проблема при загрузке материалов из папки ресурсов, но с базой данных. Кажется, что вещи в вашей папке активов могут иметь 2 статистики: сжатые или нет.
Если он сжимается, вам разрешается распаковывать 1 мес памяти, иначе вы получите исключение такого рода. Есть несколько сообщений об ошибках об этом, потому что документация не ясна. Поэтому, если вы все еще хотите использовать свой формат, вы должны либо использовать несжатую версию, либо дать расширение, например .mp3 или .png, для вашего файла. Я знаю, что это немного сумасшествие, но я загружаю базу данных с расширением .mp3, и она отлично работает. Это другое решение состоит в том, чтобы упаковать ваше приложение со специальной опцией, чтобы запретить сжатие определенного расширения. Но тогда вам нужно собрать приложение вручную и добавить опцию «zip -0».
Преимущество несжатой сборки состоит в том, что фаза zip-align перед публикацией приложения будет правильно выравнивать данные, так что при загрузке в память они могут быть напрямую отображены.

Итак, решения:

  • измените расширение файла на .mp3 или .png и посмотрите, работает ли оно
  • создайте приложение вручную и используйте опцию zip-0
3 голосов
/ 17 августа 2010

Вы пытались вручную положить видео на SDCard и пытаться воспроизвести видеомагазин на SDCard?

Если он работает, вы можете найти способ копирования с Raw на SDcard здесь:

android-copy-rawfile-to-sdcard-video-mp4 .

2 голосов
/ 05 декабря 2011

Я нашел это:

Uri raw_uri = Uri.parse(<package_name>/+R.raw.<video_file_name>);

Personnaly Android нашел ресурс, но пока не может его воспроизвести. Мой файл .m4v

1 голос
/ 02 декабря 2015
VideoView myVideo = (VideoView) rootView.findViewById(R.id.definition_video_view);

//Set video name (no extension)
String myVideoName = "my_video";

//Set app package
String myAppPackage = "com.myapp";

//Get video URI from raw directory
Uri myVideoUri = Uri.parse("android.resource://"+myAppPackage+"/raw/"+myVideoName);

//Set the video URI
myVideo.setVideoURI(myVideoUri);

//Play the video
myVideo.start();

https://gist.github.com/jrejaud/b5eb1b013c27a1f3ae5f

1 голос
/ 12 июня 2010

Я думаю, что вам нужно взглянуть на это - в нем должно быть все, что вы хотите.

РЕДАКТИРОВАТЬ: Если вы не хотите смотреть на ссылку - это в значительной степени подводит итог того, что вы хотели бы.R.raw.sound_file_1);mp.start ();

Но я все же рекомендую прочесть информацию по ссылке.

0 голосов
/ 20 января 2012

Звучит так, будто у тебя та же проблема, что и у меня. возможно ли использование MP4 вместо MP4? Я думаю, что я использовал как HandBrake или что-то в качестве видео конвертера ... вам просто нужно убедиться, что у вас есть правильный кодер, как H.264x или что-то еще. извините за то, что был немного расплывчатым, это было давно. Кроме того, если это возможно, не беспокойтесь об Android 2.1 больше, а также, что-то, что просто не будет работать в эмуляторе. так что если он работает на многих устройствах, то предположим, что он работает (особенно с разными производителями)

здесь, вы можете прочитать мою проблему и как я решил проблему (после долгого времени и никто не получил ответа). я объяснил более подробно здесь: Android Media Player не работает

...