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

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--音视频解封装功能实现

银行倒闭公示和冻结财产,美国这么搞下去,中国富人要被吓到大家都知道,美国现在策略就是使劲加息来应对通货膨胀,并且试图把我们拖垮。美国不断加息,迫使全球各地的美元回流美国,在这个大背景之下,美元就一路升值,其他货币被动贬值。对中国经济发展如果中国抛售全部美债,美国完蛋了吗?中国是美国最大的外债国之一,目前持有约1。1万亿美元的美国国债。如果中国全部抛售美债,将会对世界经济产生重大影响,尤其是对美国经济和全球金融市场产生深远的影响。首先,中国抛售美债将3月14日凌晨,一觉醒来,我发觉中国传来26个新消息3月14日凌晨,一觉醒来,我发觉中国传来26个新消息!26专家应该精减部分公务员编制!对此,你们大家怎么看?网友1那都不是一般人能去的,我们单位某国企干活的工人奇缺缺了就违反劳动法科沃斯成立25周年踏准时代节拍成就中国智造标杆中证网讯(王珞)3月11日,科沃斯集团在总部苏州举行25周年庆典。成立于1998年,科沃斯集团在25年间踏准时代的节拍,凭借其持续的自主创新在产业链的深耕,以及对市场的敏锐洞察和国中国赴黎巴嫩维和医疗分队开展药品捐赠和巡诊活动当地时间3月13日,中国第21批赴黎巴嫩维和医疗分队应联合国驻黎巴嫩临时部队(联黎部队)东区司令部民事部门的邀请,派出医护人员赴黎巴嫩卡法哈马村开展药品捐赠和巡诊活动,为当地民众提乌戈评点8天3场4球,蜘蛛侠密友贝德兰正迎来第1个爆发期看台上的球迷不惧近40度的高温。不仅从高压水龙喷射出的水丝能带来阵阵惬意,河床9号在绿茵场内的重现更让他们的心情无比舒爽。是蜘蛛侠又回来了吗?真的像啊!尽管在2019年的官网专访中广州恒大老对手陈戌源倒了,以何种方式崛起?1000万投资玩中超?我们知道广州恒大与上港是老对头,在俱乐部时陈戌源与许家印就是对手,谁也瞧不起谁,陈戌源对许家印这种不断烧钱十分反感,还对球员进行归化也十分痛恨,所以他上位之后,对广州恒大各种打压,韩国倒打一耙!批评中国U20前,先看看韩国足球的往事吧!中韩U20比赛已经落下帷幕,这是中韩两国都很关注的比赛,中国U20最终还是实力原因落败。然而,韩国媒体却毫无理由地攻击中国队!韩媒OSEN表示中国队的球员们不是踢足球,而是在展示功林高远逆转张禹珍,樊振东王曼昱苦战晋级WTT新加坡大满贯赛2023WTT新加坡大满贯赛继续进行,男单116决赛今天正式拉开了幕布。继首轮比赛3比0战胜了丹麦选手乔纳森后,梁靖崑又在今天比赛直落三局战胜了中国台北选手冯翊新,顺利晋级16强。惊天逆转!钱天一32淘汰伊藤美诚晋级,日本奥运冠军惨遭出局乒乓球WTT新加坡大满贯赛事如火如荼进行中,在刚刚结束的女单116决赛中,女乒选手钱天一迎来了跟日本奥运冠军伊藤美诚的较量。结果钱天一顶住了伊藤美诚的冲击,在01落后的情况下,连赢47岁丘索维金娜又拿奖牌了感谢所有人,未来还有更多来源海外网丘索维金娜(右一)。3月12日,2023年体操世界杯巴库站落下帷幕,中国队选手邱祺缘摘得高低杠金牌,虞琳敏则收获了跳马项目铜牌。不过在获奖者名单中,还有一个令体操观众无比
松花江全长多少公里?松花江被全国人民熟知,还是从这首松花江上开始的,由张寒晖于1935年创作的这首歌曲,描写了国土的沦陷和东北同胞流亡的惨状。我的家在东北松花江上,那里有森林煤矿,还有那满山遍野的大豆周琦参加与日本队的比赛,是直接从澳大利亚飞往日本吗?周琦入选国家队,鉴于澳大利亚联赛马上开赛,他离开打世界杯就是出难题,这看他怎么答题国家队是16人大名单确实是在以前14人呢大名单上进行取舍,但名单的江湖气息很重,拉进刘维伟究竟要干赵睿如果离开广东队,广东后场还有竞争力吗?赵睿如果离开广东队,广东后场还有意争力吗?若广东队,赵睿真离开,该有竞争力,照样有竞争力,为什么这样说呢,广东队必然是一支CBA传统强队,目前已经获得了11冠也是目前CBA12支队为什么辽篮对广厦的比赛,郭艾伦没有上场?郭艾伦和朱荣振都没有登场,杨鸣认为足以赢广厦,这就是看透了对方,对手就只有广东辽宁10294拿下广厦,这就完成上赛季常规赛的复仇,他们上赛季被对方双杀,即便季后赛逼退对方,但还是让HCL网络设备模拟器安装教程为你呈现最详细的操作步骤自我设限,固步自封,唯有突破极限,才能发掘潜能。大家好,我是每天分享网络技术和系统运维技术的网络系统技艺者,右上角点关注陪你一起成长,见证更强大的自己。前言欢迎来到本篇硬核HCL安一定别错过这两款手游神器,超高颜值!八位堂猎户座手柄相信很多游戏爱好者都期待有一个属于自己的电竞房,拥有不同的电竞设备,也成为了一些目标,手柄,键盘,耳机每一样都是自己的心头爱,不同的设备可以满足不同类型的游戏,手柄是我日常使用中频为什么中国不拆开英伟达显卡研究,从而造出自己的国产显卡?我就简单从常人能理解的角度简单解释一下这个问题。实际上拆开显卡并不难,把显卡散热器外面的几颗螺丝拧下后拿掉散热器外壳,你大概就会看到类似下图一样的一块电路板。RTX3090上图中最Lunabot在任何网页使用ChatGPT的扩展,免费还不用注册Lunabot是一款功能强大的浏览器扩展,ChromeEdgeFirefox都可以免费使用,最重要的是不需要你有APIKEY,提供免费的额度。可以帮助用户更高效便捷地处理网页内容。大容量嵌入式缘何成为现象级冰箱热度标签?日前,GfK中怡康对主流冰箱品牌进行梳理和总结,针对市场流行趋势的热点爆款产品,发布了冰箱现象级产品系列报告,大容量嵌入式成为了现象级产品的热度标签。其中容声卡萨帝COLMOTCL当牛市总是证券股先涨,是选行业前列股好还是选小盘券商好呢?一轮牛市行情启动后,无论是蓝筹股白马股,还是绩差股垃圾股,都会上涨,区别在于有的涨幅大,有的涨幅小。有的先启动,有的后启动。从个股的涨幅上来讲,涨幅大有涨幅大的理由,涨幅小有涨幅小买股票什么指标最准确?很高兴回答您的问题,希望能帮到您。买股票什么指标最准确,这个问题有点像问我要出趟门,穿什么衣服最好?。首先,没有最准确的指标,原因有两个1如果有最准确的指标,那么,就不会有那么多人