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会卡住不返回。

a's'da's'd相关推荐

  1. 本田da屏怎么进wince系统_弥补小型车短板,东风本田全新LIFE“来福酱”上市

    "骨子里流淌着本田的纯正血统." 来源:东风本田官方 12月15日晚,东风本田全新LIFE(中文名:来福酱)正式上市.新车推出SPORT"灵动拍档"和CROSS ...

  2. 初步了解:使用JavaScript进行表达式(De Do Do Do,De Da Da Da)

    by Donavon West 由Donavon West 初步了解:使用JavaScript进行表达式(De Do Do Do,De Da Da Da) (A first look: do expr ...

  3. 通da信TCP长连接数据算法分析

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 分析通da信TCP长连接内部分数据的算法." 作为一款老牌的炒股软件,通da信里面的数据是相当的丰富,免费的也很丰富,准确性也很好 ...

  4. 你听过BA、DA、AA、TA么?全网疯传的架构实践全景图!

    业务架构是跨系统的业务架构蓝图,应用架构.数据架构.技术架构是解决方案的不同方面. 多年来,全球业界已在业务架构.应用架构.数据架构.技术架构方面积累了大量经验. 近几年,数字化转型呼唤"懂 ...

  5. Enterprise Vault 系列 [CA和DA]

    很多人不知道Enterprise Vault是什么,更不用说它的组件CA和DA了,这两天时间看了两本书,分别是介绍CA和DA的,和大家简单分享: 首先说说EV,它是一种数据归档软件,主要用于归档Exc ...

  6. 【arduino】继续用arduino玩CyberPi童芯派之DA音频信号播放

    微信关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. hi老铁们,我回来了,今天继续玩CyberPi童芯派. 经过大量的试验,终于把DA播放 ...

  7. 【DA算法】基于DA算法的FIR滤波器的FPGA实现

    1.软件版本 quartusii 2.本算法理论知识 DA算法的主要特点是,巧妙地利用查找表将固定系数的MAC运算转化为查表操作,其运算速度不随系数和输入数据位数的增加而降低,而且相对直接实现乘法器而 ...

  8. DL之CNN:卷积神经网络算法应用之卷积神经网络实践技巧(DA/DP/WI/BN/H/O/R)、优化技术经验之详细攻略

    DL之CNN:卷积神经网络算法应用之卷积神经网络实践技巧(DA/DP/WI/BN/Hyperparameter/Overfitting/Regularization).优化技术经验之详细攻略 目录 卷 ...

  9. Dataset之DA:数据增强(Data Augmentation)的简介、方法、案例应用之详细攻略

    Dataset之DA:数据增强(Data Augmentation)的简介.方法.案例应用之详细攻略 目录 DA的简介 DA的方法 DA的案例应用 DA的简介 数据集增强主要是为了减少网络的过拟合现象 ...

  10. 本田da屏怎么进wince系统_东风本田LIFE“来福酱”上市

    阅读本文前,请您先点击上面的"蓝色字体",再点击"关注",这样您就可以继续免费收到文章了.每天都会有分享,都是免费订阅,请您放心关注.注:本文转载自网络,不代表 ...

最新文章

  1. 华人“军火专家”——黄仁勋
  2. Ubuntu 下获得root权限
  3. 完整适配LUCI界面的Openwrt中EC20的QMI拨号
  4. jquery append 动态添加的元素事件on 不起作用的解决方案
  5. 打开本机网页总有安全提示,怎么办?
  6. windows中安装64位MySQL及连接MySQL和重置MySQL密码
  7. rocketMq概念介绍
  8. keras系列︱利用fit_generator最小化显存占用比率/数据Batch化
  9. 川农《劳动与社会保障法(本科)》21年12月作业考核
  10. 002--软考程序员之硬件组成原理
  11. airtest获取当前设备序列号,并连接
  12. linux 设置开机自启动服务命令,linux开机自启动服务优化设置命令
  13. 计算机找不到指纹登陆,Win10电脑上登陆选项没有PIN码和指纹设置的解决教程
  14. LATEX编辑高数基础公式
  15. 2D/3D文档查看器ABViewer v12大大提高了PDF转DWG的速度
  16. python拍七游戏代码_python实现逢七拍腿小游戏的思路详解
  17. vscode格式化文件时 vue文件报错
  18. 蓝叠验证码java异常,过apk模拟器检测,关于特定模拟器检测蓝叠模拟器
  19. 多分类svm的hinge loss公式推导_损失函数—深度学习常见损失函数总结【图像分类|下】...
  20. 永磁同步电机的矢量控制策略(七)一一一SVPWM控制

热门文章

  1. 荣耀9 lite进军印度市场,但价格还不够低
  2. 2016蘑菇街内推电面经验
  3. Listbox+time picker
  4. 一年级小嘎蹦豆儿的故事
  5. 京东AI研究院8篇论文被AAAI 2019收录,国际顶会彰显京东科技实力
  6. C#关于外挂汉化的一些思考(API函数FindWindow,FindWindowEx,SendMessage)(转)
  7. iPhone手机上的Apple ID密码忘了,怎么把它注销掉登陆一个新的Apple ID
  8. ACM-简单题之不容易系列之一——hdu1465
  9. Dragger 2遇到的坑 Dragger2详解 Dragger2学习最好的资料
  10. nginx 动态设置黑名单