拍摄是树莓派比较基础的应用
网上已经有很多成熟的应用实现了视频流的处理
利用这些应用,可以轻松在浏览器中查看实时监控,MJPG即是其中之一
但是MJPG有一个局限,就是只能在树莓派运行的同一个局域网中访问
如果想要实现类似远程监控的能力,那么首先就是要将拍摄内容转发出来,然后在程序中处理之后再转发
树莓派自带的raspivid命令刚好具备这样的录制转发能力(第一次的转发)
关于raspivid详细的介绍可以参考官方文档:
https://www.raspberrypi.org/documentation/raspbian/applications/camera.md
在树莓派上执行
raspivid --help
可以看到关于关于起输出的描述如下:
-o, --output : Output filename <filename> (to write to stdout, use '-o -').
Connect to a remote IPv4 host (e.g. tcp://192.168.1.2:1234, udp://192.168.1.2:1234)
To listen on a TCP port (IPv4) and wait for an incoming connection use -l
(e.g. raspivid -l -o tcp://0.0.0.0:3333 -> bind to all network interfaces, raspivid -l -o tcp://192.168.1.1:3333 -> bind to a certain local IPv4)
也就是说raspivid可以将视频流通过TCP或者UDP转发到一个IP地址上
然后也就可以利用socket编程,处理这个视频流
一个简单的raspivid命令如下:
raspivid -w 640 -h 480 -t 5000 -o tcp://192.168.1.101:3333
该命令将录制 格式640*480, 时长 5 S的视频并已TCP协议发送到192.168.1.101的3333端口
如果想要录制一直持续,则将 -t 的参数设置为 0,即执行:
raspivid -w 640 -h 480 -t 0 -o tcp://192.168.1.101:3333
接下来就可以利用程序接收和处理这段视频流
我这里用Java的一个实现demo如下,该程序执行之后,然后启动上面的raspivid命令就可以将视频保存在test.h264文件中
(.h264文件可以用应用VLC打开)
也可以将视频保存为普通的.mp4文件(对这个视频流的二次转发在之后的文章中介绍)
public void saveVideoStream() throws IOException {
ServerSocket cameraSS = new ServerSocket(3333);
Socket cameraSocket;
while (true) {
cameraSocket = cameraSS.accept();
File file = new File(System.getProperty("user.dir") + "/test.h264");
InputStream cameraStream = cameraSocket.getInputStream();
FileOutputStream outputStream = new FileOutputStream(file);
int content = cameraStream.read();
while (content != -1) {
outputStream.write(content);
content = cameraStream.read();
outputStream.flush();
}
}
}