使用 RaspberryPi 摄像头流式传输 H264

Posted

技术标签:

【中文标题】使用 RaspberryPi 摄像头流式传输 H264【英文标题】:Streaming H264 using RaspberryPi camera 【发布时间】:2014-01-12 14:22:27 【问题描述】:

我正在开发一个使用树莓派构建机器人的项目,该机器人会将视频发送到安卓设备,并通过它进行控制。 我决定使用 RaspberryPi 摄像头(也许 USB 网络摄像头更好?)。 我希望视频采用 H264 格式,但是在以这种格式进行流式传输时遇到了问题。 我尝试使用 gstreamer 和 vlc:

    如果我使用 vlc,我会得到一个非常延迟的视频,而且不流畅。 如果我使用 gstreamer,我会得到一个很好的视频,但我不知道如何设置一个 url 来放入 android 应用程序代码。 我可以通过在我的电脑上运行 gstreamer 命令来观看视频。我使用的命令是:

在树莓派上:

raspivid -t 999999 -h 720 -w 1080 -fps 25 -hf -b 2000000 -o - | gst-launch-1.0 -v fdsrc ! h264parse !  rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=192.168.1.102 port=5000

在我的电脑上(观看视频):

gst-launch-1.0 -v tcpclientsrc host=192.168.1.102 port=5000  ! gdpdepay !  rtph264depay ! avdec_h264 ! videoconvert ! autovideosink sync=false

首先,我的问题是是否有任何方法可以设置一个 url 来捕获这个 gstreamer 流(或任何其他方法来捕获 android 应用代码中的流)? 其次,如果您有任何其他建议,例如使用不同的相机、不同的格式(不是 mjpg)、不同的流媒体方式等。

【问题讨论】:

我也在研究无线流媒体视频,据我所知,最好的方法是将流作为 RTSP 服务(其中使用基于 TCP/UDP 的 RTP)。之后,您可以编写一个播放 url rtsp://ip 的应用程序。 【参考方案1】:

当然,您可以在 Android 代码中使用相同的 PC 管道。查看GStreamer's Android Tutorial 3,了解如何在 Android 上运行 GStreamer 代码。您基本上可以在您的 Android 设备上运行该确切的教程程序,只需将您的管道粘贴到对gst_parse_launch 的调用中。此外,请确保将INTERNET permission 添加到您的 Android 清单中,否则您的程序将无法打开套接字。

唯一的问题是您的管道使用的是 GStreamer 1.0,而上面的 SDK 教程示例是为 GStreamer 0.10 编写的。不过,使用 Cerbero 构建系统交叉编译适用于 Android 的 GStreamer 1.0 SDK 是相当容易的(我最近已经这样做了,可以帮助您)。或者您可以在 Android 上坚持使用 0.10 并使用预构建的 0.10 SDK 文件。

编辑:还有一件事——你不需要 RTP 负载和 GDP 负载,只需要一个。单独的 RTP 对我来说效果很好。

【讨论】:

【参考方案2】:

您可以从论坛RTSP Streaming H264 找到可能的解决方案。

可以通过 V4L2 驱动访问树莓派相机板:

official kernel V4L2 driver bcm2835-v4l2
sudo modprobe bcm2835-v4l2
unofficial userspace V4L2 driver for the Raspberry Pi Camera Module

uv4l --driver raspicam --auto-video_nr

接下来,您可以从 H264 V4L2 源 gihub 找到 RTSP 流媒体源的简单实现

【讨论】:

【参考方案3】:

您选择的方式是我认为最好的方式。 Gstreamer 已准备好使用 android 示例(通过 NDK): http://docs.gstreamer.com/display/GstSDK/Android+tutorial+3%3A+Video

您可以在此处找到示例应用程序: https://play.google.com/store/apps/details?id=pl.effisoft.rpicamviewer2

【讨论】:

【参考方案4】:

为 Android 编译 gstreamer 有时会很困难。您可以考虑在 android 设备上查看您的管道的替代解决方案。下面的示例代码打开基于 videotestsrc 的简单管道:

Intent intent = new Intent("pl.effisoft.rpicamviewer2.PREVIEW");
int camera =0;

//--------- Basic settings
intent.putExtra("full_screen", true);
intent.putExtra("name"+camera, "My pipeline name");
intent.putExtra("host"+camera, "192.168.0.1");
intent.putExtra("port"+camera, 5000);
intent.putExtra("description"+camera, "My pipeline description");
intent.putExtra("uuid"+camera, UUID.randomUUID().toString() );
intent.putExtra("aspectRatio"+camera, 1.6);
intent.putExtra("autoplay"+camera, true);

//--------- Enable advanced mode
intent.putExtra("advanced"+camera, true);
intent.putExtra("custom_pipeline"+camera, "videotestsrc ! warptv ! autovideosink");

//--------- Enable application extra features
intent.putExtra("extraFeaturesEnabled"+camera, false);

//--------- Add autoaudiosink to featured pipeline
intent.putExtra("extraFeaturesSoundEnabled"+camera, false);

//--------- Scale Video Stream option
intent.putExtra("extraResizeVideoEnabled"+camera, false);


intent.setPackage("pl.effisoft.rpicamviewer2");
startActivityForResult(intent, 0);

完整的示例代码在这里:https://github.com/pzuk/raspberry-pi-camera-viewer-embedded-example

【讨论】:

【参考方案5】:

我也有类似的需求,在使用 vlc、gstreamer 进行多次试验后,我使用 raspividnc (netcat) 和以下 android 应用程序解决了问题:

https://github.com/ShawnBaker/RPiCameraViewer

这可能不是最好的解决方案,因为源代码只是部分开放,但它可以工作并且延迟很短。

【讨论】:

以上是关于使用 RaspberryPi 摄像头流式传输 H264的主要内容,如果未能解决你的问题,请参考以下文章

将视频从 Raspberry Pi 流式传输到 Android 应用程序

raspberrypi gstreamer1.0 alsasrc0:内部数据流错误

使用用户摄像头实时流式传输网页

使用 FFmpeg 从 Mac 流式传输网络摄像头

使用 socket.io 流式传输网络摄像头

在流式传输网络摄像头时定期拍照