71

Androidエミュレーターでビデオを再生しようとしていますが、アセットフォルダーと生フォルダーにビデオがありますが、いくつかの調査を行った後でも、エミュレーターでビデオを再生できません。Android 2.1で作業しています。ビデオ形式はmp4なので、私はそれが問題になるとは思わないでください。もう少し理解できるように、誰かがサンプルコードを教えてくれませんか?

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

ビデオを raw または assets フォルダーに保存すると、入力ストリームまたはファイル記述子しか取得できず、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カードにコピーする以外に方法はないようで、時間とメモリの無駄のようです。

4

13 に答える 13

122

##Android1.6以降は完全に機能しています##

getWindow().setFormat(PixelFormat.TRANSLUCENT);
VideoView videoHolder = new VideoView(this);
//if you want the controls to appear
videoHolder.setMediaController(new MediaController(this));
Uri video = getUriFromRawFile(context, R.raw.your_raw_file);
//if your file is named sherif.mp4 and placed in /raw
//use R.raw.sherif
videoHolder.setVideoURI(video);
setContentView(videoHolder);
videoHolder.start();

その後

public static Uri getUriFromRawFile(Context context, @ResRaw int rawResourceId) {
    return Uri.Builder()
        .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
        .authority(context.getPackageName())
        .path(String.valueOf(rawResourceId))
        .build();
}

##完全なチュートリアルを確認してください##

于 2011-12-23T12:40:09.680 に答える
12
String UrlPath="android.resource://"+getPackageName()+"/"+R.raw.ur file name;
videocontainer.setVideoURI(Uri.parse(UrlPath));
videocontainer.start();

タイプ videoview の videocontainer です。

于 2013-03-05T14:11:42.603 に答える
11

試す:

AssetFileDescriptor afd = getAssets().openFd(fileName);
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength());
于 2011-08-25T18:54:28.260 に答える
10

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>
于 2013-12-18T08:05:55.640 に答える
4

よく覚えていれば、アセット フォルダーからデータベースを読み込むときに同じ種類の問題が発生しました。アセットフォルダー内のものには、圧縮されているかどうかの2つの統計があるようです。
圧縮されている場合は、1 Mo のメモリを使用して圧縮を解除できます。そうしないと、この種の例外が発生します。いくつかのバグレポートがありますドキュメントが明確ではないため、それについて。そのため、引き続き独自の形式を使用する場合は、圧縮されていないバージョンを使用するか、ファイルに .mp3 や .png などの拡張子を付ける必要があります。少しおかしなことはわかっていますが、拡張子が .mp3 のデータベースをロードすると、完全に正常に動作します。この他の解決策は、特定の拡張子を圧縮しないように指示する特別なオプションを使用してアプリケーションをパッケージ化することです。ただし、アプリを手動でビルドし、「zip -0」オプションを追加する必要があります。
圧縮されていないアセットの利点は、アプリケーションの公開前の zip-align のフェーズでデータが正しく整列されるため、メモリにロードされたときに直接マップできることです。

だから、解決策:

  • ファイルの拡張子を .mp3 または .png に変更し、動作するかどうかを確認します
  • アプリを手動でビルドし、zip-0 オプションを使用する
于 2010-08-21T09:33:50.680 に答える
3

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

動作している場合は、Raw から SDcard にコピーする方法をここで見つけることができます。

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

于 2010-08-16T23:27:33.057 に答える
2
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

于 2015-12-02T20:30:51.537 に答える
2

見つけた :

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

個人的に Android はリソースを見つけましたが、今のところ再生できません。私のファイルは.m4vです

于 2011-12-05T15:27:16.017 に答える
1

これを見る必要があると思います-- 必要なものがすべて揃っているはずです。

編集:リンクを見たくない場合-これはあなたが望むものをほぼ要約しています.

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

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

于 2010-06-12T19:54:05.667 に答える
0
  1. MediaPlayerAPI とサンプル コードを使用します。

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

  3. をファイルに取得しfile descriptorます。

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

  5. その後onPrearedmediaplayer.start();

于 2010-06-13T09:50:32.337 に答える
0

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

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

于 2012-01-20T06:42:05.940 に答える
0

ではfileName、ファイルへの相対パスを入力する必要があります ( なし/asset)。たとえば、次のようになります。

player.setDataSource(
    getAssets().openFd(**"media/video.mp4"**).getFileDescriptor()
);
于 2011-12-10T14:13:43.767 に答える
-2

メインコード

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="+@/Video_View"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
        />
</LinearLayout>
于 2010-07-01T13:41:16.203 に答える