从视频设备上采集数据,求指教

前期介绍:
对于Mac笔记本
*devicename = “0”;为采集视频
:0为只采集音频
0:0为同时采集音视频
0 代表机器摄像头
1 代表桌面

相关命令

查看设备支持格式:啊,简直了

ffmpeg -f dshow -i video="Lenovo EasyCamera"

在这里插入图片描述

实战

调用lenovo EasyCamera设备录像出错,就从开始菜单用它来录视频,然后打印录制完成的视频信息,结果
在这里插入图片描述

代码,没成功,

yuv保存下来为花屏,没影像,pkt.size改成640x320或是其两倍,指教为0大小的yuv,用pkt.size才有雪花数据

#define __STDC_CONSTANT_MACROS
extern "C"
{
#include <libavutil/log.h>
#include <libavdevice/avdevice.h>
#include <libavformat/avformat.h>
}

#include <windows.h>
#include <vector>
#include <string>
#include <memory>

#pragma comment(lib, "avutil.lib")
#pragma comment(lib, "avdevice.lib")
#pragma comment(lib, "avformat.lib")
#pragma comment(lib, "avcodec.lib")

#pragma comment(lib, "Winmm.lib")

using std::vector;
using std::string;
using std::shared_ptr;

void capture_audio()
{
	/*
	//windows api 获取音频设备列表(ffmpeg 好像没有提供获取音视频设备的api)
	int nDeviceNum =  waveInGetNumDevs();
	vector<string> vecDeviceName;
	for (int i = 0; i < nDeviceNum; ++i)
	{
		WAVEINCAPS wic;
		waveInGetDevCaps(i, &wic, sizeof(wic));

		//转成utf-8
		int nSize = WideCharToMultiByte(CP_UTF8, 0, wic.szPname, wcslen(wic.szPname), NULL, 0, NULL, NULL);
		shared_ptr<char> spDeviceName(new char[nSize + 1]);
		memset(spDeviceName.get(), 0, nSize + 1);
		WideCharToMultiByte(CP_UTF8, 0, wic.szPname, wcslen(wic.szPname), spDeviceName.get(), nSize, NULL, NULL);
		vecDeviceName.push_back(spDeviceName.get());
		av_log(NULL, AV_LOG_DEBUG, "video input device : %s \n", spDeviceName.get());
		//printf("%s \n", spDeviceName.get());
	}
	
	if (vecDeviceName.size() <= 0)
	{
		av_log(NULL, AV_LOG_ERROR, "not find video input device.\n");
		return;
	}
	*/
	string sDeviceName = "video=Lenovo EasyCamera";
	//printf("--z中-----%s \n", sDeviceName);

	AVDictionary *options = NULL;

	//ffmpeg
	avdevice_register_all(); //注册所有输入输出设备
	AVInputFormat* ifmt = av_find_input_format("dshow");    //设置采集方式 dshow,此为windows下

	av_dict_set(&options, "video_size", "640x320", 0);
	av_dict_set(&options, "framerate", "30", 0);//帧率
	//av_dict_set(&options, "pixel_format", "30", 0);//帧率

	if (ifmt == NULL)
	{
		av_log(NULL, AV_LOG_ERROR, "av_find_input_format for dshow fail.\n");
		return;
	}

	AVFormatContext* fmt_ctx = NULL;                    //format 上下文
	int ret = avformat_open_input(&fmt_ctx, sDeviceName.c_str(), ifmt, NULL); //"video=Lenovo EasyCamera"打开音频设备 sDeviceName.c_str()
	if (ret != 0)
	{
		av_log(NULL, AV_LOG_ERROR, "avformat_open_input fail. return %d.\n", ret);
		return;
	}

	AVPacket pkt;
	FILE* fp = fopen("dst.yuv", "wb+");
	int count = 0;
	printf("--------------------------Record video is begin \n");
	while (count++ < 60)
	{
		ret = av_read_frame(fmt_ctx, &pkt);
		if (ret != 0)
		{
			av_log(NULL, AV_LOG_ERROR, "av_read_frame fail, return %d .\n", ret);
			break;
		}
		printf("wxd_____pkt.size is %d \n",pkt.size);
		//av_log(NULL, AV_LOG_INFO, "packet size is %d(%p)\n", pkt.size, pkt.data);
		fwrite(pkt.data, 1, 409600, fp);//这里 pkt.size是相对音频,要改204800
		
		av_packet_unref(&pkt);//必须释放pkt申请的内存,否则会内存泄露
	}
	printf("---------------------------Record video is over \n");
	fflush(fp);//刷新文件io输出缓冲区
	fclose(fp);

	avformat_close_input(&fmt_ctx);
}

int main(int argc, char** argv)
{
	av_log_set_level(AV_LOG_DEBUG); //设置ffmpeg日志库等级
	printf("中文显示, chinese display \n");
	capture_audio();

	Sleep(1);
	return 0;
}

bug解决

1.报错:无法查找或打开 PDB 文件,要仅加载指定符号
参考:https://blog.csdn.net/weixin_37662982/article/details/86631124

https://blog.csdn.net/sinat_33205914/article/details/87870378

其他注意:

-s 1280x720参数一定要在-i sample.yuv的前面,否则会报"Picture size 0x0 is invalid "的错误
删除或调小水印参考:https://blog.csdn.net/weixin_41217917/article/details/103274974
查看平台下的设备支持:https://blog.csdn.net/lwj_zeal/article/details/86564659

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值