Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проиграть бинарный аудио файл 
:(
    Опции темы
Vicul
Дата 21.10.2010, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 27.4.2009

Репутация: нет
Всего: нет



Всем привет,

я хочу получать инфу с микрофона. 
Здесь проблем нет, подключаюсь к /dev/audio и и все записываю в бинарный файл, скажем data.au.
Теперь надо бы переслать его на динамики, сделать на прямую  (типа cat ./data.au >  /dev/audio)не могу,   
ОС выдает, что устройство занято.  Что приходит на ум, это надо  этот файл преобразовать в какой-нибудь звуковой формат
и юзать его через штатный плеер. Вообщем любые идеи, как прослушать полученный файл. 
PM MAIL   Вверх
bsa
Дата 21.10.2010, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Причем тут C/C++?
Если тебе нужно написать программу, которая будет это делать, то посмотри формат WAV файла. Там ничего сложного, просто заполнишь правильно структуру, запишешь ее перед блоком аудио данных и все.
Если же ты ищешь готовое программное решение, то проще использовать уже готовые программы аудиозахвата, например, Audacity.
PM   Вверх
Vicul
Дата 21.10.2010, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 27.4.2009

Репутация: нет
Всего: нет



>Причем тут C/C++?

потому как все написано у меня на С.  И мне нужно решение на нем. 

За  WAV спасибо, сейчас попробую
PM MAIL   Вверх
Vicul
Дата 21.10.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 27.4.2009

Репутация: нет
Всего: нет



Cделал на WAV,  но когда запускаю на плеер - некачественный звук, это так должно быть если напрямую забираешь инфу с /dev/audio ??
PM MAIL   Вверх
djamshud
Дата 21.10.2010, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



А заголовки wav выставлены правильно и соответствуют записанному потоку?

ЗЫ. Раньше можно было просто направить дамп в /dev/dsp, сейчас это тоже можно сделать, но с бубном. Может быть проще будет нагуглить такой бубен?


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Vicul
Дата 21.10.2010, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 27.4.2009

Репутация: нет
Всего: нет



С дампом не получается,  вот даю все коды, закомнтированные коды в main() это вариант с дампом 

Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>

int g_flagStop;
char* g_pRcvBuffer;
int g_lenBuffer;

struct WAV
{
  char ChankID[4];
  unsigned int ChankSize;
  char Format[4];
  char Subchunk1ID[4];
  unsigned int Subchunk1Size;
  unsigned short  AudioFormat;
  unsigned short NumChannels;
  unsigned int SampleRate;
  unsigned int ByteRate;
  unsigned short  BlockAlign;
  unsigned short BitsPerSample;
  char Subchunk2ID[4];
  unsigned int Subchunk2Size;
};

void* StopThread(void* pParam)
{
  printf("Press Enter for stop:");
  getc(stdin);
  g_flagStop = 1;
  return NULL;
}


void AddRcvBuffer(char chr)
{

  char* pBuffer2 = NULL;
 
  if (g_pRcvBuffer == NULL)
    {
      g_pRcvBuffer = new char[1];
      *g_pRcvBuffer = chr;
      g_lenBuffer = 2;
      return;
    }
  pBuffer2 = new char[3+ g_lenBuffer];
  memset (pBuffer2, 0, g_lenBuffer + 2;
  memcpy(pBuffer2, g_pRcvBuffer,  g_lenBuffer );
  delete [] g_pRcvBuffer;
  *(pBuffer2 +  g_lenBuffer) = chr; 
  g_lenBuffer ++;
  g_pRcvBuffer = pBuffer2;
  return; 

}


int main()
{
  FILE *r = fopen("/dev/audio", "rb");
  //FILE *w = fopen("DATA.AU", "wb");
  pthread_t threadID;
  g_flagStop = 0;
  g_pRcvBuffer = NULL;
  g_lenBuffer = 0;

  pthread_create(&threadID, NULL, &StopThread, NULL);
  //collect data
  while(!g_flagStop) 
    {
      char c = fgetc(r);
      //fputc(c, w);
      AddRcvBuffer(c);
    }
  fclose(r);
  //fclose(w);
  //return 0;
  if (g_pRcvBuffer == NULL)
    {
      printf("No info.");
      return 1;
    }
  else
    {
      //translate to WAV
      FILE* stream = NULL;
      stream = fopen("data.wav", "w");
      if (stream == NULL)
    {
      printf("Cannot open the file data.wav\nError: %s\n",  strerror(errno));
    }
      else
    {
      WAV wav;
      //char chanID[] = 
      memcpy(wav.ChankID,"RIFF", 4);
      memcpy(wav.Format,"WAVE", 4);
      memcpy(wav.Subchunk1ID, "fmt ", 4);
      wav.Subchunk1Size = 16;
      wav. AudioFormat =1;
      wav.NumChannels = 1;//mono
      wav.SampleRate = 8000;
      wav.BitsPerSample = 8;
      wav.BlockAlign = wav.NumChannels * wav.BitsPerSample/8;
      wav.ByteRate = wav.SampleRate * wav.NumChannels * wav.BitsPerSample/8;
      memcpy(wav.Subchunk2ID, "data", 4);
      wav.Subchunk2Size =  g_lenBuffer  * wav.NumChannels * wav.BitsPerSample/8;
      wav.ChankSize = 36 + wav.Subchunk2Size;
      fwrite(&wav, sizeof(WAV), 1, stream);
      fwrite(g_pRcvBuffer, g_lenBuffer, 1, stream);
      fflush(stream);
      fclose(stream);
    }
      delete [] g_pRcvBuffer;
    }
  return 0;
 }


Это сообщение отредактировал(а) Vicul - 22.10.2010, 08:08
PM MAIL   Вверх
Vicul
Дата 21.10.2010, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 27.4.2009

Репутация: нет
Всего: нет



добавил канал в заголовок, стало лучше

Код

      wav.NumChannels = 2;
      wav.SampleRate = 4000;


Шумы ушли, но до идеала далеко.  Может у меня чтото с микрофоном?
Хотя в скайпе работает.
PM MAIL   Вверх
Vicul
Дата 21.10.2010, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 27.4.2009

Репутация: нет
Всего: нет



Вообщем поменял  /dev/audio на  /dev/dsp  заработало!

Всем спасибо!
PM MAIL   Вверх
bsa
Дата 21.10.2010, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Почитай про PulseAudio, может стоит воспользоваться его API.
PM   Вверх
xvr
Дата 22.10.2010, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Ошибка в строке 46, должно быть
Код

      g_lenBuffer = 1;

PS. Ваша AddRcvBuffer - это мясорубка для динамической памяти  smile 

PM MAIL   Вверх
Vicul
Дата 24.10.2010, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 27.4.2009

Репутация: нет
Всего: нет



Цитата(xvr @  22.10.2010,  10:54 Найти цитируемый пост)
- это мясорубка для динамической памяти

 
Конечно там лажа, за несколько секунд дамп возрастает до 500К, на боевой проге   там нужно делать свопинг. Кусок 
я привел показать,  как я формирую WAV заголовок.   Ладно, проблема не в динамическом буфере, проблема   в другом - как передать  дамп 
обратно на    /dev/dsp пока без левых библиотек?      ОC не даст открыть его для записи.  У вас есть идеи коллега?

Это сообщение отредактировал(а) Vicul - 24.10.2010, 09:24
PM MAIL   Вверх
xvr
Дата 24.10.2010, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(Vicul @  24.10.2010,  09:23 Найти цитируемый пост)
ОC не даст открыть его для записи.  У вас есть идеи коллега?
Поменять права на /dev/dsp


PM MAIL   Вверх
Vicul
Дата 25.10.2010, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 27.4.2009

Репутация: нет
Всего: нет



Цитата(xvr @  24.10.2010,  11:33 Найти цитируемый пост)
Поменять права на /dev/dsp


запустил с рутом - не пошло

sudo cat data.au > /dev/dsp 
bash: /dev/dsp: Устройство или ресурс занято

PM MAIL   Вверх
bsa
Дата 25.10.2010, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Vicul, конечно работать не будет. Так как во всех современных дистрибутивах в качестве системного микшера используется pulseaudio и именно она "занимает" все устройства ввода и вывода звука. Поэтому, я лично, рекомендую использовать именно ее. Ну или что-то, что позволит работать через нее с более простым API (например, OpenAL).
PM   Вверх
Vicul
Дата 25.10.2010, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 27.4.2009

Репутация: нет
Всего: нет



Цитата(bsa @  25.10.2010,  09:44 Найти цитируемый пост)
. Так как во всех современных дистрибутивах в качестве системного микшера используется pulseaudio 


Спасибо, надо переворить это.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1140 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.