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

2024-03-12 22:36

本文主要是介绍【视频转码】基于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

有需求的可以联系我来测试, WX:18675721

这篇关于【视频转码】基于ZLMediakit的视频转码技术概述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/802798

相关文章

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

Java如何获取视频文件的视频时长

《Java如何获取视频文件的视频时长》文章介绍了如何使用Java获取视频文件的视频时长,包括导入maven依赖和代码案例,同时,也讨论了在运行过程中遇到的SLF4J加载问题,并给出了解决方案... 目录Java获取视频文件的视频时长1、导入maven依赖2、代码案例3、SLF4J: Failed to lo

Python实现多路视频多窗口播放功能

《Python实现多路视频多窗口播放功能》这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下... 目录一、python实现多路视频播放功能二、代码实现三、打包代码实现总结一、python实现多路视频播放功能服务端开

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项