Не удалось получить встроенный mp3-файл.

Я пытаюсь получить обложку альбома из файла MP3. Я подумал, что лучший и самый чистый способ сделать это — использовать класс MediaMetadataRetriever. Но по какой-то причине вызов метода getEmbeddedPicture не работает. Изображение не отображается, LogCat показывает ошибку:

04-29 18:36:19.520: E/MediaMetadataRetrieverJNI(25661): getEmbeddedPicture: Call to getEmbeddedPicture failed.

Это код, который, похоже, не работает:

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        MediaMetadataRetriever mmdr = new MediaMetadataRetriever();
        mmdr.setDataSource(path); //path of the MP3 file on SD Card
        bites = mmdr.getEmbeddedPicture();
        if(bites != null)
        artBM = BitmapFactory.decodeByteArray(bites, 0, bites.length);
        return null;
    }

Я запускаю его на устройстве с Android 4.2, поэтому не должно быть никаких проблем с MediaMetadataRetriever (требуется API lvl 10). Файлы, которые я тестировал, показывают изображение в проводнике Windows, поэтому кажется, что в них встроено искусство. У кого-нибудь есть мысли по этому поводу?


person Raymond P    schedule 29.04.2013    source источник
comment
Локально, но похоже, что это зависит от файла. В других файлах MP3 отображается обложка альбома.   -  person Raymond P    schedule 01.05.2013


Ответы (2)


Не во все файлы MP3 встроена обложка альбома, для некоторых альбомов обложка альбома помещается в папку альбома, поэтому вы можете видеть обложку альбома для всех файлов внутри этой папки.

Но

MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(mp3_file_path); 

Это получит обложку альбома, если обложка альбома встроена в этот файл. Поэтому сделайте изображение по умолчанию в качестве обложки альбома для файлов, которые не встроены в обложку альбома, и проверьте, является ли возвращаемый байт [] нулевым или нет,

Если байт [] не равен нулю, то извлекается обложка альбома, если он равен нулю, тогда установите изображение обложки альбома по умолчанию.

В моем проекте я использую это

    MediaMetadataRetriever mmr = new MediaMetadataRetriever();
    mmr.setDataSource(songsList.get(index).get("songPath"));
    byte[] artBytes =  mmr.getEmbeddedPicture();
    if(artBytes != null)
    {
        InputStream is = new ByteArrayInputStream(mmr.getEmbeddedPicture());
        Bitmap bm = BitmapFactory.decodeStream(is);
        imgArt.setImageBitmap(bm);
    }
    else
    {
        imgArt.setImageDrawable(getResources().getDrawable(R.drawable.adele));
    }

Я надеюсь, что это поможет вам

person Mani    schedule 17.07.2013

У меня такая же проблема, кажется, что не у всех mp3 файлов есть обложка альбома. Что мы должны сделать, так это установить изображение по умолчанию для изображения.

public Bitmap getAlbumBitmap(Context context, String url, int defaultRes) {
        Bitmap bitmap = null;
        //能够获取多媒体文件元数据的类
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        try {
            retriever.setDataSource(url); //设置数据源
            byte[] embedPic = retriever.getEmbeddedPicture(); //得到字节型数据
            bitmap = BitmapFactory.decodeByteArray(embedPic, 0, embedPic.length); //转换为图片
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                retriever.release();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return bitmap == null ? BitmapFactory.decodeResource(context.getResources(), defaultRes) : bitmap;
    }
person jiechengWu    schedule 25.02.2017