三.ffmpeg对yuv的操作

一.windows

1.使用ffmpeg录制mp4视频

#获取音视频设备
ffmpeg -list_devices true -f dshow -i dummy
#录制视频
ffmpeg -f dshow -i video="xxxx" -c"v libx264 -pix_fmt yuv420p output.mp4

2.将mp4转换为yuv数据

//-i:输入文件选项;-an:不处理音频流;
//-c:v rawvideo 视频编码器的选项,使用原始视频格式进行编码(不进行压缩);
//-pix_fmt yuv420p:输出视频的像素格式
ffmpeg -i output.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv
//播放
ffplay -f rawvideo -pixel_format yuv420p -video_size 1280x720 out1.yuv

3.也可以单独播放单独分量

//播放yuv数据
ffplay -s 1280x720 -vf extractplanes='y' out.yuv
//提取yuv三个分量为三个文件
ffmpeg -s 1280x720 -pix_fmt yuv420p -i out.yuv -filter_complex "extractplanes=y+u+v[y][u][v]" -map "[y]" y.yuv -map "[u]" u.yuv -map "[v]" v.yuv
//播放单个分量 格式为gray
ffplay -s 1280x720 -pix_fmt gray y.yuv

播放出来y、u、v都是没有颜色的,为什么u和v表示蓝色和红色的差分量也没有颜色呢?

因为u和v分量的值是相对于y分量的,没有y分量它们都无法提供完整的颜色信息。

4.api调用 

#可以查看摄像头输出的视频数据的编码格式和像素格式
ffmpeg -list_options true -f dshow -i video="Integrated Camera" 

5.整体代码

//打开摄像头直接获取原始数据
int read_video()
{int ret = 0;char errors[1024];AVFormatContext *fmt_ctx = NULL;AVDictionary *options = NULL;AVAudioFifo *fifo = nullptr;// FILE *outfile = fopen("./out.yuv", "wb+");FILE *outfile_yuv = fopen("./out1.yuv", "wb+");if (outfile_yuv == nullptr){printf("filed open out file\n");}AVPacket pkt;av_init_packet(&pkt);int frame_count = 0;// 找到采集工具const AVInputFormat *iformat = av_find_input_format("dshow");if (iformat == NULL){printf("AVInputFormat find failed \n");return -1;}// 打开视频设备av_dict_set(&options, "video_size", "1280x720", 0);av_dict_set(&options, "framerate", "10", 0);av_dict_set(&options, "pixel_format", "yuyv422", 0);ret = open_dev(&fmt_ctx, "video=Integrated Camera", iformat, &options);int count = 0;while (av_read_frame(fmt_ctx, &pkt) >= 0){printf("pkt-size:%d\n", pkt.size);fwrite(pkt.data, 1, pkt.size, outfile_yuv);fflush(outfile_yuv);av_packet_unref(&pkt);if (count++ > 50)break;}avformat_close_input(&fmt_ctx);fclose(outfile_yuv);av_log(NULL, AV_LOG_DEBUG, "end");return 0;
}

6.遇到问题

1.通过av_read_frame获取到的视频数据不是yuv420p的原始数据,而是通过mjpeg编码的yuv422p的数据。

7.解决问题

注意:打开使用设备时要注意自己摄像头支持的参数,我之前设置的1280x720 30fps yuyv422和1280x720 30fps yuv420p都不支持设置pixel_format,所以我没写pixel_format,导致1280x720 30fps默认使用vcodec=mjpeg编码器来进行编码。

解决办法:使用上面的这个指令来查看本机设备支持的格式和参数

ffmpeg -list_options true -f dshow -i video="Integrated Camera" 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36576.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

巧用符号链接搬移C盘中的软件数据目录到其他盘

#工作记录 我们知道,在Windows11系统,有些软件是不能指定安装目录的,有些软件即使指定了安装目录可是在更新版本之后还是会安装到默认的C盘目录中(比如剪映),而且每次安装某些软件之后,这些软件…

Mysql的安装配置

目录 MySQL 简介 MySQL 的下载安装 mysql配置【默认以及下载好】 (1)配置环境变量 (2)修改配置文件 (3)以管理员身份运行cmd(一定要用管理员身份运行,不然权限不够) …

登山第二十梯:无人机实时自主探索——我是一只小小小鸟

文章目录 一 摘要 二 资源 三 内容 一 摘要 自主探索是无人机 (UAV) 各种应用的基本问题。最近,基于 LiDAR 的探索因其能够生成大规模环境的高精度点云地图而受到广泛关注。虽然点云本身就为导航提供了信息,但许多现有的勘探方…

基于FPGA轨道交通6U机箱CPCI脉冲板板卡

板卡简介: 本板为脉冲板,脉冲板主要执行CPU下达的指令,通过实现各种控制算法来调节PWM,然后输出光纤PWM信号来驱动变频器功率模块以达到控制电机的目的。 性能规格: 电源:DC5V;15V FPGA&…

一键批量txt转DWG,DWG转txt——插件实现 CAD c#二次开发

如下图,我们有大量dwg需要转为txt格式,或txt格式坐标需要转为dwg格式,此插件可一键完成一个文件夹下所有文件的转换。 插件使用方式 命令行输入: netload 加载此dll插件, 输入: dwg2txt 可将dwg转为t…

【Unity基础】Unity中角色动画的三种实现方式

在Unity中,角色动画有三种不同的实现方式:逐帧动画(Frame-by-Frame)、剪裁动画(Cutout)和骨骼动画(Skeletal),各自适用于不同的场景和需求。以下是它们的核心区别及特点&…

Flutter中Align的使用说明

又失业了,作为一个高龄Android程序员今年找工作真难呀。现在Flutter是必需技能了,所以最近在自学。所用书籍叫《Flutter实战》,如下 如今已看了100多页,发现这本书写得……有点赶吧,好几处讲得不清不楚,而关…

leetcode hot100(五)

11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你…

echarts+Vue2 自动轮播饼图

1、首先下载echarts,并且全局引入echarts 方法:从 npm 安装 npm install echarts 在 main.js 文件中全局引入 然后创建一个vue文件,名字随便起,比如 pieChart.vue,话不多说,直接上才艺:&…

自学软硬件第755 docker容器虚拟化技术

见字如面, 这里是AIGC创意人_竹相左边, 正在通过AI自学软硬件工程师,目标手搓可回收火箭玩具。 我很喜欢 《流浪地球 2》中 ,马兆:没有硬件支撑,你破解个屁。 写作背景 今天在剪视频,然后看…

单片机自学总结

自从工作以来,一直努力耕耘单片机,至今,颇有收获。从51单片机,PIC单片机,直到STM32,以及RTOS和Linux,几乎天天在搞:51单片机,STM8S207单片机,PY32F003单片机,…

模拟String基本函数/深浅拷贝/柔性数组

1.首先我们先关注一下ASCII&#xff1a; 记住常用每一个字符对应的ascii码值&#xff01; 2.string函数的相关操作函数代码&#xff1a; 大多数小疑问都已经写在注释里面&#xff01; #pragma once #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<a…

论文分享:PL-ALF框架实现无人机低纹理环境自主飞行

在室内仓库、地下隧道等低纹理复杂场景中&#xff0c;无人机依赖视觉传感器进行自主飞行时&#xff0c;往往会遇到定位精度低、路径规划不稳定等难题。针对这一问题&#xff0c;重庆邮电大学计算机学院雷大江教授团队在IEEE Trans期刊上提出了一种新型自主飞行框架&#xff1a;…

文档搜索引擎

实现的搜索功能 首先获取很多的网页,然后根据用户输入的查询词,在这些网页中进行查找 用户输入查询词之后,如何让查询词和当前的网站进行匹配? 首先获取很多网页(爬虫->一个http客户端,发送http请求获取http响应结果(就是网站))(批量化的获取很多的页面), 再根据用户输入…

自然语言处理入门4——RNN

一般来说&#xff0c;提到自然语言处理&#xff0c;我们都会涉及到循环神经网络&#xff08;RNN&#xff09;&#xff0c;这是因为自然语言可以被看作是一个时间序列&#xff0c;这个时间序列中的元素是一个个的token。传统的前馈神经网络结构简单&#xff0c;但是不能很好的处…

C++学习之QT实现取证小软件首页

实现效果 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QToolButton> #include <QLabel> #include <QMessageBox> #include <QDebug> #include <QHBoxLayout> #include <QTableView> #incl…

AI 数字人短视频数字人分身系统源码开发难点都有哪些?

AI 数字人分身系统源代码开发涉及多个领域的复杂技术&#xff0c;其难点主要体现在以下几个方面&#xff1a; 逼真的数字人建模 精确的人体扫描与重建&#xff1a;要创建高度逼真的数字人分身&#xff0c;首先需要对真实人体进行精确扫描&#xff0c;获取准确的人体外形、肌肉…

适合用户快速开发项目的PHP框架有哪些?

有时候用户赶时间&#xff0c;并想快速在有限的时间里&#xff0c;筑起自己的项目&#xff0c;对于适合用户快速开发项目的PHP框架有哪些推荐呢&#xff1f;下面一起来了解一下。 1. Laravel Laravel 是一个功能强大且语法优雅的PHP框架&#xff0c;提供了丰富的功能和工具&a…

物联网为什么用MQTT不用 HTTP 或 UDP?

先来两个代码对比&#xff0c;上传温度数据给服务器。 MQTT代码示例 // MQTT 客户端连接到 MQTT 服务器 mqttClient.connect("mqtt://broker.server.com:8883", clientId) // 订阅特定主题 mqttClient.subscribe("sensor/data", qos1) // …

进程间通信(1)——管道

1. 进程间通信简介 进程间通信&#xff08;Inter-Process Communication&#xff0c;IPC&#xff09;是指不同进程之间交换数据的机制。由于进程具有独立的地址空间&#xff0c;它们无法直接访问彼此的数据&#xff0c;因此需要IPC机制来实现信息共享、数据传递或同步操作。 …