⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mp3rtp.c

📁 音频编码
💻 C
字号:
/* $Id: mp3rtp.c,v 1.22 2004/12/31 11:26:25 takehiro Exp $ *//* Still under work ..., need a client for test, where can I get one? *//*  *  experimental translation: * *  gcc -I..\include -I..\libmp3lame -o mp3rtp mp3rtp.c ../libmp3lame/libmp3lame.a lametime.c get_audio.c portableio.c ieeefloat.c timestatus.c parse.c rtp.c -lm * *  wavrec -t 14400 -s 44100 -S /proc/self/fd/1 | ./mp3rtp 10.1.1.42 -V2 -b128 -B256 - my_mp3file.mp3 */#ifdef HAVE_CONFIG_H# include <config.h>#endif#ifdef STDC_HEADERS# include <stdlib.h># include <string.h>#else# ifndef HAVE_STRCHR#  define strchr index#  define strrchr rindex# endifchar *strchr (), *strrchr ();# ifndef HAVE_MEMCPY#  define memcpy(d, s, n) bcopy ((s), (d), (n))#  define memmove(d, s, n) bcopy ((s), (d), (n))# endif#endif#include <time.h>#ifdef HAVE_UNISTD_H# include <unistd.h>#endif#include "lame.h"#include "main.h"#include "parse.h"#include "lametime.h"#include "timestatus.h"#include "get_audio.h"#include "rtp.h"#ifdef WITH_DMALLOC#include <dmalloc.h>#endif/* * Encode (via LAME) to mp3 with RTP streaming of the output. * * Author: Felix von Leitner <leitner@vim.org> * *   mp3rtp ip[:port[:ttl]] [lame encoding options] infile outfile * * examples: *   arecord -b 16 -s 22050 -w | ./mp3rtp 224.17.23.42:5004:2 -b 56 - /dev/null *   arecord -b 16 -s 44100 -w | ./mp3rtp 10.1.1.42 -V2 -b128 -B256 - my_mp3file.mp3 * */struct rtpheader    RTPheader;struct sockaddr_in  rtpsi;int                 rtpsocket;void  rtp_output ( const char* mp3buffer, const int mp3size ){    sendrtp (rtpsocket, &rtpsi, &RTPheader, mp3buffer, mp3size);    RTPheader.timestamp += 5;    RTPheader.b.sequence++;}#if 0struct rtpheader RTPheader;SOCKET rtpsocket;void rtp_output (char *mp3buffer, int mp3size){    rtp_send (rtpsocket, &RTPheader,mp3buffer,mp3size) ;    RTPheader.timestamp+=5;    RTPheader.b.sequence++;}#endifunsigned int  maxvalue ( int  Buffer [2] [1152] ){    unsigned int  max = 0;    int  i;        for ( i = 0; i < 1152; i++ ) {        if ( abs (Buffer[0][i]) > max ) max = abs (Buffer[0][i]);        if ( abs (Buffer[1][i]) > max ) max = abs (Buffer[1][i]);    }        return max;}void levelmessage ( unsigned int maxvalue ){    char buff[] = "|  .  |  .  |  .  |  .  |  .  |  .  |  .  |  .  |  .  |  .  |  \r";    static int  max = 0;    static int  tmp = 0;    buff [tmp] = '+';    tmp = (maxvalue*61 + 16384) / (32767 + 16384/61);    if (tmp > sizeof(buff)-2)	tmp = sizeof(buff)-2;    if (max < tmp)	max = tmp;    buff [max] = 'x';    buff [tmp] = '#';    fwrite ( buff, 1, sizeof(buff)-1, stderr );}/************************************************************************** main** PURPOSE:  MPEG-1,2 Layer III encoder with GPSYCHO * psychoacoustic model.*************************************************************************/int  main ( int argc, char **argv ){    unsigned char       mp3buffer [LAME_MAXMP3BUFFER];    char       inPath    [PATH_MAX + 1];    char       outPath   [PATH_MAX + 1];    int        Buffer [2] [1152];    lame_global_flags *gf;        int        ret;    int        wavsamples;    int        mp3bytes;    FILE*      outf;    char       ip [16];    unsigned   port = 5004;    unsigned   ttl  =    2;    char       dummy;    if ( argc <= 2 ) {        fprintf ( stderr, "Encode (via LAME) to mp3 with RTP streaming of the output\n""\n""    mp3rtp ip[:port[:ttl]] [lame encoding options] infile outfile\n""\n""    examples:\n""      arecord -b 16 -s 22050 -w | ./mp3rtp 224.17.23.42:5004:2 -b 56 - /dev/null\n""      arecord -b 16 -s 44100 -w | ./mp3rtp 10.1.1.42 -V2 -b128 -B256 - my_mp3file.mp3\n""\n" );	return 1;    }    switch (sscanf ( argv[1], "%11[.0-9]:%u:%u%c", ip, &port, &ttl, &dummy )) {    case 1:    case 2:    case 3:         break;    default:        fprintf (stderr, "Illegal destination selector '%s', must be ip[:port[:ttl]]\n", argv[1] );	return -1;    }    rtpsocket = makesocket ( ip, port, ttl, &rtpsi );    srand ( getpid () ^ time (NULL) );    initrtp ( &RTPheader );    /* initialize encoder */    gf=lame_init();    /* Remove the argumets that are rtp related, and then      * parse the command line arguments, setting various flags in the     * struct pointed to by 'gf'.  If you want to parse your own arguments,     * or call libmp3lame from a program which uses a GUI to set arguments,     * skip this call and set the values of interest in the gf struct.       * (see lame.h for documentation about these parameters)     */         argv[1] = argv[0];     parse_args(gf, argc - 1, argv + 1, inPath, outPath,NULL,NULL);    /* open the output file.  Filename parsed into gf.inPath */    if ( 0 == strcmp ( outPath, "-" ) ) {        lame_set_stream_binary_mode (outf = stdout);    }    else {        if ((outf = fopen (outPath, "wb+")) == NULL) {            fprintf (stderr, "Could not create \"%s\".\n", outPath);            return 1;        }    }    /* open the wav/aiff/raw pcm or mp3 input file.  This call will     * open the file with name gf.inFile, try to parse the headers and     * set gf.samplerate, gf.num_channels, gf.num_samples.     * if you want to do your own file input, skip this call and set     * these values yourself.       */    init_infile(gf,inPath);    /* Now that all the options are set, lame needs to analyze them and     * set some more options      */    ret = lame_init_params(gf);    if ( ret < 0 ) {        if (ret == -1) display_bitrates (stderr);        fprintf (stderr, "fatal error during initialization\n");        return -1;    }    lame_print_config(gf); /* print useful information about options being used */    if (update_interval < 0.)        update_interval = 2.;    /* encode until we hit EOF */    while ( (wavsamples = get_audio(gf, Buffer)) > 0 ) { /* read in 'wavsamples' samples */        levelmessage ( maxvalue (Buffer) );        mp3bytes = lame_encode_buffer_int(gf,            /* encode the frame */	                                Buffer[0], Buffer[1], wavsamples, 					mp3buffer, sizeof (mp3buffer) );        rtp_output ( mp3buffer, mp3bytes );       /* write MP3 output to RTP port */        fwrite ( mp3buffer, 1, mp3bytes, outf );  /* write the MP3 output to file */    }    mp3bytes = lame_encode_flush(gf,           /* may return one or more mp3 frame */                                    mp3buffer, sizeof (mp3buffer) );     rtp_output ( mp3buffer, mp3bytes );           /* write MP3 output to RTP port */    fwrite ( mp3buffer, 1, mp3bytes, outf );      /* write the MP3 output to file */        lame_mp3_tags_fid(gf, outf ); /* add VBR tags to mp3 file */        lame_close(gf);    fclose(outf);    close_infile();                 /* close the sound input file */        return 0;}/* end of mp3rtp.c */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -