The libavformat and libavcodec libraries that come with ffmpeg are a great way of accessing a large variety of video file formats.
Unfortunately, there is no real documentation on using these libraries in your
own programs (at least I couldn't find any), and the example programs aren't
really very helpful either.
In case you're wondering why there are two libraries, libavformat and
libavcodec: Many video file formats (AVI being a prime example) don't actually
specify which codec(s) should be used to encode audio and video data; they
merely define how an audio and a video stream (or, potentially, several
audio/video streams) should be combined into a single file. This is why
sometimes, when you open an AVI file, you get only sound, but no picture -
because the right video codec isn't installed on your system. Thus,
libavformat deals with parsing video files and separating the streams
contained in them, and libavcodec deals with decoding raw audio and video
streams.
1 Open a video file
First things--let's look at how to open a video file and get at the
streams contained in it. The first thing we need to do is to initialize libavformat/libavcodec:
av_register_all();
This registers all available file formats and codecs with the library so they
will be used automatically when a file with the corresponding format/codec is
opened. Note that you only need to call av_register_all() once, so
it's probably best to do this somewhere in your startup code. If you like,
it's possible to register only certain individual file formats and codecs, but
there's usually no reason why you would have to do that.
And then open the file:
int i, err;
AVFormatContext *ic;
int nopts = 0;
err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
if (err < 0)
return err;
Next,retrieve information about the streams contained in the file:
ret = av_find_stream_info(ic);
if (ret < 0 && verbose >= 0) {
fprintf(stderr, "%s: could not find codec parameters\n", filename);
av_close_input_file(ic);
ffmpeg_exit(1);
}
Find the actual codec and open it:
codec = avcodec_find_decoder(ist->st->codec->codec_id);
error_handler();
avcodec_open(ist->st->codec, codec);
error_handler();
One more thing left to do,allocate a video frame to store the decoded images
in:
avcodec_alloc_frame();
That's it! Now let's start decoding some video.
2 Decoding video frames
A video file can contain several audio and video
streams, and each of those streams is split up into packets of a particular
size. FFMPEG is to read these packets one by one using libavformat, filter
out all those that aren't part of the video stream we're interested in, and
hand them on to libavcodec for decoding. In doing this, we'll have to take
care of the fact that the boundary between two frames can occur in the middle
of a packet.
阅读(2223) | 评论(0) | 转发(0) |