【问题标题】:error with by MediaMetadataRetriever setdatasourceMediaMetadataRetriever setdatasource 出错
【发布时间】:2014-12-11 23:26:33
【问题描述】:

我的 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;
}

我在这里做错了什么,我在哪里设置数据源?没看懂?

【问题讨论】:

    标签: android android-mediaplayer


    【解决方案1】:

    您将整数传递给 setDataSource,因为 R.raw.music 返回与文件相关的资源 id,而不是文件的路径。您需要将路径或文件描述符作为参数传递给 setDataSource。试试这个代码:

        AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.music);
        if (afd != null) {
            MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
            metaRetriever.setDataSource(afd.getFileDescriptor());
        }
    

    【讨论】:

    • 感谢威廉的帮助。我已经通过使用以下代码解决了它: String uriPath = "android.resource://" + getPackageName() + "/raw/music"; uri uri = Uri.parse(uriPath); MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever(); metaRetriever.setDataSource(getApplication(), uri);
    【解决方案2】:

    其实你可以这样用:

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

    【讨论】:

      【解决方案3】:

      我有同样的错误。我的解决方案与@android developer's 的方向相同。

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

      此代码对我有用。

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-02-18
        • 1970-01-01
        • 2016-06-04
        • 1970-01-01
        • 2018-10-31
        • 2019-07-20
        • 2020-06-05
        • 1970-01-01
        • 2018-07-11
        相关资源
        最近更新 更多