Форум: "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.039 c