【视频转码】基于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

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

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

相关文章

基于Spring Boot + Vue的信息化在线教学平台

末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发 更多项目:CSDN主页YAML墨韵 学如逆水行舟,不进则退。学习如赶路,不能慢一步。 目录 一、项目简介 二、开发技术与环…

个人商城系统开源(登录)

原文地址:个人商城系统开源(登录) - Pleasure的博客 下面是正文内容: 前言 由于近期实在没有什么话题可写和一些有趣的项目教程可以分享。所以我只能决定将我自己亲手编写的一个迷你迷你商城系统进行开源。 也就是放在我博客右边…

day06-网路编程

#include <myhead.h>int do_add(sqlite3 *ppDb) {int numb;char name[20];int age;int salary;printf("请输入要插入的信息:");scanf("%d %s %d %d", &numb, name, &age, &salary);char sql[128] "";sprintf(sql, "INSE…

SkyWalking 本地启动以及闪退问题

1. 下载包 Downloads | Apache SkyWalking SkyWalking APM包含OAP和UI Java Agent 就是Java 的探针 2. 运行 UI 默认端口是 8080&#xff0c; OAP 默认端口是 11800&#xff08;grpc&#xff09;12800&#xff08;http&#xff09; 如果占用可以修改配置文件 UI 项目的配…

手撕指针第一页

1. 理解内存和地址 1.1 内存 内存&#xff0c;顾名思义就是电脑用来存储数据的&#xff0c;当CPU&#xff08;中央处理器&#xff09;在工作时&#xff0c;不仅需要从内存中拿取数据也需要将数据放入内存当中&#xff0c;当把内存引入到现实当中&#xff0c;就像学校里面的宿…

如何恢复已删除的华为手机图片?5 种方式分享

不幸的现实是&#xff0c;华为的珍贵时刻有时会因为意外删除、软件故障或其他不可预见的情况而在眨眼之间消失。在这种情况下&#xff0c;寻求恢复已删除的图片成为个人迫切关心的问题。 本文旨在为用户提供如何从华为恢复已删除图片的实用解决方案。我们将探索五种可行的方法…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之RowSplit容器组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之RowSplit容器组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、RowSplit容器组件 将子组件横向布局&#xff0c;并在每个子组件之间插入一…

CentOS/Fedora/Ubuntu/Debian 系统 wget 命令

wget 是云服务器安装环境和面板常用下载命令。下载软件或从远程服务器下载备份到本地服务器&#xff0c;也可以使用 wget 把文件下载到云服务器上。 VPS wget 命令最常用使用方法如下&#xff1a; 安装 wget 一般来说 wget 命令是系统自带的&#xff0c;方面安装环境和面板&…

【Python】可变数据类型 不可变数据类型 || hash

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

神经网络算法(带你了解 原理 实践)

目录 引言 一、神经网络的历史背景与重要性 二、神经网络算法在现代机器学习中的地位与应用 三、神经网络基础知识​编辑 &#xff08;一&#xff09;神经元模型与工作原理 &#xff08;二&#xff09;网络结构 &#xff08;三&#xff09;激活函数的作用与常见类型 四…

云原生架构设计:开放应用模型(OAM)的重要性与实践

在当今云计算时代&#xff0c;云原生架构已经成为许多企业追求的理想状态&#xff0c;在云原生架构设计中&#xff0c;开放应用模型是至关重要的一部分。本文灸哥将和你一起探讨开放应用模型的概念、意义以及实践方法&#xff0c;以帮助大家更好地理解和应用云原生架构中的开放…

guava的使用

对数组操作前判断是否会越界&#xff1a; List<String> s new ArrayList<>();System.out.println(Preconditions.checkElementIndex(2,s.size(),"下标长度超过了")); 是否为空 String s null;System.out.println(Preconditions.checkNotNull(s)); 判空…

如何使用LEAKEY轻松检测和验证目标服务泄露的敏感凭证

关于LEAKEY LEAKEY是一款功能强大的Bash脚本&#xff0c;该脚本能够检测和验证目标服务中意外泄露的敏感凭证&#xff0c;以帮助广大研究人员检测目标服务的数据安全状况。值得一提的是&#xff0c;LEAKEY支持高度自定义开发&#xff0c;能够轻松添加要检测的新服务。 LEAKEY主…

HUAWEI华为MateBook D 14 2022款 12代酷睿版集显(NbF-16)工厂模式原厂Windows11预装OEM系统,含F10智能还原功能

系统下载链接&#xff1a;https://pan.baidu.com/s/1kgJvwSq5eOdme7J9PDXIxQ?pwdxvz8 提取码&#xff1a;xvz8 华为笔记本电脑原装出厂系统工厂安装包&#xff0c;含F10功能、系统自带所有驱动、系统属性专属联机支持标志、Office办公软件、华为电脑管家等预装程序&#xf…

练习 5 Web [GXYCTF2019]BabyUpload

[GXYCTF2019]BabyUpload 猜测直接上传txt会被过滤&#xff0c;提示“上传类型也太露骨了吧&#xff01;”按经验传入一个"muma.phtml" 提示过滤了“ph”相关的后缀 传入muma.jpg等图像格式&#xff0c;提示表明复原并检测了文件内容 审查文件后缀Context-type 不能…

机械臂中TCP配置

红色、绿色、蓝色箭头分别代表x、y、z三个方向

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

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

Java面试篇【并发编程·进阶】常见面试题(2024最新)

并发常见面试题进阶 1.synchronized synchronized关键字解决的是多线程之间访问资源的同步性&#xff0c;synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能被一个线程执行。 监视器锁&#xff08;monitor&#xff09;是依赖于底层的操作系统的 Mutex Lock来…

2024电子商务与互联网技术国际会议(ICECIT 2024)

2024电子商务与互联网技术国际会议&#xff08;ICECIT 2024) 一、【会议简介】 2024电子商务与互联网技术国际会议&#xff08;ICECIT 2024&#xff09;将于2024年在杭州举行。这是一个重要的学术会议&#xff0c;旨在汇集全球的专家、学者和业界领袖&#xff0c;共同探讨电子…

Python爬虫——Requests

目录 简介 基本使用​编辑 ​编辑 安装 一个类型和六个属性 请求类型 GET 代码示例 POST 代码示例 代理 古诗文网绕过验证码登录 总结 简介 Python的Requests库是一个用于发送HTTP请求的常用库。它提供了简单且人性化的API&#xff0c;使得发送HTTP请求变得非常容易。…