使用FFmpeg 打开摄像头指定分辨率和格式 C++示例
时间: 2024-09-11 10:07:45 浏览: 139
FFmpeg是一个强大的多媒体处理库,常用于视频编码、解码、转换等任务。在C++中,你可以使用FFmpeg库通过AVFoundation框架访问摄像头,并设置特定的分辨率和格式。下面是一个简单的C++示例,展示如何做到这一点:
```cpp
#include <opencv2/opencv.hpp>
#include <avformat.h>
#include <avcodec.h>
// FFmpeg初始化函数
void init_av() {
av_register_all();
}
// 摄像头获取帧回调函数
static int camera_frame_callback(void* user_data, AVFrame* frame) {
cv::Mat mat(cvSize(frame->width, frame->height), CV_8UC3, static_cast<uint8_t*>(frame->data[0]));
// 将AVFrame数据转存到OpenCV Mat中
cv::imshow("Camera Feed", mat);
if (cv::waitKey(1) >= 0) { // 如果按下任意键则关闭摄像头
return AVERROR_EOS;
}
return 0;
}
int main() {
init_av();
AVFormatContext* format_ctx = NULL;
av_register_all();
avformat_open_input(&format_ctx, "v4l2:///dev/video0", NULL, NULL); // 使用设备名打开摄像头
if (!format_ctx) {
std::cerr << "Error opening device" << std::endl;
return -1;
}
// 设置视频流
int video_stream_idx = av_find_best_stream(format_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);
if (video_stream_idx == -1) {
std::cerr << "Error finding video stream" << std::endl;
return -1;
}
AVCodecContext* codec_ctx = format_ctx->streams[video_stream_idx]->codec;
int width = codec_ctx->width; // 获取原生分辨率
int height = codec_ctx->height;
// 调整分辨率,例如1920x1080
codec_ctx->width = 1920;
codec_ctx->height = 1080;
AVStream* video_stream = format_ctx->streams[video_stream_idx];
avcodec_send_packet(video_stream->codec, NULL); // 初始化编码上下文
avcodec_receive_frame(video_stream->codec, frame); // 获取编码后的帧
// 开启摄像头并设置回调函数
avdevice_start_input_stream(format_ctx, video_stream);
while (true) {
camera_frame_callback(format_ctx, frame);
}
avformat_close_input(&format_ctx);
avcodec_free_context(&codec_ctx);
cv::destroyAllWindows();
return 0;
}
```
这个示例中,我们首先创建了AVFormatContext对象来管理输入文件(这里是摄像头)。然后找到视频流并调整其宽度和高度。最后,我们开启摄像头并设置一个回调函数来处理从摄像头捕获的每一帧。
阅读全文