MediaMetadataRetriever setdatasource出错

时间:2013-01-21 11:45:02

标签: android android-mediaplayer

我遇到了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;
}

我在这里做错了什么,我在哪里设置数据源?我不明白吗?

3 个答案:

答案 0 :(得分: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());
    }

答案 1 :(得分:1)

实际上,你可以使用类似的东西:

final AssetFileDescriptor afd=getResources().openRawResourceFd(R.raw.music);
final MediaMetadataRetriever mediaMetadataRetriever=new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

答案 2 :(得分:0)

我有同样的错误。我的解决方案与@android开发人员的方向相同。

检查您是否可以通过ExtractMetadata从视频中提取元数据信息。如果没有,则setDataSource()通话可能出现问题,或者视频格式/编解码器格式错误。

此代码适用于我。

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

我必须提供afd.getStartOffset()afd.getLength()

也许它可以帮助你走上正确的轨道。