Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2014, 13:49   #1
nXs
Форумчанин
 
Регистрация: 26.02.2010
Сообщений: 126
По умолчанию ID3v2

Добрый день, ув. форумчане. Вот ковыряю теги мр3, взял функцию чтения из всеми известного модуля ID3v2, пользуюсь Delphi XE, возник вопрос, некоторые файлы читаются нормально а некоторые нет, видимо причина в кодировке текста (utf16?), потому что в ListBox получаю крякозябры. Натолкните на мысль как поправить.
Код привожу, на всякий случай:
Код:
procedure TForm1.ReadFrames(const FileName: string; var Tag: TID3v2);
var
  SourceFile: file;
  Frame: TFrameHeader;
  Data: array [1..250] of AnsiChar;
  DataPosition: Integer;
begin
  try
    { Set read-access, open file }
    AssignFile(SourceFile, FileName);
    FileMode := 0;
    Reset(SourceFile, 1);
    Seek(SourceFile, 10);
    while (FilePos(SourceFile) < GetTagSize(Tag)) and (not EOF(SourceFile)) do
    begin
      FillChar(Data, SizeOf(Data), 0);
      BlockRead(SourceFile, Frame, 10);
      if not (Frame.ID[1] in ['A'..'Z']) then break;
      DataPosition := FilePos(SourceFile);
      { Read frame data and set tag item if frame supported }
      BlockRead(SourceFile, Data, Swap32(Frame.Size) mod SizeOf(Data));

           if Frame.ID = 'TRCK' then ListBox1.Items.Add('Track Number: '+trim(Utf8ToAnsi(Data)));
           if Frame.ID ='TIT2' then ListBox1.Items.Add('Title: '+trim(Utf8ToAnsi(Data)));
           if Frame.ID ='TALB' then ListBox1.Items.Add('Album: '+trim(Utf8ToAnsi(Data)));
           if Frame.ID ='TCON' then ListBox1.Items.Add('Genre: '+trim(Utf8ToAnsi(Data)));
           if Frame.ID ='TYER' then ListBox1.Items.Add('Year: '+trim(Utf8ToAnsi(Data)));
           if Frame.ID ='COMM' then ListBox1.Items.Add('Comments: '+trim(Utf8ToAnsi(Data)));
           if Frame.ID ='TPE1' then ListBox1.Items.Add('Artist: '+trim(Utf8ToAnsi(Data)));
           if Frame.ID ='APIC' then ListBox1.Items.Add('APIC: '+trim(Utf8ToAnsi(Data)));

      Seek(SourceFile, DataPosition + Swap32(Frame.Size));
    end;
    CloseFile(SourceFile);
  except
  end;
end;
UPD: Другие библиотеки не подходят, т.к. надо под андроид.
nXs вне форума Ответить с цитированием
Старый 02.05.2014, 21:03   #2
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Крякозябры получаешь потому что Юникод. С ходу могу ответить, что надо переводить в Ansi эти строки. Всё в твоем случае зависит от формата файла.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 02.05.2014, 21:13   #3
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

Там в ATL есть своя функция перекодирования из юникода, ей переведи и будет тебе счастье!
ZuBy вне форума Ответить с цитированием
Старый 02.05.2014, 22:34   #4
nXs
Форумчанин
 
Регистрация: 26.02.2010
Сообщений: 126
По умолчанию

Нашел я эту функцию, но по ходу чего то не так пилю, если переменную Data: array [1..500] of Char; оставить так как есть получаю полную чушь, если заменить на Data: array [1..500] of AnsiChar; - получаю почти правду (т.е. правду вперемешку с мусором).
nXs вне форума Ответить с цитированием
Старый 03.05.2014, 18:34   #5
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

Там в этой функции я что то менял, не помню правда точно. Там есть посимвольное считывание, начинает считывать с единицы, а я ставил 2. Попробуй!

Ты для андроида делаешь? В курсе что он незнает что такое Ansi?
ZuBy вне форума Ответить с цитированием
Старый 05.05.2014, 08:49   #6
nXs
Форумчанин
 
Регистрация: 26.02.2010
Сообщений: 126
По умолчанию

Поправил функцию, работает (на компе), спасибо. Об Анси на андроиде не знал...
nXs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обложка альбома через ID3v2 adr Мультимедиа в Delphi 31 20.09.2011 21:02
ID3v2!!!!! Кольша Мультимедиа в Delphi 24 20.09.2011 21:01
ID3v2 в delphi darts116 Помощь студентам 2 22.06.2010 12:07
ID3v2 и Delphi 2010 fuss Мультимедиа в Delphi 6 19.05.2010 22:08
Работа с тэгом ID3v2 rush_13 Общие вопросы C/C++ 3 04.02.2007 12:12