ffmpeg扩展支持H265视频流的flv封装

news2024/11/26 6:23:30

ffmpeg扩展支持H265视频流的flv封装

由于Adobe暂停了对RTMP/FLV标准的更新,所以目前标准中没有支持HEVC视频编码格式。为避免各终端和服务器间的兼容性问题,FFmpeg也没有在RTMP/FLV的协议实现中进行HEVC的相关扩展。CDN联盟制定了相关的协议扩展规范,并在FFmpeg中完成了相关代码实现,本文主要介绍如何让ffmpeg扩展支持HEVC视频编码格式的HTTP-FLV流媒体协议。

flv协议扩展支持HEVC

有关FLV协议介绍参照文章:HTTP FLV交互流程及实例解析
有关ffmpeg介绍参照文章:音视频领域强大的辅助工具-ffmpeg常用操作介绍

为推进HEVC视频编码格式在直播方案中的落地,CDN联盟规范了HEVC在RTMP/FLV中的扩展,在支持HEVC的VideoTagHeader

FLV协议扩展支持HEVC

  1. 支持HEVC的VideoTagHeader扩展,扩展后的格式如下图所示:
    1

其中修改了如下部分:

  • CodecID :定义HEVC格式的值为12
  • HEVCPacketType :当CodecID=12时,AVCPacketType改为HEVCPacketType;其中HEVCPacketType=0,表示HEVCVIDEOPACKET中存放的是HEVC sequence header;HEVCPacketType=1,表示HEVCVIDEOPACKET中存放的是HEVC NALU;HEVCPacketType=2,表示HEVCVIDEPACKET中存放的是HEVC end of sequence,即HEVCDecoderConfigurationRecord
  • CompositionTime:当CodecID=12时,也需要CompositionTime
  1. 支持HEVC的VideoTagBody扩展,扩展后的格式如下:
    2
    当CodecID为12时,VideoTagBody中存放的就是HEVC视频帧内容

ffmpeg扩展支持HEVC flv封装源码修改

FLV的解复用和复用功能代码分别在libavformt/flvdec.c和libavformat/flvenc.c中,扩展后的修改也都集中在这两个文件。

  1. 编码类型的枚举扩展

修改文件libavformat/flv.h,修改如下,CodecId增加FLV_CODECID_HEVC:

enum {
    FLV_CODECID_H263    = 2,
    FLV_CODECID_SCREEN  = 3,
    FLV_CODECID_VP6     = 4,
    FLV_CODECID_VP6A    = 5,
    FLV_CODECID_SCREEN2 = 6,
    FLV_CODECID_H264    = 7,
    FLV_CODECID_REALH263= 8,
    FLV_CODECID_MPEG4   = 9,
    FLV_CODECID_HEVC   = 12,
};
  1. flv解复用修改

HEVCPacketType=0时,表示HEVCVIDEOPACKET中存放的是HEVC sequence header,也就是HEVCDecoderConfigurationRecord,解码时需设置HEVCDecoderConfigurationRecord方能正确解码,在读取Video Tag的地方增加AV_CODEC_ID_HEVC的判断条件。

修改文件libavformt/flvdec.c,修改内容如下,

if (st->codecpar->codec_id == AV_CODEC_ID_AAC ||
     st->codecpar->codec_id == AV_CODEC_ID_H264 ||
     st->codecpar->codec_id == AV_CODEC_ID_HEVC ||
    st->codecpar->codec_id == AV_CODEC_ID_MPEG4) {
    int type = avio_r8(s->pb);
    size--;
    if (st->codecpar->codec_id == AV_CODEC_ID_H264 || 
         st->codecpar->codec_id == AV_CODEC_ID_HEVC ||
         st->codecpar->codec_id == AV_CODEC_ID_MPEG4) {
         // sign extension
         int32_t cts = (avio_rb24(s->pb) + 0xff800000) ^ 0xff800000;
         pts = dts + cts;
         if (cts< 0) { // dts might be wrong
             if (!flv->wrong_dts)
                 av_log(s, AV_LOG_WARNING,
                        "Negative cts, previous timestamps might be wrong.\n");
            flv->wrong_dts = 1;
        } else if (FFABS(dts - pts) > 1000*60*15) {
                av_log(s, AV_LOG_WARNING,
                       "invalid timestamps %"PRId64" %"PRId64"\n", dts, pts);
                dts = pts = AV_NOPTS_VALUE;
        }
   }
   
   if (type == 0 &&(!st->codecpar->extradata ||
       st->codecpar->codec_id == AV_CODEC_ID_AAC ||
       st->codecpar->codec_id == AV_CODEC_ID_HEVC ||
       st->codecpar->codec_id == AV_CODEC_ID_H264)) {
       AVDictionaryEntry *t;
       if (st->codecpar->extradata) {
           if ((ret = flv_queue_extradata(flv, s->pb, stream_type, size)) < 0)
               return ret;
           ret = FFERROR_REDO;
           goto leave;
       }
       if ((ret = flv_get_extradata(s, st, size)) < 0)
           return ret;
       ……
   }
}

3.flv复用修改

主要修改header、packet、trailer,修改文件libavformat/flvenc.c,改动就多,需改后文件直接从如下连接获取:
https://github.com/ksvc/FFmpeg

本文也是基于他们整理的资料进行编译打包。

ffmpeg扩展修改后编译安装步骤

测试环境为:centos 7 x86-64

  1. 下载x265并编译:
wget http://ftp.videolan.org/pub/videolan/x265/x265_3.2.tar.gz
tar -zxvf x265_3.2.tar.gz
./make-Makefiles.bash
make
make install
pkg-config --list-all #查看x265是否安装成功
  1. 编译修改后的ffmpeg

从上面的github中下在源码,编译过程如下:

#下载修改后的ffmpeg,解压,https://github.com/ksvc/FFmpeg/archive/refs/tags/n3.3.2.tar.gz
# 编译步骤如下:
./configure --enable-shared --enable-libx264 --enable-gpl --enable-libx265
make&make install
ffmpeg version # 查看是否编译成功
  1. 测试验证
    通过如下命令测试,看是否能够成功,参照文章《使用nginx搭建HTTP FLV流媒体服务器》搭建http-flv服务器。
    找到一个HEVC的rtsp视频连接,输入如下命令,看是否能够正常打包flv。
    ffmpeg -i rtsp://admin:@******@10.45.13.236/h265/ch1/main/av_stream -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:1935/live/test
    (备注,nginx的rtmp扩展模块开源版本并不支持H265的HTTP-FLV协议,需要花钱向开源的作者购买补丁才行,如需要测试,可安装SRS流媒体服务器,这个已经支持了,后续文章会介绍)

后话

今天早上(2023-11-11)看到ffmpeg发布最新的版本6.1,已经增加了对flv h265的支持,有兴趣的可以直接下载官方最新的版本,试试是否已经支持flv h265格式,ffmpeg6.1版本安装包也可用过关注公众号:零**仓,发送消息:软件工具 获取。
安装步骤如下:

tar -jxvf ffmpeg-6.1.tar.gz
./configure --enable-shared --prefix=/usr/ffmpeg
make & make install
vi /etc/profile
# 增加ffmpeg执行路径的环境变量:
PATH=$PATH:/usr/ffmpeg/bin
export PATH
# 使环境变量生效:
source /etc/profile

vi /etc/ld.so.conf
# 增加系统连接库路径:/usr/ffmpeg/lib/
# 生效
ldconfig
ffmpeg version

最新版本更新说明如下:


增加了 libaribcaption 解码器
增加 Playdate 视频 Decoder 和 Demuxer
增加了 afireqsrc 音频源滤镜
增加了 arls 音频滤镜
增加了 zoneplate 视频源滤镜
在 Windows 上扩展对 libva-win32 的 VAAPI 支持
在 setpts 和 asetpts 滤镜中支持命令
完善 Vulkan 解码硬件加速,支持 H264、HEVC 和 AV1
增加了 color_vulkan 滤镜
增加了 bwdif_vulkan 滤镜
增加了 nlmeans_vulkan 滤镜
增加了 RivaTuner 视频解码器
增加了 xfade_vulkan 滤镜
增加了 vMix 视频解码器
增加了 Essential Video Coding parser、muxer 和 demuxer
增加了 Essential Video Coding 帧合并 bsf
增加了 bwdif_cuda 滤镜
实现了 apsnr 和 asisdr 音频滤镜
增加了 Microsoft RLE 视频编码器
Raw AC-4 Muxer 和 Demuxer
Raw VVC bitstream parser、Muxer 和 Demuxer
增加了 用于编辑 VVC 流中metadata的bsf
将 VVC 从 MP4 转换为 Annex B 的 bitstream 滤镜
实现了 apsnr 和 asisdr 音频滤镜
实现了 videotoolbox 的 scale_vt 滤镜
实现了 videotoolbox 的 transpose_vt 滤镜
支持 P_SKIP 提示以加速 libx264 编码
在增强的 flv 格式中支持 HEVC、VP9、AV1 编解码器
实现了 OSQ复用器和解码器
在增强的rtmp协议中支持HEVC、VP9、AV1编解码器的fourcclist
实现了 CRI USM复用器
ffmpeg CLI的'-top'选项已弃用,推荐使用setfield过滤器
ffmpeg CLI选项:-readrate_initial_burst
完善了 VAAPI AV1编码器
ffprobe XML 输出模式已更改,以适应同一父元素内的多个可变字段元素
添加了ffprobe -output_format 选项,作为 -of 的别名

关注,发送:flv,获取更多flv文章。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++引用 引用做函数参数

一.引用的定义和语法 // 给a取别名为b int &b a; // 修改b的值&#xff0c;a的值也会被修改&#xff0c;因为他们都指向同一个内存空间 b 20; 二.引用的注意事项 1.引用必须初始化如 int&b; 是错误的&#xff0c;因为没有初始化。 2.引用在初始化后&#xff0c;不…

二维码智慧门牌管理系统升级,实现综合运营可视化

文章目录 前言一、升级解决方案概述二、重点指标综合展示三、综合运营可视化 前言 随着科技的发展和城市化进程的加速&#xff0c;传统的门牌管理系统已经无法满足现代社会的需求。为了解决这一问题&#xff0c;一款二维码智慧门牌管理系统应运而生&#xff0c;为城市管理和运…

Jenkins Docker Swarm插件 配置的坑

配置 Docker Host URI 注意&#xff0c;这里要用 http://&#xff01;&#xff01;&#xff01;如果按照提示里用了 tcp:// 则会报错&#xff0c;异常信息如下&#xff1a; 2023-11-13 16:28:42.6830000 [id34] WARNING o.e.j.s.h.ContextHandler$Context#log: Error while s…

如何在TS中使用JS库

在 TypeScript 中使用 JavaScript 库&#xff0c;几种常用的方法。 直接使用&#xff1a;如果 JavaScript 库不提供 TypeScript 类型定义文件&#xff08;.d.ts&#xff09;&#xff0c;您可以直接在 TypeScript 代码中使用该库。您可以通过在 TypeScript 代码的开头添加 //ts-…

【C/PTA——8.数组2(课内实践)】

C/PTA——8.数组2&#xff08;课内实践&#xff09; 7-1 求矩阵的局部极大值7-2 求矩阵各行元素之和7-3 判断上三角矩阵7-4 点赞 7-1 求矩阵的局部极大值 #include<stdio.h> int main() {int m, n, i, j;int arr[100][100];scanf("%d %d", &m, &n);for…

PHP在自己框架中引入composer

目录 1、使用composer之前先安装环境 2、 在项目最开始目录添加composer.json文本文件 3、写入配置文件 composer.json 4、使用composer安装whoops扩展 5、引入composer类并且使用安装异常显示类 1、使用composer之前先安装环境 先安装windows安装composer并更换国内镜像…

部署 KVM 虚拟化平台

虚拟化技术的演变过程分为软件模拟、虚拟化层翻译、容器虚拟化三个阶段 1 软件模拟的技术方式 软件模拟是通过软件完全模拟CPU、网卡、芯片组、磁盘等计算机硬件&#xff0c;因为是软件模拟&#xff0c;所以理论上可以模拟任何硬件&#xff0c;甚至不存在的硬件。但是由于是软…

SAP-SD-一个无交货数量的项目是不允许的,项目将被删除

创建外向交货单时报错 初步判断是没有销售订单库存&#xff0c;普通库存1000&#xff0c;从普通库存转移100到销售订单库存&#xff0c;移动类型413 转移完成 再VL01N就可以了

数据结构 顺序表和链表

1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串.. 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线…

数据仓库入门简介

一&#xff0c;数组仓库介绍 数据仓库 &#xff08;英语&#xff1a;Data Warehouse&#xff0c;简称数仓、DW&#xff09;是一个为数据分析而设计的企业级数据管理系统。它旨在 支持企业决策过程中的数据分析和业务智能 。数据仓库的基本原理是将不同来源的数据整合到一个中心…

机器学习6:逻辑回归

假设我们有一个二元分类问题&#xff0c;有两个特征&#xff08;x1, x2&#xff09;和对应的类别标签&#xff08;y&#xff09;。给定 以下训练数据集&#xff1a; 我们定义逻辑回归模型的假设函数和损失函数。假设函数使用 sigmoid 函 数来将线性函数的输出转换为概率值&…

计算机毕业设计项目选题推荐(免费领源码)SSM+Mysql电商微信小程序09228

摘 要 随着微信小程序的使用越来越广泛&#xff0c;在传统的商业模式中&#xff0c;对于各类生活日常商品&#xff0c;人们习惯于到各种商家店铺购买。然而在快节奏的新时代中&#xff0c;人们不一定能为购买商品腾出时间&#xff0c;更不会耐心挑选自己想要的商品。所以设计一…

通信原理板块——语音压缩编码

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 1、语音压缩编码 语音压缩编码可以…

第91步 深度学习图像分割:FCN建模

基于WIN10的64位系统演示 一、写在前面 本期&#xff0c;我们继续学习深度学习图像分割系列的另一个模型&#xff0c;FCN (Fully Convolutional Network)。 二、FCN FCN是一种用于图像语义分割的神经网络。与传统的分类网络&#xff08;如VGG、AlexNet&#xff09;不同&…

ARPG----C++学习记录04 Section8 角色类,移动

角色类输入 新建一个角色C&#xff0c;继承建立蓝图,和Pawn一样&#xff0c;绑定输入移动和相机. 在构造函数中添加这段代码也能实现。打开UsePawnControlRotation就可以让人物不跟随鼠标旋转 得到旋转后的向前向量 使用旋转矩阵 想要前进方向和旋转的方向对应。获取当前控制…

如何通过把setTimeout异步转为同步

一.封装定时器函数 function delayed(time){return new Promise((resolve,reject)>{setTimeout( () > {resolve(time)}, time);}) }二调用的时候通过async await 修饰 async function demo() {console.log(new Date().getMinutes(): new Date().getSeconds())await del…

你知道王者荣耀是怎么实现技能范围指示器的吗?

引言 一文教会你实现类似王者荣耀的技能范围指示器。 技能范围指示器是许多游戏中常见的一个元素&#xff0c;特别是在MOBA&#xff08;多人在线战斗竞技场&#xff09;游戏中&#xff0c;如《王者荣耀》、《英雄联盟》等。 本文将介绍如何在Cocos Creator中实现一个技能范围…

6.jvm中对象创建流程与内存分配

目录 概述对象的创建流程对象的内存分配方式对象怎样才会进入老年代大对象直接进入老年代内存担保 jvc 相关指令查看jdk默认使用的gc查看当前jdk支持的有哪些gc查看指定进程当前正在使用的gc 结束 概述 相关文章在此总结如下&#xff1a; 文章地址jvm基本知识地址jvm类加载系…

Linux常用命令——bzip2命令

在线Linux命令查询工具 bzip2 将文件压缩成bz2格式 补充说明 bzip2命令用于创建和管理&#xff08;包括解压缩&#xff09;“.bz2”格式的压缩包。我们遇见Linux压缩打包方法有很多种&#xff0c;以下讲解了Linux压缩打包方法中的Linux bzip2命令的多种范例供大家查看&…

Python | 机器学习之数据清洗

​ &#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《人工智能奇遇记》&#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 目录结构 1. 机器学习之数据清洗概念 1.1 机器学习 1.2 数据清洗 2. 数据清洗 2.1 实验目的…