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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2017, 11:52   #21
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Работа с антивирем тут тоже удалённая и выполняется админами, пользователям доступ закрыт По ссылке да, получилось. Спасибо!
Пока продвигался в направлении работы через консольную программу. Нашёл, как получить текст из консоли в файл, как дешифровать досовскую кодировку (ну и там же как виндовую в досовскую превратить). Незадачка в том, что не хочет выполняться комманда, если название папки кириллическое, даже если её в досовскую кодировку загнать... Можно, конечно, сделать временную папку и т.п., но, может, кто-нибудь знает какое-то решение, которое мне не удалось найти пока в интернете?
Тестовое получение текста командной строки в файл:
Код:
  DirApp:=StrAnsiToOem('D:\тмп\');
  ShellExecute(Form1.Handle,nil, 'cmd.exe', PAnsiChar(' /c help > '+DirApp+'123.txt'), nil, SW_HIDE);
Шифровка/дешифровка кодировки DOS
Код:
function StrAnsiToOem(const aStr : String) : String;
var
  Len : Integer;
begin
  Result := '';
  Len := Length(aStr);
  if Len = 0 then Exit;
  SetLength(Result, Len);
  CharToOemBuff(PChar(aStr), PChar(Result), Len);
end;

function StrOemToAnsi(const aStr : String) : String;
var
  Len : Integer;
begin
  Result := '';
  Len := Length(aStr);
  if Len = 0 then Exit;
  SetLength(Result, Len);
  OemToCharBuff(PChar(aStr), PChar(Result), Len);
end;
Ship_1 вне форума Ответить с цитированием
Старый 13.04.2017, 12:01   #22
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Aliens_wolfs Отлично работающий вариант! Для выполнения целей полностью подходит! Спасибо большое!
Но тему закрывать не хотелось бы. Вариант работающий, даже не особо замороченный, однако вынуждает таскать с программкой две DLL. Вариант, с которым я до этого копался, тоже не безфайловый, но там он хоть один. Хотя и вариант гораздо более замороченный...
Ship_1 вне форума Ответить с цитированием
Старый 13.04.2017, 12:23   #23
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Интересно... В начале исполнителя какой-то знак вопроса. Прикладываю одну из mp3-шек.
Иногда он и в начале файла встречается, но винда его не отображает. Вот вам и юникод... Название с глюком, а фиг увидишь...
Вложения
Тип файла: zip 09-33-24. Я Почти Итальянец.zip (1.27 Мб, 14 просмотров)

Последний раз редактировалось Ship_1; 13.04.2017 в 12:25.
Ship_1 вне форума Ответить с цитированием
Старый 13.04.2017, 13:32   #24
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Вот накидал код который вытаскивает тэги ID3
Код:
function FindTags(TagName, sFinds: String): string;
var
 ipos, i: integer;
 S: String;
 bSize: byte;
begin
 TagName:= TagName +  #0#0#0;
 ipos:= Pos(TagName, sFinds);
 if ipos <> 0 then
 begin
 Inc(ipos, Length(TagName));
 bSize:= Byte(sFinds[ipos]) - 1;
 S:= Copy(sFinds, ipos + 4, bSize);
 For i:= 1 to Length(S) do
 if S[i] = #0 then
 S[i]:= #32;
 Result:= s;
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 f : File;
 sTelo: String;
begin

  if OpenDialog1.Execute then
begin
  {$I-}
   if FileExists(OpenDialog1.FileName) then
   begin
   AssignFile(f, OpenDialog1.FileName);
   FileMode := fmOpenReadWrite;
   Reset (f, 1);
   {$I+}
   //ошибка открытия файла то выходим
  if IOResult<>0 then
  exit;
  //переходим на нужную позицию
  seek(f, 0);
  SetLEngth(sTelo, filesize(f));
 BlockRead(f, Pointer(sTelo)^, Length(sTelo));
 Label1.Caption := 'Номер трека: ' + FindTags('TRCK', sTelo);
 Label2.Caption := 'Заголовок: ' +  FindTags('TIT2', sTelo);
 Label3.Caption := 'Исполнитель: ' + FindTags('TPE1', sTelo);
 Label4.Caption := 'Альбом: ' +  FindTags('TALB', sTelo);
 Label5.Caption := 'Жанр: ' +  FindTags('TCON', sTelo);
 Label6.Caption := 'Год: ' + FindTags('TYER', sTelo);
 Label7.Caption := 'Коментарии: ' + FindTags('COMM', sTelo);
 CloseFile(f);
  end;
end;
end;
Да и почитайте про mp3 начинку файла https://habrahabr.ru/post/103635/

Последний раз редактировалось Aliens_wolfs; 13.04.2017 в 13:51.
Aliens_wolfs вне форума Ответить с цитированием
Старый 13.04.2017, 14:00   #25
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Хм... Что-то не то выводит у меня... С кодировкой, что ли, что-то не то...
Артист:
Цитата:
яюяю8:=8:
Трек:
Цитата:
яю/ >GB8 B0;LO=5F
Кстати, для разовых операций, если с кракозябрами разобраться, очень хорош, или когда можно оставить выполняться и забить. Но с большим количеством файлов работает заметно медленней, чем вариант с Bass. Для 1000 файлов вывод артиста и трека в TStringList занял минуту, а Bass справляется за 3 секунды.
Ship_1 вне форума Ответить с цитированием
Старый 13.04.2017, 14:15   #26
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Для увеличения скорости поиска тегов можно сделать так

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
 f : File;
 sTelo: String;
 SizeFile: integer;
begin

  if OpenDialog1.Execute then
begin
  {$I-}
   AssignFile(f, OpenDialog1.FileName);
   FileMode := fmOpenReadWrite;
   Reset (f, 1);
   {$I+}
   //ошибка открытия файла то выходим
  if IOResult<>0 then
  exit;
  //переходим на нужную позицию
  seek(f, 0);
 SizeFile:= filesize(f);
 if SizeFile > 512 then
 SizeFile:= 512;

 SetLEngth(sTelo, SizeFile);
 BlockRead(f, Pointer(sTelo)^, Length(sTelo));
 Label1.Caption := 'Номер трека: ' + FindTags('TRCK', sTelo);
 Label2.Caption := 'Заголовок: ' +  FindTags('TIT2', sTelo);
 Label3.Caption := 'Исполнитель: ' + FindTags('TPE1', sTelo);
 Label4.Caption := 'Альбом: ' +  FindTags('TALB', sTelo);
 Label5.Caption := 'Жанр: ' +  FindTags('TCON', sTelo);
 Label6.Caption := 'Год: ' + FindTags('TYER', sTelo);
 Label7.Caption := 'Коментарии: ' + FindTags('COMM', sTelo);
 CloseFile(f);
  end;
end;
А с кракобязами сейчас посмотрим что можно сделать, там нужно кодировку подобрать

Последний раз редактировалось Aliens_wolfs; 13.04.2017 в 17:05.
Aliens_wolfs вне форума Ответить с цитированием
Старый 13.04.2017, 14:16   #27
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

http://www.gausi.de/mp3fileutils-en.html
Filka вне форума Ответить с цитированием
Старый 13.04.2017, 14:17   #28
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Ship_1 Посмотреть сообщение
яюяю8:=8:
это на utf-16 похоже, видимо Aliens_wolfs накидывал не в древней Дельфи.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 13.04.2017, 14:22   #29
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

в D7 накидано
Aliens_wolfs вне форума Ответить с цитированием
Старый 13.04.2017, 16:40   #30
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

2cyr не справился с дешифровкой кодировки, которая получилась вообще никак
Ship_1 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
с чего начать решение? Считать из файла название объемных геометрических фигур,вывести название,количество граней,рисунок (Delphi) леночка93 Помощь студентам 6 16.05.2013 13:14
Есть ли способ вставлять кнопки в ячейки таблицы? Serhantes Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 0 27.02.2013 13:54
Есть ли другои способ получения внешнего IP ArtGrek Работа с сетью в Delphi 9 26.02.2011 16:46
WPF пропуск кадров. Есть ли способ предотвратить? Casper-SC Общие вопросы .NET 0 09.06.2010 20:16
Есть ли способ узнать, кто вызвал скрипт? motorway PHP 5 08.07.2009 09:16