用ffmpeg4.x读取windows摄像头
时间: 2023-07-01 15:13:21 浏览: 159
在Windows平台上,可以使用dshow(DirectShow)输入设备来读取摄像头。以下是基于FFmpeg4.x的dshow输入设备的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libavdevice/avdevice.h>
#include <libavformat/avformat.h>
int main(int argc, char *argv[])
{
AVInputFormat *inputFormat;
AVFormatContext *formatCtx = NULL;
AVDictionary *options = NULL;
AVCodecContext *codecCtx = NULL;
AVFrame *frame = NULL;
AVPacket pkt;
int ret;
avdevice_register_all();
inputFormat = av_find_input_format("dshow");
av_dict_set(&options, "video_size", "640x480", 0);
av_dict_set(&options, "framerate", "30", 0);
av_dict_set(&options, "pixel_format", "yuyv422", 0);
av_dict_set(&options, "vcodec", "rawvideo", 0);
ret = avformat_open_input(&formatCtx, "video=USB Camera", inputFormat, &options);
if (ret < 0) {
fprintf(stderr, "Could not open input file\n");
return 1;
}
ret = avformat_find_stream_info(formatCtx, NULL);
if (ret < 0) {
fprintf(stderr, "Could not find stream information\n");
return 1;
}
codecCtx = avcodec_alloc_context3(NULL);
if (!codecCtx) {
fprintf(stderr, "Could not allocate codec context\n");
return 1;
}
ret = avcodec_parameters_to_context(codecCtx, formatCtx->streams[0]->codecpar);
if (ret < 0) {
fprintf(stderr, "Could not copy codec parameters to codec context\n");
return 1;
}
codecCtx->pix_fmt = AV_PIX_FMT_BGR24;
ret = avcodec_open2(codecCtx, avcodec_find_decoder(codecCtx->codec_id), NULL);
if (ret < 0) {
fprintf(stderr, "Could not open codec\n");
return 1;
}
frame = av_frame_alloc();
if (!frame) {
fprintf(stderr, "Could not allocate frame\n");
return 1;
}
while (1) {
ret = av_read_frame(formatCtx, &pkt);
if (ret < 0)
break;
if (pkt.stream_index == 0) {
ret = avcodec_send_packet(codecCtx, &pkt);
if (ret < 0) {
fprintf(stderr, "Could not send packet to decoder\n");
break;
}
while (ret >= 0) {
ret = avcodec_receive_frame(codecCtx, frame);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
break;
else if (ret < 0) {
fprintf(stderr, "Error during decoding\n");
break;
}
printf("Frame %d (type=%c, size=%d bytes)\n", codecCtx->frame_number,
av_get_picture_type_char(frame->pict_type), frame->pkt_size);
av_frame_unref(frame);
}
}
av_packet_unref(&pkt);
}
av_frame_free(&frame);
avcodec_free_context(&codecCtx);
avformat_close_input(&formatCtx);
av_dict_free(&options);
return 0;
}
```
这个样例使用了dshow作为输入格式,打开了名为"USB Camera"的设备,读取该设备的视频流,并将视频帧通过AVCodecContext解码。在解码的过程中,将每一帧的信息打印到控制台上。
请注意,使用此样例代码需要安装FFmpeg库,并且需要有Windows系统的摄像头设备。如果要在其他平台上运行,需要根据平台不同进行一定的修改。
阅读全文