mp3rtp.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:4k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <time.h>
  4. #include <unistd.h>
  5. #include "lame.h"
  6. #include "rtp.h"
  7. /*
  8. encode (via LAME) to mp3 with RTP streaming of the output.
  9. Author:  Felix von Leitner <leitner@vim.org>
  10. mp3rtp  ip:port:ttl  [lame encoding options]  infile outfile
  11. example:
  12. arecord -b 16 -s 22050 -w | ./mp3rtp 224.17.23.42:5004:2 -b 56 - /dev/null
  13. */
  14. struct rtpheader RTPheader;
  15. struct sockaddr_in rtpsi;
  16. int rtpsocket;
  17. void rtp_output(char *mp3buffer,int mp3size)
  18. {
  19.   sendrtp(rtpsocket,&rtpsi,&RTPheader,mp3buffer,mp3size);
  20.   RTPheader.timestamp+=5;
  21.   RTPheader.b.sequence++;
  22. }
  23. void rtp_usage(void) {
  24.     fprintf(stderr,"usage: mp3rtp ip:port:ttl  [encoder options] <infile> <outfile>n");
  25.     exit(1);
  26. }
  27. char mp3buffer[LAME_MAXMP3BUFFER];
  28. /************************************************************************
  29. *
  30. * main
  31. *
  32. * PURPOSE:  MPEG-1,2 Layer III encoder with GPSYCHO 
  33. * psychoacoustic model.
  34. *
  35. ************************************************************************/
  36. int main(int argc, char **argv)
  37. {
  38.   int i,port,ttl;
  39.   char *tmp,*Arg;
  40.   lame_global_flags gf;
  41.   int iread,imp3;
  42.   FILE *outf;
  43.   short int Buffer[2][1152];
  44.   if(argc<=2) {
  45.     rtp_usage();
  46.     exit(1);
  47.   }
  48.   /* process args */
  49.   Arg = argv[1];
  50.   tmp=strchr(Arg,':');
  51.   if (!tmp) {
  52.     rtp_usage();
  53.     exit(1);
  54.   }
  55.   *tmp++=0;
  56.   port=atoi(tmp);
  57.   if (port<=0) {
  58.     rtp_usage();
  59.     exit(1);
  60.   }
  61.   tmp=strchr(tmp,':');
  62.   if (!tmp) {
  63.     rtp_usage();
  64.     exit(1);
  65.   }
  66.   *tmp++=0;
  67.   ttl=atoi(tmp);
  68.   if (tmp<=0) {
  69.     rtp_usage();
  70.     exit(1);
  71.   }
  72.   rtpsocket=makesocket(Arg,port,ttl,&rtpsi);
  73.   srand(getpid() ^ time(0));
  74.   initrtp(&RTPheader);
  75.   /* initialize encoder */
  76.   lame_init(&gf);
  77.   /* Remove the argumets that are rtp related, and then 
  78.    * parse the command line arguments, setting various flags in the
  79.    * struct pointed to by 'gf'.  If you want to parse your own arguments,
  80.    * or call libmp3lame from a program which uses a GUI to set arguments,
  81.    * skip this call and set the values of interest in the gf struct.  
  82.    * (see lame.h for documentation about these parameters)
  83.    */
  84.   for (i=1; i<argc-1; i++)  /* remove first argument, it was for rtp */
  85.     argv[i]=argv[i+1];
  86.   lame_parse_args(&gf,argc-1, argv); 
  87.   /* open the output file.  Filename parsed into gf.inPath */
  88.   if (!strcmp(gf.outPath, "-")) {
  89. #ifdef __EMX__
  90.     _fsetmode(stdout,"b");
  91. #elif (defined  __BORLANDC__)
  92.     setmode(_fileno(stdout), O_BINARY);
  93. #elif (defined  __CYGWIN__)
  94.     setmode(fileno(stdout), _O_BINARY);
  95. #elif (defined _WIN32)
  96.     _setmode(_fileno(stdout), _O_BINARY);
  97. #endif
  98.     outf = stdout;
  99.   } else {
  100.     if ((outf = fopen(gf.outPath, "wb")) == NULL) {
  101.       fprintf(stderr,"Could not create "%s".n", gf.outPath);
  102.       exit(1);
  103.     }
  104.   }
  105.   /* open the wav/aiff/raw pcm or mp3 input file.  This call will
  106.    * open the file with name gf.inFile, try to parse the headers and
  107.    * set gf.samplerate, gf.num_channels, gf.num_samples.
  108.    * if you want to do your own file input, skip this call and set
  109.    * these values yourself.  
  110.    */
  111.   lame_init_infile(&gf);
  112.   /* Now that all the options are set, lame needs to analyze them and
  113.    * set some more options 
  114.    */
  115.   lame_init_params(&gf);
  116.   lame_print_config(&gf);   /* print usefull information about options being used */
  117.   /* encode until we hit eof */
  118.   do {
  119.     /* read in 'iread' samples */
  120.     iread=lame_readframe(&gf,Buffer);
  121.     /* encode the frame */
  122.     imp3=lame_encode_buffer(&gf,Buffer[0],Buffer[1],iread,
  123.     mp3buffer,sizeof(mp3buffer));
  124.     fwrite(mp3buffer,1,imp3,outf);       /* write the MP3 output to file  */
  125.     rtp_output(mp3buffer,imp3);          /* write MP3 output to RTP port */    
  126.   } while (iread);
  127.   
  128.   imp3=lame_encode_finish(&gf,mp3buffer,sizeof(mp3buffer));   /* may return one or more mp3 frame */
  129.   fwrite(mp3buffer,1,imp3,outf);  
  130.   rtp_output(mp3buffer,imp3);
  131.   fclose(outf);
  132.   lame_close_infile(&gf);             /* close the sound input file */
  133.   lame_mp3_tags(&gf);                /* add id3 or VBR tags to mp3 file */
  134.   return 0;
  135. }