【音视频处理】转编码H264 to H265,FFmpeg,代码分享讲解

大家好,欢迎来到停止重构的频道。

本期我们讨论音视频文件转编码,如将视频H264转H265等。

内容中所提及的代码都会放在GitHub,感兴趣的小伙伴可以到GitHub下载。

我们按这样的顺序展开讨论:​

1、  编码的作用 

2、  转编码的工作原理

3、  编解码器安装 

4、  示例代码讲解 

编码的作用

在前面《音视频转码工作原理》中讨论过,一个视频文件实质上是分3层的,封装、编码、基础数据

编码的作用是为了压缩数据,限制最终文件的大小。

选择不同的编码格式,更多是为了节省更多的存储空间,或者为了扩大客户端的播放兼容性

这里值得一提的是,编码是需要区分音频和视频的,视频的编码器是不能压缩音频数据的,反之亦然。​

 

关于H264等视频编码格式的详细说明,可参考往期《H264》。

 

关AAC等音频编码格式的详细说明,可参考往期《AAC》

转编码的工作原理 

整个转编码的过程是 解封装>>解码>>编码>>封装

将解封装后的数据块放到对应的解码器中,即可解压缩成原始的视频帧、音频帧。

将原始帧放入目标编码器中,即可压缩出对应编码格式的数据块。

其中一个数据块不一定是完整的一帧数据 一些封装格式,可能几个数据块才能组成完整的一帧数据。

整个过程是流式的,循环往复,直到处理完成。

这里需要特别说明的是,编码器、解码器都是对应编码格式的,是特定的算法程序,是现成的

如h264转h265,则解码器使用h264的,编码器使用h265的。

如果是直播的场景,可以选择在封装前加上时间间隔,请参考往期《重封装》, 本期不作赘述。

补充说明一下,转编码实际上只是换了一种编码格式,可以对编码器设置诸如码率等影响压缩效率的参数,也可以设置诸如去除B帧等编码格式特有的参数

但是想要改变分辨率、帧率、采样率等参数的话,则需要对原始帧数据进行处理才行,关于这部分的详细说明,请关注下一期内容。

 

编解码器安装

FFmpeg默认情况下会包含一些编解码器,可以使用命令查看FFmpeg支持的编解码器。

如果需要对FFmpeg扩展编解码器的话,则需要先安装对应的编码器/解码器程序,然后修改FFmpeg编译配置,并重新编译安装即可。

关于FFmpeg更详细的说明,可参考往期《FFmpeg》。

 

示例代码讲解 

转编码的示例代码为trancode.cpp ,示例代码是H264转H265的。

原来转封装示例代码基础上,增加了初始、关闭编解码器,循环处理数据中加入了解码、编码过程

在设置解码器/编码器timebase时,FFmpeg推荐设置为帧率的倒数,但按我们的经验,这样会有很多问题,所以我们更推荐设置为统一的timebase

 

在转编码过程中,需要在解码前、编码后,做一下timebase转换 ,才能保证视频播放时不会过快或过慢。

 

在编码/解码时,需要区分音频/视频,将数据放到对应的编解码器

另外,编码/解码实质上是异步的,所以程序需要判断是否取出数据再进行下一步。

 

而且因为编解码异步处理的原因,且解编码是需要花费一定时间的,所以在读取完视频文件时 ,编解码器可能还存在未处理完的数据

所以在读出完视频文件后,还需要等待编解码器处理完所有的数据才算处理结束。

总结

本期内容的代码已经上传Github,需要的朋友可以下载。

以上代码讲解只提及了重要的部分,代码中含有更详细的注释说明,里面有编译运行环境的搭建说明,也提供了做好的docker容器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/87407.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言基础之——操作符(上)

本篇文章,我们将展开讲解C语言中的各种常用操作符,帮助大家更容易的解决一些运算类问题。 这里提醒一下小伙伴们,本章知识会大量涉及到二进制序列,不清楚二进制序列的小伙伴,可以去阅读我的另一篇文章《数据在内存中的…

Seaborn数据可视化(二)

目录 1.Seaborn风格设置 1.1 主题设置 1.2 轴线设置 1.3 移除轴线 1.4 使用字典传递函数 2.设置绘图元素比例 2.1 设置绘图元素比例paper 2.2 设置绘图元素比例poster 2.3 设置绘图元素比例notebook Seaborn将Matplotlib的参数划分为两个独立的组合,第一组用于…

gRpc的四种通信方式详细介绍

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

【Unity】如何制作小地图

我们为什么要制作小地图呢? 原因很简单: 导航和定位:小地图可以显示玩家当前位置以及周围环境的概览。这使得玩家能够更好地导航和定位自己在游戏中的位置,找到目标或避开障碍物。场景了解:通过小地图,玩…

网络电子词典

一、项目要求: 1. 登录注册功能,不能重复登录,重复注册 2. 单词查询功能 3. 历史记录功能,存储单词,意思,以及查询时间 4. 基于TCP,支持多客户端连接 5. 采用数据库保存用户信息与历史记录…

情人节定制:HTML5 Canvas全屏七夕爱心表白特效

❤️ 前言 “这个世界乱糟糟的而你干干净净可以悬在我心上做太阳和月亮。”,七夕节表白日,你要错过吗?如果你言辞不善,羞于开口的话,可以使用 html5 canvas 制作浪漫的七夕爱心表白动画特效,全屏的爱心和…

docker实践作业

1.安装docker服务,配置镜像加速器 2.下载系统镜像(Ubuntu、 centos) 3.基于下载的镜像创建两个容器 (容器名一个为自己名字全拼,一个为首名字字母) 4.容器的启动、 停止及重启操作 5.怎么查看正在运行的容器…

python从入门到精通——完整教程

阅读全文点击《python从入门到精通——完整教程》 一、编程入门与进阶提高 Python编程入门 1、Python环境搭建( 下载、安装与版本选择)。 2、如何选择Python编辑器?(IDLE、Notepad、PyCharm、Jupyter…) 3、Pytho…

制造执行系统(MES)在家具行业中的应用

制造执行系统(MES)在家具行业中有许多应用,它可以帮助家具制造商提高生产效率、质量控制和整体管理。以下是MES系统在家具行业中的一些应用领域: 1. 生产计划与调度:MES可以帮助家具制造商优化生产计划和调度&#xff…

MySQL高可用Orchestrator

目录 一 Orchestrator简介 二 Orchestrator功能 1 Discovery(发现复制拓扑) 2 Refactoring(重构复制拓扑) 3 Recovery(恢复主库故障) 三 orchestrator支持的操作方式 四 部署要求 五 下载 六 安装 1 下载软件包 2 解压软件包 3 创建账号 第一种是 orc后端MySQL数据…

Spring练习31---用户添加操作--添加数据到数据库,最终添加讲师,助教操作最终完毕

视频链接:16-Spring练习-用户添加操作-添加数据到数据库_哔哩哔哩_bilibili 104 1、当你点击提交时,form表单进行提交 2、这个名字必须跟你当前封装的属性名一样 3、要封装跟user的属性名一样,这样springMVc才能自动封装进去 4、提交时选择r…

vue 简单实验 v-bind 变量与html属性绑定

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"bind-attribute"><span v-bind:title"message">鼠标悬停几秒钟查看此处动态绑定的提示信息&#xff01;</sp…

LeetCode108. 将有序数组转换为二叉搜索树

108. 将有序数组转换为二叉搜索树 一、题目 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1&#x…

Android相机-架构

引言&#xff1a; 主要是针对CameraAPI v2 HAL3的架构对Android相机系统进行梳理。 相机架构 App和FrameWork Camera API v2位于&#xff1a; packages/apps/Camer2 frameworks/ex/camera2 应用框架级别&#xff0c;使用Camera2 API与相机的硬件进行交互。通过调用Binder接口…

无涯教程-PHP - 移除的扩展

以下扩展已从PHP 7开始删除- eregmssqlmysqlsybase_ct 以下SAPI已从PHP 7开始删除- aolserverapacheapache_hooksapache2filtercaudiumcontinuityisapimilternsapiphttpdpi3webroxenthttpdtuxwebjames PHP - 移除的扩展 - 无涯教程网无涯教程网提供以下扩展已从PHP 7开始删除…

PostgreSQL基本操作总结

安装按PostgreSQL数据库后&#xff0c;会默认创建用户postgres和数据库postgres&#xff0c;这个用户是超级用户&#xff0c;权限最高&#xff0c;可以创建其他用户和权限&#xff0c;在实际开发过程中&#xff0c;会新创建用户和业务数据库&#xff0c;本文主要介绍用户权限和…

【LeetCode】167. 两数之和 II - 输入有序数组 - 双指针

目录标题 2023-8-23 09:25:08 2023-8-23 09:25:08 自己写的不是常量级的额外空间&#xff0c;但是写出来了&#xff0c;记录一下。 下次写的时候&#xff0c;请用双指针。 &#xff08;其实我想了想一想&#xff0c;双指针就没感觉出来&#xff1a;因为我只想到双指针两个都…

Ompl初探

在/ompl-1.x.0/build/Release/bin下有很多生成的demo可执行文件 在终端执行 ./demo_Point2DPlanning 测试程序 #include <ompl/base/SpaceInformation.h> #include <ompl/base/spaces/SE3StateSpace.h> #include <ompl/base/StateSpace.h> #include <o…

java八股文面试[java基础]——接口和抽象类的区别

知识来源&#xff1a; 【基础】接口和抽象类_哔哩哔哩_bilibili 【2023年面试】Java中抽象类和接口有什么区别_哔哩哔哩_bilibili 【23版面试突击】抽象类和接口的区别&#xff0c;类可以继承多个类么&#xff0c;接口可以继承多个接口么,类可以实现多个接口么&#xff1f;_…

langchain ChatGPT AI私有知识库

企业知识库 原理就是把文档变为向量数据库&#xff0c;然后搜索向量数据库&#xff0c;把相似的数据和问题作为prompt&#xff0c; 输入到大模型&#xff0c;再利用GPT强大的自然语言处理、推理和分析等方面的能力将答案返回给用户 什么是langchain? langchain是一个强大的…