【音视频处理】转编码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容器。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

npm yarn pnpm npx nvm 命令怎么区分怎么用

npm​​​​​​​ 包管理器,可以用来安装、卸载、更新和管理各种包npm的package.json中文文档 参数 - install:安装一个或多个包。例如:npm install 。 uninstall:卸载一个包。例如:npm uninstall 。 update&#xf…

【stable-diffusion使用扩展+插件和模型资源(下)】

插件模型魔法图片等资源:https://tianfeng.space/1240.html 书接上文:(上) 插件推荐 1.lobe theme lobe theme是一款主题插件,直接可以在扩展安装 界面进行了重新布局,做了一些优化,有兴趣的…

【业务功能篇85】微服务-springcloud-Nginx-反向代理-网关

Nginx域名 1.hosts文件 在c:/window/system32/drivers/etc/hosts文件,我们在这个文件中添加 192.168.56.100 msb.mall.com注意如果是没有操作权限,那么点击该文件右击属性,去掉只读属性即可 通过这个域名访问到Nginx服务 2.Nginx的方向代…

【C++多线程】C++11互斥锁和条件变量实现生产者消费者模型

先看几个问题,第三个问题可以先看代码然后再理解 Q1:临界区在哪 A1: 队列中元素在「生产者生产(push)」和「消费者消费(pop)」时就是临界区 Q2:同步操作在哪 A2: 很显然,队列只有…

基于Java+SpringBoot+Vue前后端分离社区医院管理系统设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

若依移动端Ruoyi-App 项目的后端项目入门

后端项目运行 运行报错 Error creating bean with name sysConfigServiceImpl: Invocation of init method failed 数据库创建了。 代码连接数据库地方了也匹配上了。但是还是报错。 分析 : 想起来我电脑从来没有安装过redis 下载安装redis到windows 链接&…

煤质软化:提升采矿效率的关键技术

煤质软化:提升采矿效率的关键技术 随着煤炭的广泛应用和能源需求的增长,对煤炭采矿和利用的要求也不断提高。传统的煤炭采矿方法往往面临一些困难和挑战,如厚层、高硬度以及强抗压性等问题,导致采掘效率低下、操作困难&#xff0c…

4.14 HTTPS 中 TLS 和 TCP 能同时握手吗?

目录 实现HTTPS中TLS和TCP同时握手的前提: 什么是TCP Fast Open? TLS v1.3 TCP Fast Open TLSv1.3 HTTPS都是基于TCP传输协议实现的,得先建立完可靠得TCP连接才能做TLS握手的事情。 实现HTTPS中TLS和TCP同时握手的前提: 1、…

9.4 集成功率放大电路

OTL、OCL 和 BTL 电路均有各种不同输出功率和不同电压增益的集成电路。应当注意,在使用 OTL 电路时,需外接输出电容。为了改善频率特性,减小非线性失真,很多电路内部还引入深度负反馈。这里以低频功放为例。 一、集成功率放大电路…

Unity编辑器扩展:提高效率与创造力的关键

Unity编辑器扩展:提高效率与创造力的关键 前言 一、理解Unity编辑器二、扩展Unity编辑器的意义三、扩展Unity编辑器的必要性四、Unity编辑器的扩展方式五、扩展Unity编辑器的步骤六、Unity编辑器扩展的应用案例七、总结 前言 Unity是一款广泛使用的游戏开发引擎&am…

机器学习十大算法之七——随机森林

0 引言 集成学习(ensemble learning)是时下非常流行的机器学习算法,它本身不是一个单独的机器学习算法,而是通过在数据上构建多个横型,集成所有模型的建模结果,基本上所有的机器学习领域都可以看到集成学习…

前端将file文件传给后台,后台将文件传给前台(包含上传下载)

前端将file文件传给后台,后台将文件传给前台(包含上传下载) 在开发过程中,经常会遇见对文件的处理。 例如:在上传、下载文件时,需要在前端选完文件传到后台传到服务器;或者文件从后台&#xf…

RTSP/Onvif协议安防视频平台EasyNVR录像模式自定义操作

TSINGSEE青犀视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif流媒体协议接入,并能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。在智慧安防等视频监控场景中,EasyNVR可提供视频实时监控直播…

linux并发服务器 —— 动态库和静态库实战(一)

-E 预处理指定源文件 -S 编译指定源文件 -c 汇编指定源文件 -o 生成可执行文件 -I directory 指定Include包含文件的搜索目录 -g 编译的时候生成调试信息 -D 在程序编译时指定一个宏 -w 不生成任何的警告信息 -Wall 生成所有警告 -On n:0~3;表示编译器的优…

pip install bz2 和readline失败

python3.7.5 在跑模型时报错找不到bz2,使用pip install bz2 安装失败 bz2和readline应该是python自带的包 解决方案:重新编译安装python3.7.5,参考: https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/70RC1alpha002/softwareinstall/…

Android工具条

在底层,所有通过主题得到应用条的活动都使用ActionBar类实现它的应用条。不过最新的应用条特性已经增加到AppCompat支持库中的Toolbar类。这意味着,如果你想在应用中使用最新的应用条特性,就需要使用支持库中的ToolBar类。 如何增加工具条 1…

❤ windows 安装后台java开发环境JDK 、MySQL 、Redis

❤ windows 安装后台java开发环境 1、windows 安装 JDK. 下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 1、下载安装 官网点击下载安装 网盘 jdk安装包 链接:https://pan.baidu.com/s/1sdxA6B…

Linux学习之DNS服务的原理

DNS服务一些理论 域名系统(Domain Name System,DNS)是互联网的核心应用服务,可以通过IP地址查询到域名,也可以通过域名查询到IP地址。 FQDN(Full Qualified Domain Name)是完全限定域名&#xf…

【ES6】—【新特性】—Symbol详情

一、一种新的原始数据类型 定义:独一无二的字符串 二、 声明方式 1. 无描述声明 let s1 Symbol() let s2 Symbol() console.log(s1, s2) // Symbol() Symbol() console.log(s1 s2) // falsePS: Symbol 声明的值是独一无二的 2. 有描述的声明 let s1 Symb…

【如何对公司网络进行限速?一个案例详解】

有不少朋友问到了关于企业网络QoS配置,这个确实在实际网络应用中非常多,基本上大部分企业或个人都用到这个功能,本期我们详细了解下QoS如何对宽带进行限制,QoS如何企业中应用。 一、什么是QoS? Qos是用来解决网络延迟和阻塞等问…