Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 143

/ вопрос решён /

Здравствуйте!
Эх, почти закончил программу, но осталось сделать последний шаг, который для меня пока что нереальным является! Поэтому и снова обращаюсь к вам... Мне нужно добавить mp3 файл в экзешник проги! Мне говорили - что с помощью ресурсов можно сделать - но сколько инфы я не перечитал - ничего не понял! Я даже с принципом работы не разобрался... получается как - при запуски проги mp3 файл из ресурсов копируется куда-то в глубокий темп, если на него сослаться - он воспроизводится - а по закрытии проги автоматически удаляется, так? Ну вот и все, впринципе, как добавить mp3 файл в ресурсы или куда-то еще, но чтобы небыло его на жестком... может где-то есть статья, как это сделать, написанная для гиперчайников, как я, или кому-то объяснить не лень будет! Был бы не то, что бы очень признателен - а гипер признателен! Спасибо)

Вечперик Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Вечперик (статус: Посетитель)
Вопрос отправлен: 30 ноября 2008, 11:42
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Аксион

Здравствуйте, Вечперик!
Сначала кидаем mp3 на диск с (для быстрого доступа) обзываем его например: music.mp3
Создаем файл music.RC и в него записываем: music music "music.mp3" сохраняем.
Входим в командную строку (cmd) и пишем команду: brcc32 C:\music.RC
На диске с появится файл music.res с запакованым в нём music.mp3, осталось его только подключить и использовать...
Распаковать этот mp3 пишем процедуру:

 procedure ExtractRes(ResType, ResName, ResNewName : String);
var
Res : TResourceStream;
Begin
Res:=TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
Res.SavetoFile(ResNewName);
Res.Free;
 end;

И собственно воспроизведение:
 ExtractRes('music', 'music', 'music.mp3');
 with MediaPlayer1 do
begin
  FileName:='music.mp3';
 Open;
   Play
   end;
Т.e. сначало файл распаковывается в папку с exe, а потом воспроизводится...при выходе из проги его можно удалить...
П.с. еще файл ресурса надо подключить, вписав строку {$R music.res} под строкой {$R *.dfm}...

Удачи, надеюсь все написал правильно...ибо со звуком давно не работал...если что то не получится, пишите на мф....

(редактировалось 1 раз)

Ответ отправил: Аксион (статус: 4-ый класс)
Время отправки: 30 ноября 2008, 12:18
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Ученый

Здравствуйте, Вечперик! Создаете music.RC, точно так как вам сказал Блазер, только писать надо music WAV music.mp3. Далее создаем ресурс music.res, надеюсь в этом вы не затруднитесь.
Собственно сама процедур а выглядит так:
procedure joue;
var
h: THandle;
p: pointer;
begin
h := FindResource(hInstance,'music','WAV');
h := LoadResource(hInstance, h);
p := LockResource(h);
sndPlaySound(p,
SND_MEMORY or SND_SYNC);
UnLockResource(h);
FreeResource(h);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
joue('music');
end;

Но есть один недостаток, пока звук не проиграет до конца, ни один объект на форме не будет доступен. Решить эту проблему можно при помощи потоков.

Ответ отправил: Ученый (статус: 8-ой класс)
Время отправки: 30 ноября 2008, 19:16
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 41; последнее сообщение — 30 ноября 2008, 21:19; участников в обсуждении: 3.

Страницы: [1] [2] [3] [Следующая »]

Вечперик

Вечперик (статус: Посетитель), 30 ноября 2008, 12:28 [#1]:

Блазер, большое Вам спасибо! Щас попробую рзобратсья наконец! начну с начала - с помощью чего создать music.RC и где находится командная строка cmd?))
Аксион

Аксион (статус: 4-ый класс), 30 ноября 2008, 12:34 [#2]:

C:\WINDOWS\system32\cmd.exe
http://www.onlinedisk.ru/file/42444/ - Вот Вам music.RC...чтоб Вас не напрягать сделал сам :)
Вечперик

Вечперик (статус: Посетитель), 30 ноября 2008, 13:00 [#3]:

Большое спасибо... вроде понял - создал music.RES, кинул этот файл в папку с прогой (это обязательно делать нужно, проги этот файл нужен - или его 1 раз подключить можно и удалить?), потом на форму поместил MediaPlayer и Button - вписал как Вы говорили - но что-то не хочет - не гляните, что я не так сделал? Вот код)

unit Unit1;

interface

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

type
TForm1 = class(TForm)
MediaPlayer1: TMediaPlayer;
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
{$R music.res}

procedure ExtractRes(ResType, ResName, ResNewName : String);
var
Res : TResourceStream;
Begin
Res:=TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
Res.SavetoFile(ResNewName);
Res.Free;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
ExtractRes('MUSIC', 'RCDATA', 'music.mp3');
with MediaPlayer1 do
begin
FileName:='music.mp3';
Open;
Play
end;
end;

end.

Извеняюсь, что криво код написал - но по другому не знаю, как его тут вписать...

Ах, да - ошибку в этой строке выдет
Res:=TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
Аксион

Аксион (статус: 4-ый класс), 30 ноября 2008, 13:06 [#4]:

Ошибку пишет? Файл распаковывается?
Файл должен быть в папке с проектом, но уже ехе файлу он не нужен...
Вечперик

Вечперик (статус: Посетитель), 30 ноября 2008, 13:07 [#5]:

Да - указывает на эту строку
Res:=TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
Выдает окно Resource RCDATA not found
Не распаковываетю
Аксион

Аксион (статус: 4-ый класс), 30 ноября 2008, 13:10 [#6]:

ExtractRes('MUSIC', 'RCDATA', 'music.mp3'); поменяйте на ExtractRes('RCDATA', 'MUSIC', 'music.mp3'); Кажись я перепутал местами :)
Вечперик

Вечперик (статус: Посетитель), 30 ноября 2008, 13:13 [#7]:

Поменял - но оно до туда не доходи - раньше матерится( - на это

Res:=TResourceStream.Create(Hinstance, Resname, Pchar(ResType));

И теперь пишет Resource MUSIC not found))
Вечперик

Вечперик (статус: Посетитель), 30 ноября 2008, 13:28 [#8]:

Блазер, спасбо! Будет время - посмотрите, пожалуйста!)
Аксион

Аксион (статус: 4-ый класс), 30 ноября 2008, 13:39 [#9]:

Разобрался :) Вобщем в файл music.RC пишем: music music "music.mp3" Вместо: music RCDATA "music.mp3"
Заного компилируем через cmd...
И вместо ExtractRes('RCDATA', 'MUSIC', 'music.mp3'); Пишем: ExtractRes('music', 'music', 'music.mp3');
Проверил...работает :)
Вечперик

Вечперик (статус: Посетитель), 30 ноября 2008, 13:43 [#10]:

Спасибо! Если бы Вы еще в 2-х словах рассказали, как этот music.RC делать-то было бы вообще здорово))) Вроде де-то читал - это пишем в обычном блокноте - потом вместо .txt пишем .rc? Так?
Аксион

Аксион (статус: 4-ый класс), 30 ноября 2008, 13:45 [#11]:

Я вам давал ссылку на файл, откройте его блокнотом и замените music RCDATA "music.mp3" на music music "music.mp3"
П.с. .rc - это разширение файла, как и .txt т.е. его можно свободно поменять...
Вечперик

Вечперик (статус: Посетитель), 30 ноября 2008, 13:51 [#12]:

О.. ну тогда вообще отлично!! Спасибо! Понял! Щас проверю все...
Вечперик

Вечперик (статус: Посетитель), 30 ноября 2008, 14:01 [#13]:

Блазер, огнромное спасибо! Все работает! Если будет у Вас свободная минутка, не могли бы Вы еще написать, как изменять дирректорию распаковки файла music.mp3 - ну - как его в другое место - а не в папку с экзешником можно кинуть) И как сделать так, что бы он удалялся автоматически, после закрытия программы? Еще раз огромное спасибо!!
Аксион

Аксион (статус: 4-ый класс), 30 ноября 2008, 14:08 [#14]:

Чтобы зменить деррикторию распаковки измените параметры:
ExtractRes('music', 'music', 'Путь/music.mp3');
FileName:='Путь/music.mp3';

Удалить файл:
DeleteFile('Путь/Music.mp3');

Надеюсь сейчас нигде не ошибся :)
Вечперик

Вечперик (статус: Посетитель), 30 ноября 2008, 15:48 [#15]:

Большое спасибо! Сейчас еще раз все проверя и кое-что немного неприятное обнаружил... Первый раз все хорошо воспроизводит - а если повторно запросить - пишет, что не может создать файл, так как он занят другим приложением... это как-то можно исправить? И еще DeleteFile('Путь/Music.mp3'); че-то не хочет работать... указываю на OnClose - DeleteFile('C:/music.mp3'); (до этого его извлекаю на диск С) - но ничего... не подскажите как это исправить можно? Спасибо)
Ученый

Ученый (статус: 8-ой класс), 30 ноября 2008, 19:01 [#16]:

to Вечперик. У меня есть вариант, при котором файл никуда не извлекается, но это только для wav файлов. Если вам не принципиально чтобы звук был именно в mp3 формате, тогда я могу дать код.
Вечперик

Вечперик (статус: Посетитель), 30 ноября 2008, 19:03 [#17]:

Ученый, спасибо! Подойдет - кидайте - попробую) Мне главное что б играло)
Ученый

Ученый (статус: 8-ой класс), 30 ноября 2008, 19:04 [#18]:

Тогда вам придется подождать пока напишу.
Вечперик

Вечперик (статус: Посетитель), 30 ноября 2008, 19:06 [#19]:

Это сделать нетрудно))
Аксион

Аксион (статус: 4-ый класс), 30 ноября 2008, 19:11 [#20]:

Ну для wav есть и у меня....но размер проги будет больше ибо у вава сжатия нет...
Насчет того что не удаляет... у меня файл удалился...вы уверены что к этому времени он уже НЕ ИСПОЛЬЗУЕТСЯ и вообще имеется?

Страницы: [1] [2] [3] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:36
Выполнено за 0.03 сек.