Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 02.05.2014, 13:49   #1
nXs
Форумчанин
 
Регистрация: 26.02.2010
Адрес: г. Винница
Сообщений: 125
Репутация: 23
По умолчанию 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,010
Репутация: -21
По умолчанию

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

Там в ATL есть своя функция перекодирования из юникода, ей переведи и будет тебе счастье!
__________________
бложик FMX Developer'a
ZuBy вне форума   Ответить с цитированием
Старый 02.05.2014, 22:34   #4
nXs
Форумчанин
 
Регистрация: 26.02.2010
Адрес: г. Винница
Сообщений: 125
Репутация: 23
По умолчанию

Нашел я эту функцию, но по ходу чего то не так пилю, если переменную 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,232
Репутация: 379
По умолчанию

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

Ты для андроида делаешь? В курсе что он незнает что такое Ansi?
__________________
бложик FMX Developer'a
ZuBy вне форума   Ответить с цитированием
Старый 05.05.2014, 08:49   #6
nXs
Форумчанин
 
Регистрация: 26.02.2010
Адрес: г. Винница
Сообщений: 125
Репутация: 23
По умолчанию

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



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обложка альбома через 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 13:12




21:32.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru