web-dev-qa-db-ja.com

アセットフォルダーまたはrawフォルダーからAndroidでビデオを再生する方法は?

私はAndroidエミュレーターで動画を再生しようとしていますが、アセットフォルダーと生のフォルダーにビデオがありますAndroid 2.1私のビデオ形式はmp4ですので、それが問題になるとは思いません。

問題は、ビデオを表示するために必要なVideoViewが、ビデオを指すためにURIまたはファイルパスのみを取ることです。

ビデオをrawフォルダーまたはassetフォルダーに保存すると、入力ストリームまたはファイル記述子しか取得できず、VideoViewを初期化するために使用できるものはないようです。

更新

MediaPlayerの例を詳しく見て、以下のコードのように、アセットファイルにFileDescriptorを指定してMediaPlayerを起動しようとしました。

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カードにファイルをコピーする他の方法はないと思われ、それは時間とメモリの無駄のようです。

67
Abhishek Talwar

## 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();

##完全なチュートリアルを確認##

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

ここで、タイプvideoviewのvideocontainer。

11
Bishoy Fakhry

試してください:

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

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>
8
haotang

よく覚えていれば、アセットフォルダーからデータベースを読み込むときにも同じような問題がありました。アセットフォルダーの内容には、圧縮されているかどうかにかかわらず、2つの統計情報が含まれているようです。
圧縮されている場合は、1か月分のメモリを圧縮解除できます。そうしないと、この種の例外が発生します。ドキュメンテーションが明確でないため、それについて いくつかのバグレポート があります。したがって、まだフォーマットを使用したい場合は、非圧縮バージョンを使用するか、ファイルに.mp3や.pngなどの拡張子を付ける必要があります。私はそれが少しクレイジーであることを知っていますが、.mp3拡張子を持つデータベースをロードし、それは完全に正常に動作します。この他の解決策は、特定の拡張子を圧縮しないように指示する特別なオプションを使用してアプリケーションをパッケージ化することです。ただし、アプリを手動でビルドし、「Zip -0」オプションを追加する必要があります。
[。

だから、ソリューション:

  • ファイルの拡張子を.mp3または.pngに変更し、機能するかどうかを確認します
  • アプリを手動でビルドし、Zip-0オプションを使用します
4
Sephy

ビデオをSDCardに手動で配置し、SDCardのビデオストアを再生しようとしましたか?

それが機能している場合は、ここからRawからSDカードにコピーする方法を見つけることができます:

Android-copy-rawfile-to-sdcard-video-mp4

3
NicoMinsk
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

2
Jordan Réjaud

見つけた :

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

Personnaly Androidはリソースを見つけましたが、現時点では再生できません。私のファイルは.m4vです

2
Nabil Gardon

this に目を向ける必要があると思います。必要なものはすべて揃っているはずです。

編集:リンクを見たくない場合-これはあなたが望むものをほとんどまとめています。

MediaPlayer mp = MediaPlayer.create(context、R.raw.sound_file_1); mp.start();

しかし、リンクの情報を読むことをお勧めします。

1
hwrdprkns

fileNameには、ファイルへの相対パスを指定する必要があります(/asset) 例えば:

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

私と同じ問題を抱えているようです。 MP4を使用する代わりに、3GPPは可能ですか? HandBrakeなどをビデオコンバーターとして使用したと思います... H.264xなどの適切なエンコーダーがあることを確認するだけです。少しあいまいになってすみません、しばらくしてきました。また、可能であれば、Android 2.1を心配する必要はありません。また、EMULATORでは動作しないものもあります。したがって、多くのデバイスで動作する場合は、動作します(特に異なるメーカーで)

ここで、あなたは私の問題と私が問題をどのように解決したかを読むことができます(長い時間の後、誰も答えがありませんでした)。ここで詳細を説明しました: Androidメディアプレーヤーが動作していません

0
David T.
  1. MediaPlayer AP​​Iとサンプルコードを使用します。

  2. メディアファイルをrawフォルダーに入れます。

  3. _file descriptor_をファイルに取得します。

  4. mediaplayer.setDataSource(fd,offset,length);-3つの引数を持つコンストラクタ。

  5. 次に、onPrearedmediaplayer.start();

0
Khajan