1

ローカル/外部ストレージに保存されているメディア ファイルをメディア プレーヤーで再生しようとしています。

メディア ファイルは別のアクティビティを使用してダウンロードされ、ローカル/外部ストレージに保存されます。保存のサンプル コードについては、以下を参照してください。

    FileOutputStream fos = openFileOutput("myfile.mp4" , Context.MODE_WORLD_WRITEABLE);
    fos.write(byteArrayBuf.toByteArray());
    fos.close();

同じファイルを再生するために、私は使用します。

    mMediaPlayer = new MediaPlayer();
    ParcelFileDescriptor parcel = ParcelFileDescriptor.open(new File( URI.create("file:///data/data/com.mypackage/files/myfile.mp4")),ParcelFileDescriptor.MODE_READ_WRITE);
mMediaPlayer.setDataSource(parcel.getFileDescriptor());
    mMediaPlayer.setDisplay(mHolder);
    mMediaPlayer.prepare();
    mMediaPlayer.setOnPreparedListener(this);

    /** On Prepared Implementation **/
    public void onPrepared(MediaPlayer mp) {
       mMediaPlayer.start();
    }

ただし、メディア プレーヤーはファイルの再生を拒否し、常にエラーで失敗します (1、 )。ローカル/外部ストレージからファイルを読み取らせるために、コードサンプルに沿ったすべてのことを行ったように見えるので、このメディアプレーヤーを実行するのは本当に頭が痛いです。

注: ローカル ファイルを res/raw フォルダーのファイルに置き換えると、正常に再生されるようです。これは、アプリケーションまたはメディア プレーヤーで読み取れないファイルに特に関連しています。この作品を機能させるために、助けていただければ幸いです。

更新 1

@Chris : 私は一時的にファイルを WORLD_WRITEABLE にしました。メディア プレーヤーを動作させると、実際には WORLD_READABLE としてファイルを書き込みます。パスをハードコーディングすることは、ファイルがあいまいさなしに読み取られることを最初に確認したいだけなので、現時点では意図的です。実際、adbシェルとDDMSを介してファイルが存在することを確認しました。ファイルを読み取ったら、実際にはおそらくgetFilesDir()などのより賢明なものを使用します。Logcat の出力は次のとおりです。

    surfaceCreated
    I/AwesomePlayer(   34): reset
    I/AwesomePlayer(   34): cancel player events
    I/AwesomePlayer(   34): cancel player events
    I/SampleTable(   34): There are reordered frames present.
    D/MyPlayerActivity(  460): surfaceChanged
    I/ActivityManager(   82): Displayed com.mypackage/.MyPlayerActivity: +1s997ms
    D/MyPlayerActivity(  460): Video Prepared
    D/AudioSink(   34): bufferCount (4) is too small and increased to 12
    E/MediaPlayer(  460): error (1, -2147483648)
    E/MediaPlayer(  460): Error (1,-2147483648)
4

1 に答える 1

0

Chris Stratton がコメントしたように、内部ストレージまたは外部ストレージへのパスをハードコーディングしないでください。一部のシステムでは機能する可能性がありますが、すべてのシステムで保証されているわけではありません。

getFilesDir()ディレクトリのパスを見つけるために使用します。ドキュメントから...

public File getFilesDir ()

openFileOutput(String, int) で作成されたファイルが保存されているファイルシステム上のディレクトリへの絶対パスを返します。

アプリケーション ファイルを保持するディレクトリのパスを返します。

getAbsolutePath()返されたを呼び出してFile追加/myfile.mp4し、それを で使用できsetDataSource(...)ますMediaplayer

于 2012-05-17T17:27:06.787 に答える