ffmpeg.c
上传用户:jxp0626
上传日期:2007-01-08
资源大小:102k
文件大小:23k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Unix_Linux

  1. /*
  2.  * Basic user interface for ffmpeg system
  3.  * Copyright (c) 2000,2001 Gerard Lantau
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19. #include <stdlib.h>
  20. #include <stdio.h>
  21. #include <netinet/in.h>
  22. #include <linux/videodev.h>
  23. #include <linux/soundcard.h>
  24. #include <unistd.h>
  25. #include <fcntl.h>
  26. #include <sys/ioctl.h>
  27. #include <sys/mman.h>
  28. #include <errno.h>
  29. #include <sys/time.h>
  30. #include <getopt.h>
  31. #include "mpegenc.h"
  32. static AVFormat *file_format;
  33. static int frame_width  = 160;
  34. static int frame_height = 128;
  35. static int frame_rate = 25;
  36. static int bit_rate = 200000;
  37. static int video_disable = 0;
  38. static const char *video_filename, *audio_filename;
  39. static float recording_time = 10.0;
  40. static int nb_frames;
  41. static int gop_size = 12;
  42. static int intra_only = 0;
  43. static int audio_freq = 44100;
  44. static int audio_bit_rate = 64000;
  45. static int audio_disable = 0;
  46. static int audio_channels = 1;
  47. static int high_quality = 0;
  48. static long long time_start;
  49. #define INFMT_YUV 1
  50. #define INFMT_PGM 2
  51. static inline int pnm_space(int c)  
  52. {
  53.     return (c==' ' || c=='n' || c=='r' || c=='t');
  54. }
  55. static void pnm_get(FILE *f, char *str, int buf_size) 
  56. {
  57.     char *s;
  58.     int c;
  59.     
  60.     do  {
  61.         c=fgetc(f);
  62.         if (c=='#')  {
  63.             do  {
  64.                 c=fgetc(f);
  65.             } while (c!='n');
  66.             c=fgetc(f);
  67.         }
  68.     } while (pnm_space(c));
  69.     
  70.     s=str;
  71.     do  {
  72.         *s++=c;
  73.         c=fgetc(f);
  74.     } while (!pnm_space(c));
  75.     *s=0;
  76. }
  77. static int file_read_picture(AVEncodeContext *s, 
  78.                              UINT8 *picture[3],
  79.                              int width, int height,
  80.                              int picture_number)
  81. {
  82.     FILE *f;
  83.     char buf[1024], buf1[100];
  84.     static int init = 0;
  85.     static int format = 0;
  86.     static UINT8 *pict[3];
  87.     int i;
  88.     if (!init) {
  89.         pict[0] = malloc(width * height);
  90.         pict[1] = malloc(width * height / 4);
  91.         pict[2] = malloc(width * height / 4);
  92.         init = 1;
  93.     }
  94.     
  95.     picture[0] = pict[0];
  96.     picture[1] = pict[1];
  97.     picture[2] = pict[2];
  98.     /* auto detect format */
  99.     if (format == 0) {
  100.         sprintf(buf, "%s%d.Y", video_filename, picture_number);
  101.         f=fopen(buf, "r");
  102.         if (f) {
  103.             fclose(f);
  104.             format = INFMT_YUV;
  105.             goto ok;
  106.         }
  107.         sprintf(buf, "%s%d.pgm", video_filename, picture_number);
  108.         f=fopen(buf, "r");
  109.         if (f) {
  110.             fclose(f);
  111.             format = INFMT_PGM;
  112.             goto ok;
  113.         }
  114.         fprintf(stderr, "Bad file name or unknown input video formatn");
  115.         return -1;
  116.     }
  117.  ok:    
  118.     switch(format) {
  119.     case INFMT_YUV:
  120.         sprintf(buf, "%s%d.Y", video_filename, picture_number);
  121.         f=fopen(buf, "r");
  122.         if (!f) {
  123.             return -1;
  124.         }
  125.         
  126.         fread(picture[0], 1, width * height, f);
  127.         fclose(f);
  128.         
  129.         sprintf(buf, "%s%d.U", video_filename, picture_number);
  130.         f=fopen(buf, "r");
  131.         if (!f) {
  132.             perror(buf);
  133.             return -1;
  134.         }
  135.         fread(picture[1], 1, width * height / 4, f);
  136.         fclose(f);
  137.         
  138.         sprintf(buf, "%s%d.V", video_filename, picture_number);
  139.         f=fopen(buf, "r");
  140.         if (!f) {
  141.             perror(buf);
  142.             return -1;
  143.         }
  144.         fread(picture[2], 1, width * height / 4, f);
  145.         fclose(f);
  146.         break;
  147.     case INFMT_PGM:
  148.         sprintf(buf, "%s%d.pgm", video_filename, picture_number);
  149.         f=fopen(buf, "r");
  150.         if (!f) {
  151.             return -1;
  152.         }
  153.         pnm_get(f, buf1, sizeof(buf1));
  154.         if (strcmp(buf1, "P5")) {
  155.             fprintf(stderr, "%s: bad pgm filen", buf);
  156.             fclose(f);
  157.             return -1;
  158.         }
  159.         pnm_get(f, buf1, sizeof(buf1));
  160.         pnm_get(f, buf1, sizeof(buf1));
  161.         pnm_get(f, buf1, sizeof(buf1));
  162.         
  163.         fread(picture[0], 1, width * height, f);
  164.         for(i=0;i<height/2;i++) {
  165.             fread(picture[1] + i * width/2, 1, width/2, f);
  166.             fread(picture[2] + i * width/2, 1, width/2, f);
  167.         }
  168.         fclose(f);
  169.         break;
  170.     }
  171.     return 0;
  172. }
  173. static void display_stats(AVEncodeContext *video_ctx, 
  174.                           AVEncodeContext *audio_ctx,
  175.                           int batch_mode, int the_end)
  176. {
  177.     if (video_ctx && 
  178.         ((video_ctx->frame_number % video_ctx->rate) == 0 || 
  179.         the_end)) {
  180.         float ti;
  181.         
  182.         if (batch_mode) {
  183.             ti = (float)video_ctx->frame_number / video_ctx->rate;
  184.         } else {
  185.             ti = (gettime() - time_start) / 1000000.0;
  186.             if (ti < 0.1)
  187.                     ti = 0.1;
  188.         }
  189.         
  190.         fprintf(stderr,
  191.                 "frame=%5d size=%8dkB time=%0.1f fps=%4.1f bitrate=%6.1fkbits/s q=%2dr", 
  192.                 video_ctx->frame_number,
  193.                 data_out_size / 1024,
  194.                 ti,
  195.                 video_ctx->frame_number / ti,
  196.                 (data_out_size * 8 / ti / 1000),
  197.                 video_ctx->quality);
  198.         if (the_end) {
  199.             fprintf(stderr,"n");
  200.         }
  201.         fflush(stderr);
  202.     }
  203. #if 0
  204.     if (the_end && batch_mode && audio_ctx) {
  205.         duration = (gettime() - ti) / 1000000.0;
  206.         factor = 0;
  207.         if (ti > 0) {
  208.             factor = (float)nb_samples / s->sample_rate / duration;
  209.         }
  210.         fprintf(stderr, "%0.1f seconds compressed in %0.1f seconds (speed factor: %0.1f)n",
  211.                 (float)nb_samples / s->sample_rate, 
  212.                 duration,
  213.                 factor);
  214.     }
  215. #endif
  216. }
  217. void raw_write_data(void *opaque, 
  218.                     unsigned char *buf, int size)
  219. {
  220.     FILE *outfile = opaque;
  221.     fwrite(buf, 1, size, outfile);
  222.     data_out_size += size;
  223. }
  224. int raw_seek(void *opaque, long long offset, int whence)
  225. {
  226.     FILE *outfile = opaque;
  227.     fseek(outfile, offset, whence);
  228.     return 0;
  229. }
  230. static void av_encode(AVFormatContext *ctx,
  231.                       const char *video_filename,
  232.                       const char *audio_filename)
  233. {
  234.     UINT8 audio_buffer[4096];
  235.     UINT8 video_buffer[128*1024];
  236.     char buf[256];
  237.     short *samples;
  238.     int ret;
  239.     int audio_fd;
  240.     FILE *infile;
  241.     int sample_count;
  242.     int batch_mode;
  243.     AVEncodeContext *audio_enc, *video_enc;
  244.     int frame_size, frame_bytes;
  245.     AVEncoder *audio_encoder, *video_encoder;
  246.     UINT8 *picture[3];
  247.     /* audio */
  248.     audio_enc = ctx->audio_enc;
  249.     sample_count = 0;
  250.     infile = NULL;
  251.     frame_size = 0;
  252.     samples = NULL;
  253.     audio_fd = -1;
  254.     frame_bytes = 0;
  255.     batch_mode = 0;
  256.     if (audio_filename ||
  257.         video_filename)
  258.         batch_mode = 1;
  259.     
  260.     if (audio_enc) {
  261.         if (batch_mode) {
  262.             if (!audio_filename) {
  263.                 fprintf(stderr, "Must give audio input filen");
  264.                 exit(1);
  265.             }
  266.             infile = fopen(audio_filename, "r");
  267.             if (!infile) {
  268.                 fprintf(stderr, "Could not open '%s'n", audio_filename);
  269.                 exit(1);
  270.             }
  271.             audio_fd = -1;
  272.         } else {
  273.             audio_fd = audio_open(audio_enc->rate, audio_enc->channels);
  274.             if (audio_fd < 0) {
  275.                 fprintf(stderr, "Could not open audio devicen");
  276.                 exit(1);
  277.             }
  278.         }
  279.         
  280.         audio_encoder = avencoder_find(ctx->format->audio_codec);
  281.         if (avencoder_open(audio_enc, audio_encoder) < 0) {
  282.             fprintf(stderr, "Audio encoder: incorrect audio frequency or bitraten");
  283.             exit(1);
  284.         }
  285.         avencoder_string(buf, sizeof(buf), audio_enc);
  286.         fprintf(stderr, "  %sn", buf);
  287.         
  288.         frame_size = audio_enc->frame_size;
  289.         
  290.         frame_bytes = frame_size * 2 * audio_enc->channels;
  291.         samples = malloc(frame_bytes);
  292.     }
  293.     /* video */
  294.     video_enc = ctx->video_enc;
  295.     if (video_enc) {
  296.         if (batch_mode) {
  297.             if (!video_filename) {
  298.                 fprintf(stderr, "Must give video input filen");
  299.                 exit(1);
  300.             }
  301.         } else {
  302.             ret = v4l_init(video_enc->rate, video_enc->width, video_enc->height);
  303.             if (ret < 0) {
  304.                 fprintf(stderr,"Could not init video 4 linux capturen");
  305.                 exit(1);
  306.             }
  307.         }
  308.         
  309.         video_encoder = avencoder_find(ctx->format->video_codec);
  310.         if (avencoder_open(video_enc, video_encoder) < 0) {
  311.             fprintf(stderr, "Error while initializing video codecn");
  312.             exit(1);
  313.         }
  314.         avencoder_string(buf, sizeof(buf), video_enc);
  315.         fprintf(stderr, "  %sn", buf);
  316.     }
  317.     
  318.     ctx->format->write_header(ctx);
  319.     time_start = gettime();
  320.     for(;;) {
  321.         /* read & compression audio frames */
  322.         if (audio_enc) {
  323.             if (!batch_mode) {
  324.                 for(;;) {
  325.                     ret = read(audio_fd, samples, frame_bytes);
  326.                     if (ret != frame_bytes)
  327.                         break;
  328.                     ret = avencoder_encode(audio_enc,
  329.                                            audio_buffer, sizeof(audio_buffer), samples);
  330.                     ctx->format->write_audio_frame(ctx, audio_buffer, ret);
  331.                 }
  332.             } else {
  333.                 if (video_enc)
  334.                     sample_count += audio_enc->rate / video_enc->rate;
  335.                 else
  336.                     sample_count += frame_size;
  337.                 while (sample_count > frame_size) {
  338.                     if (fread(samples, 1, frame_bytes, infile) == 0)
  339.                         goto the_end;
  340.                     
  341.                     ret = avencoder_encode(audio_enc,
  342.                                            audio_buffer, sizeof(audio_buffer), samples);
  343.                     ctx->format->write_audio_frame(ctx, audio_buffer, ret);
  344.                     sample_count -= frame_size;
  345.                 }
  346.             }
  347.         }
  348.         if (video_enc) {
  349.             /* read video image */
  350.             if (batch_mode) {
  351.                 ret = file_read_picture (video_enc, picture, 
  352.                                          video_enc->width, video_enc->height, 
  353.                                          video_enc->frame_number);
  354.             } else {
  355.                 ret = v4l_read_picture (picture, 
  356.                                         video_enc->width, video_enc->height, 
  357.                                         video_enc->frame_number);
  358.             }
  359.             if (ret < 0)
  360.                 break;
  361.             ret = avencoder_encode(video_enc, video_buffer, sizeof(video_buffer), picture);
  362.             ctx->format->write_video_picture(ctx, video_buffer, ret);
  363.         }
  364.         
  365.         display_stats(video_enc, NULL, batch_mode, 0);
  366.         if (video_enc && video_enc->frame_number >= nb_frames)
  367.             break;
  368.     }
  369.  the_end:
  370.     display_stats(video_enc, NULL, batch_mode, 1);
  371.     if (video_enc)
  372.         avencoder_close(video_enc);
  373.     if (audio_enc)
  374.         avencoder_close(audio_enc);
  375.     
  376.     ctx->format->write_trailer(ctx);
  377.     if (!infile) {
  378.         close(audio_fd);
  379.     } else {
  380.         fclose(infile);
  381.     }
  382. }
  383. typedef struct {
  384.     const char *str;
  385.     int width, height;
  386. } SizeEntry;
  387. SizeEntry sizes[] = {
  388.     { "sqcif", 128, 96 },
  389.     { "qcif", 176, 144 },
  390.     { "cif", 352, 288 },
  391.     { "4cif", 704, 576 },
  392. };
  393.     
  394. enum {
  395.     OPT_AR=256,
  396.     OPT_AB,
  397.     OPT_AN,
  398.     OPT_AC,
  399.     OPT_VN,
  400.     OPT_AD,
  401.     OPT_HQ,
  402. };
  403. struct option long_options[] =
  404. {
  405.     { "ar", required_argument, NULL, OPT_AR },
  406.     { "ab", required_argument, NULL, OPT_AB },
  407.     { "an", no_argument, NULL, OPT_AN },
  408.     { "ac", required_argument, NULL, OPT_AC },
  409.     { "vn", no_argument, NULL, OPT_VN },
  410.     { "ad", required_argument, NULL, OPT_AD },
  411.     { "hq", no_argument, NULL, OPT_HQ },
  412. };
  413. enum {
  414.     OUT_FILE,
  415.     OUT_PIPE,
  416.     OUT_UDP,
  417. };
  418. void help(void)
  419. {
  420.     AVFormat *f;
  421.     printf("ffmpeg version " FFMPEG_VERSION ", Copyright (c) 2000,2001 Gerard Lantaun"
  422.            "usage: ffmpeg [options] outfile [video_infile] [audio_infile]n"
  423.            "Hyper fast MPEG1/MPEG4/H263/RV and AC3/MPEG audio layer 2 encodern"
  424.            "n"
  425.            "Main options are:n"
  426.            "n"
  427.            "-L           print the LICENSEn"
  428.            "-s size      set frame size                       [%dx%d]n"
  429.            "-f format    set encoding format                  [guessed]n"
  430.            "-r fps       set frame rate                       [%d]n"
  431.            "-b bitrate   set the total bitrate in kbit/s      [%d]n"
  432.            "-t time      set recording time in seconds        [%0.1f]n"
  433.            "-ar freq     set the audio sampling freq          [%d]n"
  434.            "-ab bitrate  set the audio bitrate in kbit/s      [%d]n"
  435.            "-ac channels set the number of audio channels     [%d]n"
  436.            "-an          disable audio recording              [%s]n"
  437.            "-vn          disable video recording              [%s]n"
  438.            "-hq          high quality mode (non real time)    [%s]n"
  439.            "n"
  440.            "Frame sizes abbreviations: sqcif qcif cif 4cifn",
  441.            frame_width, frame_height,
  442.            frame_rate,
  443.            bit_rate / 1000,
  444.            recording_time,
  445.            audio_freq,
  446.            audio_bit_rate / 1000,
  447.            audio_channels,
  448.            audio_disable ? "yes" : "no",
  449.            video_disable ? "yes" : "no",
  450.            high_quality ? "yes" : "no");
  451.     printf("Encoding video formats:");
  452.     for(f = first_format; f != NULL; f = f->next)
  453.         printf(" %s", f->name);
  454.     printf("n");
  455.     printf("outfile can be a file name, - (pipe) or 'udp:host:port'n"
  456.            "n"
  457.            "Advanced options are:n"
  458.            "-d device    set video4linux device name          [%s]n"
  459.            "-ad device   set audio device name                [%s]n"
  460.            "-g gop_size  set the group of picture size        [%d]n"
  461.            "-i           use only intra frames                [%s]n"
  462.            "-c comment   set the comment stringn"
  463.            "n",
  464.            v4l_device,
  465.            audio_device,
  466.            gop_size,
  467.            intra_only ? "yes" : "no");
  468. }
  469. void licence(void)
  470. {
  471.     printf(
  472.     "ffmpeg version " FFMPEG_VERSION "n"
  473.     "Copyright (c) 2000,2001 Gerard Lantaun"
  474.     "This program is free software; you can redistribute it and/or modifyn"
  475.     "it under the terms of the GNU General Public License as published byn"
  476.     "the Free Software Foundation; either version 2 of the License, orn"
  477.     "(at your option) any later version.n"
  478.     "n"
  479.     "This program is distributed in the hope that it will be useful,n"
  480.     "but WITHOUT ANY WARRANTY; without even the implied warranty ofn"
  481.     "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See then"
  482.     "GNU General Public License for more details.n"
  483.     "n"
  484.     "You should have received a copy of the GNU General Public Licensen"
  485.     "along with this program; if not, write to the Free Softwaren"
  486.     "Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.n"
  487.     );
  488. }
  489. static unsigned char output_buffer[32768];
  490. int main(int argc, char **argv)
  491. {
  492.     AVEncodeContext video_enc1, *video_enc = &video_enc1;
  493.     AVEncodeContext audio_enc1, *audio_enc = &audio_enc1;
  494.     UDPContext udp_ctx1, *udp_ctx = &udp_ctx1;
  495.     AVFormatContext av_ctx1, *av_ctx = &av_ctx1;
  496.     FILE *outfile;
  497.     int i, c;
  498.     char *filename;
  499.     int output_type;
  500.     int use_video, use_audio;
  501.     register_avencoder(&ac3_encoder);
  502.     register_avencoder(&mp2_encoder);
  503.     register_avencoder(&mpeg1video_encoder);
  504.     register_avencoder(&h263_encoder);
  505.     register_avencoder(&rv10_encoder);
  506.     register_avencoder(&mjpeg_encoder);
  507.     register_avencoder(&divx_encoder);
  508.     register_avformat(&mp2_format);
  509.     register_avformat(&ac3_format);
  510.     register_avformat(&mpeg1video_format);
  511.     register_avformat(&h263_format);
  512.     register_avformat(&mpeg_mux_format);
  513.     register_avformat(&ra_format);
  514.     register_avformat(&rm_format);
  515.     register_avformat(&asf_format);
  516.     register_avformat(&avi_format);
  517.     register_avformat(&mpjpeg_format);
  518.     register_avformat(&swf_format);
  519.     file_format = NULL;
  520.     
  521.     for(;;) {
  522.         c = getopt_long_only(argc, argv, "s:f:r:b:t:hd:g:ic:L", 
  523.                              long_options, NULL);
  524.         if (c == -1)
  525.             break;
  526.         switch(c) {
  527.         case 'L':
  528.             licence();
  529.             exit(1);
  530.         case 'h':
  531.             help();
  532.             exit(1);
  533.         case 's':
  534.             {
  535.                 int n = sizeof(sizes) / sizeof(SizeEntry);
  536.                 const char *p;
  537.                 for(i=0;i<n;i++) {
  538.                     if (!strcmp(sizes[i].str, optarg)) {
  539.                         frame_width = sizes[i].width;
  540.                         frame_height = sizes[i].height;
  541.                         break;
  542.                     }
  543.                 }
  544.                 if (i == n) {
  545.                     p = optarg;
  546.                     frame_width = strtol(p, (char **)&p, 10);
  547.                     if (*p)
  548.                         p++;
  549.                     frame_height = strtol(p, (char **)&p, 10);
  550.                 }
  551.             }
  552.             break;
  553.         case 'f':
  554.             {
  555.                 AVFormat *f;
  556.                 f = first_format;
  557.                 while (f != NULL && strcmp(f->name, optarg) != 0) f = f->next;
  558.                 if (f == NULL) {
  559.                     fprintf(stderr, "Invalid format: %sn", optarg);
  560.                     exit(1);
  561.                 }
  562.                 file_format = f;
  563.             }
  564.             break;
  565.         case 'r':
  566.             {
  567.                 frame_rate = atoi(optarg);
  568.             }
  569.             break;
  570.         case 'b':
  571.             {
  572.                 bit_rate = atoi(optarg) * 1000;
  573.             }
  574.             break;
  575.         case 't':
  576.             {
  577.                 recording_time = atof(optarg);
  578.                 break;
  579.             }
  580.             /* audio specific */
  581.         case OPT_AR:
  582.             {
  583.                 audio_freq = atoi(optarg);
  584.                 break;
  585.             }
  586.         case OPT_AB:
  587.             {
  588.                 audio_bit_rate = atoi(optarg) * 1000;
  589.                 break;
  590.             }
  591.         case OPT_AN:
  592.             audio_disable = 1;
  593.             break;
  594.         case OPT_VN:
  595.             video_disable = 1;
  596.             break;
  597.         case OPT_AC:
  598.             {
  599.                 audio_channels = atoi(optarg);
  600.                 if (audio_channels != 1 && 
  601.                     audio_channels != 2) {
  602.                     fprintf(stderr, "Incorrect number of channels: %dn", audio_channels);
  603.                     exit(1);
  604.                 }
  605.             }
  606.             break;
  607.         case OPT_HQ:
  608.             high_quality = 1;
  609.             break;
  610.             /* advanced options */
  611.         case 'd':
  612.             v4l_device = optarg;
  613.             break;
  614.         case OPT_AD:
  615.             audio_device = optarg;
  616.             break;
  617.         case 'g':
  618.             gop_size = atoi(optarg);
  619.             break;
  620.         case 'i':
  621.             intra_only = 1;
  622.             break;
  623.         case 'c':
  624.             comment_string = optarg;
  625.             break;
  626.         default:
  627.             exit(2);
  628.         }
  629.     }
  630.     if (optind >= argc) {
  631.         help();
  632.         exit(1);
  633.     }
  634.     filename = argv[optind++];
  635.     video_filename = NULL;
  636.     audio_filename = NULL;
  637.     /* auto detect format */
  638.     if (file_format == NULL)
  639.         file_format = guess_format(NULL, filename, NULL);
  640.     if (file_format == NULL)
  641.         file_format = &mpeg_mux_format;
  642.     /* check parameters */
  643.     if (frame_width <= 0 || frame_height <= 0) {
  644.         fprintf(stderr, "Incorrect frame sizen");
  645.         exit(1);
  646.     }
  647.     if ((frame_width % 16) != 0 || (frame_height % 16) != 0) {
  648.         fprintf(stderr, "Frame size must be a multiple of 16n");
  649.         exit(1);
  650.     }
  651.     
  652.     if (bit_rate < 5000 || bit_rate >= 10000000) {
  653.         fprintf(stderr, "Invalid bit raten");
  654.         exit(1);
  655.     }
  656.     if (frame_rate < 1 || frame_rate >= 60) {
  657.         fprintf(stderr, "Invalid frame raten");
  658.         exit(1);
  659.     }
  660.     nb_frames = (int)(recording_time * frame_rate);
  661.     if (nb_frames < 1) {
  662.         fprintf(stderr, "Invalid recording timen");
  663.         exit(1);
  664.     }
  665.     use_video = file_format->video_codec != CODEC_ID_NONE;
  666.     use_audio = file_format->audio_codec != CODEC_ID_NONE;
  667.     if (audio_disable) {
  668.         use_audio = 0;
  669.     }
  670.     if (video_disable) {
  671.         use_video = 0;
  672.     }
  673.         
  674.     if (use_video == 0 && use_audio == 0) {
  675.         fprintf(stderr, "No audio or video selectedn");
  676.         exit(1);
  677.     }
  678.     fprintf(stderr, "Recording: %s, %0.1f secondsn",
  679.             file_format->name, 
  680.             recording_time);
  681.     /* open output media */
  682.     if (strstart(filename, "udp:", NULL)) {
  683.         output_type = OUT_UDP;
  684.         outfile = NULL;
  685.         memset(udp_ctx, 0, sizeof(*udp_ctx));
  686.         if (udp_tx_open(udp_ctx, filename, 0) < 0) {
  687.             fprintf(stderr, "Could not open UDP socketn");
  688.             exit(1);
  689.         }
  690.     } else if (!strcmp(filename, "-")) {
  691.         output_type = OUT_PIPE;
  692.         outfile = stdout;
  693.     } else {
  694.         output_type = OUT_FILE;
  695.         outfile = fopen(filename, "w");
  696.         if (!outfile) {
  697.             perror(filename);
  698.             exit(1);
  699.         }
  700.     }
  701.     av_ctx->video_enc = NULL;
  702.     av_ctx->audio_enc = NULL;
  703.     if (output_type == OUT_UDP) {
  704.         init_put_byte(&av_ctx->pb, output_buffer, sizeof(output_buffer),
  705.                       udp_ctx, udp_write_data, NULL);
  706.     } else {
  707.         init_put_byte(&av_ctx->pb, output_buffer, sizeof(output_buffer),
  708.                       outfile, raw_write_data, raw_seek);
  709.     }
  710.     if (use_video) {
  711.         if (optind < argc) {
  712.             video_filename = argv[optind++];
  713.         }
  714.         /* init mpeg video encoding context */
  715.         memset(video_enc, 0, sizeof(*video_enc));
  716.         video_enc->bit_rate = bit_rate;
  717.         video_enc->rate = frame_rate; 
  718.         video_enc->width = frame_width;
  719.         video_enc->height = frame_height;
  720.         if (!intra_only)
  721.             video_enc->gop_size = gop_size;
  722.         else
  723.             video_enc->gop_size = 0;
  724.         if (high_quality)
  725.             video_enc->flags |= CODEC_FLAG_HQ;
  726.         av_ctx->video_enc = video_enc;
  727.         av_ctx->format = file_format;
  728.     }
  729.     if (use_audio) {
  730.         if (optind < argc) {
  731.             audio_filename = argv[optind++];
  732.         }
  733.         audio_enc->bit_rate = audio_bit_rate;
  734.         audio_enc->rate = audio_freq;
  735.         audio_enc->channels = audio_channels;
  736.         av_ctx->audio_enc = audio_enc;
  737.     }
  738.     av_ctx->format = file_format;
  739.     av_ctx->is_streamed = 0;
  740.     av_encode(av_ctx, video_filename, audio_filename);
  741.     /* close output media */
  742.     switch(output_type) {
  743.     case OUT_FILE:
  744.         fclose(outfile);
  745.         break;
  746.     case OUT_PIPE:
  747.         break;
  748.     case OUT_UDP:
  749.         udp_tx_close(udp_ctx);
  750.         break;
  751.     }
  752.     fprintf(stderr, "n");
  753.     
  754.     return 0;
  755. }
  756.