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

news2024/11/24 12:58:35

一、概述

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.coloradmin.cn/o/1493347.html

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

相关文章

js设计模式:解释器模式

作用: 对文本进行解释和编译的时候,就会用到解释器模式 比如你写了一段js代码,js引擎就会去解释并执行这段代码 webpack中的各种loader就是用来解释各种文件类型的,并将其解释为js可识别的代码 示例: //翻译词库const wordList [{text:韩信前期有蓝有红,必须拿二杀。你要是…

电脑解锁后黑屏有鼠标--亲测!!不需要重装系统!!

问题:上周电脑黑屏,只有鼠标,鼠标还不能右键!! 中招:win10系统最新版火绒安全 ,那你有概率获得开机黑屏套餐一份。 原因是:火绒把我们的explorer删除了导致黑屏,这个文…

医院床旁交互系统概述 -智慧护理-全视通

全视通床旁交互系统是一种先进的医疗信息技术解决方案,旨在改善病患与医疗团队之间的沟通与交流。该系统通过集成多种高科技设备,为病患在病床边提供了一站式的信息交互平台,从而优化了医疗服务流程,提升了医疗体验。 首先&#x…

C# LaMa Image Inpainting 图像修复 Onnx Demo

目录 介绍 效果 模型信息 项目 代码 下载 LaMa Image Inpainting 图像修复 Onnx Demo 介绍 gihub地址:https://github.com/advimman/lama 🦙 LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WAC…

Python 应用程序编程接口库之pywin32使用详解

概要 在Python的世界里,有许多优秀的第三方库可以帮助开发者更轻松地处理各种任务。其中,pywin32库是一个特别引人注目的工具,它提供了对Windows API的完整访问,使得开发者能够利用Python来编写强大的Windows应用程序,从简单的脚本到复杂的桌面应用,pywin32都能胜任。 什…

anaconda创建虚拟环境(第一次玩)

首先需要打开anaconda prompt,打开后需要等待一会,他要加载。 然后你输入下面的代码,其中环境名和python版本可以自定义 conda create -n 环境名 python3.6比如我的是 conda create -n mnist python3.7.0 等待一会,中途需要你输…

【论文精读】基于知识图谱关系路径的多跳智能问答模型研究

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

Axure 入门文档 文件格式 全局样式 元件居中

文件格式 .rp 原型文件.rplib:元件库文件.rpteam 团队项目文件.html 项目网页文件 批量设置居中 选中多个,然后上方任务栏即可设置 设置自定义页面视图尺寸 项目-自适应视图设置 点击页面空白处就可以使用 添加元件说明 当一个元件创建好,可以设…

电脑怎么设置静态ip地址和动态

在数字时代,电脑与网络的关系日益紧密。对于大多数用户来说,电脑的网络设置可能是个相对陌生的领域,尤其是关于IP地址的选择与配置。IP地址,即“互联网协议地址”,是电脑在网络中的唯一标识。了解如何设置静态IP地址和…

JavaScript 原型链继承:掌握面向对象的基础

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

华为HQoS配置案例

HQoS基于层次化调度,cpe上支持三级队列: level3流队列:每个用户的同类业务是一个业务流,针对每个用户不同的业务流进行队列调度,流队列一般与业务类型对应(EF、AF、BE等)。 level2用户队列&…

Golang搭建grpc环境

简介 OS : Windows 11 Golang 版本: go1.22.0 grpc : 1.2 protobuffer: 1.28代理 没有代理国内环境下载不了库七牛CDN (试过可用) go env -w GOPROXYhttps://goproxy.cn,direct阿里云代理(运行grpc时下载包出现报错 ): go env -w GOPROXYhttps://mirr…

漫步者、南卡、Cleer开放式耳机怎么样?硬核对比测评性能强者!

​在当今市场上,开放式耳机的型号层出不穷,作为一名专业的测评博主,我对这类产品有着深入的了解和丰富的经验。最近,我的粉丝们通过私信向我咨询如何选择适合自己的开放式耳机,面对众多品牌的选择,他们感到…

基于springboot的场地预约小程序的设计与实现(程序+数据库+文档)

** 🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅** 目录 一、研…

OPC UA协议转换网关

在物联网和工业自动化的世界里,OPC UA(OLE for Process Control Unified Architecture)协议凭借其开放性和互操作性,正在逐渐成为不同设备和系统间通信的桥梁。然而,在实际应用中,由于各种历史和技术原因&a…

【MySQL】视图、索引

目录 视图视图的用途优点视图的缺点创建视图查看视图修改视图删除视图注意事项 索引索引的原理索引的数据结构二分查找法Hash结构Hash冲突!!! B树二叉查找树 存在问题改造二叉树——B树降低树的高度 B树特点案例继续优化的方向 改造B树——B树…

基于Java的快递管理系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 快递类型模块2.3 快递区域模块2.4 快递货架模块2.5 快递档案模块 三、界面展示3.1 登录注册3.2 快递类型3.3 快递区域3.4 快递货架3.5 快递档案3.6 系统基础模块 四、免责说明 一、摘要 1.1 项目介绍 …

万物皆可Find My,伦茨科技ST17H6x芯片赋能产品苹果Find My功能

苹果的Find My功能使得用户可以轻松查找iPhone、Mac、AirPods以及Apple Watch等设备。如今Find My还进入了耳机、充电宝、箱包、电动车、保温杯等多个行业。苹果发布AirTag发布以来,大家都更加注重物品的防丢,苹果的 Find My 就可以查找 iPhone、Mac、Ai…

【RK3568+RV1126】NPU算力集成

通过瑞芯微RK3568使用USB RNDIS网络与多个RV1126算力棒进行网络通信,打造多算力集群,同时进行AI运算处理,NPU算力集成不仅能增加算力,更能灵活的控制成本,具有更高的性价比,更低的功耗。 Mini-PCIe接口的RV…

华为交换机vlan实验

一、目标 实现不同vlan之间的终端通信 二、命令学习 1.创建2个vlan # 进入系统视图 sy# 创建vlan vlan 10 vlan 202.查看vlan # 2.查看vlan display vlanThe total number of vlans is : 3 ---------------------------------------------------------------------------…