我遇到了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;
}
我在这里做错了什么,我在哪里设置数据源?我不明白吗?
答案 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()
也许它可以帮助你走上正确的轨道。