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

Вниз

Как программно несколько WAV-файлов склеить в один?   Найти похожие ветки 

 
moor38   (2004-07-23 16:33) [0]

Как программно несколько WAV-файлов склеить в один?


 
Jeer ©   (2004-07-23 16:42) [1]

А как ты из нескольких пачек одноразового супа на одного готовишь на десятерых, к примеру ?
Вот так же и здесь.


 
moor38   (2004-07-23 17:10) [2]

Я просил не издевку, а нормальный ответ. Прошу без обид.


 
Анонимщик ©   (2004-07-23 17:31) [3]

Как, библиотек не знаю. Формат wav"а несложен, разберись и склей.


 
moor38   (2004-07-23 17:52) [4]

Итак, повторяю вопрос: Как программно несколько WAV-файлов склеить в один?
 Вопрос конкретный, прошу конкретный ответ.
 Кто не знает прошу не отвечать.


 
Jeer ©   (2004-07-23 17:53) [5]

moor38   (23.07.04 17:10) [2]

А это не издевка:)

Упаковка супа - суть заголовок wave
Начинка - сырые данные.
Изменяешь размер упаковки и сливаешь туда все сырые данные из остальных пакетов в нужном порядке.

Такая вот, аллегория.


 
moor38   (2004-07-23 18:00) [6]

Теория понятна, а как с практикой?


 
Анонимщик ©   (2004-07-23 18:08) [7]

Что тебе понятно?
Заголовки могут быть несколько разными. Тебе нужно будет кое-чего менять при склеивании.


 
moor38   (2004-07-23 18:34) [8]

Господа Анонимщик и Jeer если Вы шарете, то помогите с кодом, плиииззззззззз.


 
Анонимщик ©   (2004-07-23 18:36) [9]

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


 
wicked ©   (2004-07-23 18:42) [10]

подитожу...
нужно читать о:
1) mmio функциях - формат файла и как его безболезненно пользовать....
2) acm - как данные привести к одному формату, или попросту, что делать с тегом "fmt " (WAVEFORMATEX)....

добавлю, что mmio функции спроектированны и расписаны на удивление хорошо, чего не скажешь об acm... лучше сразу начинать с описания acmStreamOpen...


 
moor38   (2004-07-23 18:58) [11]

Мне нужно сделать прогу которая из коротких WAVу файлов создавали один пакет (файлы менее сек.) Желательно сформировать изначально один файл, т.к. проигрывание последовательно каждого создает межимпульсное временное растояние которое сбрасывает всю систему на нуль, время подготовки пакета импульсов меня не волнует. Можно также сформировать двухтональный паралельный сигнал, но я не знаю как и его создать и вывести на звуковуху,
 Ух, ну вроде све!


 
Константинов ©   (2004-07-24 02:33) [12]

Заголовок wav-файла выглядит так:

TWaveHeader = record
Marker1:        Array[0..3] of Char;
BytesFollowing: LongInt;
Marker2:        Array[0..3] of Char;
Marker3:        Array[0..3] of Char;
Fixed1:         LongInt;
FormatTag:      Word;
Channels:       Word;
SampleRate:     LongInt;
BytesPerSecond: LongInt;
BytesPerSample: Word;
BitsPerSample:  Word;
Marker4:        Array[0..3] of Char;
DataBytes:      LongInt;
end;

заполняется он примерно так:

DataBytes := Channels;
DataBytes := DataBytes * SampleRate;
DataBytes := DataBytes * Resolution;
DataBytes := DataBytes div 8;
DataBytes := DataBytes * Duration;
DataBytes := DataBytes div 1000;

WaveHeader.Marker1 := "RIFF";
WaveHeader.BytesFollowing := DataBytes + 36;
WaveHeader.Marker2 := "WAVE";
WaveHeader.Marker3 := "fmt ";
WaveHeader.Fixed1 := 16;
WaveHeader.FormatTag := 1;
WaveHeader.SampleRate := SampleRate;
WaveHeader.Channels := Channels;
WaveHeader.BytesPerSecond := Channels;
WaveHeader.BytesPerSecond := WaveHeader.BytesPerSecond * SampleRate;
WaveHeader.BytesPerSecond := WaveHeader.BytesPerSecond * Resolution;
WaveHeader.BytesPerSecond := WaveHeader.BytesPerSecond div 8;
WaveHeader.BytesPerSample := Channels * Resolution div 8;
WaveHeader.BitsPerSample := Resolution;
WaveHeader.Marker4 := "data";
WaveHeader.DataBytes := DataBytes;

Примечания:
Duration – длительность звучания файла ( мс ).
Параметры дискретизации:
SampleRate – частота дискретизации ( бит/с )
Channels – кол-во каналов ( моно / стерео )
Resolution – разрядность данных ( 8 / 16 бит )

cначала в wav – файле идет заголовок из которого Вам необходимо узнать с какими параметрами дискретизации записан этот файл.  Если необходимо «склеить» несколько файлов. Будет гораздо проще если все они будут записаны с одними и теми же параметрами дискретизации. Иначе, придется «подгонять» все файлы к одному формату, а это гораздо сложнее чем кажется. Поэтому этот вариант я опущу.
Надо учесть, что заголовок может быть больше, чем данная запись. Например SoundForge оставляет примерно 1 кБ для записи данных пользователя.
Перед началом непосредственно звуковых данных в обязательном порядке должно стоять

’data’ + количество байт звуковых данных ( LongInt );

в Вашем случае необходимо:

1. Зарезервировать место по заголовок файла. ( записать пустой заголовок ).
2. Записать в этот же файл звуковые данные 1-ог файла.
3. …
4. Записать в этот же файл звуковые данные N-ого файла.
5. Пересчитать полученное кол-во байт звуковых данных ( DataBytes ) и записать эти значения в заголовок.

Все! Файл готов!
Удачи!


 
wicked ©   (2004-07-24 23:22) [13]

> Константинов [12]
не стыдно давать неправильную информацию?.... учитывая, что файлы надо не только писать (тут как раз частично правильно), но и читать?...


 
Константинов ©   (2004-07-26 01:52) [14]

Я даю информацию, до которой докопался сам.
К своему стыду я не знаю, как работают функции mmio.
Используя мою информацию в принципе реально разобраться дальше самому, зная структуру заголовка ( может быть и не совсем точную, но реально дающую возможность считать все требуемые данные о формате файла и отыскать начало звуковых данных ).

Не спорю, может быть с помощью mmio это сделать проще, но я не профессионал и могу позволить себе писать код так, как мне заблагорассудится.

В Вашех же постах только ссылки: "иди туда, читай то".

За что Вы пытаетесь меня пристыдить?

P.S. Прошу притензии отправлять на мыло т.к. в ближайшие две недели у меня не будет выхода в интернет.


 
ИМХО ©   (2004-07-26 11:40) [15]

TWaveHeader = record
   // RIFF file header
   RIFF: array [0..3] of Char;          // = "RIFF"
   FileSize: Integer;                   // = FileSize - 8
   RIFFType: array [0..3] of Char;      // = "WAVE"
   // Format chunk
   FmtChunkId: array [0..3] of Char;    // = "fmt"
   FmtChunkSize: Integer;               // = 16
   FormatTag: Word;                     // One of WAVE_FORMAT_XXX constants
   Channels: Word;                      // = 1 - mono = 2 - stereo
   SampleRate: Integer;
   BytesPerSecond: Integer;
   BlockAlign: Word;
   BitsPerSample: Word;                 // = 8, 16 or 32 Bits/sample
   // Data Chunk
   DataChunkId: array [0..3] of Char;   // = "data"
   DataSize: Integer;   // Data size in bytes
 end;


 
moor38   (2004-07-26 14:56) [16]

Константинов, ИМХО: Большое вам спасибо, хоть что-то стало понятно и супами не кормят. Далее попытаюсь разобраться.


 
ИМХО ©   (2004-07-26 16:52) [17]

Насколько я понял, тебе нужно сделать wav-микширование?
Если да, то пиши на al_sotnikov@list.ru


 
DDDeN   (2004-07-26 18:16) [18]

Ребята, а чё на мыло кидайте всем, если это что-то отличное от BASS.DLL то и мне намыльте!



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

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

Наверх





Память: 0.5 MB
Время: 0.035 c
14-1096354059
Григорьев Антон
2004-09-28 10:47
2004.10.17
У кого Windows 98 и ME - помогите


1-1096466396
GH@ST
2004-09-29 17:59
2004.10.17
Как сделать сортировку в Excel


14-1096167142
Думкин
2004-09-26 06:52
2004.10.17
С днем рождения! 26 сентября


1-1096646043
Homa_Programer
2004-10-01 19:54
2004.10.17
Перенос текста на новую страницу...


3-1094742606
senya
2004-09-09 19:10
2004.10.17
Как подсчитать количество соединений к БД?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский