На главную страницу | Новости  |  Ссылки | Контакты

Spyphy Farnsworth
Квантовая реальность. Кибернетика. Искусственный интеллект


Запись аудио в LINUX: rec, play, sox

[22.07.07]

sox

sox infile1 outfile [effect [effect-options]]

play [global-options] [format-options] infile1

rec [global-options] [format-options] outfile

---------------------

Для записи звука с микрофона можно использовать утилиту rec, а проигрывать любой файл можно с помощью play (нужно установить пакет sox).

Пример:

rec 1.wav

play 1.wav

play -v 5 1.wav -увеличить громкость в 5 раз.

При этом бывает полезно в alsamixer'е включить оптию "Mic Boost (+20dB)", а параметр PCM установить на 75% [dB gain=0.00].

----

Для сжатия данных в формате MP3 можно использовать замечательную программу lame (устанавливается отдельно).

Её синтаксис: lame [opt]

Например: lame 1.wav 1.mp3

Её полезные оптии:

--scale n - увеличить звук в n раз (напр.,10)

--decode - декодировать в wav-файл

-m mode, где mode=s,m (-m m -моно режим);

-q qual - качество записи (qual от 0 до 9, 0 - самый медленный, но лучшее возможности), на размер файла не влияет.

-b bitrate - задать kbps (=32,48,64,96 и т.д).

Вот пример скрипта, который упрощает процесс записи. Скрипт имеет один параметр - имя файла, которое вводится без расширения - оно само добавится.

#!/bin/bash

cd /z/rec

rec $1.wav

lame --scale 10 $1.wav $1.mp3

rm $1.wav -f

ls /z/rec -la

mpg123 $1.mp3

Однако и этого мало. Я решил написать альтернативную прогу на Си, чтобы имя файла создавалось автоматически - из текущего времени:

#include 
 
#include
#include
#include
#include
#include
int main(){ time_t time1 = time(NULL); struct tm *lt = localtime(&time1); char file[128]="/z/rec/"; // - директория назначения char filewav[128], filemp3[128]; char cmd[128], str[10]; long res; struct stat st; res = stat(file,&st); if (res!=0) { printf("Error! No such dir - %s\n",file); return 1; } if ((st.st_mode&S_IFMT)!=S_IFDIR) { printf("Error! %s is not dir\n",file); return 1; } res = stat("/usr/local/bin/lame",&st); if (res!=0) { printf("Error! LAME is not install (No file %s)\n",file); return 1; } sprintf(str,"%d\0",lt->tm_year+1900); strcat(file,str); strcat(file,"-"); if (lt->tm_mon <= 8) strcat(file,"0"); sprintf(str,"%d\0",lt->tm_mon+1); strcat(file,str); strcat(file,"-"); if (lt->tm_mday <= 9) strcat(file,"0"); sprintf(str,"%d\0",lt->tm_mday); strcat(file,str); strcat(file,"_"); if (lt->tm_hour <= 9) strcat(file,"0"); sprintf(str,"%d\0",lt->tm_hour); strcat(file,str); strcat(file,"-"); if (lt->tm_min <= 9) strcat(file,"0"); sprintf(str,"%d\0",lt->tm_min); strcat(file,str); strcpy(filewav,file); strcat(filewav,".wav"); strcpy(filemp3,file); strcat(filemp3,".mp3"); strcpy(cmd,"rec "); strcat(cmd,filewav); system(cmd); // - rec printf("cmd=%s\n",cmd); strcpy(cmd,"lame --scale 10 "); strcat(cmd,filewav); strcat(cmd," "); strcat(cmd,filemp3); res = system(cmd); // lame printf("cmd=%s\n",cmd); if (res!=0) { printf("Error! Can not start lame\n"); printf("res=%ld\n",res); return 1; } strcpy(cmd,"rm "); strcat(cmd,filewav); strcat(cmd," -f"); system(cmd); // - удаление wav-файла printf("cmd=%s\n",cmd); system("ls /z/rec -la"); printf("ls /z/rec -la\n"); strcpy(cmd,"play "); strcat(cmd,filemp3); system(cmd); // - проиграть готовый файл printf("cmd=%s\n",cmd); printf("END\n"); return 0; }

---

Недостаток, как видите, не слишком компактный файл как выполнимый, так и исходный текст. Но тем ни мение работает и это уже хорошо.





galaxy