菜鸟学ffmpeg音视频技术之二实现命令录制(暂停,组合)

利用FFmpeg玩转Android视频录制与压缩(一) Android下利用FFmpeg玩转视频录制与压缩(一) 说明: 本库暂时是在秒拍开源库上做的二次开发,旨在开发简单好用高效的视频录制库。本篇文档只涉及Java层次逻辑,正在业余修炼c语言与JNI相关的东西,如果有幸写第二篇文章,那时将对其做更深入的剖析,如FFmpeg编译、JNI相关代码编写。 效果图: 功能描述: 利用FFmpeg录制定制化的视 阅读详情

前一节已经实现了录制,只能录制一段视频,实际运用中我们可能会暂停,然后接着录制最终生成一条完整的视频。

我们在使用命令行操作ffmpeg时组合各段视频的命令如下:

ffmpeg -f conccat -safe 0 -i conccatfile -c copy dirfile

所以我的方法是暂停录制后生成一条临时视频,并把临时视频的文件名保存在conccatfile里面。重新开始录制又重新录制一条临时视频,这样如果一直反复暂停录制开始录制,会生成多个临时文件。停止录制时将这些视频组合成一条视频,从而完成录制的各种操作实现。

1.创建一个保存临时视频的文件

文件按录制开始的本地时间命名如下:

  QString path = QString("%1/%2_tmp").arg(m_cacheDir).arg(QDateTime::currentDateTime().toMSecsSinceEpoch());
         m_pConcatFile = new QFile(path);
        if (!m_pConcatFile->open(QIODevice::ReadWrite | QIODevice::Text|QIODevice::Truncate))
            qDebug() << "File open error";

2.开始录制

之前是直接给出最终的录制文件名,这里为了实现暂停录制功能,开始录制时使用临时文件。并把临时视频文件内容写入步骤1创建的文件

QString tmpFilePath = QString("v%1_tmp").arg(QDateTime::currentDateTime().toMSecsSinceEpoch());

    QTextStream out(m_pConcatFile);
    out << "file" << " '" << tmpFilePath << "'\n";
    QString tmpFileAbsolutePath =  m_cacheDir + "/"+ tmpFilePath;
    args << tmpFileAbsolutePath;

    m_currentRecordTempFiles<<tmpFileAbsolutePath;
    m_currentRecordTempFiles<<tmpFileAbsolutePath.replace("_tmp", ".mp4");
    m_pRecordProcess->start("ffmpeg", args);

3.停止录制

新增加一个成员变量来判断时真的停止录制,如果时停止录制就开始组合视频。并将步骤1创建的组合文件列表的文件删除

   m_bStopRecord = true;
    m_concatFileName = m_pConcatFile->fileName();
    m_pConcatFile->close();
    m_pConcatFile->deleteLater();
    m_pConcatFile = nullptr;
    m_pRecordProcess->write("q");

4.暂停录制

暂停录制停止当前录制进程,并设置m_bStopRecord = false,这样就不会开始组合,下次开始录制会重新生成一个视频临时文件,并写入步骤1创建的组合文件列表的文件

    m_bStopRecord = false;
    m_pRecordProcess->write("q");

录制过程中会生成如下临时文件:

带v的表示视频,不带的表示组合文件列表:

 

5.组合录制视频

每次录制进程退出都会去判断m_bStopRecord = true,如果true则新建一个进程去处理视频组合。

        connect(m_pRecordProcess, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
            [this](int exitCode, QProcess::ExitStatus exitStatus) {
            if(!m_bStopRecord)
                return;
            QProcess* mergeProcess = new QProcess(this);
            connect(mergeProcess, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
                [mergeProcess, this](int exitCode, QProcess::ExitStatus exitStatus) {
                qDebug() << QStringLiteral("成功合成视频");
                qDebug() << mergeProcess->readAllStandardError();
                if(m_currentRecordTempFiles.count()>3)
                    m_currentVideoPath = m_currentRecordTempFiles.at(2);
                clear();
            });

            if(m_currentRecordTempFiles.count()<3)
                return ;
            QStringList args;
            args << "-f" << "concat";
            args << "-safe" << "0";
            args << "-i" << m_currentRecordTempFiles.at(0);
            args << "-c" << "copy";
            args << m_currentRecordTempFiles.at(2);
            //合成视频
            mergeProcess->start("ffmpeg", args);

 

其实就是对应上面写的那条命令。

组合后删除临时文件生成视频。

这样就能实现真正的录制场景。

FFmpeg工具(一) --- ffmpeg视频处理命令行大全 FFmpeg是视频处理最常用的开源软件。 它功能强大,用途广泛,大量用于视频网站,也是许多音视频格式的标准编解码实现。 FFmpeg的使用格式 ffmpeg的命令行参数非常多,可以分成五个部分。 $ ffmpeg {1} {2} -i {3} {4} {5} $ ffmpeg [全局参数] [输入文件参数] -i [输入文件] [输出文件参数] [输出文件] 上面命令中,参数依次为1.全局参数,2.输入文件参数,3.输入文件,4.输出文件参数,5.输出文件。 比如: $ ffmpeg \ -y \ 阅读详情

相关推荐

使用FFmpeg实现视频录制时暂停和继续录制功能的设计

这两个函数会分别暂停读写操作,直到我们再次调用av_read_play和av_write_play函数时才恢复读写。不过,在实际应用中,用户往往需要暂停和继续录制视频,这就需要我们在录制过程中动态地切换视频流,并且保证录制后的视频文件不出错。如果在录制过程中需要暂停和继续录制,我们可以添加一些额外的逻辑来达到这个目的。当我们需要继续录制时,我们需要恢复读写操作。在上面的示例中,我们在第150帧时调用pause_recording函数暂停录制,在第200帧时调用resume_recording函数恢复录制。

ByteNinja的博客 975

ffmpeg 命令行使用

mmfpeg 合并文件 提取音频

chenzhjlf的专栏 828

使用FFmpeg合并MP4视频 ffmpeg-20190416-036b4b0-win64-exe

使用FFmpeg合并MP4视频 ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts ffmpeg -i 2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts ffmpeg -i "concat:1.ts|2.ts" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4

ffmpeg录制流媒体,正常方式停止录制

QProcess m_Process; m_Process.setProcessChannelMode(QProcess::MergedChannels); //拼接命令行字符串 QString cmd_str(""); cmd_str += QApplication::applicationDirPath() + "/ffmpeg.exe"; cmd_str += " -rtsp_tran...

weixin_30296405的博客 2143

iPhone免越狱Git服务器搭建教程-iSH

iPhone免越狱Git服务器搭建教程

jts666的博客 4427

AppFlow实战:零代码将Dify接入企业微信的完整指南

本文提供了一份零代码将Dify AI应用接入企业微信的完整实战指南。通过使用阿里云AppFlow作为无代码连接器,详细讲解了从获取Dify API密钥、创建企业微信应用到配置自动化流程的全过程,帮助团队快速将AI能力无缝融入日常协作,大幅提升工作效率。

php55的博客 808

菜鸟学ffmpeg音视频技术之一实现命令录制

ffmpeg就不解释了,太多资料了,著名的开源做音视频的库 学些录制的动力是目前所在公司使用OBS录屏存在一些问题,录制窗口有些显卡会黑屏,录制屏幕会把电脑的其他软件也会录制进去,理想的录制方式是组合录制方式,把想录制的录制进去,不像录制的去掉。比如一个软件中有多个窗口,只想录制其中一些。希望后续能成功立一个flag。 ffmpeg使用的方式有两种,一种是命令模式,一种是api模式,要实现我想要录制应该是api模式能实现,这里我先使用api实现录制,了解一下录制原理。为了方便依旧使用qt来实现。 .

xpg4321的博客 961

【Python爬虫系列】_005.浏览器开发者工具(详解)

Elements(元素)分析当前页面节点,用来辅助书写BS或者XPath这里面的数据与源代码有区别,不一定准确(避坑)Console(控制台)这个除了查看错误信息、打印调试信息(console.log())、写一些测试脚本以外,还可以当作Javascript API查看用例如我想查看console都有哪些方法和属性,我可以直接在Console中输入"console"并执行后续学js逆向的时候需要用到Sources(源代码)与在网页页面,鼠标右键——查看网页源代码 内容一致。

weixin_50296259的博客 422

【FFmpeg 系列】常用命令(二)

1、FFmpeg 命令分类 分类 分类 (1)基本信息查询命令 (5)各种滤镜命令 (2)录制命令 (6)裁剪与合并命令 (3)分解/复用命令 (7)图片/视频互转命令 (4)处理原始数据命令 (8)直播相关命令 2、FFmpeg 相关的各种流程图 FFmpeg 之处理音视频流程图 FFmpeg 之分解与复用流程图 FFmpeg 之滤镜处理流程图 3、FFmpeg 基本信息查询命令 命令 含义 命令 含义 -version 显示版本 -formats

u011035026的博客 1183

DeepSeek揭秘:构建高效反洗钱智能监控系统的全流程与代码实例

在金融领域,反洗钱(AML)是一项至关重要的任务。随着金融交易的复杂性和规模不断增长,传统的手工监控方法已无法满足现代金融系统的需求。因此,开发一个智能监控系统来自动识别和报告可疑交易变得尤为重要。本文将详细介绍如何使用DeepSeek技术构建一个高效的反洗钱智能监控系统,并提供相关的代码实例。

理论都是虚的,代码才是王道。 884

水很深的深度学习(四): 卷积神经网络CNN

深度学习-CNN,卷积神经网络的概念 上世纪60年代,Hubel等人通过对猫视觉皮层细胞的研究,提出了感受野这个概念,到80年代,Fukushima在感受野概念的基础之上提出了神经认知机的概念,可以看作是卷积神经网络的第一个实现网络,神经认知机将一个视觉模式分解成许多子模式(特征),然后进入分层递阶式相连的特征平面进行处理

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 3622

ffmpeg 常用命令汇总

转载地址: https://blog.youkuaiyun.com/kingvon_liwei/article/details/79271361 part 1: 经常用到ffmpeg 做一些视频数据的处理转换等,用来做测试,今天总结了一下,参考了网上部分朋友的经验,一起在这里汇总了一下,有需要的朋友可以收藏测试一下,有问题欢迎在下面回帖交流,谢谢;by ternence.hsu) 1、ffmpeg使用语法 命令格式: ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件] ffmpeg [[op

qq_44779847的博客 3027

专栏二十:如何选择你的单细胞亚群的分辨率--ROGUE

ROGUE这是继chooseR后第二个计算单细胞亚群分辨率的内容,其实关于代码的运行很简单,网上已经有不少教程,重复这些就没意思了,这里主要是结合探讨一下这个算法。

m0_58549466的博客 981

ffmpeg常用基本命令(转)

【FFmpeg】FFmpeg常用基本命令   1.分离视频音频流 ffmpeg -i input_file -vcodec copy -an output_file_video  //分离视频流 ffmpeg -i input_file -acodec copy -vn output_file_audio  //分离音频流 2.视频解复用 ffmpeg –i test.mp...

weixin_34050389的博客 742

CAPL通过lookupSignal和DBLookup获取DBC信号的属性信息

CAPL通过lookupSignal和DBLookup获取DBC信号的属性信息以及一些相关问题

天赐好车的博客 2885

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ffmpeg 正常停止屏幕录制

看见网上提问的人比较多,希望这个方法对大家有帮助吧。 使用ffmpeg命令行录制桌面,正常结束是在cmd窗口中输入“q”,或者直接ctrl+c; 但是在程序中通过process调用的ffmpeg.exe会出现以下问题: 1.在第一次录制中可以使用模拟ctrl+c正常结束,第二次就不能结束了。 2.如果使用kill强制结束那录制的视频就不能播放了,原因可能是视频没有写入文件尾。 既然模拟ctrl+c行不通了,那就只能试试把“q”写进标准输入 //此方法可以正常停止ffmpeg.

cloud_yd的博客 4870

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

ffmpeg MP4操作

按照视频长度添加音频 ffmpeg -i home_test.mp4 -i testmp3.mp3 -filter_complex " [1:0] apad " -shortest output.mp4

highoooo的博客 477

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ffmpeg常用命令

程序员专用的剪辑工具:)

1周是1年的2% 1018

ffmpeg笔记(三)ffmpeg指令总结

使用[0v][1v][2v][3v]将输入的4个视频流去除,分别进行缩放处理,然后基于nullsrc生成的画布进行视频平铺,命令中自定义upperleft,upperright,lowerleft,lowerright进行不同位置平铺。在FFmpeg中加入图片水印有两种方式,一种是通过movie指定水印文件路径,另外一种方式是通过filter读取输入文件的流并指定为水印。图片logo.png将会打入到input.mp4视频中,显示在x坐标50、y坐标20的位置。修改字体透明度,修改字体颜色。........

qq_23350817的博客 1499

ffmpeg常用命令小结

视频编辑、视频理解

On_theway10的博客 591

ffmpeg视频暂停录制的设计

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

irainsa的博客 887

FFmpeg录制视频、停止(VB.net,踩坑,类库——10)

FFmpeg录制视频,停止录制视频,process踩坑,VB.net

weixin_56050945的博客 1903

ffmpeg初探,windows平台下录屏

这个命令将从屏幕上录制视频,分辨率为1280x720,帧率为30fps,并将输出保存为output.mp4文件。您可以根据需要更改分辨率、帧率和输出文件名。这个命令将从默认的音频设备和屏幕上录制视频,并将它们组合成一个输出文件。使用ffmpeg录屏,按q停止。

Gjesus33的博客 551

FFMpeg无损合并视频的多种方法

众所周知,从某些视频网站下载的视频是分段的。比如新浪视频每隔6分钟分段,俗称“6分钟诅咒”。 现在的任务是将这些视频片段合并起来,并且尽量无损。 方法一:FFmpeg concat 协议 对于 MPEG 格式的视频,可以直接连接: ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg

doublefi123的专栏 12万+

FFmpeg命令行使用小结

FFmpeg 是一个强大的开源多媒体框架,被广泛应用于视频编辑、视频转码、流媒体处理、视频直播等领域。FFmpeg 包含了一系列的库和工具,用于处理和操作音视频文件。这些库包括音视频编解码器、格式转换器、滤镜、封装器等,可以处理几乎所有常见的音视频格式.

十十办文武的博客 1895
上一篇: 菜鸟学ffmpeg音视频技术之一实现命令录制
下一篇: 菜鸟学ffmpeg音视频技术之三实现命令录制(细节相关)
很菜但努力
博客等级 码龄17年 113粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值