WPF C #, получить информацию из аудио файла - PullRequest
3 голосов
/ 26 апреля 2011

Hy!
Я хотел бы получить некоторую информацию из аудиофайла (название, исполнитель и т. Д.) В C # (wpf). MediaElement не предоставляет эту опцию, поэтому я использовал этот код (читайте байты напрямую):

public string[] GetAudioFileInfo(string path)
    {
        path = Uri.UnescapeDataString(path);

        byte[] b = new byte[128];
        string[] infos = new string[5]; //Title; Singer; Album; Year; Comm;
        bool isSet = false;

        //Read bytes
        try
        {
            FileStream fs = new FileStream(path, FileMode.Open);
            fs.Seek(-128, SeekOrigin.End);
            fs.Read(b, 0, 128);
            //Set flag
            String sFlag = System.Text.Encoding.Default.GetString(b, 0, 3);
            if (sFlag.CompareTo("TAG") == 0) isSet = true;

            if (isSet)
            {
                infos[0] = System.Text.Encoding.Default.GetString(b, 3, 30); //Title
                infos[1] = System.Text.Encoding.Default.GetString(b, 33, 30); //Singer
                infos[2] = System.Text.Encoding.Default.GetString(b, 63, 30); //Album
                infos[3] = System.Text.Encoding.Default.GetString(b, 93, 4); //Year
                infos[4] = System.Text.Encoding.Default.GetString(b, 97, 30); //Comm
            }
            fs.Close();
            fs.Dispose();
        }
        catch (IOException ex)
        {
            MessageBox.Show(ex.Message);
        }

        return infos;
    }

Проблема с этим кодом в том, что иногда он не дает полное название или представляет только маленькие кубики. (Если я открою мультимедиа в MeidaPlayer, я смогу увидеть полный заголовок)
Я не уверен, что параметры GetString (byte [], int, int), возможно, я ошибаюсь там.

В моей программе: This is the result
В медиаплеере: enter image description here

1 Ответ

2 голосов
/ 26 апреля 2011

Вы читаете заголовок ID3v1 , который ограничивает заголовок 30 символами. Кроме того, все, что короче этого, дополнено пробелами или нулями, последние из которых переводятся в поля, которые вы видите. Вы должны были бы удалить их, используя что-то вроде:

myString = myString.Replace("\0", "")

Скорее всего, медиаплеер читает расширенный тег ID3v1, который помещается перед читаемым заголовком. Смотрите ссылку выше для получения дополнительной информации. Но это фактически 227 байтов перед 128 байтами, которые вы читаете.

В расширенном заголовке заголовок (и другие) ограничен 60 символами вместо 30.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...