5-3-ffmpeg libx264-dev 搭建USB相机转RTSP服务器

29 篇文章 9 订阅
3 篇文章 1 订阅

        之前我们使用gstreamer实现了USB相机转RTSP服务的测试,初步的测试看还有一些问题,比如不能多路并发链接显示,之后,网上看到了很多使用ffmpeg(ffserver)、vlc、live555等方法实现RTSP服务器的方案,经过测试,效果可行,下面先介绍一种ffmpeg(ffserver)方案。

我自己的测试硬件环境在文章《【GStreamer 】USB相机 Jeston TX1平台测试环境说明_机器人虎哥的博客-CSDN博客》有说明,请必要的时候参考。

        

1 ffserver

1.1 介绍

有几个关键概念了解一下

  1. ffserver,负责响应客户端的流媒体请求,把流媒体数据发送给客户端。

  2. ffserver.conf,ffserver启动时的配置文件,在这个文件中主要是对网络协议,缓存文件feed1.ffm和要发送的流媒体文件的格式参数做具体的设定。

  3. feed1.ffm,可以看成是一个流媒体数据的缓存文件,ffserver启动后会自动生成。ffmpeg把转码好的数据发送给ffserver,如果没有客户端连接请求,ffserver把数据缓存到该文件中。

  4. ffmpeg,负责媒体文件的转码工作,把你服务器上的源媒体文件转换成要发送出去的流媒体文件。

关于ffserver的介绍,可参考wiki介绍,如图所示为ffserver的原理:

        大致流程为:通过ffmpeg将usb摄像头数据推送到ffserver服务器,终端设备通过rtsp地址访问,达到远程访问的效果。

1.2 安装

sudo apt install ffmpeg libx264-dev

1.3 配置

在终端中打开配置文件

sudo gedit /etc/ffserver.conf

原始内容:

# Port on which the server is listening. You must select a different
# port from your standard HTTP web server if it is running on the same
# computer.
HTTPPort 8090
​
# Address on which the server is bound. Only useful if you have
# several network interfaces.
HTTPBindAddress 0.0.0.0
​
# Number of simultaneous HTTP connections that can be handled. It has
# to be defined *before* the MaxClients parameter, since it defines the
# MaxClients maximum limit.
MaxHTTPConnections 2000
​
# Number of simultaneous requests that can be handled. Since FFServer
# is very fast, it is more likely that you will want to leave this high
# and use MaxBandwidth, below.
MaxClients 1000
​
# This the maximum amount of kbit/sec that you are prepared to
# consume when streaming to clients.
MaxBandwidth 1000
​
# Access log file (uses standard Apache log file format)
# '-' is the standard output.
CustomLog -
​
##################################################################
# Definition of the live feeds. Each live feed contains one video
# and/or audio sequence coming from an ffmpeg encoder or another
# ffserver. This sequence may be encoded simultaneously with several
# codecs at several resolutions.
​
<Feed feed1.ffm>
​
# You must use 'ffmpeg' to send a live feed to ffserver. In this
# example, you can type:
#
# ffmpeg http://localhost:8090/feed1.ffm
​
# ffserver can also do time shifting. It means that it can stream any
# previously recorded live stream. The request should contain:
# "http://xxxx?date=[YYYY-MM-DDT][[HH:]MM:]SS[.m...]".You must specify
# a path where the feed is stored on disk. You also specify the
# maximum size of the feed, where zero means unlimited. Default:
# File=/tmp/feed_name.ffm FileMaxSize=5M
File /tmp/feed1.ffm
FileMaxSize 200K
​
# You could specify
# ReadOnlyFile /saved/specialvideo.ffm
# This marks the file as readonly and it will not be deleted or updated.
​
# Specify launch in order to start ffmpeg automatically.
# First ffmpeg must be defined with an appropriate path if needed,
# after that options can follow, but avoid adding the http:// field
#Launch ffmpeg
​
# Only allow connections from localhost to the feed.
ACL allow 127.0.0.1
​
</Feed>
​
​
##################################################################
# Now you can define each stream which will be generated from the
# original audio and video stream. Each format has a filename (here
# 'test1.mpg'). FFServer will send this stream when answering a
# request containing this filename.
​
<Stream test1.mpg>
​
# coming from live feed 'feed1'
Feed feed1.ffm
​
# Format of the stream : you can choose among:
# mpeg       : MPEG-1 multiplexed video and audio
# mpegvideo  : only MPEG-1 video
# mp2        : MPEG-2 audio (use AudioCodec to select layer 2 and 3 codec)
# ogg        : Ogg format (Vorbis audio codec)
# rm         : RealNetworks-compatible stream. Multiplexed audio and video.
# ra         : RealNetworks-compatible stream. Audio only.
# mpjpeg     : Multipart JPEG (works with Netscape without any plugin)
# jpeg       : Generate a single JPEG image.
# mjpeg      : Generate a M-JPEG stream.
# asf        : ASF compatible streaming (Windows Media Player format).
# swf        : Macromedia Flash compatible stream
# avi        : AVI format (MPEG-4 video, MPEG audio sound)
Format mpeg
​
# Bitrate for the audio stream. Codecs usually support only a few
# different bitrates.
AudioBitRate 32
​
# Number of audio channels: 1 = mono, 2 = stereo
AudioChannels 1
​
# Sampling frequency for audio. When using low bitrates, you should
# lower this frequency to 22050 or 11025. The supported frequencies
# depend on the selected audio codec.
AudioSampleRate 44100
​
# Bitrate for the video stream
VideoBitRate 64
​
# Ratecontrol buffer size
VideoBufferSize 40
​
# Number of frames per second
VideoFrameRate 3
​
# Size of the video frame: WxH (default: 160x128)
# The following abbreviations are defined: sqcif, qcif, cif, 4cif, qqvga,
# qvga, vga, svga, xga, uxga, qxga, sxga, qsxga, hsxga, wvga, wxga, wsxga,
# wuxga, woxga, wqsxga, wquxga, whsxga, whuxga, cga, ega, hd480, hd720,
# hd1080
VideoSize 160x128
​
# Transmit only intra frames (useful for low bitrates, but kills frame rate).
#VideoIntraOnly
​
# If non-intra only, an intra frame is transmitted every VideoGopSize
# frames. Video synchronization can only begin at an intra frame.
VideoGopSize 12
​
# More MPEG-4 parameters
# VideoHighQuality
# Video4MotionVector
​
# Choose your codecs:
#AudioCodec mp2
#VideoCodec mpeg1video
​
# Suppress audio
#NoAudio
​
# Suppress video
#NoVideo
​
#VideoQMin 3
#VideoQMax 31
​
# Set this to the number of seconds backwards in time to start. Note that
# most players will buffer 5-10 seconds of video, and also you need to allow
# for a keyframe to appear in the data stream.
#Preroll 15
​
# ACL:
​
# You can allow ranges of addresses (or single addresses)
#ACL ALLOW <first address> <last address>
​
# You can deny ranges of addresses (or single addresses)
#ACL DENY <first address> <last address>
​
# You can repeat the ACL allow/deny as often as you like. It is on a per
# stream basis. The first match defines the action. If there are no matches,
# then the default is the inverse of the last ACL statement.
#
# Thus 'ACL allow localhost' only allows access from localhost.
# 'ACL deny 1.0.0.0 1.255.255.255' would deny the whole of network 1 and
# allow everybody else.
​
</Stream>
​
​
##################################################################
# Example streams
​
​
# Multipart JPEG
​
#<Stream test.mjpg>
#Feed feed1.ffm
#Format mpjpeg
#VideoFrameRate 2
#VideoIntraOnly
#NoAudio
#Strict -1
#</Stream>
​
​
# Single JPEG
​
#<Stream test.jpg>
#Feed feed1.ffm
#Format jpeg
#VideoFrameRate 2
#VideoIntraOnly
##VideoSize 352x240
#NoAudio
#Strict -1
#</Stream>
​
​
# Flash
​
#<Stream test.swf>
#Feed feed1.ffm
#Format swf
#VideoFrameRate 2
#VideoIntraOnly
#NoAudio
#</Stream>
​
​
# ASF compatible
​
<Stream test.asf>
Feed feed1.ffm
Format asf
VideoFrameRate 15
VideoSize 352x240
VideoBitRate 256
VideoBufferSize 40
VideoGopSize 30
AudioBitRate 64
StartSendOnKey
</Stream>
​
​
# MP3 audio
​
#<Stream test.mp3>
#Feed feed1.ffm
#Format mp2
#AudioCodec mp3
#AudioBitRate 64
#AudioChannels 1
#AudioSampleRate 44100
#NoVideo
#</Stream>
​
​
# Ogg Vorbis audio
​
#<Stream test.ogg>
#Feed feed1.ffm
#Metadata title "Stream title"
#AudioBitRate 64
#AudioChannels 2
#AudioSampleRate 44100
#NoVideo
#</Stream>
​
​
# Real with audio only at 32 kbits
​
#<Stream test.ra>
#Feed feed1.ffm
#Format rm
#AudioBitRate 32
#NoVideo
#NoAudio
#</Stream>
​
​
# Real with audio and video at 64 kbits
​
#<Stream test.rm>
#Feed feed1.ffm
#Format rm
#AudioBitRate 32
#VideoBitRate 128
#VideoFrameRate 25
#VideoGopSize 25
#NoAudio
#</Stream>
​
​
##################################################################
# A stream coming from a file: you only need to set the input
# filename and optionally a new format. Supported conversions:
#    AVI -> ASF
​
#<Stream file.rm>
#File "/usr/local/httpd/htdocs/tlive.rm"
#NoAudio
#</Stream>
​
#<Stream file.asf>
#File "/usr/local/httpd/htdocs/test.asf"
#NoAudio
#Metadata author "Me"
#Metadata copyright "Super MegaCorp"
#Metadata title "Test stream from disk"
#Metadata comment "Test comment"
#</Stream>
​
​
##################################################################
# RTSP examples
#
# You can access this stream with the RTSP URL:
#   rtsp://localhost:5454/test1-rtsp.mpg
#
# A non-standard RTSP redirector is also created. Its URL is:
#   http://localhost:8090/test1-rtsp.rtsp
​
#<Stream test1-rtsp.mpg>
#Format rtp
#File "/usr/local/httpd/htdocs/test1.mpg"
#</Stream>
​
​
# Transcode an incoming live feed to another live feed,
# using libx264 and video presets
​
#<Stream live.h264>
#Format rtp
#Feed feed1.ffm
#VideoCodec libx264
#VideoFrameRate 24
#VideoBitRate 100
#VideoSize 480x272
#AVPresetVideo default
#AVPresetVideo baseline
#AVOptionVideo flags +global_header
#
#AudioCodec aac
#AudioBitRate 32
#AudioChannels 2
#AudioSampleRate 22050
#AVOptionAudio flags +global_header
#</Stream>
​
##################################################################
# SDP/multicast examples
#
# If you want to send your stream in multicast, you must set the
# multicast address with MulticastAddress. The port and the TTL can
# also be set.
#
# An SDP file is automatically generated by ffserver by adding the
# 'sdp' extension to the stream name (here
# http://localhost:8090/test1-sdp.sdp). You should usually give this
# file to your player to play the stream.
#
# The 'NoLoop' option can be used to avoid looping when the stream is
# terminated.
​
#<Stream test1-sdp.mpg>
#Format rtp
#File "/usr/local/httpd/htdocs/test1.mpg"
#MulticastAddress 224.124.0.1
#MulticastPort 5000
#MulticastTTL 16
#NoLoop
#</Stream>
​
​
##################################################################
# Special streams
​
# Server status
​
<Stream stat.html>
Format status
​
# Only allow local people to get the status
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
​
#FaviconURL http://pond1.gladstonefamily.net:8080/favicon.ico
</Stream>
​
​
# Redirect index.html to the appropriate site
​
<Redirect index.html>
URL http://www.ffmpeg.org/
</Redirect>

替换修改为:

HTTPPort 8090                     #绑定端口号
HTTPBindAddress 0.0.0.0           #绑定IP
MaxHTTPConnections 2000           #最大HTTP连接数
MaxClients 1000                   #最大客户端连接数
MaxBandwidth 1000                 #最大带宽
CustomLog -                       #日志文件,- 为直接打印
#<------------------------------Feed-------------------------------------->
<Feed feed1.ffm>                              #feed:每一个输入都建立一个feed
File /tmp/feed1.ffm                           #feed缓存文件位置和名称
FileMaxSize 10M                               #缓存文件最大值
ACL allow 127.0.0.1                           #允许写入feed的IP
ACL allow 192.168.0.0 192.168.255.255         #允许写入feed的IP范围
</Feed>
​
#<------------------------------Stream--live1.h264----------------------->
RTSPPort 8554                                 #rtsp端口号
RTSPBindAddress 0.0.0.0                       #rtsp IP地址
​
<Stream live1.h264>                           #
Format rtp                                    #视频流的格式
Feed feed1.ffm                                #视频流的种子来源
VideoCodec libx264                            #
VideoFrameRate 24                             #视频帧率
VideoBitRate 128                              #视频比特率
VideoBufferSize 100                           #视频缓冲区大小
VideoSize 640x480                             #视频帧大小
VideoQMin 1                                   #
VideoQMax 31                                  #
NoAudio                                       #无音频
AVPresetVideo default                          
AVPresetVideo baseline
AVOptionVideo flags +global_header
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
</Stream>
#<------------------------------Stream--stat.html----------------------->
<Stream stat.html>
Format status
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
</Stream>
​
# Redirect index.html to the appropriate site
​
<Redirect index.html>
URL http://www.ffmpeg.org/
</Redirect>

替换以上内容后,保存退出,之后即可以开始测试了。

1.4 测试

#命令行启动服务
ffserver 

  

#新终端,启动转发
ffmpeg -f v4l2 -i /dev/video0 -s 640x480 -r 25 -vcodec libx264 -an http://127.0.0.1:8090/feed1.ffm

 

      在另外一台终端设备上,如windows的电脑上,用VLC软件,打开网络串流,输入如下rtsp地址,即可打开摄像头。

rtsp://192.168.xx.xx:8554/live1.h264

其中,要将上边的IP地址改为服务器的地址

#我自己的测试URL
rtsp://192.168.55.1:8554/live1.h264

 

 

查看此时的资源占用:

 

同时链接3路,再看看资源占用:

 

增加1路,其实对于资源的增加并不对,还在介绍范围以内。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器人虎哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值