在使用 FFmpeg 进行解码时,可以通过 C API 来调用相关功能。下面是一个简单的例子,展示如何使用 FFmpeg 解码视频文件。
准备工作
首先,确保你已经安装了 FFmpeg,并且有相应的开发库(例如 libavcodec
、libavformat
和 libavutil
)。
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
int main(int argc, char *argv[]) {
const char *filename = "input.mp4"; // 输入文件名
AVFormatContext *formatContext = NULL;
int videoStreamIndex;
// 注册所有格式和编解码器
av_register_all();
// 打开视频文件
if (avformat_open_input(&formatContext, filename, NULL, NULL) != 0) {
fprintf(stderr, "Could not open source file %s\n", filename);
return -1;
}
// 检查输入流信息
if (avformat_find_stream_info(formatContext, NULL) < 0) {
fprintf(stderr, "Could not find stream information\n");
return -1;
}
// 查找视频流
videoStreamIndex = -1;
for (int i = 0; i < formatContext->nb_streams; i++) {
if (formatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
videoStreamIndex = i;
break;
}
}
if (videoStreamIndex == -1) {
fprintf(stderr, "Could not find a video stream\n");
return -1;
}
AVCodecParameters *codecParameters = formatContext->streams[videoStreamIndex]->codecpar;
// 找到解码器
AVCodec *codec = avcodec_find_decoder(codecParameters->codec_id);
if (!codec) {
fprintf(stderr, "Unsupported codec!\n");
return -1;
}
// 创建解码上下文
AVCodecContext *codecContext = avcodec_alloc_context3(codec);
if (!codecContext) {
fprintf(stderr, "Could not allocate codec context\n");
return -1;
}
// 将参数复制到解码上下文中
if (avcodec_parameters_to_context(codecContext, codecParameters) < 0) {
fprintf(stderr, "Could not copy codec parameters to context\n");
return -1;
}
// 打开解码器
if (avcodec_open2(codecContext, codec, NULL) < 0) {
fprintf(stderr, "Could not open codec\n");
return -1;
}
// 解码循环
AVPacket packet;
AVFrame *frame = av_frame_alloc();
while (av_read_frame(formatContext, &packet) >= 0) {
if (packet.stream_index == videoStreamIndex) {
// 解码帧数据
int response = avcodec_send_packet(codecContext, &packet);
if (response >= 0) {
while (response >= 0) {
response = avcodec_receive_frame(codecContext, frame);
if (response == AVERROR(EAGAIN) || response == AVERROR_EOF)
break;
else if (response < 0) {
fprintf(stderr,"Error during decoding\n");
break;
}
printf("Decoded frame: %d\n", codecContext->frame_number);
}
}
}
av_packet_unref(&packet); // 释放包内存
}
// 清理资源
av_frame_free(&frame);
avcodec_free_context(&codecContext);
avformat_close_input(&formatContext);
return 0;
}
编译与运行
确保你链接了 FFmpeg 库。在 Linux 上,你可以用以下命令编译:
gcc decode_example.c -o decode_example -lavformat -lavfilter -lavdevice -lavutil -lavcodecs
然后执行程序:
./decode_example
注意事项
- 确保你的 FFmpeg 安装包含 libav* 库。
- 根据需要修改输入文件名。
- 此示例只处理了基本的解码过程,实际应用中可能需要更复杂的错误处理和资源管理。
以上就是使用 FFmpeg 解码视频文件的一个简单示例,希望能对你有所帮助!如果有其他问题,请随时问我。
内容由零声教学AI助手提供,问题来源于学员提问