Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2012, 10:33   #1
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию Вопрос по TWaveFormatEx

Доброго всем времени форумчане!!! Неподскажите как заполнить TWaveFormatEx для GSM, голову ломаю ничего невыходит, как то нужно сжатие прописать, что то еще дописать нужно.

pcm 11 = работает.
Код:
 
  with wfx do
  begin
    wFormatTag := 1;
    nChannels := 1;
    nSamplesPerSec := 11025;
    nAvgBytesPerSec := 11025;
    nBlockAlign := 1;
    wBitsPerSample := 8;
    cbSize := 0;
end;
GSM = неработает.
Код:
 with wfx do
 begin
  wFormatTag := 49; // gsm 6.10 2kb
  nChannels := 1;
  nSamplesPerSec := 8000;
  nAvgBytesPeSec := 1625;
  nBlockAlign := 65;
  wBitsPerSample := 0;
  cbSize := 2;
end;

Последний раз редактировалось Aliens_wolfs; 23.01.2012 в 11:13.
Aliens_wolfs вне форума Ответить с цитированием
Старый 23.01.2012, 12:10   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Код:
var
  OrigFormat                  : PWaveFormatEX;
  Res                         : Longint;
begin
  Result := False;
  GetMem(OrigFormat,Sizeof(TACMWaveFormat));
  try
    if UseDefault then
      Move(Format,OrigFormat^, SizeOf(TACMWaveFormat))
    else with OrigFormat^ do begin
      wFormatTag := 49;   // Default to GSM6.10
      nChannels := 1;     // Mono
      nSamplesPerSec := 8000; //Low enough to strean
      nAvgBytesPerSec:= 8000;
      nBlockAlign:=1;
      wbitspersample := 8;
      cbSize := SizeOf(TACMWaveFormat);
    end;
у меня работает. Подробности см.стандарт на кодек GSM6.10.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 23.01.2012, 13:07   #3
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Спасибо за отклик. Delphi ругается на TACMWaveFormat в MMSystem такого нет

А понял наверное его самому задать примерно так

Код:
TACMWaveFormat = packed record
    Format : TWaveFormatEx;
    RawData : Array[0..128] of byte;
  end;

Последний раз редактировалось Aliens_wolfs; 23.01.2012 в 13:20.
Aliens_wolfs вне форума Ответить с цитированием
Старый 23.01.2012, 13:22   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...именно.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 23.01.2012, 13:33   #5
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Мне нужно без модуля ACMOut.

Далее я вставлял сюда и все работает кроме GSM
WaveOutOpen(@FWaveOut, 0, @wfx, 0, 0, CALLBACK_WINDOW or WAVE_MAPPED);

Код:
var
F: TACMWaveFormat;
Код:
f.Format:= origformat^;
WaveOutOpen(@FWaveOut, 0, @f, 0, 0, CALLBACK_WINDOW or WAVE_MAPPED);
Пока неработает

Последний раз редактировалось Aliens_wolfs; 23.01.2012 в 14:02.
Aliens_wolfs вне форума Ответить с цитированием
Старый 23.01.2012, 14:13   #6
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Заработало так:

Код:
  type
    TACMWaveFormat = packed record
    Format : TWaveFormatEx;
    RawData : Array[0..128] of byte;
  end;

var
OrigFormat: PWaveFormatEX;
F: Tacmwaveformat;
s: array[1..256] of byte;
begin

GetMem(OrigFormat,Sizeof(TACMWaveFormat));
try
with origformat^ do begin
wformattag := 49; // gsm 6.10 2kb
nchannels := 1;
nsamplespersec := 8000;
navgbytespersec := 1625;
nblockalign := 65;
wbitspersample := 0;
cbsize := 2;
move(origformat^, s, Sizeof(TACMWaveFormat));
s[18] := 0;
s[19] := 64;
s[20] := 1;
move(s, f.format, sizeof(Tacmwaveformat));
end;
i:=WaveOutOpen(@FWaveOut, 0, @f, 0, 0, CALLBACK_WINDOW or WAVE_MAPPED);
finally
freeMem(origformat);
end;
raxp Спасибо!!! Нашел здесь форум по VoIp где вы дали ссылки.

Последний раз редактировалось Aliens_wolfs; 23.01.2012 в 15:41.
Aliens_wolfs вне форума Ответить с цитированием
Старый 23.01.2012, 14:46   #7
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Еще вопросик, а mp3 22050

Код:
 with origformat^ do
begin
wformattag := 85; //mp3
nchannels := 2;
nsamplespersec := 22050;
navgbytespersec := 14000;
nblockalign := 1;
wbitspersample := 0;
cbsize := 12;
f.format := origformat^;
end;
так неработает

Последний раз редактировалось Aliens_wolfs; 23.01.2012 в 15:51.
Aliens_wolfs вне форума Ответить с цитированием
Старый 23.01.2012, 16:23   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...эээ, с mp3 не все так просто, лицензии будете отчислять за использование? Может стоит обратить внимание на альтернативные кодеки от ffmpeg?

Добавлено

...кстати, сжатие-декомпрессию потока удобно проводить с помощью zLIB ...правда я не знаю для каких целей вы затеяли выбор кодеков.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 23.01.2012 в 16:31.
raxp вне форума Ответить с цитированием
Старый 24.01.2012, 08:26   #9
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

GSM мне нужен для VOIP моей програмки, а mp3 для трансляции по сети музыкальных потоков, беру файл mp3 открываю его в буфер, этот буфер по сети отправляет данные этого файла клиенту радиорубки предприятия, а дальше по громкой связи транслируется. Территория большая две радиорубки соеденены VDSL сетью, трансляцию хочу сделать с любого места, также и голос транслировать для объявлений тагда любой кодек пойдет. Вот теперь MP3 нужен. Хотя наверное Bass для этих целей использовать буду, у него с mp3 легче, правда что в Bass нужно заголовки создавать засчет этого он теряет время на обработку и начинает глотает звуки, voip точно на нем мне кажется не сделать. Кстати может знаете как в Bass кодек GSM настроить?

C Bass работаю так голос несжатый PCM передаю, но он глотает, неуспевает обрабатывать, фразы отрывистые, что меня неустраивает, а на WaveOutOpen норм.
Код:
procedure TForm1.OnReceiveSocketClient(Sender: TObject; Socket: TSocketClientTCP);
type
    PWaveHeader = ^TWaveHeader;
    TWaveHeader = record
    idRiff        : array [0..3] of Char;
    RiffLen       : LongInt;
    idWave        : Array[0..3] of Char;
    idFmt         : Array[0..3] of Char;
    InfoLen       : LongInt;
    FormatTag     : Word;
    Channels      : Word;
    Freq          : LongInt;
    BytesPerSec   : LongInt;
    BlockAlign    : Word;
    BitsPerSample : Word;
    idData        : Array[0..3] of Char;
    DataBytes     : LongInt;
  end;

var
stream : HSTREAM;
header: TWaveHeader;
Buf: array of char;
Size:integer;
begin

with header do
  begin
    idRiff        :='RIFF';
    RiffLen       :=Socket.BufSize;
    idWave        :='WAVE';
    idFmt         :='fmt ';
    InfoLen       :=16;
    FormatTag     :=1;
    Channels      :=1;
    Freq          :=8000;
    BitsPerSample :=8;
    BlockAlign    :=Channels * (BitsPerSample div 8);
    BytesPerSec   :=Freq * BlockAlign;
    idData        :='data';
    DataBytes     :=Socket.BufSize;
  end;
  size:=SizeOf(TWaveHeader)+Socket.BufSize;
 getmem(Buf,size);
 Move(Pointer(@header)^,Pointer(Buf)^,SizeOf(TWaveHeader));
 Move(Pointer(Socket.buf)^,Buf[SizeOf(TWaveHeader)],Socket.BufSize);
 stream:=BASS_StreamCreateFile(true, Buf, 0, Size, 0);
 BASS_ChannelPlay(stream,true);
 freemem(Buf);
end;

Последний раз редактировалось Aliens_wolfs; 24.01.2012 в 09:10.
Aliens_wolfs вне форума Ответить с цитированием
Старый 24.01.2012, 09:01   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

mp3 это сжатый формат, мало того что легальное его применение требует отчислений, так его нельзя читать так как читаете вы.(он не является RIFF контейнером+требует распаковки данных)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по VB Mr_ViK Помощь студентам 6 01.09.2011 16:29
Вопрос по mySQL + Вопрос по RichEdit HTL Общие вопросы Delphi 4 01.01.2010 20:22
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33
вопрос по сокетам и общение как в ICQ.Сложный вопрос... Руслантус Общие вопросы C/C++ 2 12.08.2008 21:10