Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2003.02.20;
Скачать: [xml.tar.bz2];

Вниз

Несколько музыкальных файлов в один   Найти похожие ветки 

 
Anar   (2002-10-26 23:29) [0]

Недавно я на форуме спрашивал: как записать несколько wav файлов в один. К сожалению ответы были не очент информативные (всё что мне сказали - используй TFileStream).

Так вот, прошу очень не обделяйте вниманием меня на этот раз. Хотя бы подскажите ссылки или может компонент. Мне ещё друг сказал, что это можно осуществить при помощи DirectX. Только вот я думаю, что с помощью DirectX их потом надо будет вручную как-то вопроизводить (а мне лучше при помощи Media Player).
Вообщем: как несколько wav, mp3 и т.д. файлов программным путём сохранить в одном файле и чтоб далее их можно было бы считывать с помощью Media Player так как будто это несколько отдельных файлов.
Помогите, пожалуйста.


 
Pumpkin   (2002-10-26 23:35) [1]

Если ты их засунешь в один файл, то в любом случае вытаскивать их оттуда придется вручную. А так возьми любой архиватор или сделай его подобие.


 
Anar   (2002-10-27 00:04) [2]

Ну ладно, хотя бы скажи как их засунуть в один, а потом подумаем как вытаскивать...


 
Pumpkin   (2002-10-27 00:16) [3]

Примерно так:

var
F : TFileStream;
SL: TStringList;
i: Integer;

procedure PutFileInStream( FName: String; var S: TFileStream );
var
D: DWord;
FF: TFileStream;
begin
try
FF := TFileStream.Create( FName, fmOpenRead );
except
Exit;
end;
D := Length( FName );
// пишем имя файла
S.Write( D, 4 );
S.Write( FName, D );
// пишем сам файл
D := FF.Size;
S.Write( D, 4 );
S.CopyFrom( FF, D );
FF.Free;
end;


begin
SL := TStringList.Create;
SL.LoadFromFile("c:\list.txt");
if SL.Count = 0 then Exit;
F := TFileStream.Create("c:\bigfile.dat", fmCreate );
for i := 0 to SL.Count-1 do
PutFileToStream( SL.Strings[i], F );
F.Free;
end.


 
Карелин Артем   (2002-10-28 11:38) [4]

Гоны какие...

Насколько я помню, надо использовать ДиректИкс или Video For Windows.
Делаем звуковой поток (Не путать с Дельфийскими потоками. структуры чисто виндовские), считываем файлы и записываем.

Конкретнее не могу: Я как-то больше по видео загоняюсь. Еще есть библиотека MCL на сайте Gromada.com. Она хоть и платная, но ограничения у нее только на запись видеофайлов.


 
Pumpkin   (2002-10-28 13:46) [5]

2 Карелин Артем © (28.10.02 11:38)
Перечитай вопрос. Помоему он хочет слепить кучу wav, mp3 и т.д. в один файл, наподобии tar, а не делать из всего этого один непрерывный wav.

PS. Автор, отзовись. Проясни ситуацию.


 
Anar   (2002-10-28 21:53) [6]

Pumpkin прав. Мне надо записать все wav (или mp3) в один файл (не звуковой), но это ты мне уже объяснил, осталось только эти файлы считывать из этого bigfile.dat как разные файлы и проигрывать MediaPlayer"ом. Это возможно. И где можно про это прочитать?


 
Pumpkin   (2002-10-28 22:54) [7]

TMediaPlayer проигрывает только файлы. Придется тебе сохранять конкретный WAV, MP3 в отдельный файл а потом играть, или играть их без TMediaPlayer (поищи компонент, играющий Stream-ы).

Вот тебе еще кусочек (опять-же грубо):

{скидывает из болшого файла в отделный файл}
procedure SaveFileFromStream( FName: String; Offset: Integer; var S: TFileStream );
var
D: DWord;
FF: TFileStream;
begin
FF := nil;
try
FF := TFileStream.Create( FName, fmCreate );
S.Seek( Offset, soFromBeginning );
S.ReadBuffer( D, 4 );
FF.CopyFrom( S, D );
except
if FF <> nil then FF.FreeAndNil;
if FileExists( FName ) then DeleteFile( FName );
Exit;
end;
FF.Free;
end;

begin
{индексируем bigfile в StringList (offset находится в SL.Objects)}
SL := TStringList.Create;
F := TFileStream.Create("c:\bigfile.dat", fmOpenRead );
while F.Position < F.Size - 1 then begin
F.Read(D, 4 );
SetLength( FN, D );
F.read( FN, D );
Offs := F.Position;
F.read( D, 4);
F.Seek(D, soFromCurrent);
SL.AddObject( FN, TObject( Offs ));
end;
........
........
{извлекаем i-й фаил}
SaveFileFromStream( SL.Strings[i], DWord(SL.Objects[i]), F);
........
........
F.Free;
end.



 
Карелин Артем   (2002-10-29 12:47) [8]

2 Pumpkin © (28.10.02 13:46)
Перечитал. Я косяк ходячий ;-)


 
Anar   (2002-10-30 16:25) [9]

2 Pumpkin:
Второй код не работает... :(((
Я не разбираюсь в FileStream"ах вообще.
Может подробно объяснишь свою программу?


 
Pumpkin   (2002-11-04 23:33) [10]

2 Anar © (30.10.02 16:25)
Это не код. Это так, набросок. Почитай про стримы, все поймещь.
Объясняю:
Индексируем - означает: пробегаем по большому файлу и заносим в StringList имена всех засунутых в него файлав с Offset-ами в болшом файле (offset суем в Object-ы).
SaveFileFromStream сохраняет файл с известным offset-ом из предварительно открытого как TFileStream большого файла в файл с именем FName.


 
Anar   (2002-11-05 17:24) [11]

Ты знаешь Pumpkin, в чём моя проблема: у меня есть несколько файлов, которые лежат в одной папке. В этой же папке у меня есть текстовый файл такого рода:

anar.wav|Звуковой файл 1
delphi.mp3|MP3 файл 1

и т.д.

Файлы anar.wav и delphi.mp3 сидят в одной папке с этим текстовым файлом. В моей программе я произвольно считываю строки из этого файла до символа "|", т.е. произвольное считываю имя файла и загружаю в MediaPlayer. Так вот я решил все звуковые файлы собрать в один и загружать их в MediaPlayer оттуда.

Если брать твой метод, то мне придётся в корне менять алгоритм, причём я даже не знаю как?

Ты не знаешь как мне решить свою проблему?
Буду очень рад.


 
Pumpkin   (2002-11-05 23:29) [12]

MediaPlayer играет только файлы. Если соберешь все в один файл, то тебе придется извлекать и сохранять каждый WAV на диск, играть его и удалять. Так что во избежание этого придется либо отказаться от MediaPlayer либо от идеи слить все в один файл. ИМХО второе проще.


 
Anar   (2002-11-06 08:30) [13]

Ладно, пока воздержимся...
Постараемся что-нидь другое придумать.


 
Карелин Артем   (2002-11-06 11:55) [14]

А в архив??
В сжатую папку?


 
Anar   (2002-11-06 19:05) [15]

Можно и в DLL. Но как?



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2003.02.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.006 c
9-63463
xMagicx
2002-08-05 19:24
2003.02.20
Изометрический движок


6-63695
BJValentine
2002-12-26 19:47
2003.02.20
Удаленный клиент


4-63894
Rookie
2003-01-09 17:56
2003.02.20
CreateDialog глюкавит???


3-63489
slava_r
2003-02-04 13:33
2003.02.20
Как вставить пустое значение (NULL)?


14-63800
Strannik.
2003-02-04 07:58
2003.02.20
ПОМОГИТЕ!!! немогу winnt4.0 поставить





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский