音视频系列6:rtsp模拟流、解码

1. 模拟流

1.1 ffmpeg

打开https://ffmpeg.zeranoe.com/builds/,该网站中的FFMPEG分为3个版本:Static,Shared,Dev。

前两个版本可以直接在命令行中使用,他们的区别在于:Static里面只有3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe,每个exe的体积都很大,相关的Dll已经被编译到exe里面去了。Shared里面除了3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe之外,还有一些Dll,比如说avcodec-54.dll之类的。Shared里面的exe体积很小,他们在运行的时候,到相应的Dll中调用功能。Dev版本是用于开发的,里面包含了库文件xxx.lib以及头文件xxx.h,这个版本不包含exe文件。

-re : 表示使用文件的原始帧率进行读取,因为ffmpeg读取视频帧的速度很快,如果不使用这个参数,ffmpeg可以在很短时间就把video.mp4中的视频帧全部读取完并进行推流,这样就无法体现出视频播放的效果了。-r的默认配置为25

-vcodec copy : -vcodec表示使用的视频编解码器 ,前缀v表示video。后面紧跟的copy 表示复制使用源文件的视频编解码器,比如原文件的编解码器(codec)是h264,则这里就使用h264。

-acodec copy : -acodec表示使用的音频编解码器,前缀a表示audio。后面的copy 表示使用源文件的音频编解码器。

-b:v 800k : -b:v表示视频的比特率(bitrate) ,即视频流量,默认为200k,这里设置为800k。

-b:a 32k : 表示音频的比特率为32k。

-f flv : -f表示format ,就是强制输出格式为flv,这一步其实也叫封装(mux),封装要做的事就是把视频和音频混合在一起,进行同步。紧跟在后面的rtmp://localhost/live 表示输出的"文件名",这个文件名可以是一个本地的文件,也可以指定为rtmp流媒体地址。指定为rtmp流媒体地址后,则ffmpeg就可以进行推流。

1.2 图形界面:easyDarwin+ffmpeg

高性能开源RTSP流媒体服务器,基于go语言研发,维护和优化:RTSP推模式转发、RTSP拉模式转发、录像、检索、回放、关键帧缓存、秒开画面、RESTful接口、WEB后台管理、分布式负载均衡……
下载下来直接启动,打开浏览器输入 http://localhost:10008, 进入控制页面,默认用户名密码是admin/admin。
接下来的操作步骤和上面一样,依次用ffmpeg发布视频流即可。

1.3 docker方式:rtsp simple server+ffmpeg

首先起一个界面拉取镜像:

docker run --rm -it -e RTSP_PROTOCOLS=tcp -p 8554:8554 -p 1935:1935 aler9/rtsp-simple-server

接着打开另一个界面,进行起流:

ffmpeg -re -stream_loop -1 -i last_helmet.mp4 -c copy -f rtsp rtsp://localhost:8554/mystream

下面我们来测试一下,每10秒保存为一个文件

ffmpeg -rtsp_transport tcp -i rtsp://localhost:8554/mystream -c copy -f segment -segment_time 10 stream_piece_%d.mp4

2. cpu平台读取视频

2.1 ffmpeg-python

PyAV是FFmpeg库的python绑定。使用pyav的代码示例如下:

import av,cv2
while True:
	g= av.open("rtsp://....:8554/yourstream", 'r').decode()
	img = g.send(None).to_nd_array(format='bgr24')
	cv2.imwrite('0.jpeg',img)
import av
container = av.open(path_to_video)
for frame in container.decode(video=0):
    frame.to_image().save('frame-%04d.jpg' % frame.index)

2.2 opencv-python

真的异常简单

from imutils.video import VideoStream
import imutils,time,cv2
vs = VideoStream(src="rtsp://...:8554/mystream001").start()
frame = vs.read();
...//这里不停读取即可
vs.stop()

2.3 C++

C++比较麻烦,首先需要区分平台:

if (AARCH)
    set(FFMPEG_ROOT "${PROJECT_SOURCE_DIR}/3rdparty/ffmpeg-bin-n4.2.2/")
else()
    set(FFMPEG_ROOT "${PROJECT_SOURCE_DIR}/3rdparty/ffmpeg-bin-n4.1.4/")
endif()
message ("FFMPEG ROOT: ${FFMPEG_ROOT}")
include(./cmake/FindFFMpeg.cmake)
message("FFMpeg status: include ${FFMPEG_INCLUDE_DIR}")

3. gpu平台读取视频

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值