a's'da's'd

article/2025/10/3 3:15:10

1:原理
ffmpeg读取出来一个包如果是视频包放入视频包队列,如果是音频包放入音频包队列。
视频:从视频队列中取出一个包解码根绝帧率或pts等等算出一帧数据的持续时间将这一帧数据放入VideoPicture这个结构体的bmp中,这只是内存,还未到显示,根据,Sleep()控制时间显示这一帧视频,并算出下一次刷新的时间,此时消耗了一个VideoPicture这个结构体的bmp。重新循环。

音频:从音频队列中取出一个包解码,SDL_AudioSpec这个结构体SDL已经算出了一帧音频的持续时间,所以音频将解码后的数据放入SDL缓存的末尾,并传给声卡,声卡消耗数据的大小和时间是前面能算出来的,所以一直在播放。

 

2:程序初始化InitProgram()
程序启动做的初始化 打开编解码库 SDL初始化等,音视频全局结构体StreamState初始化,获取全屏的屏幕宽高,设置SDL事件状态。全局结构体StreamState只初始化一次,以及成员变量的清零等。

3:程序释放UinitProgram()
音视频全局结构体StreamState释放。关闭编解码库 ,sdl库释放,以及成员变量的清零等。

4:变量的初始化InitVariable()
这里除了需要将变量设成默认值之外 还要做
//创建全局条件变量互斥变量
m_streamstate->pictq_mutex = SDL_CreateMutex();
m_streamstate->pictq_cond  = SDL_CreateCond();
//刷新packet初始化
av_init_packet(&m_flush_pkt);
m_flush_pkt.data = (uint8_t *)(intptr_t)"FLUSH";

5:变量的释放UinitVariable()
要将成员变量的值最处理清零或设成默认值,还有一些工作




 还要将音视频的解码线程关掉

6:获取程序初始化的时候控件的位置Access_control_position()
这个的作用是当改变窗口大小的时候需要将控件的大小以及位置做调整

7:On_Size
这里首先做控件的调整

获取要显示窗口宽高


8:文件打开获取信息OnBnClickedButtonLoad()
extern int m_video_stream_idx;                  //视频在文件中的流标号
extern double m_dbFrameRate;                    //视频帧率
extern double m_video_duration;                 //视频单帧持续时间 秒(s)
extern int m_dwWidth;                           //宽
extern int m_dwHeight;                          //高
extern AVCodecID m_video_codecID;               //视频编码类型
extern AVPixelFormat m_video_pixelfromat;       //视频yuv类型
extern char m_spspps[100];                      //spspps_buf
extern int m_spspps_size;                       //spspps_size
//audio pram
extern int m_audio_stream_idx;                  //音频在文件中的流标号
extern double m_audio_duration;                 //音频单帧持续时间 秒(s)
extern int m_dwChannelCount;                    //声道
extern int m_dwBitsPerSample;                   //样本

extern int m_dwFrequency;            

本文说明再用dup做重定向的时候遇到的一些坑做一些总结。

1:FFMPEG的所有输出信息,都为错误输出流,用STDOUT_FILENO是捕获不到任何消息,必须用STDERR_FILENO,这里是个大坑;

2:子进程pid == 0 这一段代码走完返回后还会将主进程调用本函数之后的代码走一遍;

3:循环sleep要刷新fflush(stdout);才能在标准输出中输出到管道否则失败;

4:传入execvp的第二个参数argv类型为,char * execargv[LVSM_DEFAULT_STRING_LEN];当把前面的各个参数写入后 ,必须这样写execargv[pos] = NULL;否则失败,不能sprintf(execargv[pos],"%s",(char*)(0));或者,sprintf(execargv[pos],"%d",0);

5:代码中有匿名管道改成非阻塞的,否则read会卡住不返回。

本文说明再用dup做重定向的时候遇到的一些坑做一些总结。

1:FFMPEG的所有输出信息,都为错误输出流,用STDOUT_FILENO是捕获不到任何消息,必须用STDERR_FILENO,这里是个大坑;

2:子进程pid == 0 这一段代码走完返回后还会将主进程调用本函数之后的代码走一遍;

3:循环sleep要刷新fflush(stdout);才能在标准输出中输出到管道否则失败;

4:传入execvp的第二个参数argv类型为,char * execargv[LVSM_DEFAULT_STRING_LEN];当把前面的各个参数写入后 ,必须这样写execargv[pos] = NULL;否则失败,不能sprintf(execargv[pos],"%s",(char*)(0));或者,sprintf(execargv[pos],"%d",0);

5:代码中有匿名管道改成非阻塞的,否则read会卡住不返回。

本文说明再用dup做重定向的时候遇到的一些坑做一些总结。

1:FFMPEG的所有输出信息,都为错误输出流,用STDOUT_FILENO是捕获不到任何消息,必须用STDERR_FILENO,这里是个大坑;

2:子进程pid == 0 这一段代码走完返回后还会将主进程调用本函数之后的代码走一遍;

3:循环sleep要刷新fflush(stdout);才能在标准输出中输出到管道否则失败;

4:传入execvp的第二个参数argv类型为,char * execargv[LVSM_DEFAULT_STRING_LEN];当把前面的各个参数写入后 ,必须这样写execargv[pos] = NULL;否则失败,不能sprintf(execargv[pos],"%s",(char*)(0));或者,sprintf(execargv[pos],"%d",0);

5:代码中有匿名管道改成非阻塞的,否则read会卡住不返回。

本文说明再用dup做重定向的时候遇到的一些坑做一些总结。

1:FFMPEG的所有输出信息,都为错误输出流,用STDOUT_FILENO是捕获不到任何消息,必须用STDERR_FILENO,这里是个大坑;

2:子进程pid == 0 这一段代码走完返回后还会将主进程调用本函数之后的代码走一遍;

3:循环sleep要刷新fflush(stdout);才能在标准输出中输出到管道否则失败;

4:传入execvp的第二个参数argv类型为,char * execargv[LVSM_DEFAULT_STRING_LEN];当把前面的各个参数写入后 ,必须这样写execargv[pos] = NULL;否则失败,不能sprintf(execargv[pos],"%s",(char*)(0));或者,sprintf(execargv[pos],"%d",0);

5:代码中有匿名管道改成非阻塞的,否则read会卡住不返回。

本文说明再用dup做重定向的时候遇到的一些坑做一些总结。

1:FFMPEG的所有输出信息,都为错误输出流,用STDOUT_FILENO是捕获不到任何消息,必须用STDERR_FILENO,这里是个大坑;

2:子进程pid == 0 这一段代码走完返回后还会将主进程调用本函数之后的代码走一遍;

3:循环sleep要刷新fflush(stdout);才能在标准输出中输出到管道否则失败;

4:传入execvp的第二个参数argv类型为,char * execargv[LVSM_DEFAULT_STRING_LEN];当把前面的各个参数写入后 ,必须这样写execargv[pos] = NULL;否则失败,不能sprintf(execargv[pos],"%s",(char*)(0));或者,sprintf(execargv[pos],"%d",0);

5:代码中有匿名管道改成非阻塞的,否则read会卡住不返回。

本文说明再用dup做重定向的时候遇到的一些坑做一些总结。

1:FFMPEG的所有输出信息,都为错误输出流,用STDOUT_FILENO是捕获不到任何消息,必须用STDERR_FILENO,这里是个大坑;

2:子进程pid == 0 这一段代码走完返回后还会将主进程调用本函数之后的代码走一遍;

3:循环sleep要刷新fflush(stdout);才能在标准输出中输出到管道否则失败;

4:传入execvp的第二个参数argv类型为,char * execargv[LVSM_DEFAULT_STRING_LEN];当把前面的各个参数写入后 ,必须这样写execargv[pos] = NULL;否则失败,不能sprintf(execargv[pos],"%s",(char*)(0));或者,sprintf(execargv[pos],"%d",0);

5:代码中有匿名管道改成非阻塞的,否则read会卡住不返回。

本文说明再用dup做重定向的时候遇到的一些坑做一些总结。

1:FFMPEG的所有输出信息,都为错误输出流,用STDOUT_FILENO是捕获不到任何消息,必须用STDERR_FILENO,这里是个大坑;

2:子进程pid == 0 这一段代码走完返回后还会将主进程调用本函数之后的代码走一遍;

3:循环sleep要刷新fflush(stdout);才能在标准输出中输出到管道否则失败;

4:传入execvp的第二个参数argv类型为,char * execargv[LVSM_DEFAULT_STRING_LEN];当把前面的各个参数写入后 ,必须这样写execargv[pos] = NULL;否则失败,不能sprintf(execargv[pos],"%s",(char*)(0));或者,sprintf(execargv[pos],"%d",0);

5:代码中有匿名管道改成非阻塞的,否则read会卡住不返回。

本文说明再用dup做重定向的时候遇到的一些坑做一些总结。

1:FFMPEG的所有输出信息,都为错误输出流,用STDOUT_FILENO是捕获不到任何消息,必须用STDERR_FILENO,这里是个大坑;

2:子进程pid == 0 这一段代码走完返回后还会将主进程调用本函数之后的代码走一遍;

3:循环sleep要刷新fflush(stdout);才能在标准输出中输出到管道否则失败;

4:传入execvp的第二个参数argv类型为,char * execargv[LVSM_DEFAULT_STRING_LEN];当把前面的各个参数写入后 ,必须这样写execargv[pos] = NULL;否则失败,不能sprintf(execargv[pos],"%s",(char*)(0));或者,sprintf(execargv[pos],"%d",0);

5:代码中有匿名管道改成非阻塞的,否则read会卡住不返回。

本文说明再用dup做重定向的时候遇到的一些坑做一些总结。

1:FFMPEG的所有输出信息,都为错误输出流,用STDOUT_FILENO是捕获不到任何消息,必须用STDERR_FILENO,这里是个大坑;

2:子进程pid == 0 这一段代码走完返回后还会将主进程调用本函数之后的代码走一遍;

3:循环sleep要刷新fflush(stdout);才能在标准输出中输出到管道否则失败;

4:传入execvp的第二个参数argv类型为,char * execargv[LVSM_DEFAULT_STRING_LEN];当把前面的各个参数写入后 ,必须这样写execargv[pos] = NULL;否则失败,不能sprintf(execargv[pos],"%s",(char*)(0));或者,sprintf(execargv[pos],"%d",0);

5:代码中有匿名管道改成非阻塞的,否则read会卡住不返回。

本文说明再用dup做重定向的时候遇到的一些坑做一些总结。

1:FFMPEG的所有输出信息,都为错误输出流,用STDOUT_FILENO是捕获不到任何消息,必须用STDERR_FILENO,这里是个大坑;

2:子进程pid == 0 这一段代码走完返回后还会将主进程调用本函数之后的代码走一遍;

3:循环sleep要刷新fflush(stdout);才能在标准输出中输出到管道否则失败;

4:传入execvp的第二个参数argv类型为,char * execargv[LVSM_DEFAULT_STRING_LEN];当把前面的各个参数写入后 ,必须这样写execargv[pos] = NULL;否则失败,不能sprintf(execargv[pos],"%s",(char*)(0));或者,sprintf(execargv[pos],"%d",0);

5:代码中有匿名管道改成非阻塞的,否则read会卡住不返回。

本文说明再用dup做重定向的时候遇到的一些坑做一些总结。

1:FFMPEG的所有输出信息,都为错误输出流,用STDOUT_FILENO是捕获不到任何消息,必须用STDERR_FILENO,这里是个大坑;

2:子进程pid == 0 这一段代码走完返回后还会将主进程调用本函数之后的代码走一遍;

3:循环sleep要刷新fflush(stdout);才能在标准输出中输出到管道否则失败;

4:传入execvp的第二个参数argv类型为,char * execargv[LVSM_DEFAULT_STRING_LEN];当把前面的各个参数写入后 ,必须这样写execargv[pos] = NULL;否则失败,不能sprintf(execargv[pos],"%s",(char*)(0));或者,sprintf(execargv[pos],"%d",0);

5:代码中有匿名管道改成非阻塞的,否则read会卡住不返回。

本文说明再用dup做重定向的时候遇到的一些坑做一些总结。

1:FFMPEG的所有输出信息,都为错误输出流,用STDOUT_FILENO是捕获不到任何消息,必须用STDERR_FILENO,这里是个大坑;

2:子进程pid == 0 这一段代码走完返回后还会将主进程调用本函数之后的代码走一遍;

3:循环sleep要刷新fflush(stdout);才能在标准输出中输出到管道否则失败;

4:传入execvp的第二个参数argv类型为,char * execargv[LVSM_DEFAULT_STRING_LEN];当把前面的各个参数写入后 ,必须这样写execargv[pos] = NULL;否则失败,不能sprintf(execargv[pos],"%s",(char*)(0));或者,sprintf(execargv[pos],"%d",0);

5:代码中有匿名管道改成非阻塞的,否则read会卡住不返回。

本文说明再用dup做重定向的时候遇到的一些坑做一些总结。

1:FFMPEG的所有输出信息,都为错误输出流,用STDOUT_FILENO是捕获不到任何消息,必须用STDERR_FILENO,这里是个大坑;

2:子进程pid == 0 这一段代码走完返回后还会将主进程调用本函数之后的代码走一遍;

3:循环sleep要刷新fflush(stdout);才能在标准输出中输出到管道否则失败;

4:传入execvp的第二个参数argv类型为,char * execargv[LVSM_DEFAULT_STRING_LEN];当把前面的各个参数写入后 ,必须这样写execargv[pos] = NULL;否则失败,不能sprintf(execargv[pos],"%s",(char*)(0));或者,sprintf(execargv[pos],"%d",0);

5:代码中有匿名管道改成非阻塞的,否则read会卡住不返回。



http://chatgpt.dhexx.cn/article/U03Sy5ZO.shtml

相关文章

微信公众号内置浏览器缓存清理

微信公众号的H5页面访问后,会缓存js、css等数据,如果更新了脚本文件,前端一段时间内容反复刷新都无法生效。 使用过程中,更新代码但是H5不能及时更新,推荐以下几种方式: 方法一: 微信->“我…

微信浏览器缓存清理

微信其实内嵌了一个QQ浏览器,只是这个浏览器没有菜单界面,看上去无法清理微信内置浏览器的缓存。 方法一: 1、随便打开一个聊天窗口,输入debugx5.qq.com 并发送 2、点击自己发送的地址debugx5.qq.com,打开debug 调试…

Android手机微信内置浏览器缓存怎么清理?

有很多时候我们的网站需要在微信上打开进行测试,一次次的修改不像是浏览器一样可以随时清理缓存,不清理缓存的话这样会对测试运行结果有影响,那如何清理缓存呢? 注意:此功能只能适用于安卓微信 1、专门的清理缓存的网…

微信内置浏览器清理缓存方法(适用于安卓手机)

用微信内置浏览器打开这个网页debugx5.qq.com ,就会有清除缓存的选项,如下图

微信内置浏览器清除缓存、cookie、local storage清除(安卓手机)

项目需要做一个openIdADFS混合模式的登录,开发的时候发现点问题,需要清除cookie和local storage进行修改。 于是稍微研究了一下,安卓手机如何清除缓存、cookie和local storage。 本人使用的手机是华为Mate 20Pro,微信版本8.0.3.…

h5、微信浏览器、微信公众号清理缓存的常用方法

h5浏览器特别是微信公众号存在缓存的问题,让我们在测试、产品、用户面前彻底丢了面子,他们会问。为什么会有缓存?别人的产品可以做到,为什么我们的不可以? 下面提供几种方案可以尝试处理h5浏览器缓存的问题。 一、普…

清除微信浏览器缓存

转载自https://chenhuichao.com/2016/04/07/mobile/wechat-clean-cache/ 在做微信移动页面开发时,若需要清除缓存,对于Android和iOS平台的清除方法如下: iOS iOS的微信浏览器中自带刷新按钮。点击微信右上角的菜单->刷新,&am…

微信公众号开发,清除微信内置浏览器缓存

在做微信开发的时候(主要是微信内网页或者比较大型的手机网站)的时候,更改了页面代码,但是微信内置浏览器有缓存,还是之前的效果,影响调试,而且还死活清除不掉!!&#xf…

微信内置浏览器禁止缓存的问题

解决方案1&#xff1a; 调试阶段或者频繁更新的页面加入以下头信息&#xff1a; <meta http-equiv"Cache-Control" content"no-cache, no-store, must-revalidate" /> <meta http-equiv"Pragma" content"no-cache" /> &l…

微信内置浏览器缓存清理及关闭微信默认的X5内核

之前做过很多公众号的项目&#xff0c;项目写完后给客户看项目&#xff0c;客户一而再再而三的修改元素向左挪1px&#xff0c;向右挪2px。改好之后让客户看&#xff0c;客户说我特泽发克&#xff0c;你啥都没有修改&#xff0c;你竟然骗我&#xff01;&#xff01;&#xff01;…

微信内的浏览器缓存清理方法

安卓清除缓存方案&#xff1a; android版微信内置浏览器&#xff08;X5内核&#xff09; 在安卓版微信内打开链接 http://debugx5.qq.com 拉到调试页面的最底端&#xff0c;勾选上所有的缓存项目&#xff0c;点击清除。 苹果清除缓存方案&#xff1a; ios版微信内置浏览器&am…

解决微信浏览器缓存问题

微信浏览器处理缓存方式&#xff1a; 1.头部处理缓存信息。 <meta http-equiv"Cache-Control" content"no-cache, no-store, must-revalidate" /> <meta http-equiv"Pragma" content"no-c…

微信内置浏览器缓存清理

之前做过很多公众号的项目&#xff0c;项目写完后给客户看项目&#xff0c;客户一而再再而三的修改元素向左挪1px&#xff0c;向右挪2px。改好之后让客户看&#xff0c;客户说我特泽发克&#xff0c;你啥都没有修改&#xff0c;你竟然骗我&#xff01;&#xff01;&#xff01;…

h5清理微信浏览器网页缓存

前言&#xff1a; 缓存这个问题的出现&#xff0c;真真切切的感受到微信浏览器这鬼东西对前端程序员充满了恶意&#xff0c;捋捋自己的发型&#xff0c;甚是恐慌&#xff08;顿时有种想转php的冲动&#xff0c;有木有&#xff09;。 解决方案&#xff1a; 出现缓存问题导致用户…

清理微信浏览器网页缓存的办法

微信开发是件非常蛋疼的事情&#xff0c;微信网页的缓存是更加蛋疼的东西&#xff0c;今天遇到的问题&#xff1a;一个页面在web开发工具上可以正常授权并获取到openid&#xff0c;放在手机上就死活不行&#xff0c;网上找来的办法如下&#xff1a; 使用微信内置的浏览器打开“…

微信H5、网页、内置Web浏览器 清理缓存,微信浏览器缓存

目录 一、写在前面&#xff1a; 1、浏览器缓存带来的好处&#xff1a; 2、浏览器缓存带来的弊端&#xff1a; 二、如何清除微信浏览器的缓存&#xff1a; 1、在IOS环境下手动清除微信缓存&#xff1a; 2、在Android环境下手动清除微信缓存&#xff1a; 三、清除微信浏览…

Spring AOP实现原理简介

AOP联盟标准 AOP联盟将AOP体系分为三层&#xff0c;从三层结构可以看出&#xff0c;AOP实现方式有很多种&#xff0c;包括反射、元数据处理、程序处理、拦截器处理等&#xff0c;通过本节学习&#xff0c;你就会看到Spring AOP的实现使用的是Java语言本身的特性&#xff0c;即J…

Spring 面向切面编程 第4关:AOP实现原理-CgLib动态代理

目录 任务描述 相关知识 代理模式(Proxy) AOP实现的两种方式 CGLIB动态代理步骤 模拟AOP实现 代理类说明 编程要求 测试说明 参考代码 任务描述 我们知道&#xff0c;Spring AOP的主要作用就是不通过修改源代码的方式、将非核心功能代码织入来实现对方法的增强。那么…

Spring AOP实现原理详解之Cglib代理实现

引入 我们在前文中已经介绍了SpringAOP的切面实现和创建动态代理的过程&#xff0c;那么动态代理是如何工作的呢&#xff1f;本文主要介绍Cglib动态代理的案例和SpringAOP实现的原理。 要了解动态代理是如何工作的&#xff0c;首先需要了解 什么是代理模式&#xff1f;什么是…

Spring——AOP用到的代理模式SpringAOP实现原理

AOP&#xff0c;面向切面编程&#xff0c;是Spring框架中的核心思想之一&#xff1b;在Spring中是通过动态代理来实现的&#xff0c;在目标类的基础上增加切面逻辑&#xff0c;对原对象进行增强&#xff1b; SpringAOP的源码中用到了两种动态代理来实现拦截切入功能&#xff1…