音视频系列6:rtsp模拟流解码
Posted IE06
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了音视频系列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平台读取视频
以上是关于音视频系列6:rtsp模拟流解码的主要内容,如果未能解决你的问题,请参考以下文章