|
Вопрос # 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?))
|
|
Вечперик (статус: Посетитель), 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]:
Блазер, спасбо! Будет время - посмотрите, пожалуйста!)
|
|
Вечперик (статус: Посетитель), 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] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|