范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

FFmpeg入门学习02音视频解封装功能实现

  1、前言
  如上图所示,在上一篇文章中介绍了视频播放的基本原理。本文继续使用 FFmpeg 来实现其中音视频解封装功能。 2、背景2.1 封装格式
  封装格式(也叫容器)就是将已经编码压缩好的视频流、音频流及字幕按照一定的方案放到一个文件中,便于播放软件播放。一般来说,视频文件的后缀名就是它的封装格式,如 MP4、flv 等,如下图所示:
  2.2 解封装
  解封装就是和视频封装相反的过程,即把一个流媒体文件,拆解成音频数据和视频数据,一般被拆解成 H.264 编码的视频码流和 AAC 编码的音频码流,如下图所示:
  2.3 解封装实现流程
  使用 FFmpeg 实现解封装就是在在打开视频文件后,使用 av_read_frame 接口不断读取数据包的过程,如下图所示:
  3、解封装代码实现3.1 概述
  本文在之前 FFmpegPlayer 类的基础上,进一步完善相关成员变量及方法,以实现解封装功能。 3.2 完善 FFmpegPlayer 类
  增加一个成员变量 packet ,用于接收和暂存读取到的数据,完善后的 FFmpegPlayer 类如下: class FFmpegPlayer { public:     explicit FFmpegPlayer(const char* m_url);     ~FFmpegPlayer(); public:     bool        openFile();//打开文件     void        startDecode();//开启循环解码     void        abortDecode();//中断解码 private:     int         readOnePacket();//读一个包     int         readPacket();//循环读包 private:     std::string       url;//文件路径     AVFormatContext*  formatContext = nullptr;//封装格式上下文     AVPacket          packet{}; //用于读包      std::thread *     read_thread = nullptr;//数据读取线程     bool              abort_request{false};//强制结束     bool              readEof{false};//读包结束      int               video_index{-1};//视频流索引     int               audio_index{-1};//音频流索引 };3.3 readOnePacket 方法实现
  readOnePacket 方法用于读取一个数据包,并返回是否读取成功的标记,实现如下: int FFmpegPlayer::readOnePacket()  {      if( abort_request ) return -1;//响应用户中断操作      int ret = av_read_frame( formatContext, &packet); //读取一个数据包     if( ret < 0 )     {         if( ret == AVERROR_EOF )//读包结束         {             readEof = true;         }         else//出错了         {             return  -1;         }     }     else     {         readEof = false;     }     return ret; }
  C++音视频学习资料免费获取方法:关注音视频开发T哥  ,点击「链接」即可免费获取2023年最新 C++音视频开发进阶独家免费学习大礼包! 3.4 readPacket 方法实现
  readPacket 方法实现了循环读包,调用 readOnePacket 读取数据包并进行处理,实现如下: int FFmpegPlayer::readPacket()  {     while(true)     {         if( abort_request ) break;//用户退出          std::shared_ptr pktClear(&packet, [](AVPacket *p "")         {             av_packet_unref(p);         });//用来确保每次 av_read_frame 后 pkt 缓存被清理了          int ret = readOnePacket();         if( ret == 0 )         {             if (packet.stream_index == video_index)             {                 std::cout << "读取到了一个视频包,pts :" << packet.pts << std::endl;             }             else  if (packet.stream_index == audio_index)             {                 std::cout << "读取到了一个音频包,pts :" << packet.pts << std::endl;             }         }      }     return 0; }3.5 startDecode 方法实现
  创建一个线程,用于循环读包,实现如下: void FFmpegPlayer::startDecode() {     read_thread = new std::thread( &FFmpegPlayer::readPacket, this  ); }3.6 abortDecode 方法实现
  用户主动中断视频播放接口,更改中断标记并结束线程,实现如下: void FFmpegPlayer::abortDecode() {     abort_request = 1;      if( read_thread && read_thread->joinable())         read_thread->join(); }4、代码运行示例
  文件打开成功后,调用解复用接口,代码如下: #include "FFmpegPlayer.h" int main() {      const char  * url = "C:LzcWorkCodetest.mkv";     FFmpegPlayer * player = new FFmpegPlayer(url);     if( player->openFile())     {         std::cout << "文件打开成功!"<startDecode();     }          system("pause");     return 0; }
  运行结果如下:
  原文链接:FFmpeg 入门学习 02--音视频解封装功能实现

地绵万里尽春耕地绵万里尽春耕人民网2023年2月25日,江西省萍乡市莲花县升坊镇石江村萝卜种植基地里,农户们在忙着给新出土的萝卜去泥分拣装运。李桂东摄(人民图片网)2023年2月25日,四川省南专访艾比森丁彦辉跨界储能,LED大佬50岁再创业天命之年,LED大佬宣布再创业,跨界进军新型储能行业。2月6日,上市公司艾比森公告,公司全资子公司深圳市艾比森投资有限公司拟与董事长丁彦辉深圳市睿品存储合伙企业(有限合伙)共同投资和满是缺点的自己和解头条创作挑战赛曾经我不明白为什么父母对自己的孩子抱有那么大的期望,望子成龙,望女成凤。明明自己都没有比得过自己的同龄人,自己的生活水平都是在温饱线上挣扎,怎么会想着自己的孩子就是万儿童发烧除了布洛芬还有哪些方法?儿科专家给出详细建议来源澎湃新闻除了布洛芬对乙酰氨基酚,还有不少药物可用于应对儿童发烧,复旦大学附属儿科医院专家团队给出更多详细应对建议。发热后可先采用物理降温措施中国药学会儿童药物首届主任委员复旦大郑州小儿眼科专家王新解答儿童近视的前兆有哪些?随着儿童近视率不断攀升,许多家长也开始重视孩子的视力问题。儿童近视的前兆有哪些?应该如何早发现并预防呢?今天,郑州小儿眼科专家王新就来详细解答。征兆一眯眼当远处目标看不清时,孩子会孩子个子矮打生长激素有用吗?你的孩子是不是自上学起就坐在前排?孩子是不是排队永远是前几个?个子相比同龄人偏矮,而且一直都偏矮,该打生长激素吗?孩子个子偏矮下面提供一个临床上供孩子常用的矮小症状况评分量表,家长孩子视力1。0就高枕无忧吗?山东省立三院提醒定期视力筛查推荐家长们坚持做开学前刚做视力筛查,这学期还没结束,为什么又要做?上次检查视力1。0,好着呢,没必要老是查吧!孩子近视了,已经给他配了眼镜,不用担心。近年来,儿童青少年的视力健康得到全社会普遍关注事关孩子!婴幼儿奶粉新国标正式实施婴幼儿的奶粉是新晋父母关注的头等大事2月22日一个重磅消息让父母安心不少婴幼儿奶粉新国标正式实施!图源人民网微博新实施的食品安全国家标准婴儿配方食品(GB107652021)食品国终于,灵动岛还是被抄了谈到近些年苹果在iPhone设计方面作出的重大创新,就不得不提及去年iPhone14Pro中首次亮相的灵动岛了。凭借这项全新的设计,iPhone14Pro系列机型也不负众望,一跃成中小学智慧教育在全息教室环境下学生学习动机研究随着科技的发展和智慧教育的兴起,越来越多的中小学校园开始引入全息教室等新技术,以提升学生的学习体验和教育质量。但是,在这样的环境下,学生的学习动机是一个重要的问题,需要引起我们的关springboot2。7。6升级springboot3。0。2小结项目脚手架项目脚手架是基于springBoot2。7。6jdk17的springCloud分布式微服务架构。主要组件和框架有nacos,sentinel,springCloudGa
妙趣烟火味斯文风骨中袁锡卿揽34处湖湘名胜入怀,游记诗词山歌书法拓印,4册合匣,花式表达,潇湘屐齿可谓自成风景。其实,文人也是贼,偷人心。循书中此语,不说诗词山歌之雅俗天成,也不说书法拓印之自成格局,浓眉轮休湖人110114不敌火箭,波特砍27分火箭主场114110击败湖人取得两连胜。安东尼戴维斯轮休,火箭中锋阿尔佩伦申京复出。开场申京杰伦格林篮下得分,波特和格林还命中三分,火箭146领先。比斯利三分回应,但波特贾巴里史密这一巨头宣布再裁10000人!脸书母公司Meta首席执行官马克扎克伯格周二表示,该公司计划裁员10000人。Meta在2022年11月解雇了超过11000名员工。马克扎克伯格将2023年视作该公司的效率年。此前江苏作家篱边问菊的长篇小说西颜集轶事连载第十回第十回老实人巧遇不老实事贪心鬼硬做真贪心梦耿万财自打儿子耿大彪回来后神采飞扬精神焕发,像变了一个人似的。走起路来脚下仿佛随风起舞的蒲公英,有种轻飘飘地感觉,不喝酒都醉人,心情格外舒建议将科技适老列入国家发展战略立法保障数字时代的老年人权益杨伟坤河北省保定市副市长李杰人福医药董事长陈力上海移动党委书记董事长总经理迟日大中华全国律师协会副会长王晋刚山西省襄汾县古城镇关村党支部书记村委会主任刘庆峰科大讯飞董事长全国人大代沙洲日记学雷锋,树新风3月14日星期二晴三月的微风,吹来了春的气息三月的阳光,播撒了春的种子三月的甘泉,滋润着我们的心田三月,让我们再以雷锋为榜样!我校为弘扬雷锋精神,举行了三月学雷锋,保护环境活动。今湿气重的人,通常有6种表现!提示若想祛湿,谨记4不5要中医认为风寒暑湿燥火是致病的原因。被称其为6邪。其中的湿就是指的湿气,被称为湿邪。湿气是一种中医理论概念。中医认为自然界中气候潮湿食肉等是湿气的来源,湿邪过重则易伤阳气。认为通过饮怎么吃很重要!中药是饭前还是饭后吃?本文帮你解答中药的剂型有汤丸散,而临床应用最广泛的一种剂型是汤剂,它易于吸收,药效快,药物随病情加减灵活方便。服用方法与时间通常情况下,一般药物饭前饭后服都可以,应与吃饭时间间隔1小时左右。滋甲状腺疾病到底需要补碘还是限碘?甲状腺疾病甲状腺疾病患者就医时,医生除了告诉他们要按时吃药外,有时还会提醒一些患者要多吃海带等海产品,但对另外一些患者却要求要限制食用海带,那么甲状腺疾病患者到底应该多吃还是少吃海警惕!这些常见食物处理不当会引起中毒食物中毒,是由于进食被细菌及其毒素污染的食物,或摄食含有毒素的动植物等引起的急性中毒性疾病,通常都是在不知情的情况下发生食物中毒。除了大家熟悉的红伞伞白杆杆,生活中这几件常见的食物低温与长寿除了遗传因素之外,人的行为方式决定着寿命的长短。科学家发现降低人的温度有延年延寿的作用。居住在寒带的人比居住在热带的寿命要长。挪威瑞典芬兰等国,靠近北极,都以长寿著称,而热带的人长