日期:2016.10.10
作者:isshe
github:github.com/isshe
邮箱:i.sshe@outlook.com
平台:ubuntu16.04 64bit + ffmepg3 + SDL2

这篇记录退出、暂停、播放。
快进快退想了下,没啥思路。囧。

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

  • 想要做到的:
    1. 中途退出(点窗口的x)能立即退出
    2. 播放完窗口停住,等待x掉。

需要解决的问题

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

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

    1. 判断packet队列是否为空,空的话延时一段时间再判断一次(或多次),如果再为空就退出。
      问题:如果延时,延时多长呢? 判断几次好呢?
    2. 获取时长,大于等于的时候退出。(好像靠谱)
      • 获取总时长:AFStream的duration * AFStream的time_base[当然要用av_p2d转换了]
      • 获取当前时长:AFPacket的pts * AFStream 的time_base[同样要转换]。
        这种方法感觉是可以的,但是在这份代码中用这个方法,最后的packet的pts总是小于总的时长,就算再加一个两帧间的delay也还是小。所以最后还是用了第一种方法
  • 如何处理退出? 如果有两个流,一个长一个短,如何才能不互相影响?
    如何处理退出和播放音视频的代码有关

    本程序中:

    1. 音频是主线程打开(SDL_OpenAudio())设备后,SDL_OpenAudio()开线程调用callback()函数取声音数据来解码发出声音。
    2. 视频是主线程配置好相关信息,然后开一个线程运行 刷新函数 (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("<RETURN> is pressed.\n");
        if (state[SDL_SCANCODE_RIGHT] && state[SDL_SCANCODE_UP]) {
            printf("Right and Up Keys Pressed.\n");
        break;
     
    
    case SDL_KEYDOWN:
        switch(event.key.keysym.sym)
            case SDLK_LEFT:
                break;
            case SDLK_RIGHT:
                break;
            case SDLK_UP:
                break;
            case SDLK_DOWN:
                break;
    

    如何实现暂停/播放?

    这个实现中:用一个变量(player_state)表示视频的状态。
    -1: 退出;
    0: 播放;
    1: 暂停:

    • 暂停:键盘事件触发以后把视频的状态设置为1, 刷新函数(refresh_func)检测到player_state == 1, 就进入一个循环,类似:
    • 播放:就是refresh_func()退出这个循环,继续Push Event个主线程了。「中间隔了代码后缩进不对了,放上来…」
                while(ps->player_state == 1)
                    SDL_Delay(20); //delay的时间没有多尝试
  
  • 暂停: SDL_PauseAudio(1), 停止callback()。
  • 播放:SDL_PauseAudio(0), 继续callback()。
在callback里面操作这两个函数也是可以的。
但是不要放到callback里面,因为,SDL_PauseAudio(1)就是停止调用callback()的,停止以后,就调用不了SDL_PauseAudio(0)了,所以,这两个函数哪个线程调用(SDL_OpenAudio())开设备,哪个就调用这两个比较好。(目前实践情况,不一定对)。

SDL: http://wiki.libsdl.org/SDL_PauseAudio

github: https://github.com/isshe/Practice-project/tree/master/Player/blog/chapter6/player_v1.6
csdn: http://download.csdn.net/detail/i_scream_/9649398

问题:如何处理退出?如何判断一个流结束?如果有两个流,如何只结束其中一个? 想到的方法: 判断packet队列是否为空,空的话延时一段时间再判断一次,如果再为空就退出。 但是如果延时,延时多长呢? 如何用键盘按键触发暂停/播放?如何单独声音和视频? 暂停/播放声音: SDL_PauseAudio(1)/SDL_PauseAudio(0); 随着移动互联网的发展,如今的手机早已不是打电话、发短信那么简单了,播放音乐、视频、录音、拍照等都是很常用的功能。在iOS中对于多媒体的支持是非常强大的,无论是音视频播放、录制,还是对麦克风、摄像头的操作都提供了多套API。在今天的文章中将会对这些内容进行一一介绍: 音频会话 音频队列服务 MPMoviePlayerControl
前言 在Android开发中自然少不了对视频录制的需求,然而视频录制虽然有系统提供给我们能够直接使用的API,但是我们往往在完成需求的过程中需要自定义实现视频录制。网上虽然也有不少资料,但是总是零零碎碎的,因此自己收集了多方面的资料自己写了一个demo来理解和学习短视频录制,记录在此同时也希望能够给大家带来一些参考和启发。 一、调用系统相机的视频录制首先我们来了解Andorid系统为我们提供的
最近在pad上写了个录屏的项目,下面总结一下最近的收获: 查看了下git上的不少的录屏的demo,好多没有实现暂停和继续的功能,当然我这个写的也有不少瑕疵,希望能提出来共同进步! 一、需求: 1、要求录屏的时候有暂停和继续功能 2、对录制完的视频有做处理(获取第一帧图片,获取视频大小等等) 二、实现: ①、demo中的Lib文件夹的Recoder就是录制视频的相关文件
这些天项目需要用MediaRecorder实现录制视频暂停功能,原来使用的API是23的版本,MediaRecorder没有自带的pause()方法对录视频进行暂停,所以需要自己实现将每一次暂停形成的小视频进行拼接,但是大家都知道,拼接其实是比较耗空间和时间的,所以在性能上肯定远远达不到项目的需要。         今天终于在不经意中找到了解决的办法,那就是使用API24以上版本!!!在官方的
今天跟大家分享的是通过android 自带的MediaRecorder录制视频,具体录制的代码网上有很多。所以我们在写录制视频时,并不会遇到什么大难题的。但是,我现在刚好想要实现一个可以录制暂停,然后继续录制这样的功能。(我在网上就没怎么搜到有介绍的,可能是我搜的不对。) 下面是我效果图,从左到右分别是开妈的预览,录制,点击暂停播放。 首先,因为我设置的是竖屏拍摄,所以一开始遇到的
之前写过一个Demo实现了MediaRecorder的暂停录制问题,后来很多人加了我的QQ,所以今天写了这篇博客和大家一起交流分享。 首先,我研究过android的MediaRecorder的API是不支持暂停续录的,所以,客官一定要用MediaRecorder的源生API去实现暂停续录,可以直接点击关闭该页面按钮。 我这里使用的方法是对视频的拼接,思路是当时看国外的stackoverflow
FFmpeg是一个集录制、转换、音/视频编码解码功能为一体的完整的开源解决方案。FFmpeg的 开发是基于Linux操作系统,但是可以在大多数操作系统中编译和使用。FFmpeg支持MPEG、 DivX、MPEG4、AC3、DV、FLV等40多种编码,A
1.原生的ffmpeg退出机制与基础的退出处理方法:ffmpeg退出函数是:ffmpeg_cleanup。ffmpeg首先会在main入口注册这个回调。register_exit(ffmpeg_cleanup);void register_exit(void (*cb)(int ret)) program_exit = cb; }然后,在其他的地方调用,exit_program方法。...
在现今这个阶段,越来越多的app会涉及到音视频,那么学会使用ffmpeg就很有必要了。在这个系类中将讲解如何把ffmpeg编译成动态库,以及使用ffmpeg实现视频播放和音视频的采集。 Linux/Ubuntu/centos都行 在windows环境下可以安装虚拟机或者购买一个云主机,作者在金山云购买的一个Ubuntu主机。 下载配置ndk,下载ffmpeg并解压。 SDL_Window:视频播放时弹出的窗口(可以创建多个窗口)。 SDL_Texture:显示YUV数据。一个SDL_Texture对应一帧YUV数据。 SDL_Renderer:渲染SDL_Texture至SDL_Window。 SDL_Rect:确定图像显示的位置。 代码1:直接读取yuv数据进行播放,40ms一帧。 #include <stdio.h> #include "SDL2/SDL.h" void play
ffmpeg sdl是一种基于ffmpegsdl库开发的视频播放器ffmpeg是一个开源的跨平台音视频解决方案,支持包括视频采集、编码、解码、转码、播放等功能,被广泛应用于视频处理和视频播放领域。而sdl是一种跨平台开放源代码的多媒体库,提供了音频视频、事件等处理功能,它是一个适合于游戏和媒体应用的库。 ffmpeg sdl视频播放器利用ffmpeg库解码文件,将视频数据解码成RGB格式的图片数据,然后使用sdl库将图片数据渲染到屏幕上。通过这种方式,可以实现基于CPU的视频播放ffmpeg sdl视频播放器具有以下特性: 1. 支持多种视频格式:ffmpeg支持的视频格式非常丰富,几乎可以处理所有常见的视频格式,例如MP4、AVI、FLV等。因此,ffmpeg sdl视频播放器可以播放多种格式的视频。 2. 良好的兼容性:ffmpeg sdl视频播放器可以运行在多个平台上,例如Windows、Linux、Android等平台。 3. 可扩展性强:ffmpegsdl都是开源的项目,可以方便地进行开发和扩展。同时,ffmpeg sdl视频播放器还支持自定义音频视频渲染。 4. 轻量级:ffmpeg sdl视频播放器采用的是CPU进行解码,因此不需要额外的硬件加速。同时,ffmpegsdl都是轻量级的库,不会占用过多的系统资源。 总之,ffmpeg sdl视频播放器是一种非常方便的视频播放解决方案,具有兼容性强、支持视频格式多、可扩展性强等优点。它可以为视频处理和视频播放提供极佳的支持,并且可以适用于多种平台和应用场景。
i丶scream: https://blog.csdn.net/i_scream_/article/details/88088027?spm=1001.2014.3001.5502 [6] ffmpeg + SDL2 实现的视频播放器「视音频同步」 weixin_45460217: 博主方便发我一份代码吗?十分感谢 1959812781@qq.com 对主机或 Docker 镜像进行漏洞扫描 i丶scream: https://docs.docker.com/engine/install/ docker 不需要破解呀