MediaMetaDataRetriever.setDataSource 返回 null

Posted

技术标签:

【中文标题】MediaMetaDataRetriever.setDataSource 返回 null【英文标题】:MediaMetaDataRetriever.setDataSource return null 【发布时间】:2018-04-24 16:49:00 【问题描述】:

我正在尝试开发一个应用程序 (Radio Stream) 应用程序,我想获取该 MediaMetadataRetriever API 在收音机上播放的歌曲的详细信息但是当我设置我的网址时,我得到了这个错误:

java.lang.IllegalArgumentException 在 android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:71) 在 maa.myapp.MainActivity$PlayerTask.onPostExecute(MainActivity.java:447) 在 maa.myapp.MainActivity$PlayerTask.onPostExecute(MainActivity.java:419)

这是我的代码:

MediaPlayer mediaPlayer;
    String stream = "https://plaza.one/mp3";
    boolean prepared =false;
    boolean started =false ;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mediaPlayer = new MediaPlayer();
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) 
            AudioAttributes attribs = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build();
            mediaPlayer.setAudioAttributes(attribs);

         else 
            mediaPlayer.setAudiostreamType(AudioManager.STREAM_MUSIC);
        


        new PlayerTask().execute(stream);

    public class PlayerTask extends AsyncTask<String,Void,Boolean> 
        @Override
        protected void onPreExecute() 
            super.onPreExecute();
            loadingRL.setVisibility(View.VISIBLE);
        
        @Override
        protected Boolean doInBackground(String... strings) 
            try 
                mediaPlayer.reset();
                mediaPlayer.setDataSource(strings[0]);
                prepared=true;
                mediaPlayer.prepare();
             catch (IOException e) 
                e.printStackTrace();
            
            return prepared;
        
        @Override
        protected void onPostExecute(Boolean aBoolean) 
            super.onPostExecute(aBoolean);

            /*get details : */
            MediaMetadataRetriever mMediaMetaDataRetriever = new MediaMetadataRetriever();
            mMediaMetaDataRetriever.setDataSource(stream,new HashMap<String, String>());
            String titleName = mMediaMetaDataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
            Toast.makeText(MainActivity.this, "Title : "+titleName, Toast.LENGTH_SHORT).show();
        
    

【问题讨论】:

你找到答案了吗?如果没有,请提供完整的 logcat @H.***s Toast.makeText(MainActivity.this, "Title : "+titleName, Toast.LENGTH_SHORT).show(); 显示 null : 标题 : null 你在测试什么sdk? @H.***s minSdkVersion 15 这里没有'return null'。有一个IllegalArgumentException 【参考方案1】:

终于可以使用 'com.vodyasov:amr:0.5'

Uri uri = Uri.parse(stream);
            OnNewMetadataListener listener = new OnNewMetadataListener() 
                @Override
                public void onNewHeaders(String stringUri, List<String> name, List<String> desc, List<String> br, List<String> genre, List<String> info) 
                @Override
                public void onNewStreamTitle(String stringUri, String streamTitle) 
                    songinfo.setText("Song Name : "+streamTitle);
                
            ;
            AudiostreamMetadataManager.getInstance()
                    .setUri(uri)
                    .setOnNewMetadataListener(listener)
                    .setUserAgent(UserAgent.WINDOWS_MEDIA_PLAYER)
                    .start();

【讨论】:

图书馆将如何解决这个问题?【参考方案2】:

试试这个:

@Override
    protected void onPostExecute(Boolean aBoolean) 
        super.onPostExecute(aBoolean);

        MediaMetadataRetriever mmr = new MediaMetadataRetriever(); 

        if (Build.VERSION.SDK_INT >= 14)
          mmr.setDataSource(stream, new HashMap<String, String>()); 
        else 
          mmr.setDataSource(stream); 
        

        String titleName = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
        Toast.makeText(MainActivity.this, "Title : "+titleName, Toast.LENGTH_SHORT).show();
    

如果这不起作用,那么您应该确保您使用的链接实际上返回了一个文件。

尝试在onCreate 中执行上述操作,问题可能出在您的 AsyncTask 上。

【讨论】:

我的 minSdkVersion 是 15,所以没有必要使用Build.VERSION.SDK_INT &gt;=14 并且仍然无法正常工作,但是当我在 VLC 媒体播放器中测试我的 URL 时工作正常,所以我没有不要认为是 URL 的问题 代码没有问题。尝试其他链接。 我尝试使用不同的网址,例如:94.23.43.135:8050/live.mp3 实际上是返回一个 file.mp3 并且仍然不起作用 我仍然得到一个标题:NULL 尝试在设备上获取歌曲的标题,例如metaRetriver.setDataSource("/sdcard/audio.mp3");

以上是关于MediaMetaDataRetriever.setDataSource 返回 null的主要内容,如果未能解决你的问题,请参考以下文章