1

我对 MediaMetadataRetriever setdatasource 方法有疑问。我创建了一个简单的项目。main.xml 只有一个 textview,它应该显示 music.mp3 的参数。mp3 在项目原始文件中。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

您将整数传递给 setDataSource 因为 R.raw.music 返回与文件相关的资源 id,而不是文件的路径。您需要将路径或文件描述符作为参数传递给 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 回答