目录

本文前提

Python代码

推流测试

参数详解

码率控制

X264的preset和tune

参数优化

一般概念


本文前提

安装Python环境、安装OpenCV、安装安装FFmpeg并添加到系统环境变量;

如果是Linux,可以直接安装:

sudo apt install ffmpeg

Python代码

# 需先自行安装FFmpeg,并添加环境变量
import cv2
import subprocess# FFmpeg官方文档:http://ffmpeg.org/ffmpeg.html# RTMP服务器地址
rtmp_server = r'rtmp://live-push.bilivideo.com/live-bvc/'
# RTMP推流码
rtmp_key = '?streamname=live_xxx'
# 读取视频并获取属性,摄像头就写0,视频文件就写文件名
cap = cv2.VideoCapture(0)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
sizeStr = str(size[0]) + 'x' + str(size[1])
command = ['ffmpeg','-y', '-an',            # 无需询问即可覆盖输出文件'-f', 'rawvideo',       # 强制输入或输出文件格式'-vcodec','rawvideo',   # 设置视频编解码器。这是-codec:v的别名'-pix_fmt', 'bgr24',    # 设置像素格式'-s', sizeStr,          # 设置图像大小'-r', '25',             # 设置帧率'-i', '-',              # 输入'-c:v', 'libx264',      # 编解码器'-pix_fmt', 'yuv420p',  # 像素格式'-preset', 'ultrafast', # 调节编码速度和质量的平衡'-f', 'flv',            # 强制输入或输出文件格式'-tune', 'zerolatency', # 视频类型和视觉优化rtmp_server+rtmp_key]
pipe = subprocess.Popen(command, shell=False, stdin=subprocess.PIPE)# 用来实现循环播放
frame_counter = 0while cap.isOpened():success, frame = cap.read()# 如果帧尾,就重新开始;# 如果不需要循环播放,就把这部分删掉。frame_counter += 1if frame_counter == int(cap.get(cv2.CAP_PROP_FRAME_COUNT)):frame_counter = 0cap.set(cv2.CAP_PROP_POS_FRAMES, 0)if success:if cv2.waitKey(1) & 0xFF == ord('q'):breakpipe.stdin.write(frame.tostring())
cap.release()
pipe.terminate()

推流测试

哔哩哔哩平台为例。

参数详解

此部分来自:FFmpeg X264编码参数 - 掘金

码率控制

        X264提供三种码率控制的方式:bitrate, qp, crf。这三种方式是互斥的,使用时设置其中之一即可。

(1)bitrate
        x264会尝试把给定的比特率作为整体平均值来编码,这意味着最终编码文件的大小是已知的,但最终的品质未知。
        此选项通常与-pass(两阶段编码)一起使用。
        注意,ffmpeg中设置bitrate的具体参数为bit_rate,对应音轨和视轨可以分别通过-a:v和-b:v单独设置,单位是bits/s;而x264里面对应参数i_bitrate的单位则是kbits/s, 1kbits为1000bits而非1024bits.

(2)qp
        使用qp选项时,表示P帧的量化值为qp。I帧和B帧的量化值则是从--ipratio和--pbratio中取得。可使用默认参数,也可自己设定。使用qp模式,即固定量化值,意味着停用自适应量化(aq_mode)。
当qp为0时,为无损编码。

(3)crf
        固定比特率系数,Constant Rate factor,可用的值从1到51,越小编码质量越好,码率越高。一般使用16到24,可以为浮点。(crf并不是恒定质量的方式,同一Slice同一crf值,其他参数不同可能码率和质量差较大,不同的Slice之间就更没有可比性了) 
        此模式把某个“质量”作为编码目标,根据Slice质量自动分配码率的vbr(Variable Bit Rate 动态比特率)。X264中构想是让crf n提供与qp n相当的视觉品质,但编码文件更小一些。
        CRF是借由降低“较不重要”帧的品质来达到此目的。在此情况下,“较不重要”是指在复杂或高动态场景的帧,其品质不是很耗费比特数就是不易察觉,所以会提高它们的量化值。从这些帧里所节省下来的比特数被重新分配到可以更有效利用的帧。
        当crf为0时,与qp 0相同,实现无损编码。

X264的preset和tune

鉴于x264的参数众多,各种参数的配合复杂,为了使用者方便,x264建议如无特别需要可使用preset和tune设置。这套开发者推荐的参数较为合理,可在此基础上在调整一些具体参数以符合自己需要,手动设定的参数会覆盖preset和tune里的参数。

        --preset的参数主要调节编码速度和质量的平衡,有ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo这10个选项,从快到慢。

        --tune的参数主要配合视频类型和视觉优化的参数。如果视频的内容符合其中一个可用的调整值又或者有其中需要,则可以使用此选项,否则建议不使用(如tune grain是为高比特率的编码而设计的)。tune的值有:

  • film: 电影、真人类型;
  • animation: 动画;
  • grain: 需要保留大量的grain时用;
  • stillimage: 静态图像编码时使用;
  • psnr: 为提高psnr做了优化的参数;
  • ssim: 为提高ssim做了优化的参数;
  • fastdecode: 可以快速解码的参数;
  • zerolatency:零延迟,用在需要非常低的延迟的情况下,比如电视电话会议的编码。

参数优化

FFmpeg针对rtmp协议的参数:

参数 类型 说明
rtmp_app 字符串 RTMP 流发布点,又称 APP
rtmp_buffer 整数 客户端 buffer 大小(单位:毫秒),默认为 3 秒
rtmp_conn 字符串 在 RTMP 的 Connect 命令中增加自定义 AMF 数据
rtmp_flashver 字符串 设置模拟的 flashplugin 的版本号
rtmp_live 整数 指定 RTMP 流媒体播放类型,具体如下:
any:直播或点播随意
live:直播
recorded:点播
rtmp_pageurl 字符串 RTMP 在 Connect 命令中设置的 PageURL 字段,其为播放时所在的 Web 页面 URL
rtmp_playpath 字符串 RTMP 流播放的 Stream 地址,或者称为密钥,或者称为发布流
rtmp_subscribe 字符串 直播流名称,默认设置为 rtmp_playpath 的值
rtmp_swfhash 二进制数据 解压 swf 文件后的 SHA256 的 hash 值
rtmp_swfsize 整数 swf 文件解压后的大小,用于 swf 认证
rtmp_swfurl 字符串 RTMP 的 Connect 命令中设置的 swfURL 播放器的 URL
rtmp_swfverify 字符串 设置 swf 认证时 swf 文件的 URL 地址
rtmp_tcurl 字符串 RTMP 的 Connect 命令中设置的 tcURL 目标发布点地址,一般形如 rtmp://xxx.xxx.xxx/app
rtmp_listen 整数 开启 RTMP 服务时所监听的端口
listen 整数 与 rtmp_listen 相同
timeout 整数 监听 rtmp 端口时设置的超时时间,以秒为单位

. 关闭sync-lookahead
 . 降低rc-lookahead,但别小于10,默认是-1
 . 降低threads(比如从12降到6)
 . 禁用rc-lookahead
 . 禁用b-frames
 . 缩小GOP, 
 . 开启x264的 -preset fast/faster/verfast/superfast/ultrafast参数
 . 使用-tune zerolatency 参数

更多优化,仍可继续参考:FFmpeg X264编码参数 - 掘金

一般概念

RTMP是什么?

RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。支持该协议的软件包括Adobe Media Server/Ultrant Media Server/red5等。RTMP与HTTP一样,都属于TCP/IP四层模型的应用层。

树莓派是什么?

Raspberry Pi(中文名为“树莓派”,简写为RPi,(或者RasPi / RPI)是为学习计算机编程教育而设计),只有信用卡大小的微型电脑,其系统基于Linux。随着Windows 10 IoT的发布,我们也将可以用上运行Windows的树莓派。

如何使用OpenCV RTMP直播推流相关推荐

  1. windows下ffmpeg+nginx-rtmp环境搭建及opencv+ffmpeg+python实现拉流和rtmp直播推流

    由于工作需要最近在研究rtsp拉流与直播推流的问题,目前先在我本机上进行了实验,本博客记录学习的内容,包含windows下ffmpeg.nginx-rtmp环境搭建及opencv+ffmpeg+pyt ...

  2. 【Android RTMP】RTMP 直播推流阶段总结 ( 服务器端搭建 | Android 手机端编码推流 | 电脑端观看直播 | 服务器状态查看 )

    文章目录 安卓直播推流专栏博客总结 一. 服务器搭建 二. 手机端推流 三. 电脑端观看直播 四. RTMP 服务器端状态 安卓直播推流专栏博客总结 Android RTMP 直播推流技术专栏 : 0 ...

  3. 【Android RTMP】RTMP 直播推流服务器搭建 ( Ubuntu 18.04.4 虚拟机 )

    文章目录 安卓直播推流专栏博客总结 一. Android RTMP 直播推流简介 二. Nginx.RTMP Module 编译环境源码准备 三. pcre.OpenSSL.zlib 函数库安装 四. ...

  4. 本系列介绍了rtmp直播推流全过程(已完结)

    本系列介绍了rtmp直播推流全过程 完整项目地址 (已完结) 以下文章是针对每一个情况,介绍音视频相关知识,以及实现的原理,总共分五章: 第一章:直播推流全过程:视频数据源之YUV(1) RGB或YU ...

  5. 用安卓RTMP直播推流进行音频侦听时,出现播放几秒后就无法播放问题的解决方法

    Real Time Messaging Protocol(RTMP)即实时消息传输协议,是 Adobe 公司开发的一个基于 TCP 的应用层协议,目前国内的视频云服务都是以 RTMP 为主要推流协议. ...

  6. Android流媒体开发之路二:NDK C++开发Android端RTMP直播推流程序

    经过一番折腾,成功把RTMP直播推流代码,通过NDK交叉编译的方式,移植到了Android下,从而实现了Android端采集摄像头和麦克缝数据,然后进行h264视频编码和aac音频编码,并发送到RTM ...

  7. rtmp直播推流 app-livestream v0.0.1.002 发布

    rtmp直播推流 app-livestream 使用说明书 2020-07-14  Win64位版本v0.0.1.002发布    Author: hybase@qq.com  QQ: 2320768 ...

  8. 【Android RTMP】RTMP 直播推流 ( 阿里云服务器购买 | 远程服务器控制 | 搭建 RTMP 服务器 | 服务器配置 | 推流软件配置 | 直播软件配置 | 推流直播效果展示 )

    文章目录 安卓直播推流专栏博客总结 一. 阿里云服务器购买 二. 远程服务器控制软件 三. 配置 Ubuntu 服务器 1 . 更新 apt 源 2 . 安装 pcre.OpenSSL.zlib 库 ...

  9. 魔坊APP项目-26-直播、docker安装OSSRS流媒体直播服务器、基于APICloud的acLive直播推流模块实现RTMP直播推流、直播流管理

    一.docker安装OSSRS流媒体直播服务器 在外界开发中, 如果要实现直播功能.常用的方式有: 1. 通过第三方接口来实现.可以申请阿里云,腾讯云,网易云,七牛云的直播接口,根据文档,下载集成SD ...

最新文章

  1. 怎么做好企业IT运维工作
  2. 彻底掌握机器学习的6个主流模型,是什么水平?
  3. Apple Pay及其背后的安全技术
  4. html单行元素居中显示,多行元素居左显示
  5. hadoop2 Ubuntu 下安装部署
  6. 算法与程序设计_算法与程序设计入门-简单计算题1
  7. 常用的对联广告带关闭功能
  8. 从网页上考的代码考到eclipse里面,会出现每行开头的空格下面有红色异常提示,为什么?...
  9. 25muduo_net库源码分析(一)
  10. array 删除指定的元素的方法
  11. java 读写acr122u_树莓派使用ACR122U读写IC卡
  12. Hinduja Global Solutions借助OpManager一年节省300万美元
  13. 班主任工作总结中职计算机网络,中职班主任工作总结(精选5篇)
  14. OA系统实施:理清OA需求很关键
  15. 自动驾驶的分级和无人驾驶系统简介
  16. 呼叫系统管理服务器图片,电话呼叫中心系统架构,电话呼叫系统软件
  17. (二)树莓派系列教程:树莓派4B手动连接wifi,远程控制。命令行界面、桌面界面
  18. Gatling 录制功能使用
  19. Thingsboard Gateway
  20. springBoot 定时任务执行一段时间后失效

热门文章

  1. MyIE9浏览器要告微软捆绑IE
  2. Satpy基础系列教程(1)-FY4A AGRI L1数据处理
  3. Java软件开发实习生面试题总结
  4. 【第二季】Arcgis地图制图基础|(一)Arcgis地图符号制作
  5. 计算邮费。计算规则:重量在1000克以内(包括1000克), 基本费8元。超过1000克的部分,每500克加收超重费4元,不足500克部分按500克计算;如果用户选择加急,多收5元。帮我写代码...
  6. 3. 简单前馈神经网络模型及PyTorch实现
  7. 自定义Camera系列之:SurfaceView + Camera2
  8. 成都中考生专门学计算机哪个学校好,「计算机网络技术专业」2021年成都哪所计算机网络技术专业学校好_学校推荐...
  9. Linux网络管理OSI和TCP/IP
  10. python 中文乱码 问题深入分析