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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.07.2010, 00:28   #1
Anfall
Форумчанин
 
Регистрация: 10.02.2009
Сообщений: 181
По умолчанию Ошибка при чтении mp3 тегов

Доброго времени суток всем. Использую код:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;
  type  
  TID3Tag = record
    ID: string[3];  
    Titel: string[30];
    Artist: string[30];  
    Album: string[30];
    Year: string[4];  
    Comment: string[30];
    Genre: Byte;
  end;

implementation

{$R *.dfm}
function readID3Tag(FileName: string): TID3Tag;
var
  FS: TFileStream;
  Buffer: array [1..128] of Char;
begin
  FS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    FS.Seek(-128, soFromEnd);
    FS.Read(Buffer, 128);
    with Result do
    begin
      ID := Copy(Buffer, 1, 3);
      Titel := Copy(Buffer, 4, 30);
      Artist := Copy(Buffer, 34, 30);
      Album := Copy(Buffer, 64, 30);
      Year := Copy(Buffer, 94, 4);
      Comment := Copy(Buffer, 98, 30);
      Genre := Ord(Buffer[128]);
    end;
  finally
    FS.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
begin
    with readID3Tag('С:\test.mp3') do
      s:=Artist;                                                     
        with readID3Tag('С:\test.mp3') do      
      s:=s+titel;                                    
      Listbox1.Items.Add(pltsitem);
end;
end.
Но почему-то добавляет только Artist в листбокс. А если поставить сначала чтение Titel - то добавляет только titel. Т е одно из двух. Пробовал по-разному:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
begin
    with readID3Tag('С:\test.mp3') do
    Lixtbox1.Items.Add(Artist+titel);
end;
Все равно одинково добавляет только Artist. Или titel, если ввести
Lixtbox1.Items.Add(titel+artist);

В чем проблема? Заранее благодарен!
Anfall вне форума Ответить с цитированием
Старый 24.07.2010, 01:03   #2
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
with readID3Tag('E:\Музыка\Musik1.Mp3') do
Listbox1.Items.Add(Artist);
with readID3Tag('E:\Музыка\Musik1.Mp3') do
Listbox1.Items.Add(Titel);
end;
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 24.07.2010, 01:23   #3
Anfall
Форумчанин
 
Регистрация: 10.02.2009
Сообщений: 181
По умолчанию

Цитата:
Сообщение от Terran Посмотреть сообщение
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
with readID3Tag('E:\Музыка\Musik1.Mp3') do
Listbox1.Items.Add(Artist);
with readID3Tag('E:\Музыка\Musik1.Mp3') do
Listbox1.Items.Add(Titel);
end;
Ну это-то понятно. Но надо чтобы в одной строке было: Исполнитель+Заголовок.

Последний раз редактировалось Anfall; 24.07.2010 в 01:28.
Anfall вне форума Ответить с цитированием
Старый 24.07.2010, 01:35   #4
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию


Код:
procedure TForm1.Button1Click(Sender: TObject);
var
s:TID3Tag;
begin
S:=readID3Tag('E:\Музыка\Борьба с пустотой.mp3');
Listbox1.Items.Add(S.Artist);
Listbox1.Items.Strings[Listbox1.Items.Count-1]:=
Listbox1.Items.Strings[Listbox1.Items.Count-1]+ '  '+ S.Titel;
end;
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 24.07.2010, 02:03   #5
Anfall
Форумчанин
 
Регистрация: 10.02.2009
Сообщений: 181
По умолчанию

Цитата:
Сообщение от Terran Посмотреть сообщение

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
s:TID3Tag;
begin
S:=readID3Tag('E:\Музыка\Борьба с пустотой.mp3');
Listbox1.Items.Add(S.Artist);
Listbox1.Items.Strings[Listbox1.Items.Count-1]:=
Listbox1.Items.Strings[Listbox1.Items.Count-1]+ '  '+ S.Titel;
end;
Спасибо. Можно и так. А почему не работает просто Artist+titel?
Anfall вне форума Ответить с цитированием
Старый 24.07.2010, 02:13   #6
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Цитата:
Спасибо. Можно и так. А почему не работает просто Artist+titel?
Не за что. Не работает из-за функции readID3Tag. Там какое-то стрёмное вытаскивание данных Я в ней не копался.
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 24.07.2010, 02:50   #7
Anfall
Форумчанин
 
Регистрация: 10.02.2009
Сообщений: 181
По умолчанию

Цитата:
Сообщение от Terran Посмотреть сообщение
Не за что. Не работает из-за функции readID3Tag. Там какое-то стрёмное вытаскивание данных Я в ней не копался.
Вот бы эту функцию подправить(
Anfall вне форума Ответить с цитированием
Старый 24.07.2010, 12:36   #8
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Цитата:
Вот бы эту функцию подправить(
В функции проблема в вытаскивании данных. Чтобы она хорошо работала, нужно чтобы данные доставались точно до последнего не пустого символа.
Этот код нужно изменить или придумать другое решение. И тогда всё будет хорошо работать.
Код:
ID := Copy(Buffer, 1, 3);
Titel := Copy(Buffer, 4, 30);
Artist := Copy(Buffer, 34, 30);
Album := Copy(Buffer, 64, 30);
Year := Copy(Buffer, 94, 4);
Comment := Copy(Buffer, 98, 30);
Genre := Ord(Buffer[128]);
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 24.07.2010, 13:35   #9
Anfall
Форумчанин
 
Регистрация: 10.02.2009
Сообщений: 181
По умолчанию

Terran, спасибо.
Вообще код левый какой-то. Теги не всегда корректно читает(
Может кто посоветует нормальную функцию/компонент?
Anfall вне форума Ответить с цитированием
Старый 24.07.2010, 16:18   #10
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Где-то я уже этот "тител" (Titel: string[30]) видел
Тоже когда-то это был мой первый код чтения тегов, к-рый я разбирал.
Anfall, теги первой версии читать легко, в сети много примеров, у меня где-то есть (приложил к сообщению), но я так и не завершил его, кажется с расширенным наборов жанров не довел до конца, там неоднозначности были, т.к. все по своему трактуют, а в остальном читает как положено теги версий 1.0 и 1.1.
Для второй версии тегов, посмотри в Jedi пакете, мне говорили недавно что там есть компонент для тегов v2.x. Чем хорош Jedi компонент, он открытый и в исходниках, никаких dll и т.п.
Вложения
Тип файла: txt ID3v1.pas.txt (3.2 Кб, 132 просмотров)
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 24.07.2010 в 16:38.
mutabor вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импорт тегов из файлов формата mp3 в базу данных sqlite antonych SQL, базы данных 2 06.12.2009 21:06
DSPack ошибка сертификации при открытии mp3 matalata Мультимедиа в Delphi 2 17.11.2009 21:34
ошибка при чтении файла ongleb Общие вопросы C/C++ 17 30.07.2009 13:48
ошибка при чтении файла Alik-Soldier Общие вопросы C/C++ 1 31.05.2009 20:44
Ошибка при чтении БД из файла!! sting БД в Delphi 4 14.12.2008 22:23