1

MediaMetadataRetriever setdatasource メソッドに問題があります。私は簡単なプロジェクトを作成しました。main.xml には textview しかなく、music.mp3 のパラメーターを表示する必要があります。mp3 はプロジェクトの raw ファイルにあります。mainActivity は次のようになります。

public class MainActivity extends Activity {

 /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    TextView tvMain = (TextView)findViewById(R.id.textView_songParam);
    // load data file
    MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
    metaRetriever.setDataSource(R.raw.music);

    String out = "";
    // get mp3 info
    out += metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
    out += "\n";
    out += metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
    out += "\n";
    //out += metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM);
    //out += "\n";
    //out += metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR);
    //out += "\n";
    // convert duration to minute:seconds
    String duration = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
    long dur = Integer.parseInt(duration);
    String seconds = String.valueOf(dur % 60);
    String minutes = String.valueOf(dur / 60000);
    out += "Length: [ " + minutes + "m" + seconds + "s ]\n";

    // close object
    metaRetriever.release();
    // display output
    tvMain.setText(out);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

ここで、データソースを設定する行で何が間違っていますか?? 私はそれを理解していませんか?

4

3 に答える 3

2

R.raw.music はファイルへのパスではなく、ファイルに関連するリソース ID を返すため、setDataSource に整数を渡しています。パスまたはファイル記述子を引数として setDataSource に渡す必要があります。このコードを試してください:

    AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.music);
    if (afd != null) {
        MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
        metaRetriever.setDataSource(afd.getFileDescriptor());
    }
于 2013-01-21T23:35:49.447 に答える
1

実際には、次のようなものを使用できます。

final AssetFileDescriptor afd=getResources().openRawResourceFd(R.raw.music);
final MediaMetadataRetriever mediaMetadataRetriever=new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
于 2014-10-01T21:27:15.713 に答える
0

同じエラーが発生しました。私の解決策は、@android 開発者と同じ方向に進んでいます。

経由でビデオからメタデータ情報を抽出できるかどうかを確認しますExtractMetadata。そうでない場合は、setDataSource()通話に問題があるか、ビデオの形式/コーデックが間違っている可能性があります。

このコードは私にとってはうまくいきます。

AssetFileDescriptor afd=getAssets().openFd("t.mp4");
mediaMetadataRetriever.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

私は提供afd.getStartOffset()しなければならなかったafd.getLength()

正しい軌道に乗るのに役立つかもしれません。

于 2014-12-11T15:26:33.697 に答える