本程序用的Lame进行编程
编写程序之前先要安装Lame:
一. 下载最新版lame源码:
http://sourceforge.net/projects/lame/files/lame/3.99/
二. % ./configure
%make (需要root权限)
% make install (需要root权限)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <memory.h>
#include <linux/soundcard.h>
#include "lame.h"
#define TIMES
10 //录音时间,秒
#define RATE
44100 //采样频率
#define BITS
16 //量化位数
#define CHANNELS 2 //声道数目
#define INBUFF_SIZE 4096
#define MP3BUFF_SIZE (int) (1.25 * INBUFF_SIZE) + 7200
int SetFormat(int fd, unsigned int bit, unsigned int channel, unsigned int hz)
{
int
ioctl_val;
ioctl_val =
bit;
if
(ioctl(fd, SOUND_PCM_WRITE_BITS, &ioctl_val)
< 0) {
printf("Set fmt to bit %d failed:%s\n", bit,
strerror(errno));
return -1;
}
if
(ioctl_val != bit) {
printf("Do not support bit %d, supported %d\n", bit,
ioctl_val);
return (-1);
}
ioctl_val =
channel;
if
((ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &ioctl_val))
== -1) {
fprintf(stderr, "Set Audio Channels %d failed:%s\n", channel,
strerror(
errno));
return (-1);
}
if
(ioctl_val != channel) {
fprintf(stderr, "Do not support channel %d,supported %d\n",
channel,
ioctl_val);
return (-1);
}
ioctl_val =
hz;
if
(ioctl(fd, SOUND_PCM_WRITE_RATE, &ioctl_val) == -1)
{
fprintf(stderr, "Set speed to %d failed:%s/n", hz,
strerror(errno));
return (-1);
}
if
(ioctl_val != hz) {
fprintf(stderr, "Do not support speed %d,supported is %d\n",
hz,
ioctl_val);
return (-1);
}
return
0;
}
int main(int argc, char **argv)
{
int status =
0;
int
fd_dsp;
FILE*
fd_tmp;
FILE*
fd_mp3;
lame_global_flags* gfp;
short
*input_buff;
unsigned
char *mp3_buff;
int
samples;
int
mp3_bytes;
int
write_bytes;
int num =
0;
int
ch;
int i =
0;
int ret_code
= 0;
if (argc !=
2) {
fprintf(stderr, "Useage: ./mp3_record test.mp3\n");
return -1;
}
if ((fd_dsp
= open("/dev/dsp", O_RDONLY, 0777)) < 0) {
fprintf(stderr, "Open audio device error: %s\n",
strerror(errno));
status = -1;
goto EXIT;
}
if
(SetFormat(fd_dsp, BITS, CHANNELS, RATE) < 0)
{
printf("Cannot set /dev/dsp in bit 16, channel 2, speed
44100.\n");
status = -1;
goto EXIT;
}
if ((fd_mp3
= fopen(argv[1], "w")) < 0) {
fprintf(stderr, "Open file error: %s\n", strerror(errno));
status = -1;
goto CLOSE_DSP;
}
gfp =
lame_init();
if (gfp ==
NULL) {
printf("lame_init failed\n");
status = -1;
goto CLOSE_MP3;
}
lame_set_in_samplerate(gfp, RATE);
//lame_set_out_samplerate(gfp, RATE);
lame_set_num_channels(gfp, CHANNELS);
ret_code =
lame_init_params(gfp);
if (ret_code
< 0) {
printf("lame_init_params returned %d\n", ret_code);
status = -1;
goto CLOSE_LAME;
}
//printf("default rate is %d, out rate is %d.\n",
lame_get_in_samplerate(gfp), lame_get_out_samplerate(gfp));
//ch =
lame_get_num_channels(gfp);
//printf("default brate is %d.\n", lame_get_brate(gfp));
//printf("default samples is %lu.\n",
lame_get_num_samples(gfp));
//printf("default channel is %d.\n", ch);
//printf("default vbr_mode is %d.\n", lame_get_VBR(gfp));
//printf("default force_ms is %d.\n",
lame_get_force_ms(gfp));
//printf("default mode is %d.\n", lame_get_mode(gfp));
//printf("default compression_ratio is %f.\n",
lame_get_compression_ratio(gfp));
//printf("default VBR_mean_bitrate is %d.\n",
lame_get_VBR_mean_bitrate_kbps(gfp));
//printf("default quality is %d.\n", lame_get_quality(gfp));
input_buff =
(short *) malloc(INBUFF_SIZE * 2);
mp3_buff =
(unsigned char *) malloc(MP3BUFF_SIZE);
if
(input_buff == NULL || mp3_buff == NULL) {
printf("Failed to malloc.\n");
goto FREE_BUF;
}
if
((TIMES*RATE*BITS*CHANNELS/8)%(INBUFF_SIZE * 2) != 0)
num = (TIMES*RATE*BITS*CHANNELS/8)/(INBUFF_SIZE * 2) + 1;
else
num = (TIMES*RATE*BITS*CHANNELS/8)/(INBUFF_SIZE * 2);
for(i = 0; i
< num; i++) {
memset(input_buff, 0, INBUFF_SIZE * 2);
memset(mp3_buff, 0, MP3BUFF_SIZE);
samples = read(fd_dsp, input_buff, INBUFF_SIZE * 2);
if (samples < 0) {
perror("Read sound device failed");
status = -1;
goto FREE_BUF;
}
//printf("samples is %d.\n", samples);
mp3_bytes = lame_encode_buffer_interleaved(gfp, input_buff,
samples/4, mp3_buff, MP3BUFF_SIZE);
//printf("mp3_bytes is %d.\n", mp3_bytes);
if (mp3_bytes < 0) {
printf("lame_encode_buffer_interleaved returned %d\n",
mp3_bytes);
status = -1;
goto FREE_BUF;
}
write_bytes = fwrite(mp3_buff, 1, mp3_bytes, fd_mp3);
if (write_bytes < 0) {
perror("Write sound data file failed\n");
status = -1;
goto FREE_BUF;
} else fflush(fd_mp3);
}
mp3_bytes =
lame_encode_flush(gfp, mp3_buff, sizeof(mp3_buff));
if
(mp3_bytes > 0) {
printf("Writing %d mp3 bytes.\n", mp3_bytes);
if (fwrite(mp3_buff, 1, mp3_bytes, fd_mp3) <
0)
printf("'Writing mp3 bytes error.\n");
else
fflush(fd_mp3);
} else
printf("Writing mp3 bytes 0.\n");
FREE_BUF:
free(mp3_buff);
mp3_buff =
NULL;
free(input_buff);
input_buff =
NULL;
CLOSE_LAME:
lame_close(gfp);
CLOSE_MP3:
fclose(fd_mp3);
CLOSE_DSP:
close(fd_dsp);
EXIT: return
status;
}
编写程序之前先要安装Lame:
一. 下载最新版lame源码:
http://sourceforge.net/projects/lame/files/lame/3.99/
二. % ./configure
%make (需要root权限)
% make install (需要root权限)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <memory.h>
#include <linux/soundcard.h>
#include "lame.h"
#define TIMES
#define RATE
#define BITS
#define CHANNELS 2
#define INBUFF_SIZE 4096
#define MP3BUFF_SIZE (int) (1.25 * INBUFF_SIZE) + 7200
int SetFormat(int fd, unsigned int bit, unsigned int channel, unsigned int hz)
{
}
int main(int argc, char **argv)
{
}