闲置笔记本充当服务器2:视频监控

原创
2020/04/24 20:59
阅读数 757

之前有一篇文章写了把翻出来的旧笔记本当成服务器用的方法,具体内容可以参考如下文章:

闲置笔记本做服务器

这篇文章的末尾提到还可以用这台笔记本充当闹钟,视频监控和路由器。其中闹钟的设置方法在很久之前的文章中已经写过了,可以看如下文章:

Linux 下定时唤醒计算机

利用此文章内容结合mplayer的用法,即可实现定时随机播放某音乐播放列表的功能。mplayer用法可参考如下文章:

Linux命令相关

 

在本篇文章中,主要实现将此笔记本用作视频监控摄像头的功能。此功能需安装ffmpeg,之后执行如下指令

ffmpeg -f video4linux2 -s 320x240 -r 20 -i /dev/video0 -vcodec libx264 -f rtp rtp://192.168.1.105:43210 > test.sdp

即可生成一个rtp传输协议的视频流,此处把该视频流重定向到一个文件test.sdp中。

接下来,通过执行如下指令,即可看到摄像头拍摄的实时视频了。

ffplay test.sdp

注意运行上述指令后可能需要过几秒才能看到图像。其中-f video4linux2代表采集的格式为linux视频设备,该设备的名称为/dev/video0,采集视频大小为320x240,-r 20代表采集帧率为每秒20帧,-vcodec libx264表示采集后将视频编码为h264格式视频,然后以rtp格式输出到rtp://192.168.1.105:43210。把此视频流重定向到test.sdp文件后,利用ffplay即可查看视频图像。如果不把视频流重定向到文件,则可以通过如下指令直接查看视频流。

ffplay rtp://192.168.1.105:43210

其中192.168.1.105为本地ip地址。

 

类似地,如下指令可以录制10s视频保存在文件test.mp4中。

ffmpeg -t 10 -f video4linux2 -s 640x480 -i /dev/video0 test.mp4

其中参数-t 10给出了录制视频的时间为10秒,此处使用了默认编码(h264,30fps)。

 

除了可以以rtp协议发送视频流,ffmpeg还可以以udp协议发送视频流。比如下面的命令。

ffmpeg -f video4linux2 -i /dev/video0 -vcodec libx264 -f h264 udp://192.168.1.105:6666

然后可以通过如下命令播放。

ffplay -f h264 udp://192.168.1.105:6666

以上均为使用ffmpeg直接实现视频直播功能,利用ffmpeg库也可以将其嵌入自己的程序中,封装成自己的网络监控程序。

 

除此以外,ffmpeg还提供了ffserver来帮助搭建视频服务器。比如为了实现上述的监控功能,可修改/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
RTSPPort 5454

# 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 10000

# 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 24

# 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 320x240

# 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 320x240
VideoBitRate 256
VideoBufferSize 40
VideoGopSize 30
#AudioBitRate 64
NoAudio
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 "/home/praise/视频/test.sdp"
#</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 10
VideoBitRate 100
VideoSize 320x240
#AVPresetVideo default
#AVPresetVideo baseline
###AVOptionVideo crf 23
###AVOptionVideo preset medium
AVOptionVideo flags +global_header
#
#AudioCodec aac
#AudioBitRate 32
#AudioChannels 2
#AudioSampleRate 22050
#AVOptionAudio flags +global_header
NoAudio
</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
ACL allow 172.24.0.0 172.24.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>

上面文件修改的核心有两点,一是禁掉声音,因为输入的只有视频;二是调整视频分辨率和帧率,确保能够和编码器匹配,同时网速又能流畅播放。

修改完成后运行ffserver,再运行如下语句。

ffmpeg -s 320x240 -f video4linux2 -i /dev/video0 http://localhost:8090/feed1.ffm

此时,在同一局域网内的其他机器上用windows media player(或其他支持mms网络协议的播放器)打开如下网址,即可看到摄像头实时拍摄的画面了。

mms://192.168.1.105:8090/test.asf

其中192.168.1.105为运行ffserver的服务器ip地址。此外,还可以用下面两种方式查看视频。

ffplay rtsp://192.168.1.105:5454/live.h264
ffplay http://192.168.1.105:8090/test1.mpg

因为ffserver.conf中总共定义了三个流,格式分别为mpeg,asf和rtp。从配置文件中可以看出,还可以定义其他格式的音频或视频流,但最好不要定义太多格式的流从而拖累性能。

 

注意也可将/etc/ffserver.conf复制出来,修改后用如下命令运行,可以得到同样的效果。

ffserver -f /path/to/your/ffserver.conf

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部