使用RaspberryPi相机流式传输H264

时间:2013-12-24 10:28:32

标签: stream video-streaming raspberry-pi gstreamer h.264

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

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

    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
    

    首先,我的问题是,是否有任何方法可以设置网址来捕获此gstreamer流(或任何其他方式来捕获Android应用程序代码中的流)? 第二,如果您有任何其他建议,例如使用不同的相机,不同的格式(不是mjpg),不同的流媒体方式等。

5 个答案:

答案 0 :(得分: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 payloader和GDP payloader,只需要一个。仅RTP对我来说效果很好。

答案 1 :(得分:1)

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

可以通过V4L2驱动程序访问rasperry相机板:

sudo modprobe bcm2835-v4l2
  

uv4l --driver raspicam --auto-video_nr

接下来,您可以从H264 V4L2源gihub

找到RTSP流转换器的简单实现

答案 2 :(得分:1)

你选择的方式是我认为最好的方式。 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

答案 3 :(得分:1)

有时候为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

答案 4 :(得分:0)

我有类似的需求,经过vlc的多次试用后,我使用 raspivid nc (netcat)和以下android应用解决了gstreamer:

https://github.com/ShawnBaker/RPiCameraViewer

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