FFmpeg+OpenCV 读取摄像头
提供两种方式使用 FFmpeg 从摄像头中读取数据,并使用 OpenCV 显示视频帧。
读取摄像头
方法一
void VideoCapture() {
avdevice_register_all();
AVFormatContext *context = avformat_alloc_context();
AVInputFormat *inputFormat = av_find_input_format("dshow");
// 这里的 video=Logitech Webcam C930e 需要填写你自己的摄像头信息
// 可以在终端下使用 ffmpeg -list_devices true -f dshow -i dummy 查看
avformat_open_input(&context, "video=Logitech Webcam C930e", inputFormat, nullptr);
int video_index = av_find_best_stream(context, AVMEDIA_TYPE_VIDEO, -1, -1, nullptr, 0);
if (video_index == -1) {
printf("Could not find a video stream");
avformat_close_input(&context);
return;
}
// 获取流参数
AVCodecParameters *params = context->streams[video_index]->codecpar;
// 获取解码器
AVCodec *codec = avcodec_find_decoder(params->codec_id);
// 初始化一个解码器的上下文
AVCodecContext *codecContext = avcodec_alloc_context3(codec);
if (avcodec_parameters_to_context(codecContext, params) != 0) {
printf("Could not copy codec context");
avformat_close_input(&context);
return;
}
avcodec_open2(codecContext, codec, nullptr);
AVFrame *frame = av_frame_alloc();
AVFrame *frameYUV = av_frame_alloc();
int width = codecContext->width;
int height = codecContext->height;
// 声明图像的空间用以保存 YUV 图像
auto* out_buffer = (unsigned