web-dev-qa-db-ja.com

ExoPlayer-SDカードでローカルのmp4ファイルを再生する

Exoplayer Demoアプリを使用していて、SDカードからMP4ビデオをプリロードしたい。 この投稿 から実装を試しましたが、動作しません。私のexoplayer DemoにはDemoUtil.Javaというクラスはありません。代わりに使用:

public static final Sample[] LOCAL_VIDEOS = new Sample[] {
new Sample("Some User friendly name of video 1",
"/mnt/sdcard/video1.mp4", Util.TYPE_OTHER),
};

また、SampleChooserActivity.Javaで言及したコードスニペットを使用することもできませんでした。 (私にエラーを出し続けました)

私は代わりに使用しました:

group = new SampleGroup("Local Videos");
group.addAll(Samples.LOCAL_VIDEOS);
sampleGroups.add(group);

何が悪いのですか?ファイルのパスはデバイスごとに変わりますか?

14
Meera Anand

デモアプリは試していませんが、ローカルオーディオファイルを再生する独自の例を作成して、ここに投稿しました: https://github.com/nzkozar/ExoplayerExample

ファイルUriからプレーヤーを準備するすべての作業を行う主要部分は次のとおりです。

_private void prepareExoPlayerFromFileUri(Uri uri){
        exoPlayer = ExoPlayerFactory.newSimpleInstance(this, new DefaultTrackSelector(null), new DefaultLoadControl());
        exoPlayer.addListener(eventListener);

        DataSpec dataSpec = new DataSpec(uri);
        final FileDataSource fileDataSource = new FileDataSource();
        try {
            fileDataSource.open(dataSpec);
        } catch (FileDataSource.FileDataSourceException e) {
            e.printStackTrace();
        }

        DataSource.Factory factory = new DataSource.Factory() {
            @Override
            public DataSource createDataSource() {
                return fileDataSource;
            }
        };
        MediaSource audioSource = new ExtractorMediaSource(fileDataSource.getUri(),
                factory, new DefaultExtractorsFactory(), null, null);

        exoPlayer.prepare(audioSource);
    }
_

次のようにUriを取得できます:Uri.fromFile(file)

上記のようにファイルを再生用に準備したら、exoPlayer.setPlayWhenReady(true);を呼び出して再生を開始するだけです。

ビデオファイルの場合は、おそらくexoPlayerオブジェクトにサーフェスビューをアタッチするだけで済みますが、ExoPlayer2ではまだこれを行っていません。

22
ak93

アセットからのビデオExoPlayer 2を使用して再生したい人のためにここに方法があります:

String playerInfo = Util.getUserAgent(context, "ExoPlayerInfo");
DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(
        context, playerInfo
);
MediaSource mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory)
    .setExtractorsFactory(new DefaultExtractorsFactory())
    .createMediaSource(Uri.parse("asset:///your_video.mov"));
player.prepare(mediaSource);
5
Sasha Shpota

これは私のために働きました。これらのステップを試してください:

ファイルのパスを取得してプレーヤーを起動します

File myFile = new File(extStore.getAbsolutePath() + "/folder/videos/" + video_name);  
videoUrl= String.valueOf(Uri.fromFile(myFile));  
initializePlayer(videoUrl);

プレーヤーを初期化しています

private void initializePlayer(String videoUrl) {
    player = ExoPlayerFactory.newSimpleInstance(
            new DefaultRenderersFactory(getActivity()),
            new DefaultTrackSelector(), new DefaultLoadControl());

    playerView.setPlayer(player);

    player.setPlayWhenReady(playWhenReady);
    player.seekTo(currentWindow, playbackPosition);

    Uri uri = Uri.parse(videoUrl);
    MediaSource mediaSource = buildMediaSource(uri);
    player.prepare(mediaSource, resetPositionBoolean, false);
}   

メディアソースの構築

  private MediaSource buildMediaSource(Uri uri) {
    return new ExtractorMediaSource.Factory(
            new DefaultDataSourceFactory(getActivity(),"Exoplayer-local")).
            createMediaSource(uri);
}
2
Aashis Shrestha

アセットフォルダーからロードする場合:

assets/xyz.mp4

それはファイルを次のようにロードすることによって機能します:

「file:/Android_asset/xyz.mp4」

そして、DefaultDataSourceFactoryを使用します。 exoplayer 2.4.4で確認しました。

1
petrumo

SDカードからのビデオ再生は次のコードで動作しました。私のテストファイルはsdcardのVideosディレクトリにあります。

public static final Sample[] LOCAL_VIDEOS = new Sample[] {
        new Sample("test",
            Environment.getExternalStorageDirectory()+"/Videos/test.mp4", Util.TYPE_OTHER),
};
0
Christo

一部のデバイスでは、このパス「/sdcard/nameoffile.mp4」を直接使用できます。