【视频转码】基于ZLMediakit的视频转码技术概述

一、概述

zlmediakit pro版本支持基于ffmpeg的转码能力,在开源版本强大功能的基础上,新增支持如下能力:

  • 1、音视频间任意转码(包括h265/h264/opus/g711/aac等)。
  • 2、基于配置文件的转码,支持设置比特率,codec类型等参数。
  • 3、基于http api的动态增减转码,支持设置比特率,分辨率倍数,codec类型、滤镜等参数。
  • 4、支持硬件、软件自适应转码。
  • 5、支持按需转码,有人观看才转码。
  • 6、支持负载过高时,转码主动降低帧率且不花屏。
  • 7、支持滤镜,支持添加osd文本以及logo角标等能力。

在这里插入图片描述

二、转码实现原理

  • 视频转码原理
    在这里插入图片描述

  • 音频转码原理

三、使用方法

目前zlmediakit pro转码能力支持两种使用方式,第一种是基于配置文件方式,在设置好配置文件后,所有流都支持转码为目标编码格式直播流,第二种模式基于http api方式,此方式更灵活,功能强大,可以指定更多转码相关参数。

3.1 基于配置文件的转码

[transcode]
#转码stream_id后缀,为空时关闭转码
suffix=
#默认转码视频目标codec,支持H264/H265/JPEG/copy 
vcodec=H264
#默认转码音频目标codec,支持mpeg4-generic/PCMA/PCMU/opus/copy
acodec=mpeg4-generic
#是否开启ffmpeg日志
enable_ffmpeg_log=0
# h264解码器白名单
decoder_h264=h264_cuvid,h264_qsv,h264_videotoolbox,h264_nvmpi,h264_bm,libopenh264
# h265解码器白名单
decoder_h265=hevc_cuvid,hevc_qsv,hevc_videotoolbox,hevc_nvmpi,hevc_bm
# h264编码器白名单
encoder_h264=h264_nvenc,h264_qsv,h264_videotoolbox,h264_nvmpi,h264_bm,libx264,libopenh264
# h265编码器白名单
encoder_h265=hevc_nvenc,hevc_qsv,hevc_videotoolbox,hevc_nvmpi,hevc_bm,libx265

在上述配置文件中,如果用户配置好suffix,那么zlmediakit将统一把所有直播流转码为目标编码格式,用户通过访问新的流地址即可确保为预期编码格式视频。

例如源视频地址为:rtmp://127.0.0.1/live/test, 那么转码后地址即为:rtmp://127.0.0.1/live/test_H264。

当配置文件修改为suffix=null时,转码后流会直接替换原始流(不会有_suffix后缀);替换模式下,建议rtsp.directProxy/rtmp.directProxy都设置为0。

如果源视频编码格式与目标编码格式一致,那么zlmediakit为了确保性能最优,将直接拷贝流数据(不会编码)。

基于配置文件方式的转码使用最简单,可以使用于安防行业H265视频无法webrtc/mse播放的场景。

3.2 基于http api的转码

zlmediakit同时还提供基于http api的转码方式,这种方式支持的功能更强大,使用更灵活,同时支持一个流转码成多个目标流(比如说不同分辨率的场景)。

  • 请求地址:/index/api/setupTranscode

  • 请求参数:

    参数参数类型释意是否必选
    secretstringapi操作密钥(配置文件配置)Y
    vhoststring流的虚拟主机,例如__defaultVhost__Y
    appstring流的应用名,例如liveY
    streamstring流的id名,例如testY
    namestring转码名(后缀),功能类似配置文件transcode.suffixY
    addint1:添加转码; 0: 删除转码Y
    video_codecstring视频转码的codec,支持H264/H265/JPEG/copyY
    video_bitrateint转码后视频的比特率Y
    video_scalefloat转码视频宽高拉伸比例,取值范围0.1~10Y
    audio_codecstring音频转码codec,支持mpeg4-generic/PCMA/PCMU/opus/copyY
    audio_bitrateint转码后音频比特率Y
    audio_samplerateint转码后音频采样率率Y
    filterstringavfilter滤镜参数,用法与ffmpeg -vf 参数一致Y
    forcebool是否强制转码,强制转码时不管目标编码是否一致,默认否N
    decoder_threadsint解码线程数,默认2个,最大16个,音频强制为1个N
    encoder_threadsint编码线程数,默认4个,最大16个,音频强制为1个N
    hw_decoderbool是否启用硬件解码器,默认启用N
    hw_encoderbool是否启用硬件编码器,默认启用N
    decoder_liststring视频ffmpeg解码器列表,例如: h264_cuvid,h264_qsvN
    encoder_liststring视频ffmpeg编码器列表,例如: hevc_nvenc,hevc_qsvN
    gpu_indexint硬件编解码gpu索引号,默认0N
    enable_hlsbool转码后是否转换成hls-mpegts协议N
    enable_hls_fmp4bool转码后是否转换成hls-fmp4协议N
    enable_mp4bool转码后是否允许mp4录制N
    enable_rtspbool转码后是否转rtsp协议N
    enable_rtmpbool转码后是否转rtmp/flv协议N
    enable_tsbool转码后是否转http-ts/ws-ts协议N
    enable_fmp4bool转码后是否转http-fmp4/ws-fmp4协议N
    hls_demandbool转码后该协议是否有人观看才生成N
    rtsp_demandbool转码后该协议是否有人观看才生成N
    rtmp_demandbool转码后该协议是否有人观看才生成N
    ts_demandbool转码后该协议是否有人观看才生成N
    fmp4_demandbool转码后该协议是否有人观看才生成N
    enable_audiobool转码后转协议时是否开启音频N
    add_mute_audiobool转码后无音频是否添加静音aac音频N
    mp4_save_pathstring转码后mp4录制文件保存根目录,置空使用默认N
    mp4_max_secondint转码后mp4录制切片大小,单位秒N
    mp4_as_playerbool转码后MP4录制是否当作观看者参与播放人数计数N
    hls_save_pathstring转码后hls文件保存保存根目录,置空使用默认N
    modify_stampint转码后该流是否开启时间戳覆盖(0:绝对时间戳/1:系统时间戳/2:相对时间戳)N
    auto_closebool转码后无人观看是否自动关闭流(不触发无人观看hook)N
  • 响应:

    {"code" : 0,"msg" : "success"
    }
    

3.3 使用http api获取转码信息

  • 请求接口:/index/api/getMediaInfo
  • 请求回复:请查看transcode字段
{"aliveSecond": 88,"app": "live","bytesSpeed": 330246,"code": 0,"createStamp": 1691902256,"isRecordingHLS": true,"isRecordingMP4": false,"originSock": {"identifier": "2-51","local_ip": "192.168.31.101","local_port": 8000,"peer_ip": "192.168.31.101","peer_port": 61801},"originType": 8,"originTypeStr": "rtc_push","originUrl": "rtc://127.0.0.1/live/test?app=live&stream=test&type=push&session=1-50","readerCount": 0,"schema": "rtsp","stream": "test","totalReaderCount": 0,"tracks": [{"codec_id": 0,"codec_id_name": "H264","codec_type": 0,"fps": 30.0,"frames": 2648,"gop_interval_ms": 2012,"gop_size": 60,"height": 556,"key_frames": 51,"loss": 0.0,"ready": true,"width": 990},{"channels": 1,"codec_id": 4,"codec_id_name": "PCMU","codec_type": 1,"frames": 4434,"loss": 0.0,"ready": true,"sample_bit": 16,"sample_rate": 8000}],"transcode": [{"name": "codec",                     // 转码名称"setting": {                         // 转码配置信息"adecoder_threads": 1,           // 音频解码器线程数"aencoder_threads": 1,           // 音频编码器线程数"hw_decoder": true,              // 启动硬件解码器"hw_encoder": true,              // 启动硬件编码器"target_acodec": "mpeg4-generic",// 目标音频编码格式"target_vcodec": "H265",         // 目标视频编码格式"vdecoder_threads": 4,           // 视频解码器线程数"vencoder_threads": 8,           // 视频编码器线程数"force": false,                  // 是否强制转码"filter": "",                     // 滤镜参数"decoder_list" : ["h264_cuvid", "h264_qsv"],  // 解码器列表"encoder_list" : ["hevc_nvenc", "hevc_qsv"]   // 编码器列表},"adec": "pcm_mulaw",       // 音频解码器名称"aenc": "aac",             // 音频编码器名称"aenc_ctx": {              // 音频AVCodecContext信息"bit_rate": 32000,     // 比特率"channels": 1,         // 通道数"frame_number": 4055,  // 已编码帧数"frame_size": 1024,    // 每帧采样数"sample_fmt": "fltp",  // 音频编码输入格式"sample_rate": 48000   // 编码器采样率},"vdec": "h264",               // 视频解码器名称"venc": "hevc_videotoolbox",  // 视频编码器名称"venc_ctx": {                 // 视频AVCodecContext信息"bit_rate": 1000000,      // 比特率"fps": 20,                // 帧率"frame_number": 2595,     // 已编码帧数"gop": 60,								// gop大小"has_b_frames": 0,        // 是否编码b帧"height": 556,            // 视频高度"pix_fmt": "nv12",        // 编码器输入图片格式"width": 990              // 视频宽度}}],"vhost": "__defaultVhost__"
}

技术交流QQ群: 1033175645

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

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

相关文章

总结:Java枚举类Enum常用API,与EnumUtil工具类封装

总结:Java枚举类Enum常用API,与EnumUtil工具类封装 一通过enum关键字创建一个枚举类:二自定义枚举对象常用方法示例:1.获取枚举值方法:一般为code字段2.获取描述值方法:一般为description字段3.获取枚举对象…

使用docker搭建chromium

使用Docker CLI 首先,你需要确保已经安装了Docker。以下是使用Docker命令行界面(CLI)搭建linuxserver/chromium的步骤: 拉取linuxserver/chromium镜像: docker pull linuxserver/chromium这将从Docker Hub上拉取最新的…

LeetCode-Hot100

哈希 1.两数之和: 给定一个整数数组nums和一个整数目标值target,请你再该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。 思路:暴力解法是使用两层循环来遍历每一个数,然后找出两数之和等于target的…

Unity的PICO项目基础环境搭建笔记(调试与构建应用篇)

文章目录 前言一、为设备开启开发者模式1、开启PICO VR一体机。前往设置>通用>关于本机>软件版本号2、一直点击 软件版本号 ,直到出现 开发者 选项3、进入 开发者模式,打开 USB调试,选择 文件传输 二、实时预览应用场景1、下载PC端的…

Linux中的read命令详解:交互性脚本编写的利器

在Linux系统中,Shell脚本是一种强大的工具,用于自动化任务和编写系统管理脚本。然而,有时候需要脚本能够与用户进行交互,以便动态地获取输入或提供输出。这时,read命令就成为了我们的利器。本文将深入探讨read命令的使…

2024年新手视频剪辑软件推荐-6款视频剪辑软件测评

视频剪辑软件推荐 premiere premiere 直达地址:各大软件网站 说到底,还是得专业的来,虽然很多人觉得他是收费的,但是你懂的,想要免费总是会有办法的.别的不说,剪辑这块,我还是很认可这个软件,虽然我现在还是刚入门. 剪映 剪映 抖音官方推出的一款手机视频编辑剪辑应用,提供切割…

go切片实现原理

近日一直在学习golang,已经产出如下博客一篇 GO闭包实现原理(汇编级讲解) 引言 最近在使用go语言的切片时,出现了一些意料之外的情况,遂查询相关文档学习后写下此篇博客 正文 首先,我们思考,go在通过函数传递一个切片时,是通过引用传递的吗,还是通过值传递的呢(答案将会很…

Transformer之多角度解读

Transformer 文章目录 Transformer  👉引言💎 一、 自注意力机制 : 主要用于 长距离依赖捕捉和转换序列二、 Encoder:2.1 多头注意力机制:2.2 残差连接: 三、 Decoder:3.1 Decoder 多头注意力…

hive sql无法停止

排查流程 hive任务停止是调用org.apache.hive.jdbc.HiveStatement的close()方法实现的 其底层是委托给org.apache.hive.service.cli.thrift.TCLIService.Iface客户端实例来实现。 同时,通过JDK动态代理为其织入了synchronized同步机制:其底层是委托给…

申请公众号上限是多少

一般可以申请多少个公众号?公众号申请限额在过去几年内的经历了很多变化。对公众号申请限额进行调整是出于多种原因,确保公众号内容的质量和合规性。企业公众号的申请数量从50个到5个最后到2个,对于新媒体公司来说,这导致做不了公…

swift的lazy关键字 后面还会补充

使用lazy关键字的例子 在Swift 中,如果你在子类的构造器中遇到了“Property self.someProperty not initialized at super.init call”的错误,这表示在调用父类的init方法前,你必须确保所有非可选的实例属性都已经被初始化。Swift 要求所有非…

网络延迟导致终端卡顿

网络延迟导致终端卡顿 在一些情况下,终端卡顿可能是由于网络延迟增加或丢包导致的。例如,使用 hping3 模拟网络流量时可能观察到这种情况。 在使用 hping3 运行前后,通过 ping 命令来观察网络延迟的变化,以便更全面地了解卡顿问…

【XMU学科实践二】豆瓣爬虫实践

文章目录 分析豆瓣阅读网站具体步骤构造headersBeautiful soup中的定位函数find() 、find_all() 完整爬虫代码 叠甲:仅供学习。。 XMU的小朋友实在不会了可以参考我的思路,但还是建议自己敲一遍哈。 学科实践二还是挺有意思的! 分析豆瓣阅读网…

什么是jwt

jwt是JSON Web Token,由3部分构成: 头部Header:头部包含了两部分,token 类型和采用的加密算法(可为none,后端应限制加密算法,不以这里为准)。 载荷Payload:这部分才是重要…

test02

1.逢七过/*朋友聚会时,玩逢7过的游戏 游戏规则:从任意一个数字开始报数,当你要报的数字是包含7或者是7的倍数时都要说:过 需求:使用程序在控制台打印出1-100之间的满足逢七过规则的数据*/ //1.打印1-100 for (int i 1…

Compose UI 之 Small TopAppBar

Small 类型 TopAppBar AppBar 主要由2类,顶部 AppBar 和底部 AppBar。 顶部 AppBar:主要包含了标题,action菜单,导航菜单。底部 AppBar:典型地包含主要导航项。 顶部 AppBar 顶部 AppBar 包含了 4 中类型&#xff…

webhook详解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 webhook简介 在当今高度连接的网络世界中,没有什么可以孤立地发挥最佳作用。完成一项任务(几乎)总是需要多个实体的参与。电子商务应用程序需要与支付系统通信,支付…

Python快速入门系列-2(Python的安装与环境设置)

第二章:Python的安装与环境设置 2.1 Python的下载与安装2.1.1 访问Python官网2.1.2 安装Python对于Windows用户对于macOS用户对于Linux用户 2.2 集成开发环境(IDE)的选择与设置2.2.1 PyCharm2.2.2 Visual Studio Code2.2.3 Jupyter Notebook2…

【操作系统学习笔记】文件管理2.2

【操作系统学习笔记】文件管理2.2 参考书籍: 王道考研 视频地址: Bilibili 文件系统的全局结构(布局) 外存结构 物理格式化,即低级格式化->划分扇区,检测坏扇区,并用备用扇区替换坏扇区逻辑格式化,即…

初级代码游戏的专栏介绍与文章目录

我的github: codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 一、大型专题 1.1 C嵌入式HTTP服务器 C嵌入式HTTP服务器_初级代码游戏的博…