需要事先安装nginx并开启rtmp服务,然后
-
read video from video use opencv
-
write video to ffmpeg with pipe
python ffmpeg_rtmp.py
from os import write
import subprocess as sp
import cv2
class ffmpeg_writer:
def __init__(self,rtmpUrl,fps,width,height):
# ffmpeg command
command = ['ffmpeg',
'-y',
'-f', 'rawvideo',
'-vcodec','rawvideo',
'-pix_fmt', 'bgr24',
'-s', "{}x{}".format(width, height),
'-r', str(fps),
'-i', '-',
'-c:v', 'libx264',
'-pix_fmt', 'yuv420p',
# '-preset', 'ultrafast',
'-f', 'flv',
'-flvflags', 'no_duration_filesize',
rtmpUrl]
self.pipe=sp.Popen(command, stdin=sp.PIPE)
def write(self,frame):
self.pipe.stdin.write(frame.tostring())
def release(self):
self.pipe.terminate()
if __name__ == '__main__':
rtmpUrl = "rtmp://192.168.1.151:1935/live/av_stream"
camera_path = "output.mp4"
cap = cv2.VideoCapture(camera_path)
# Get video information
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 管道配置
writer=ffmpeg_writer(rtmpUrl,fps,width,height)
# read webcamera
while(cap.isOpened()):
ret, frame = cap.read()
if not ret:
print("Opening camera is failed")
break
# process frame
# your code
# process frame
# write to pipe
writer.write(frame)
writer.release()
参考https://zhuanlan.zhihu.com/p/103164153步骤需要事先安装nginx并开启rtmp服务,然后read video from video use opencvwrite video to ffmpeg with pipe"""python ffmpeg_rtmp.py"""from os import writeimport subprocess as spimport cv2 class ffmpeg_writer: def _
相信很多像我一样只要接触过
ffmpeg
的人,都会对这个强大的音视频库产生很大的兴趣,因为几乎所有的音视频处理都离不开
ffmpeg
,我们平时自己开发一些小软件时,也可能会用到它。
但是,我们会发现,
ffmpeg
的使用也分几个层次,最开始的时候,我们完全是糊涂的,这个库怎么使用那么复杂,自己去编译一个android版或者windows版的
ffmpeg
库,可能折腾个好几天也没有一个好的输出结果。好不容...
Win10
Python
+Nginx+
FFmpeg
+Django2.2 搭建
RTMP
流媒体服务器并
实现
摄像头
rtmp
推流
并且在网页上显示
前言:最近在做一个人工智能项目,让我从摄像头读取视频流,然后经过神经网络的处理,从而将处理后的视频流推到HTML上显示。这里就整个
实现
过程做一个总结。本人是技术能力有限,如有错误之处,请谅解。
第一步:实验之前需要准备的东西有
Python
Nginx(这里我们用到的是nginx 1.7.11.3 Gryphon)下载地址:nginx 1.7.11.3 Gryphon
最近在做一个校园安防的项目,其中涉及到前端要实时展示监控摄像机的画面,其中画面要求是经过神经网络处理过的画面。
如果前端只要求展示原始画面,只需要在接入摄像机的时候,把视频流推送到一个服务器地址上,前端可根据地址获取视频流,
本次开发,前端借助的是一个视频流插件video.js,可拉取
rtmp
格式的视频流。
如果接入多路的摄像头,可以借助服务器Nginx +
ffmpeg
,具体的安装配置可参...
opencv
读取视频 —> 将视频分割为帧 —> 将每一帧进行需求加工后 —> 将此帧写入pipe管道 —> 利用
ffmpeg
进行
推流
直播
pipe管道:
啥是pipe管道? 粗略的理解就是一个放共享文件的地方(理解不是很深刻。。。)
利用这个特点 让
ffmpeg
读取处理后的图像帧并进行
rtmp
推流
即可
FFMPEG
读取实时音视频并编码
推流
//-------------------------------------------------------------------------------------------------
参考链接1、https://blog.csdn.net/leixiaohua1020/article/details/39702113
参考链接2、https:/...
[root@localhost ~]# yum install git unzip patch gcc gcc-c++ make
[root@localhost ~]# git clone https://github.com/winlinvip/st-load.git
[root@localhost
Python
推流
本质是调用
FFmpeg
的
推流
进程,所以" pipe.stdin.write(img.tobytes()) "这句话报错时,可以考虑是
FFmpeg
没有配置的原因。
推流
术语…省略。
import cv2
# subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。
import subprocess
# 视频读取对象
cap = cv2.VideoCapture(".../xx.mp4")
# 读取一帧
要在C++中
实现
Opencv
和
FFmpeg
推流
RTMP
,需要使用
FFmpeg
的API和
Opencv
的VideoCapture类。
首先,需要初始化
FFmpeg
的网络库和注册所有的组件。可以使用如下代码:
av_register_all();
avformat_network_init();
然后,需要打开视频文件或者摄像头,并将其转换为
FFmpeg
的AVFormatContext结构体。可以使用如下代码:
AVFormatContext *pFormatContext = nullptr;
avformat_open_input(&pFormatContext, "video.mp4", nullptr, nullptr);
if (avformat_find_stream_info(pFormatContext, nullptr) < 0) {
// 处理错误
接下来,需要找到视频流和音频流的索引,并打开它们。可以使用如下代码:
int videoStreamIndex = -1;
int audioStreamIndex = -1;
for (int i = 0; i < pFormatContext->nb_streams; i++) {
AVStream *pStream = pFormatContext->streams[i];
if (pStream->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
videoStreamIndex = i;
if (pStream->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
audioStreamIndex = i;
AVCodecContext *pVideoCodecContext = pFormatContext->streams[videoStreamIndex]->codec;
AVCodecContext *pAudioCodecContext = pFormatContext->streams[audioStreamIndex]->codec;
AVCodec *pVideoCodec = avcodec_find_decoder(pVideoCodecContext->codec_id);
AVCodec *pAudioCodec = avcodec_find_decoder(pAudioCodecContext->codec_id);
if (pVideoCodec == nullptr || pAudioCodec == nullptr) {
// 处理错误
if (avcodec_open2(pVideoCodecContext, pVideoCodec, nullptr) < 0 ||
avcodec_open2(pAudioCodecContext, pAudioCodec, nullptr) < 0) {
// 处理错误
然后,需要创建一个
FFmpeg
的AVOutputFormat结构体来表示输出格式,并打开输出文件。可以使用如下代码:
AVOutputFormat *pOutputFormat = av_guess_format("flv", nullptr, nullptr);
AVFormatContext *pOutputContext = nullptr;
if (avformat_alloc_output_context2(&pOutputContext, pOutputFormat, nullptr, "
rtmp
://127.0.0.1/live/test") < 0) {
// 处理错误
if (avio_open(&pOutputContext->pb, "
rtmp
://127.0.0.1/live/test", AVIO_FLAG_WRITE) < 0) {
// 处理错误
接着,需要创建视频流和音频流的AVStream结构体,并设置它们的编码器和参数。可以使用如下代码:
AVStream *pVideoStream = avformat_new_stream(pOutputContext, pVideoCodec);
AVStream *pAudioStream = avformat_new_stream(pOutputContext, pAudioCodec);
// 设置编码器参数
avcodec_parameters_from_context(pVideoStream->codecpar, pVideoCodecContext);
avcodec_parameters_from_context(pAudioStream->codecpar, pAudioCodecContext);
最后,需要循环读取视频帧和音频帧,并将它们写入输出流。可以使用如下代码:
AVPacket packet;
av_init_packet(&packet);
while (av_read_frame(pFormatContext, &packet) >= 0) {
if (packet.stream_index == videoStreamIndex) {
// 处理视频帧
av_interleaved_write_frame(pOutputContext, &packet);
if (packet.stream_index == audioStreamIndex) {
// 处理音频帧
av_interleaved_write_frame(pOutputContext, &packet);
av_packet_unref(&packet);
完整的代码示例可以参考[这里](https://github.com/charles-wangkai/
opencv
-
ffmpeg
-
rtmp
)。