Recherche avancée

Médias (1)

Mot : - Tags -/publishing

Autres articles (61)

  • Ecrire une actualité

    21 juin 2013, par

    Présentez les changements dans votre MédiaSPIP ou les actualités de vos projets sur votre MédiaSPIP grâce à la rubrique actualités.
    Dans le thème par défaut spipeo de MédiaSPIP, les actualités sont affichées en bas de la page principale sous les éditoriaux.
    Vous pouvez personnaliser le formulaire de création d’une actualité.
    Formulaire de création d’une actualité Dans le cas d’un document de type actualité, les champs proposés par défaut sont : Date de publication ( personnaliser la date de publication ) (...)

  • Les autorisations surchargées par les plugins

    27 avril 2010, par

    Mediaspip core
    autoriser_auteur_modifier() afin que les visiteurs soient capables de modifier leurs informations sur la page d’auteurs

  • List of compatible distributions

    26 avril 2011, par

    The table below is the list of Linux distributions compatible with the automated installation script of MediaSPIP. Distribution nameVersion nameVersion number Debian Squeeze 6.x.x Debian Weezy 7.x.x Debian Jessie 8.x.x Ubuntu The Precise Pangolin 12.04 LTS Ubuntu The Trusty Tahr 14.04
    If you want to help us improve this list, you can provide us access to a machine whose distribution is not mentioned above or send the necessary fixes to add (...)

Sur d’autres sites (8775)

  • How to catch stdout stream in ffmpeg then pipe it to v4l2loopback

    29 août 2015, par Tveitan

    I’m trying to pipe my h264 stream to ffmpeg and then to my v4l2loopback device. Problem is that I’m fairly new to linux, so just can’t get it working.
    The stream can be outputted to stdout, but I do not know how to catch it again with ffmpeg and then again pipe it to my v4l2loopback device.

    Does anybody know how this could be done or maybe a pointer on how to solve it ?

    This is the capture program :

    PS ! You can find the options for the capture program almost in the bottom of the code.

    /*
    *  V4L2 video capture example, modified by Derek Molloy for the Logitech C920 camera
    *  Modifications, added the -F mode for H264 capture and associated help detail
    *  www.derekmolloy.ie
    *
    *  V4L2 video capture example
    *
    *  This program can be used and distributed without restrictions.
    *
    *      This program is provided with the V4L2 API
    * see http://linuxtv.org/docs.php for more information
    */

    #include
    #include
    #include
    #include

    #include              /* getopt_long() */

    #include               /* low-level i/o */
    #include
    #include
    #include <sys></sys>stat.h>
    #include <sys></sys>types.h>
    #include <sys></sys>time.h>
    #include <sys></sys>mman.h>
    #include <sys></sys>ioctl.h>

    #include <linux></linux>videodev2.h>

    #define CLEAR(x) memset(&amp;(x), 0, sizeof(x))

    enum io_method {
           IO_METHOD_READ,
           IO_METHOD_MMAP,
           IO_METHOD_USERPTR,
    };

    struct buffer {
           void   *start;
           size_t  length;
    };

    static char            *dev_name;
    static enum io_method   io = IO_METHOD_MMAP;
    static int              fd = -1;
    struct buffer          *buffers;
    static unsigned int     n_buffers;
    static int              out_buf;
    static int              force_format = 0;
    static int              frame_count = 100;

    static void errno_exit(const char *s)
    {
           fprintf(stderr, "%s error %d, %s\n", s, errno, strerror(errno));
           exit(EXIT_FAILURE);
    }

    static int xioctl(int fh, int request, void *arg)
    {
           int r;

           do {
                   r = ioctl(fh, request, arg);
           } while (-1 == r &amp;&amp; EINTR == errno);

           return r;
    }

    static void process_image(const void *p, int size)
    {
           if (out_buf)
                   fwrite(p, size, 1, stdout);

           fflush(stderr);
           fprintf(stderr, ".");
           fflush(stdout);
    }

    static int read_frame(void)
    {
           struct v4l2_buffer buf;
           unsigned int i;

           switch (io) {
           case IO_METHOD_READ:
                   if (-1 == read(fd, buffers[0].start, buffers[0].length)) {
                           switch (errno) {
                           case EAGAIN:
                                   return 0;

                           case EIO:
                                   /* Could ignore EIO, see spec. */

                                   /* fall through */

                           default:
                                   errno_exit("read");
                           }
                   }

                   process_image(buffers[0].start, buffers[0].length);
                   break;

           case IO_METHOD_MMAP:
                   CLEAR(buf);

                   buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                   buf.memory = V4L2_MEMORY_MMAP;

                   if (-1 == xioctl(fd, VIDIOC_DQBUF, &amp;buf)) {
                           switch (errno) {
                           case EAGAIN:
                                   return 0;

                           case EIO:
                                   /* Could ignore EIO, see spec. */

                                   /* fall through */

                           default:
                                   errno_exit("VIDIOC_DQBUF");
                           }
                   }

                   assert(buf.index &lt; n_buffers);

                   process_image(buffers[buf.index].start, buf.bytesused);

                   if (-1 == xioctl(fd, VIDIOC_QBUF, &amp;buf))
                           errno_exit("VIDIOC_QBUF");
                   break;

           case IO_METHOD_USERPTR:
                   CLEAR(buf);

                   buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                   buf.memory = V4L2_MEMORY_USERPTR;

                   if (-1 == xioctl(fd, VIDIOC_DQBUF, &amp;buf)) {
                           switch (errno) {
                           case EAGAIN:
                                   return 0;

                           case EIO:
                                   /* Could ignore EIO, see spec. */

                                   /* fall through */

                           default:
                                   errno_exit("VIDIOC_DQBUF");
                           }
                   }

                   for (i = 0; i &lt; n_buffers; ++i)
                           if (buf.m.userptr == (unsigned long)buffers[i].start
                               &amp;&amp; buf.length == buffers[i].length)
                                   break;

                   assert(i &lt; n_buffers);

                   process_image((void *)buf.m.userptr, buf.bytesused);

                   if (-1 == xioctl(fd, VIDIOC_QBUF, &amp;buf))
                           errno_exit("VIDIOC_QBUF");
                   break;
           }

           return 1;
    }

    static void mainloop(void)
    {
           unsigned int count;
       unsigned int loopIsInfinite = 0;

           if (frame_count == 0) loopIsInfinite = 1; //infinite loop
       count = frame_count;

           while ((count-- > 0) || loopIsInfinite) {
                   for (;;) {
                           fd_set fds;
                           struct timeval tv;
                           int r;

                           FD_ZERO(&amp;fds);
                           FD_SET(fd, &amp;fds);

                           /* Timeout. */
                           tv.tv_sec = 2;
                           tv.tv_usec = 0;

                           r = select(fd + 1, &amp;fds, NULL, NULL, &amp;tv);

                           if (-1 == r) {
                                   if (EINTR == errno)
                                           continue;
                                   errno_exit("select");
                           }

                           if (0 == r) {
                                   fprintf(stderr, "select timeout\n");
                                   exit(EXIT_FAILURE);
                           }

                           if (read_frame())
                                   break;
                           /* EAGAIN - continue select loop. */
                   }
           }
    }

    static void stop_capturing(void)
    {
           enum v4l2_buf_type type;

           switch (io) {
           case IO_METHOD_READ:
                   /* Nothing to do. */
                   break;

           case IO_METHOD_MMAP:
           case IO_METHOD_USERPTR:
                   type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                   if (-1 == xioctl(fd, VIDIOC_STREAMOFF, &amp;type))
                           errno_exit("VIDIOC_STREAMOFF");
                   break;
           }
    }

    static void start_capturing(void)
    {
           unsigned int i;
           enum v4l2_buf_type type;

           switch (io) {
           case IO_METHOD_READ:
                   /* Nothing to do. */
                   break;

           case IO_METHOD_MMAP:
                   for (i = 0; i &lt; n_buffers; ++i) {
                           struct v4l2_buffer buf;

                           CLEAR(buf);
                           buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                           buf.memory = V4L2_MEMORY_MMAP;
                           buf.index = i;

                           if (-1 == xioctl(fd, VIDIOC_QBUF, &amp;buf))
                                   errno_exit("VIDIOC_QBUF");
                   }
                   type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                   if (-1 == xioctl(fd, VIDIOC_STREAMON, &amp;type))
                           errno_exit("VIDIOC_STREAMON");
                   break;

           case IO_METHOD_USERPTR:
                   for (i = 0; i &lt; n_buffers; ++i) {
                           struct v4l2_buffer buf;

                           CLEAR(buf);
                           buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                           buf.memory = V4L2_MEMORY_USERPTR;
                           buf.index = i;
                           buf.m.userptr = (unsigned long)buffers[i].start;
                           buf.length = buffers[i].length;

                           if (-1 == xioctl(fd, VIDIOC_QBUF, &amp;buf))
                                   errno_exit("VIDIOC_QBUF");
                   }
                   type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                   if (-1 == xioctl(fd, VIDIOC_STREAMON, &amp;type))
                           errno_exit("VIDIOC_STREAMON");
                   break;
           }
    }

    static void uninit_device(void)
    {
           unsigned int i;

           switch (io) {
           case IO_METHOD_READ:
                   free(buffers[0].start);
                   break;

           case IO_METHOD_MMAP:
                   for (i = 0; i &lt; n_buffers; ++i)
                           if (-1 == munmap(buffers[i].start, buffers[i].length))
                                   errno_exit("munmap");
                   break;

           case IO_METHOD_USERPTR:
                   for (i = 0; i &lt; n_buffers; ++i)
                           free(buffers[i].start);
                   break;
           }

           free(buffers);
    }

    static void init_read(unsigned int buffer_size)
    {
           buffers = calloc(1, sizeof(*buffers));

           if (!buffers) {
                   fprintf(stderr, "Out of memory\n");
                   exit(EXIT_FAILURE);
           }

           buffers[0].length = buffer_size;
           buffers[0].start = malloc(buffer_size);

           if (!buffers[0].start) {
                   fprintf(stderr, "Out of memory\n");
                   exit(EXIT_FAILURE);
           }
    }

    static void init_mmap(void)
    {
           struct v4l2_requestbuffers req;

           CLEAR(req);

           req.count = 4;
           req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
           req.memory = V4L2_MEMORY_MMAP;

           if (-1 == xioctl(fd, VIDIOC_REQBUFS, &amp;req)) {
                   if (EINVAL == errno) {
                           fprintf(stderr, "%s does not support "
                                    "memory mapping\n", dev_name);
                           exit(EXIT_FAILURE);
                   } else {
                           errno_exit("VIDIOC_REQBUFS");
                   }
           }

           if (req.count &lt; 2) {
                   fprintf(stderr, "Insufficient buffer memory on %s\n",
                            dev_name);
                   exit(EXIT_FAILURE);
           }

           buffers = calloc(req.count, sizeof(*buffers));

           if (!buffers) {
                   fprintf(stderr, "Out of memory\n");
                   exit(EXIT_FAILURE);
           }

           for (n_buffers = 0; n_buffers &lt; req.count; ++n_buffers) {
                   struct v4l2_buffer buf;

                   CLEAR(buf);

                   buf.type        = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                   buf.memory      = V4L2_MEMORY_MMAP;
                   buf.index       = n_buffers;

                   if (-1 == xioctl(fd, VIDIOC_QUERYBUF, &amp;buf))
                           errno_exit("VIDIOC_QUERYBUF");

                   buffers[n_buffers].length = buf.length;
                   buffers[n_buffers].start =
                           mmap(NULL /* start anywhere */,
                                 buf.length,
                                 PROT_READ | PROT_WRITE /* required */,
                                 MAP_SHARED /* recommended */,
                                 fd, buf.m.offset);

                   if (MAP_FAILED == buffers[n_buffers].start)
                           errno_exit("mmap");
           }
    }

    static void init_userp(unsigned int buffer_size)
    {
           struct v4l2_requestbuffers req;

           CLEAR(req);

           req.count  = 4;
           req.type   = V4L2_BUF_TYPE_VIDEO_CAPTURE;
           req.memory = V4L2_MEMORY_USERPTR;

           if (-1 == xioctl(fd, VIDIOC_REQBUFS, &amp;req)) {
                   if (EINVAL == errno) {
                           fprintf(stderr, "%s does not support "
                                    "user pointer i/o\n", dev_name);
                           exit(EXIT_FAILURE);
                   } else {
                           errno_exit("VIDIOC_REQBUFS");
                   }
           }

           buffers = calloc(4, sizeof(*buffers));

           if (!buffers) {
                   fprintf(stderr, "Out of memory\n");
                   exit(EXIT_FAILURE);
           }

           for (n_buffers = 0; n_buffers &lt; 4; ++n_buffers) {
                   buffers[n_buffers].length = buffer_size;
                   buffers[n_buffers].start = malloc(buffer_size);

                   if (!buffers[n_buffers].start) {
                           fprintf(stderr, "Out of memory\n");
                           exit(EXIT_FAILURE);
                   }
           }
    }

    static void init_device(void)
    {
           struct v4l2_capability cap;
           struct v4l2_cropcap cropcap;
           struct v4l2_crop crop;
           struct v4l2_format fmt;
           unsigned int min;

           if (-1 == xioctl(fd, VIDIOC_QUERYCAP, &amp;cap)) {
                   if (EINVAL == errno) {
                           fprintf(stderr, "%s is no V4L2 device\n",
                                    dev_name);
                           exit(EXIT_FAILURE);
                   } else {
                           errno_exit("VIDIOC_QUERYCAP");
                   }
           }

           if (!(cap.capabilities &amp; V4L2_CAP_VIDEO_CAPTURE)) {
                   fprintf(stderr, "%s is no video capture device\n",
                            dev_name);
                   exit(EXIT_FAILURE);
           }

           switch (io) {
           case IO_METHOD_READ:
                   if (!(cap.capabilities &amp; V4L2_CAP_READWRITE)) {
                           fprintf(stderr, "%s does not support read i/o\n",
                                    dev_name);
                           exit(EXIT_FAILURE);
                   }
                   break;

           case IO_METHOD_MMAP:
           case IO_METHOD_USERPTR:
                   if (!(cap.capabilities &amp; V4L2_CAP_STREAMING)) {
                           fprintf(stderr, "%s does not support streaming i/o\n",
                                    dev_name);
                           exit(EXIT_FAILURE);
                   }
                   break;
           }


           /* Select video input, video standard and tune here. */


           CLEAR(cropcap);

           cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

           if (0 == xioctl(fd, VIDIOC_CROPCAP, &amp;cropcap)) {
                   crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                   crop.c = cropcap.defrect; /* reset to default */

                   if (-1 == xioctl(fd, VIDIOC_S_CROP, &amp;crop)) {
                           switch (errno) {
                           case EINVAL:
                                   /* Cropping not supported. */
                                   break;
                           default:
                                   /* Errors ignored. */
                                   break;
                           }
                   }
           } else {
                   /* Errors ignored. */
           }


           CLEAR(fmt);

           fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
       fprintf(stderr, "Force Format %d\n", force_format);
           if (force_format) {
           if (force_format==2){
                       fmt.fmt.pix.width       = 1920;    
                   fmt.fmt.pix.height      = 1080;  
               fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_H264;
                       fmt.fmt.pix.field       = V4L2_FIELD_INTERLACED;
           }
           else if(force_format==1){
               fmt.fmt.pix.width   = 640;
               fmt.fmt.pix.height  = 480;
               fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
               fmt.fmt.pix.field   = V4L2_FIELD_INTERLACED;
           }

                   if (-1 == xioctl(fd, VIDIOC_S_FMT, &amp;fmt))
                           errno_exit("VIDIOC_S_FMT");

                   /* Note VIDIOC_S_FMT may change width and height. */
           } else {
                   /* Preserve original settings as set by v4l2-ctl for example */
                   if (-1 == xioctl(fd, VIDIOC_G_FMT, &amp;fmt))
                           errno_exit("VIDIOC_G_FMT");
           }

           /* Buggy driver paranoia. */
           min = fmt.fmt.pix.width * 2;
           if (fmt.fmt.pix.bytesperline &lt; min)
                   fmt.fmt.pix.bytesperline = min;
           min = fmt.fmt.pix.bytesperline * fmt.fmt.pix.height;
           if (fmt.fmt.pix.sizeimage &lt; min)
                   fmt.fmt.pix.sizeimage = min;

           switch (io) {
           case IO_METHOD_READ:
                   init_read(fmt.fmt.pix.sizeimage);
                   break;

           case IO_METHOD_MMAP:
                   init_mmap();
                   break;

           case IO_METHOD_USERPTR:
                   init_userp(fmt.fmt.pix.sizeimage);
                   break;
           }
    }

    static void close_device(void)
    {
           if (-1 == close(fd))
                   errno_exit("close");

           fd = -1;
    }

    static void open_device(void)
    {
           struct stat st;

           if (-1 == stat(dev_name, &amp;st)) {
                   fprintf(stderr, "Cannot identify '%s': %d, %s\n",
                            dev_name, errno, strerror(errno));
                   exit(EXIT_FAILURE);
           }

           if (!S_ISCHR(st.st_mode)) {
                   fprintf(stderr, "%s is no device\n", dev_name);
                   exit(EXIT_FAILURE);
           }

           fd = open(dev_name, O_RDWR /* required */ | O_NONBLOCK, 0);

           if (-1 == fd) {
                   fprintf(stderr, "Cannot open '%s': %d, %s\n",
                            dev_name, errno, strerror(errno));
                   exit(EXIT_FAILURE);
           }
    }

    static void usage(FILE *fp, int argc, char **argv)
    {
           fprintf(fp,
                    "Usage: %s [options]\n\n"
                    "Version 1.3\n"
                    "Options:\n"
                    "-d | --device name   Video device name [%s]\n"
                    "-h | --help          Print this message\n"
                    "-m | --mmap          Use memory mapped buffers [default]\n"
                    "-r | --read          Use read() calls\n"
                    "-u | --userp         Use application allocated buffers\n"
                    "-o | --output        Outputs stream to stdout\n"
                    "-f | --format        Force format to 640x480 YUYV\n"
            "-F | --formatH264    Force format to 1920x1080 H264\n"
                    "-c | --count         Number of frames to grab [%i] - use 0 for infinite\n"
                    "\n"
            "Example usage: capture -F -o -c 300 > output.raw\n"
            "Captures 300 frames of H264 at 1920x1080 - use raw2mpg4 script to convert to mpg4\n",
                    argv[0], dev_name, frame_count);
    }

    static const char short_options[] = "d:hmruofFc:";

    static const struct option
    long_options[] = {
           { "device", required_argument, NULL, 'd' },
           { "help",   no_argument,       NULL, 'h' },
           { "mmap",   no_argument,       NULL, 'm' },
           { "read",   no_argument,       NULL, 'r' },
           { "userp",  no_argument,       NULL, 'u' },
           { "output", no_argument,       NULL, 'o' },
           { "format", no_argument,       NULL, 'f' },
       { "formatH264", no_argument,   NULL, 'F' },
           { "count",  required_argument, NULL, 'c' },
           { 0, 0, 0, 0 }
    };

    int main(int argc, char **argv)
    {
           dev_name = "/dev/video0";

           for (;;) {
                   int idx;
                   int c;

                   c = getopt_long(argc, argv,
                                   short_options, long_options, &amp;idx);

                   if (-1 == c)
                           break;

                   switch (c) {
                   case 0: /* getopt_long() flag */
                           break;

                   case 'd':
                           dev_name = optarg;
                           break;

                   case 'h':
                           usage(stdout, argc, argv);
                           exit(EXIT_SUCCESS);

                   case 'm':
                           io = IO_METHOD_MMAP;
                           break;

                   case 'r':
                           io = IO_METHOD_READ;
                           break;

                   case 'u':
                           io = IO_METHOD_USERPTR;
                           break;

                   case 'o':
                           out_buf++;
                           break;

                   case 'f':
                           force_format=1;
                           break;

           case 'F':
               force_format=2;
               break;

                   case 'c':
                           errno = 0;
                           frame_count = strtol(optarg, NULL, 0);
                           if (errno)
                                   errno_exit(optarg);
                           break;

                   default:
                           usage(stderr, argc, argv);
                           exit(EXIT_FAILURE);
                   }
           }

           open_device();
           init_device();
           start_capturing();
           mainloop();
           stop_capturing();
           uninit_device();
           close_device();
           fprintf(stderr, "\n");
           return 0;
    }

    It’s a modified version of a V4L2 video capture example.
    Then I know that if I have outputed the streame to a file I would have to run this command to convert the raw format to mp4 format :

    ffmpeg -f h264 -i output.raw -vcodec copy output.mp4

    And the v4l2loopback program I’m using is foud here :
    https://github.com/umlaeute/v4l2loopback

    ------------------Update------------------

    Okay. So I got the pipe from the capture program to ffmpeg working. It captures, decodes the h264 and I can write it to a mp4 file with this command :

    ./capture -F -d /dev/video0 -o | ffmpeg -f h264 -i - -vcodec copy out.mp4

    Now I am trying to get the last pipe working with this command :

    ./capture -F -d /dev/video0 -o | ffmpeg -f h264 -i - -vcodec copy -f mp4 - | gst-launch-0.10 -v fdsrc ! v4l2sink device=/dev/video3

    I get these errors :

    • muxer does not support non seekable output
    • Could not write header for output file #0 (incorrect codec parameters ?) : Invalid argument

    Any ideas ?

  • EC2 for video-encoding

    24 septembre 2012, par TK Kocheran

    I have a potential job which will require me to do some video encoding with FFMPEG and x264. I'll have a series of files which I'll need to encode once, then I'll be able to bring down the instances. Since I'm not really sure of the resource utilization of x264 and FFMPEG, what kind of instances should I get ? I'm thinking either a

    High-CPU Extra Large Instance

    7 GB of memory
    20 EC2 Compute Units (8 virtual cores with 2.5 EC2 Compute Units each)
    1690 GB of instance storage
    64-bit platform
    I/O Performance : High
    API name : c1.xlarge

    or, alternatively a

    Cluster GPU Quadruple Extra Large Instance

    22 GB of memory
    33.5 EC2 Compute Units (2 x Intel Xeon X5570, quad-core “Nehalem” architecture)
    2 x NVIDIA Tesla “Fermi” M2050 GPUs
    1690 GB of instance storage
    64-bit platform
    I/O Performance : Very High (10 Gigabit Ethernet)
    API name : cg1.4xlarge

    What should I use ? Does x264/FFMPEG perform better with faster/more CPUs or does it really pound the GPU more ? In any case, it seems that the Cluster GPU seems to be the higher performance instance. What should I prefer ?

  • Decode audio using libavcodec and play using libAO ?

    21 mars 2012, par Ashika Umanga Umagiliya

    I use following code snippet to decode audio files (tested with MP3,WAV,WMV).

    But when it plays the audio , it just gives static sounds and crashes time to time.
    Any hints on what i am doing wrong here ?

    #include
    #include
    #include
    #include


    extern "C" {
    #include "libavutil/mathematics.h"
    #include "libavformat/avformat.h"
    #include "libswscale/swscale.h"
    #include <ao></ao>ao.h>

    }

    void die(const char *msg)
    {
       fprintf(stderr,"%s\n",msg);
       exit(1);
    }

    int main(int argc, char **argv)
    {

       const char* input_filename=argv[1];

       //avcodec_register_all();
       av_register_all();
       //av_ini

       AVFormatContext* container=avformat_alloc_context();
       if(avformat_open_input(&amp;container,input_filename,NULL,NULL)&lt;0){
           die("Could not open file");
       }

       if(av_find_stream_info(container)&lt;0){
           die("Could not find file info");
       }
       av_dump_format(container,0,input_filename,false);

       int stream_id=-1;
       int i;
       for(i=0;inb_streams;i++){
           if(container->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){
               stream_id=i;
               break;
           }
       }
       if(stream_id==-1){
           die("Could not find Audio Stream");
       }

       AVDictionary *metadata=container->metadata;

       AVCodecContext *ctx=container->streams[stream_id]->codec;
       AVCodec *codec=avcodec_find_decoder(ctx->codec_id);

       if(codec==NULL){
           die("cannot find codec!");
       }

       if(avcodec_open(ctx,codec)&lt;0){
           die("Codec cannot be found");
       }

       //ctx=avcodec_alloc_context3(codec);

       //initialize AO lib
       ao_initialize();

       int driver=ao_default_driver_id();

       ao_sample_format sformat;
       sformat.bits=16;
       sformat.channels=2;
       sformat.rate=44100;
       sformat.byte_format=AO_FMT_NATIVE;
       sformat.matrix=0;

       ao_device *adevice=ao_open_live(driver,&amp;sformat,NULL);
       //end of init AO LIB

       AVPacket packet;
       av_init_packet(&amp;packet);

       AVFrame *frame=avcodec_alloc_frame();

       int buffer_size=AVCODEC_MAX_AUDIO_FRAME_SIZE;
       uint8_t buffer[buffer_size];
       packet.data=buffer;
       packet.size =buffer_size;



       int len;
       int frameFinished=0;
       while(av_read_frame(container,&amp;packet)>=0)
       {

           if(packet.stream_index==stream_id){
               //printf("Audio Frame read  \n");
               int len=avcodec_decode_audio4(ctx,frame,&amp;frameFinished,&amp;packet);
               //frame->
               if(frameFinished){
                   //printf("Finished reading Frame %d %d\n",packet.size,len);
                   ao_play(adevice, (char*)frame->data, len);
               }

           }


       }

       av_close_input_file(container);
       ao_shutdown();
       return 0;
    }