FFmpeg 官网示例地址

下面是一个使用FFmpeg的硬件加速(hwaccel)的简单示例: ```c #include <stdio.h> #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavutil/hwcontext.h> int main() { const char *input_file = "input.mp4"; const char *output_file = "output.yuv"; // 注册所有的解码器和格式器 av_register_all(); // 打开输入文件 AVFormatContext *format_ctx = avformat_alloc_context(); if (avformat_open_input(&format_ctx, input_file, NULL, NULL) != 0) { fprintf(stderr, "无法打开输入文件\n"); return -1; } // 查找流信息 if (avformat_find_stream_info(format_ctx, NULL) < 0) { fprintf(stderr, "无法获取流信息\n"); return -1; } // 查找视频流 int video_stream_index = -1; for (int i = 0; i < format_ctx->nb_streams; i++) { if (format_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { video_stream_index = i; break; } } if (video_stream_index == -1) { fprintf(stderr, "找不到视频流\n"); return -1; } // 获取视频解码器参数 AVCodecParameters *codec_params = format_ctx->streams[video_stream_index]->codecpar; // 获取解码器 AVCodec *codec = avcodec_find_decoder(codec_params->codec_id); if (!codec) { fprintf(stderr, "找不到解码器\n"); return -1; } // 创建解码器上下文 AVCodecContext *codec_ctx = avcodec_alloc_context3(codec); if (!codec_ctx) { fprintf(stderr, "无法创建解码器上下文\n"); return -1; } // 将解码器参数复制到解码器上下文 if (avcodec_parameters_to_context(codec_ctx, codec_params) < 0) { fprintf(stderr, "无法复制解码器参数到解码器上下文\n"); return -1; } // 初始化解码器上下文 if (avcodec_open2(codec_ctx, codec, NULL) < 0) { fprintf(stderr, "无法打开解码器\n"); return -1; } // 创建硬件设备上下文 AVBufferRef *hw_device_ctx = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_CUDA); if (!hw_device_ctx) { fprintf(stderr, "无法分配硬件设备上下文\n"); return -1; } // 设置解码器上下文的硬件设备上下文 codec_ctx->hw_device_ctx = av_buffer_ref(hw_device_ctx); // 创建帧 AVFrame *frame = av_frame_alloc(); if (!frame) { fprintf(stderr, "无法分配帧\n"); return -1; } // 创建包 AVPacket packet; av_init_packet(&packet); packet.data = NULL; packet.size = 0; // 打开输出文件 FILE *output = fopen(output_file, "wb"); if (!output) { fprintf(stderr, "无法打开输出文件\n"); return -1; } // 解码循环 while (av_read_frame(format_ctx, &packet) >= 0) { if (packet.stream_index == video_stream_index) { // 解码视频帧 if (avcodec_send_packet(codec_ctx, &packet) == 0) { while (avcodec_receive_frame(codec_ctx, frame) == 0) { // 将解码后的帧数据写入输出文件 for (int i = 0; i < frame->height; i++) { fwrite(frame->data[0] + i * frame->linesize[0], 1, frame->width, output); } } } } av_packet_unref(&packet); } // 清理资源 av_frame_free(&frame); avcodec_free_context(&codec_ctx); avformat_close_input(&format_ctx); av_buffer_unref(&hw_device_ctx); fclose(output); return 0; } ``` 上述示例代码使用了FFmpeg来进行视频解码并将解码后的YUV数据写入输出文件中。其中,使用了硬件加速(CUDA)来加速视频解码。请确保已经安装了CUDA驱动和FFmpeg与CUDA支持的版本。 请注意,上述示例代码可能需要根据具体的需求进行修改,例如输入文件、输出文件的路径等。此外,还可以根据需要修改硬件设备类型、解码器参数等。 希望这个示例能对你有所帮助!如有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值