pybind播放视频

2023-11-20

 

解码挺快的,0-16ms,

但是不知道为什么,还没传数据,特别慢,400-800ms一张图片,

#-*- coding:utf-8 -*-
import pysdk as demo
import time
filepath="0217.h264"

start=time.time()
def m_callback(status,width,height):
    global start
    print('callback ok', status,width,height,time.time()-start)
    start=time.time()
    # print('callback ok',a)


filename=b'rtsp://192.168.1.1:554/h264/ch1/main/av_stream'

demo.play_url(filename, m_callback)
# vp= binddemo.add(128, 72, aaa)
print(vp)

 

 

int play_url(char* url, py::function callback_f)
{

	av_log_set_level(AV_LOG_WARNING);
	unsigned version = avcodec_version();

	printf("FFmpeg version: %d\n", version);

	AVFormatContext *avFormatCtx = NULL;
	int            i, videoindex;
	AVCodecContext  *avCodecCtx = NULL;
	AVCodec        *avCodec;
	avformat_network_init();
	//avFormatCtx = avformat_alloc_context();
	//if (avformat_open_input(&pFormatCtx, patha.c_str(), NULL, NULL) != 0) {
	if (avformat_open_input(&avFormatCtx, url, NULL, NULL) != 0) {
		printf("Couldn't open input stream.\n");
		return -1;
	}
	avCodec = NULL;
	while (avCodec == NULL) {
		printf("start find stream info \n");
		if (avformat_find_stream_info(avFormatCtx, NULL) < 0) {
			printf("Couldn't find stream info\n");
			goto restart_stream;
			continue;
		}
		videoindex = -1;
		for (i = 0; i < avFormatCtx->nb_streams; i++)
			if (avFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
				if (videoindex == -1) {
					videoindex = i;
				}
				//break;
			}
		if (videoindex == -1) {
			printf("Didn't find a video stream.\n");
			goto restart_stream;
		}
		avCodecCtx = avcodec_alloc_context3(NULL);
		avcodec_parameters_to_context(avCodecCtx, avFormatCtx->streams[videoindex]->codecpar);
		avCodec = avcodec_find_decoder(avCodecCtx->codec_id);
		if (avCodec == NULL) {
			printf("Codec not found \n");
			goto restart_stream;
			//return -1;
		}
		if (avcodec_open2(avCodecCtx, avCodec, NULL) < 0) {
			printf("Could not open codec.\n");
			goto restart_stream;
			continue;
			//return -1;
		}
		goto ok;
	restart_stream:
		printf("restart 1  ");
		avformat_free_context(avFormatCtx);
		printf("restart 2  ");
		//avformat_close_input(&pFormatCtx);
		avFormatCtx = NULL;
		avFormatCtx = avformat_alloc_context();
		printf("restart 3  ");
		//printf("restart 4");
		printf("restart 4  ");

		int open_ret = avformat_open_input(&avFormatCtx, url, NULL, NULL);
		if (open_ret != 0) {
			printf("2Couldn't open input stream %d\n", open_ret);
			return -1;
		}
		avFormatCtx->probesize = 1000 * 1024;
		avFormatCtx->max_analyze_duration = 10 * AV_TIME_BASE;
		printf("restart 5\n");
		avCodec = NULL;
		continue;
	ok:
		break;
	}

	AVFrame *pFrameYUV;
	AVFrame *pFrameRGB;
	pFrameYUV = av_frame_alloc();
	pFrameRGB = av_frame_alloc();


	uint8_t *out_buffer;

	struct SwsContext *img_convert_ctx;
	img_convert_ctx = sws_getContext(avCodecCtx->width, avCodecCtx->height, avCodecCtx->pix_fmt, avCodecCtx->width, avCodecCtx->height, AV_PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL);

	out_buffer = new uint8_t[avpicture_get_size(AV_PIX_FMT_RGB24, avCodecCtx->width, avCodecCtx->height)];
	//avpicture_fill((AVPicture *)pFrameRGB, out_buffer, AV_PIX_FMT_RGB24, avCodecCtx->width, avCodecCtx->height);
	av_image_fill_arrays(pFrameRGB->data, pFrameRGB->linesize, out_buffer, AV_PIX_FMT_RGB24, avCodecCtx->width, avCodecCtx->height, 1);

	int ret, got_picture;

	AVPacket packet;// = (AVPacket *)av_malloc(sizeof(AVPacket));

	int need_decode = 1;
	int is_key_frame = 0;

	while (av_read_frame(avFormatCtx, &packet) >= 0) {
		if (packet.stream_index == videoindex) {
			DWORD start_time = GetTickCount();
			if (avcodec_send_packet(avCodecCtx, &packet) != 0) {
				printf("avcodec_send_packet错误\n");
				break;
			}
			while (avcodec_receive_frame(avCodecCtx, pFrameYUV) == 0) {

				int ret = avcodec_send_frame(avCodecCtx, pFrameYUV);
				pFrameYUV->pts++;
				printf("decode ok %d %u\n", avCodecCtx->flags, GetTickCount() - start_time);
				/*fwrite(pFrameYUV->data[0], (pCodecCtx->width)*(pCodecCtx->height) * 3, 1, output);*/
				sws_scale(img_convert_ctx, pFrameYUV->data, pFrameYUV->linesize, 0, avCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);

				//callback_f((char*)pFrameRGB->data[0], 1,  avCodecCtx->width, avCodecCtx->height);
				callback_f(1, avCodecCtx->width, avCodecCtx->height);
				avcodec_flush_buffers(avCodecCtx);
				//av_frame_free(&pFrameYUV);

			}
		}
		av_packet_unref(&packet);
	}


	avcodec_close(avCodecCtx);
	avformat_close_input(&avFormatCtx);
	return 0;
}

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pybind播放视频 的相关文章

  • 基于Springboot搭建java项目(十五)——RabbitMq的确认机制和延时通知

    RabbitMq的确认机制和延时通知 一 消息发送确认 在RabbitConfig中两个回调函数 一个叫 ConfirmCallback 一个叫 RetrunCallback 1 交换机确认 ConfirmCallback方法 Confir
  • R包实践:lubridate 处理时间数据

    人生有一道难题 那就是如何使一寸光阴等于一寸生命 在数据分析中也有一道难题 那就是如何自如的操作时间数据 R语言的基础包中提供了两种类型的时间数据 一类是Date日期数据 它不包括时间和时区信息 另一类是POSIXct POSIXlt类型数
  • Java实现MD5加密及解密的代码实例

    础 MessageDigest类的使用 其实要在Java中完成MD5加密 MessageDigest类大部分都帮你实现好了 几行代码足矣 对字符串md5加密 param str return import java security Mes
  • DevExpress设置单元格不可编辑,选单元格则选中一行

    DevExpress设置单元格不可编辑 选单元格则选中一行 目的是只展示数据 不提供修改功能 DevexpressGridControl禁止点击单元格修改 设置GridView OptionsBehavior的Editable选项设为Fal
  • JAVA多线程实现-单线程化线程池newSingleThreadExecutor

    JAVA通过Executors提供了四种线程池 单线程化线程池 newSingleThreadExecutor 可控最大并发数线程池 newFixedThreadPool 可回收缓存线程池 newCachedThreadPool 支持定时与
  • char类型数据的取值范围如何确定

    char类型数据是计算机编程语言中只可容纳单个字符的一种基本数据类型 取值范围为 128 127 对于上述概念相信大家都已经很熟悉了 但仍有不少同学对于char类型数据的取值范围抱有疑问 不知道为什么char类型数据的取值范围如何确定 若要
  • 浮点数是否与零相等的判断方法

    1 如何判断单精度浮点数 float a是否等于零 if fabs a lt 1e 6 如果成立 则a等于0 2 如何判断双精度浮点数 double a是否等于零 if fabs a lt 1e 15 如果成立 则a等于0 3 如何判断两个
  • Vue传递数据到后台SpringMVC接收解析返回

    最近在自学vue 开始以为跟angular大同小异 但是真正使用的时候发现还是很多不一样的地方 可能是因为刚刚开始理解的还不够深入O O 下面说说前端jsp怎么和后台交互 后台使用的是springMvc框架 html部分 div table
  • python算法中的机器学习算法之无监督学习知识点(详解)

    目录 学习目标 学习内容 K均值聚类 K Means Clustering 层次聚类 Hierarchical Clustering
  • 带你使用Golang快速构建出命令行应用程序

    在日常开发中 大家对命令行工具 CLI 想必特别熟悉了 如果说你不知道命令工具 那你可能是个假开发 每天都会使用大量的命令行工具 例如最常用的Git Go Docker等 不管是做技术开发还是业务开发 都会有开发命令行程序的场景 例如如果是
  • tomcat升级版本升级

    tomcat升级 1 查看当前tomcat版本 一般tomcat安装在 usr local 下 cd 至apache tomcat xxx bin sh version sh命令 查看版本信息 2 下载需要的tomcat安装包 下载网址 h
  • JavaScript 分支结构语句

    JavaScript 分支结构语句 1 if语句 2 if else语句 双分支语句 3 if else if 语句 多分支语句 4 三元表达式 5 switch语句 语句 也称为流控制语句 通常使用一或多个关键字完成既定的任务 语句可以简
  • 使用Export2Excel.js导出excel

    使用Export2Excel js导出excel 安装依赖 下载Export2Excel js文件 使用 安装依赖 npm install S file saver npm install S xlsx npm install D scri
  • python实现石头剪刀布_利用python实现和电脑玩石头剪刀布

    先说一下石头剪刀布的游戏规则 1 石头 胜 剪刀 2 剪刀 胜 布 3 布 胜 石头 石头 1 剪刀 2 布 3 其中电脑是随机输出1 3之间的整数 玩家手动输入 了解一下python的随机处理 下面上代码 导入随机工具包 importra

随机推荐

  • java8中List根据某一字段去重

    实体类 package test public class User private String userid private String username private String age private String addre
  • sql自带的函数

    1 字符串函数 length 字符串的长度 select LEN 思敏sb 全大写 全小写 select UPPER abCD select LOWER abCD 取左边 右边指定位数的字符串 select LEFT 思敏好傻 2 sele
  • CentOS 6.0 缺少 mcrypt 扩展 解决办法

    解决办法 安装php mcrypt libmcrypt libmcrypt devel这三个库文件1 安装第三方yum源 默认yum源里面没有这几个库文件 不能使用yum安装 wget http www atomicorp com inst
  • CSS 资源大全中文版

    预处理器 更快地编译 CSS GCSS 一个用GO语言编写的CSS预处理器 官网 LESS 向下兼容CSS并为当前的CSS增加额外的功能 官网 Myth 只用写纯CSS而不用担心浏览器加载缓慢 官网 PCSS 一个用Python语言编写的C
  • 虚拟机安装windows7的ISO镜像文件

    链接 https pan baidu com s 1stvzfq9UQFjlwAm4NzPpCg 提取码 wf67 复制这段内容后打开百度网盘手机App 操作更方便哦
  • React Hooks之useReducer

    useReducer 官网传送门 前言 const state dispatch useReducer reducer initialArg init useState 的替代方案 它接收一个形如 state action gt newSt
  • 【C++】VS code如何配置使用C++(手把手教学)

    博 主 米码收割机 技 能 C Python语言 公众号 测试开发自动化 获取源码 商业合作 荣 誉 阿里云博客专家博主 51CTO技术博主 专 注 专注主流机器人 人工智能等相关领域的开发 测试技术 VS code如何配置使用C 手把手教
  • centos 7修改打开文件数限制

    本文转自 http www tuicool com articles b2UNzm 未作修改 由于原文内容过多 在此仅列出部分内容 3 加大打开文件数的限制 open files 查看 ulimit n ulimit a vi etc se
  • Jmeter接口测试+压力测试

    jmeter是apache公司基于java开发的一款开源压力测试工具 体积小 功能全 使用方便 是一个比较轻量级的测试工具 使用起来非常简单 因为jmeter是java开发的 所以运行的时候必须先要安装jdk才可以 jmeter是免安装的
  • MathType 使用的解决方案

    目前遇到这种情况 MathType联网后显示证书失效 需要重新认证或者购买 或者是MathType成了精简版 只剩两行了 解决方案 分为两步 先禁止MathType联网 再删除注册表多余信息 1 禁止MathType联网 打开 控制面板 g
  • 解决server显示问题/cannot connect to X server

    1 mac下载XQuartz 安装 2 如下图打开终端 3 设置粘贴板 偏好设置 输入 勾选模拟三按键鼠标 偏好设置 粘贴板 勾选启用同步 偏好设置 粘贴板 勾选粘贴板改变时更新PRIMARY 4 连接服务器 ssh X user ip 5
  • 答题活动小程序V7.0

    答题活动小程序V7 0
  • Messari 2022年度报告9 - DAO亦有道

    大多数技术倾向于使边缘化的工人自动地做枯燥的任务 而区块链则自动去中心化 这不仅没有让出租车司机失业 而是让中心化的优步失业 同时让出租车司机直接与客户合作 Vitalik Buterin 我们前面在监管部分的讨论到了去中心化自治组织 DA
  • TypeScript从入门到精通(六)数组类型的定义

    常见且单一的数组 const numberArr string 123 456 789 数组有多种类型格式的 const AtWill string number 小爱好 18 数组中对象的定义 const obj name string
  • Lattice PCIe 学习 1

    我自己之前没有使用过lattice 平台 这次公司准备使用lattice 的PCIe IPCore 我准备在CSDN上写一系列学习笔记 记录使用过程 我使用的平台 win10 lattice diamond 3 12 这个软件下载地址 ht
  • Unity 安卓打包

    Unity打包的方式有很多种 自动打包和手动打包 今天小弟就鼓捣鼓捣unity手动打包 如果想动态打包的话 可以去看其他大佬的帖帖哈 unity打包先配置环境 下载unity的时候可以顺道把unity的安卓包下载下来 如果忘了也没事 可以从
  • [ 容器 ] Docker 的数据管理

    目录 一 Docker 的数据管理 1 1 数据卷 2 数据卷容器 二 端口映射 三 容器互联 使用centos镜像 四 Docker 镜像的创建 1 基于现有镜像创建 2 基于本地模板创建 3 基于Dockerfile 创建 3 1 联合
  • [776]github fork 别人的项目源作者更新后如何同步更新

    1 打开fork 过来的项目如下所示 2 点击new pull request 3 在进入的界面 后进行将左边的设置为你自己的仓库 fork 过来的源在右边 如下图 4 当选择完后会变成下图 5 接下来 将其展示出可以调整状态 右边改为源f
  • Linux修改hostname的几种方式,及遇到的问题

    之前修改主机名全都是采用的network方式 今天遇到点问题 发现hostname并非之前理解的那样 自己配置hostname的问题 这与系统的版本有关系么 腾讯云7 5的 百度云的是6 5 我自己在VMware上安装的6 5就没 etc
  • pybind播放视频

    解码挺快的 0 16ms 但是不知道为什么 还没传数据 特别慢 400 800ms一张图片 coding utf 8 import pysdk as demo import time filepath 0217 h264 start tim