Как воспроизводить видео в android из папки с ресурсами или сырой папкой?

Я пытаюсь воспроизвести видео в эмуляторе Android У меня есть видео в папке моих ресурсов, а также в исходной папке Но после некоторых исследований все еще я не могу воспроизвести видео в своем эмуляторе я работаю над 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-карту при запуске, и это кажется пустой тратой времени и памяти.

Ответ 1

## Прекрасно работает с 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();

## Проверить полный учебник ##

Ответ 2

Try:

AssetFileDescriptor afd = getAssets().openFd(fileName);
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength());

Ответ 3

String UrlPath="android.resource://"+getPackageName()+"/"+R.raw.ur file name;
videocontainer.setVideoURI(Uri.parse(UrlPath));
videocontainer.start();

где видеоконтент типа видеовизуется.

Ответ 4

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>

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

Я нашел его:

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

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

Ответ 8

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

EDIT: Если вы не хотите смотреть ссылку - это в значительной степени суммирует то, что вы хотели бы.

MediaPlayer mp = MediaPlayer.create(контекст, R.raw.sound_file_1);     mp.start();

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

Ответ 9

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

Ответ 10

a- Используйте API MediaPlayer и пример кода.

b- поместите файл мультимедиа в папку raw

c- получить file descriptor в файл

d- mediaplayer.setDataSource(fd,offset,length); - его конструктор с тремя аргументами

e-, тогда, когда onPreared, mediaplayer.start();

Ответ 11

В fileName вы должны поместить относительный путь к файлу (без /asset) например:

player.setDataSource(
    getAssets().openFd(**"media/video.mp4"**).getFileDescriptor()
);

Ответ 12

Кажется, что у вас такая же проблема, как и у меня. вместо использования MP4, возможно ли 3GPP? я думаю, что я использовал как HandBrake или что-то в качестве конвертера видео... вам просто нужно убедиться, что у вас есть правильный кодировщик, например H.264x или что-то в этом роде. извините за то, что вы немного расплывчаты, это было какое-то время. Кроме того, если это возможно, не беспокойтесь о том, чтобы больше беспокоиться об Android 2.1, а также что-то просто НЕ РАБОТАЕТ В ЭМУЛЯТОРЕ. поэтому, если он работает на множестве устройств, то просто предположите, что он работает (особенно с разными изготовителями).

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

Ответ 13

MainCode

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

myVideoView=(VideoView)findViewbyID(R.idV.Video_view);

myVideoView.setVideoURI(raw_uri);
myVideoView.setMediaController(new MediaController(this));
myVideoView.start();
myVideoView.requestFocus();

XML

<?xml version="1.0" encoding="utf-8" ?>

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
        <VideoView
            android:id="[email protected]/Video_View"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
        />
</LinearLayout>