QT开发 FFmpeg录制视频YUV格式
2021-08-13 本文已影响0人
我有一只小毛驴_从来都不骑
// 获取输入格式对象
AVInputFormat *fmt = av_find_input_format("avfoundation");
if (!fmt) {
qDebug() << "av_find_input_format error" <<"avfoundation";
return;
}
// 格式上下文(将来可以利用上下文操作设备)
AVFormatContext *ctx = nullptr;
// 设备参数
AVDictionary *options = nullptr;
av_dict_set(&options, "video_size", "640x480", 0);
av_dict_set(&options, "pixel_format", "yuyv422", 0);
av_dict_set(&options, "framerate", "30", 0);
// av_dict_set(&options, "video_size", "1280x720", 0);
// av_dict_set(&options, "pixel_format", "yuyv422", 0);
// av_dict_set(&options, "framerate", "10", 0);
// 打开设备
int ret = avformat_open_input(&ctx,"0", fmt, &options);
if (ret < 0) {
ERROR_BUF(ret);
qDebug() << "avformat_open_input error" << errbuf;
return;
}
// 文件名
QFile file("/Users/apple/Desktop/out.yuv");
// 打开文件
if (!file.open(QFile::WriteOnly)) {
qDebug() << "file open error" << FILENAME;
// 关闭设备
avformat_close_input(&ctx);
return;
}
// 计算一帧的大小
AVCodecParameters *params = ctx->streams[0]->codecpar;
AVPixelFormat pixFmt = (AVPixelFormat) params->format;
int imageSize = av_image_get_buffer_size(
pixFmt,
params->width,
params->height,
1);
// qDebug() << imageSize;
// qDebug() << pixFmt << params->width << params->height;
// qDebug() << av_pix_fmt_desc_get(pixFmt)->name;
// int pixSize = av_get_bits_per_pixel(av_pix_fmt_desc_get(pixFmt)) >> 3;
// int imageSize = params->width * params->height * pixSize;
// 数据包
AVPacket *pkt = av_packet_alloc();
while (!isInterruptionRequested()) {
// 不断采集数据
ret = av_read_frame(ctx, pkt);
if (ret == 0) { // 读取成功
// 将数据写入文件
file.write((const char *) pkt->data, imageSize);
// 释放资源
av_packet_unref(pkt);
} else if (ret == AVERROR(EAGAIN)) { // 资源临时不可用
continue;
} else { // 其他错误
ERROR_BUF(ret);
qDebug() << "av_read_frame error" << errbuf << ret;
break;
}
}
// 释放资源
av_packet_free(&pkt);
// 关闭文件
file.close();
// 关闭设备
avformat_close_input(&ctx);