前言

这篇记录退出、暂停、播放。

快进快退想了下,没啥思路。囧。

关于退出

一直没怎么管退出,但是始终是个问题,无论是中途退出还是播放完毕退出。

想要做到的:

中途退出(点窗口的x)能立即退出

播放完窗口停住,等待x掉。

需要解决的问题

1.如何判断一个流结束?

关于播完退出,想过的方法:

判断packet队列是否为空,空的话延时一段时间再判断一次(或多次),如果再为空就退出。

问题:如果延时,延时多长呢? 判断几次好呢?

获取时长,大于等于的时候退出。(好像靠谱)

获取总时长:AFStream的duration * AFStream的time_base[当然要用av_p2d转换了]

获取当前时长:AFPacket的pts * AFStream 的time_base[同样要转换]。

这种方法感觉是可以的,但是在这份代码中用这个方法,最后的packet的pts总是小于总的时长,就算再加一个两帧间的delay也还是小。所以最后还是用了第一种方法

如何处理退出? 如果有两个流,一个长一个短,如何才能不互相影响?

如何处理退出和播放音视频的代码有关

本程序中:

音频是主线程打开(SDL_OpenAudio())设备后,SDL_OpenAudio()开线程调用callback()函数取声音数据来解码发出声音。

视频是主线程配置好相关信息,然后开一个线程运行刷新函数(refresh_func)循环发出刷新事件,主线程接收事件再调用显示函数(代码中是decode_and_show())。

这个实现中退出视频播放比较简单,只要跳出刷新函数(refresh_func)中的循环即可。

退出音频,思路是:让callback()不再运行。SDL_PauseAudio()实现这个功能。如有必要再SDL_CloseAudio()

(更新的函数是SDL_OpenAudioDevice()和SDL_CloseAudioDevice())

「需要注意:哪个线程调用打开,哪个线程调用关闭,类似的, 哪个线程调用创建窗口(SDL_CreateWindow())之类的函数,就用哪个线程调用显示函数,否则容易出现core dump和显示不出来」

暂停/播放

实现的是用键盘的space空格键控制播放、暂停。第一感觉就是用SDL的Event,也确实可行。

如何使用键盘Event?

按键事件的触发方式:

方法一:

case SDL_KEYDOWN:

{

const Uint8 *state = SDL_GetKeyboardState(NULL);

if (state[SDL_SCANCODE_RETURN]) {

printf(" is pressed.\n");

}

if (state[SDL_SCANCODE_RIGHT] && state[SDL_SCANCODE_UP]) {

printf("Right and Up Keys Pressed.\n");

}

break;

}

1

2

3

4

5

6

7

8

9

10

11

1

2

3

4

5

6

7

8

9

10

11

SDL_SCANCODE_RIGHT这些就是表示是哪个按键。

case SDL_KEYDOWN:

{

switch(event.key.keysym.sym)

{

case SDLK_LEFT:

break;

case SDLK_RIGHT:

break;

case SDLK_UP:

break;

case SDLK_DOWN:

break;

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

1

2

3

4

5

6

7

8

9

10

11

12

13

14

如何实现暂停/播放?

这个实现中:用一个变量(player_state)表示视频的状态。

-1: 退出;

0: 播放;

1: 暂停:

视频:

暂停:键盘事件触发以后把视频的状态设置为1, 刷新函数(refresh_func)检测到player_state == 1, 就进入一个循环,类似:

播放:就是refresh_func()退出这个循环,继续Push Event个主线程了。「中间隔了代码后缩进不对了,放上来…」

while(ps->player_state == 1)

{

SDL_Delay(20); //delay的时间没有多尝试

}

1

2

3

4

1

2

3

4

音频:

暂停: SDL_PauseAudio(1), 停止callback()。

播放:SDL_PauseAudio(0), 继续callback()。

在callback里面操作这两个函数也是可以的。

但是不要放到callback里面,因为,SDL_PauseAudio(1)就是停止调用callback()的,停止以后,就调用不了SDL_PauseAudio(0)了,所以,这两个函数哪个线程调用(SDL_OpenAudio())开设备,哪个就调用这两个比较好。(目前实践情况,不一定对)。

参考资料

代码下载

ffmpeg拉流设置暂停_ffmpeg+SDL2实现的视频播放器「退出、暂停、播放」相关推荐

  1. 流媒体测试笔记记录之————阿里云监控、OBS、FFmpeg拉流和推流变化比较记录...

    OBS设置视频(512kbps)和音频(128kbps)比特率 阿里云监控结果: 使用FFmpeg拉流到Nginx 服务器测试比特率 第二次测试,修改视频和音频比特率 OBS设置 阿里云监控 Ngin ...

  2. 直播推流 ffmpeg 拉流二次转发 记录

    因 前两天老大给我发了个任务,说让我做一个flask 服务器接口,接收请求,在请求参数中获取 直播拉流地址和 推流地址,然后调用 ffmpeg 到拉流地址上进行拉流 将拉到的流媒体数据推到另一个直播服 ...

  3. uniapp h5直播拉流的几种方法 flv.js, video.js, 阿里播放器sdk,video标签

    uniapp h5直播拉流的几种方法 flv.js, video.js, 阿里播放器sdk,video标签 前言 首先引入资源文件 需要创建index.html 模板文件 flv.js video.j ...

  4. 基于阿里云直播实现视频推流(ffmpeg)/拉流(Django2.0)以及在线视频直播播放(支持http/https)功能

    由于5g网络的光速推广,视频业务又被推上了风口浪尖,在2019年初我们还在谈论照片,短视频等关键字,而进入2020年,我们津津乐道的就只有视频,视频,还是视频,普通人拿起手机做直播早已不是奢望,去年我 ...

  5. FFmpeg 拉流,视频源信号不稳定问题,解决思路

    1. 前言 在某些企业,由于视频网络不佳,导致FFmpeg在拉流的时候,总是中断,顺带者,推流端也总是中断. 2. 解决思路 2个线程,拉流一个独立的线程,推流一个独立的线程.两个线程之间,用vect ...

  6. 【人脸识别】旷世的好用的人脸识别 insightface 使用记录和搭建服务注意点和坑,手把手教你从0到1,太好用了,可以直接运行项目,跟进更新+ffmpeg拉流抽帧

    文章目录 前言 1.开始 1.1 前置 1.2 再次运行,人脸检测跑通 1.3 人脸特征抽取 1.3.1 模型下载 1.3.2 重新跑一下检测和识别 1.3.3 人脸监测返回值分析 1.3.4 计算相 ...

  7. Qt实现 基于ffmpeg拉流播放视频

    1.前言 ffmpeg作为开源库,具备跨平台性,被广泛使用于各大视频软件和网站,在视音频开发中占有极其重要的地位. Qt同样支持跨平台,因此结合qt+ffmpeg制作跨平台视频播放器是比较合适的做法. ...

  8. FFmpeg中RTSP客户端拉流测试代码

    之前在https://blog.csdn.net/fengbingchun/article/details/91355410中给出了通过LIVE555实现拉流的测试代码,这里通过FFmpeg来实现,代 ...

  9. [转]使用FFmpeg将视频推流到nginx,通过vlc拉流播放(通过命令的方式)

    安装完FFmpeg,nginx,nginx-rtmp-module,vlc后就可以进行推流.拉流测试了.博主的nginx安装在VMWare的Ubuntu中(安装方法可以参考https://blog.c ...

最新文章

  1. 毕向东Java基础教程(适合初学者入门的Java基础视频)
  2. Future取消线程执行
  3. 理解Asp.Net自定义控件的生命周期
  4. win8.1桌面上快捷方式的箭头
  5. tensorflow 1.14 + cuda10.1 在Ubuntu 16.04上
  6. 体脂率计算原理以及python实现(一目了然)
  7. 混合基金量化投资策略应该怎么制定?
  8. Hadoop资源管理
  9. 关于idea无法使用搜狗输入法打出汉字的解决方案(转)
  10. 大二暑假java培训第七天
  11. python 使用正则表达式爬取淘宝店铺图片
  12. java 一周前日期_java获取当前时间前一周、前一月、前一年的时间
  13. 【移动端聊天功能模板】Vue实现H5聊天系统,实现上下固定中间滚动布局,微信授权功能,自动滚动到底部【详细注释,一看就会】
  14. 使用artisan命令创建控制器
  15. 远程桌面连接软件 Remote Desktop Manager for Mac
  16. 管理学原理名词解释题(考试没有,仅供参考)
  17. Django项目实践(商城):九、QQ登录
  18. 阿里开源EasyExcel数字转换问题
  19. OSChina 情人节乱弹 ——我们程序员的浪漫
  20. 南邮CTF:密码学 骚年来一发吗

热门文章

  1. VS2008异常捕获不到的问题
  2. 使用 Zabbix 监控 Jenkins
  3. 数组方法 splice()与slice()的区别
  4. 【树形dp】VK Cup 2012 Round 1 D. Distance in Tree
  5. 修改MYSQL数据库表的字符集
  6. 使用HttpWebRequest方式访问外部接口
  7. 重新配置Domino服务器
  8. concurrenthashmap是什么锁_JDK1.8 util-concurrent-ConcurrentHashMap源码分析
  9. opencv linux 编译好,linux下编译opencv
  10. python中组合数据类型、函数和代码复用的难点_Python电子教案5-2 函数和代码复用...