写一个ffmpeg解码的demo
时间: 2023-11-14 08:05:19 浏览: 146
ffmpeg视频解码demo
3星 · 编辑精心推荐
抱歉,作为AI语言模型,我无法提供代码。以下是一个简单的FFmpeg解码demo的说明:
1. 引入FFmpeg库
为了使用FFmpeg解码,需要先引入FFmpeg库。在头文件中添加以下代码:
```
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/imgutils.h>
}
```
2. 打开输入文件
使用avformat_open_input()函数打开输入文件,该函数会自动检测文件格式。如果文件格式无法识别,该函数将返回错误。
```
AVFormatContext *pFormatCtx = NULL;
if (avformat_open_input(&pFormatCtx, inputFile, NULL, NULL) != 0) {
printf("Error: Could not open input file\n");
return -1;
}
```
3. 查找流的信息
使用avformat_find_stream_info()函数查找流的信息。该函数会读取一些数据包以获取流的信息,并填充AVFormatContext结构体中的流信息。
```
if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
printf("Error: Could not find stream information\n");
return -1;
}
```
4. 找到视频流
使用av_find_best_stream()函数找到视频流。该函数会从输入文件中找到最佳的视频流,并返回其索引。
```
int videoStreamIndex = av_find_best_stream(pFormatCtx, AVMEDIA_TYPE_VIDEO, -1, -1, &dec, 0);
if (videoStreamIndex < 0) {
printf("Error: Could not find video stream\n");
return -1;
}
AVStream *videoStream = pFormatCtx->streams[videoStreamIndex];
```
5. 查找解码器
使用avcodec_find_decoder()函数查找解码器。该函数会根据流的编码格式查找最合适的解码器。
```
AVCodec *codec = avcodec_find_decoder(videoStream->codecpar->codec_id);
if (codec == NULL) {
printf("Error: Could not find codec\n");
return -1;
}
```
6. 打开解码器
使用avcodec_open2()函数打开解码器。该函数会分配解码器的内存并打开解码器。
```
AVCodecContext *codecCtx = avcodec_alloc_context3(codec);
if (avcodec_parameters_to_context(codecCtx, videoStream->codecpar) < 0) {
printf("Error: Could not copy codec parameters to context\n");
return -1;
}
if (avcodec_open2(codecCtx, codec, NULL) < 0) {
printf("Error: Could not open codec\n");
return -1;
}
```
7. 读取数据包
使用av_read_frame()函数读取数据包。该函数会从输入文件中读取数据包,并将其存储在AVPacket结构体中。
```
AVPacket packet;
while (av_read_frame(pFormatCtx, &packet) >= 0) {
if (packet.stream_index == videoStreamIndex) {
// 处理视频数据包
}
av_packet_unref(&packet);
}
```
8. 解码数据包
使用avcodec_send_packet()函数将数据包发送到解码器。该函数会将数据包解码为AVFrame结构体。
```
AVFrame *frame = av_frame_alloc();
AVPacket packet;
while (av_read_frame(pFormatCtx, &packet) >= 0) {
if (packet.stream_index == videoStreamIndex) {
if (avcodec_send_packet(codecCtx, &packet) == 0) {
while (avcodec_receive_frame(codecCtx, frame) == 0) {
// 处理视频帧
}
}
}
av_packet_unref(&packet);
}
```
9. 清理
使用avcodec_close()函数关闭解码器,使用avformat_close_input()函数关闭输入文件。
```
avcodec_close(codecCtx);
avformat_close_input(&pFormatCtx);
```
阅读全文