ffmpeg视频暂停录制的设计

本文介绍了如何使用FFmpeg实现视频暂停录制功能,详细阐述了录制过程中PTS和DTS的处理,确保视频文件的连续播放。此外,还讨论了在多通道视频录制和轮询场景下的应用。提供相关代码和效果图,以及一个演示地址供体验。
摘要由CSDN通过智能技术生成

1、前言

基本上各种播放器提供的录制视频接口,都是只有开始录制和结束录制两个,当然一般用的最多的也是这两个接口,但是实际使用过程中,还有一种可能需要中途暂停录制,暂停以后再次继续录制,将中间部分视频不需要录制,跳过这部分不需要的视频,而且录制的视频文件必须是能够正常播放的连续的。vlc和mpv都只提供了开始录制和停止录制接口,ffmpeg既然是自己解码,所以录制完全自己控制,存储的时候,每一帧的数据都要写入pts和dts,每次重新计算时间基准保证时间正确,不然不是连续的帧保存后会跳。

打通了视频暂停录制功,还有个应用场景就可以迎难而解,就是多个通道的视频,不同时段分开存入同一个视频文件,类似于将轮询的过程中展示的视频挨个存储到同一个视频文件,当然分辨率必须保持一致,不一致可能存储会出问题,这种场景还是比较常见的,比如视频通道轮询过程中,指定某个位置的视频存储的同一个视频文件,将轮询的整个过程录制下来,后期以便回放查阅视频。在当前封装的组件中,除了打开和关闭录制,中途只需要将视频帧传入即可,会自动计算换算成正确的pts/dts存储到MP4文件中。

2、效果图

3、体验地址

  1. 国内站点:gitee.com/feiyangqing…

  2. 国际站点:github.com/feiyangqing…

  3. 个人作品:blog.csdn.net/feiyangqing…

  4. 体验地址:pan.baidu.com/s/1d7TH_GEY… 提取码:01jf 文件名:bin_video_demo/bin_linux_video。

4、相关代码

void FFmpegThread::recordStart(const QString &fileName)
{
#ifdef videosave
    AbstractVideoThread::recordStart(fileName);
    if ((saveVideoType > 1) && !onlyAudio) {
        this->setFileName(fileName);
        //处于暂停阶段则切换暂停标志位(暂停后再次恢复说明又重新开始录制)
        if (saveFile->getIsPause()) {
            isRecord = true;
            saveFile->pause();
            emit recorderStateChanged(RecorderState_Recording, fileName);
        } else {
            saveFile->setPara(saveVideoType, videoWidth, videoHeight, frameRate, forma
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值