ffmpeg c++ 设置传输图片尺寸
时间: 2023-10-18 18:22:09 浏览: 86
你可以使用 FFmpeg 中的 `sws_scale` 函数来设置传输图片的尺寸。以下是一个简单的示例代码:
```c++
#include <iostream>
#include <cstring>
#include <cstdio>
extern "C" {
#include <libavformat/avformat.h>
#include <libavutil/imgutils.h>
#include <libswscale/swscale.h>
}
#define WIDTH 640
#define HEIGHT 480
int main() {
// 初始化 FFmpeg
av_register_all();
// 创建 AVFrame 对象
AVFrame *frame = av_frame_alloc();
if (frame == nullptr) {
std::cerr << "Failed to allocate frame" << std::endl;
return -1;
}
// 设置 AVFrame 的宽度和高度
frame->width = WIDTH;
frame->height = HEIGHT;
// 分配 AVFrame 的数据空间
int ret = av_image_alloc(frame->data, frame->linesize, WIDTH, HEIGHT, AV_PIX_FMT_RGB24, 16);
if (ret < 0) {
std::cerr << "Failed to allocate image" << std::endl;
av_frame_free(&frame);
return -1;
}
// 创建 SwsContext 对象
SwsContext *sws_ctx = sws_getContext(WIDTH, HEIGHT, AV_PIX_FMT_RGB24, WIDTH/2, HEIGHT/2, AV_PIX_FMT_RGB24, SWS_BILINEAR, nullptr, nullptr, nullptr);
if (sws_ctx == nullptr) {
std::cerr << "Failed to create SwsContext" << std::endl;
av_freep(&frame->data[0]);
av_frame_free(&frame);
return -1;
}
// 将 AVFrame 缩小为一半
AVFrame *resized_frame = av_frame_alloc();
resized_frame->width = WIDTH/2;
resized_frame->height = HEIGHT/2;
resized_frame->format = AV_PIX_FMT_RGB24;
ret = av_image_alloc(resized_frame->data, resized_frame->linesize, resized_frame->width, resized_frame->height, AV_PIX_FMT_RGB24, 16);
if (ret < 0) {
std::cerr << "Failed to allocate resized frame" << std::endl;
sws_freeContext(sws_ctx);
av_freep(&frame->data[0]);
av_frame_free(&frame);
return -1;
}
// 缩放图像
sws_scale(sws_ctx, frame->data, frame->linesize, 0, HEIGHT, resized_frame->data, resized_frame->linesize);
// 释放资源
sws_freeContext(sws_ctx);
av_freep(&frame->data[0]);
av_frame_free(&frame);
av_freep(&resized_frame->data[0]);
av_frame_free(&resized_frame);
return 0;
}
```
在上面的代码中,我们首先创建一个 `AVFrame` 对象,并设置它的宽度和高度为 `WIDTH` 和 `HEIGHT`。然后我们使用 `av_image_alloc` 函数分配 `AVFrame` 的数据空间。
接着,我们创建了一个 `SwsContext` 对象,并使用 `sws_getContext` 函数初始化它。我们将输入图像的宽度和高度设置为 `WIDTH` 和 `HEIGHT`,输出图像的宽度和高度设置为 `WIDTH/2` 和 `HEIGHT/2`。
接下来,我们创建了一个新的 `AVFrame` 对象 `resized_frame`,并将它的宽度和高度设置为缩小后的值。我们再次使用 `av_image_alloc` 函数分配 `AVFrame` 的数据空间。
最后,我们使用 `sws_scale` 函数将输入图像缩小为一半,并将结果存储在 `resized_frame` 中。最后,我们释放所有分配的内存。
这只是一个简单的示例,你可以根据你的需求进行修改。
阅读全文