使用RaspberryPi相机流式传输H264

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

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

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


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


    当然,您可以在Android代码中使用相同的PC管道。 看看GStreamer的Android Tutorial 3,看看如何在Android上运行GStreamer代码。 你基本上可以在Android设备上运行精确的教程程序,只需将你的管道粘贴到gst_parse_launch调用中gst_parse_launch 。 另外,请确保将INTERNET权限添加到您的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对我来说效果很好。


    编译gstreamer for Android可能有时很艰难。 您可以考虑使用替代解决方案在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

    链接地址: http://www.djcxy.com/p/76455.html

    上一篇: Streaming H264 using RaspberryPi camera

    下一篇: Documenting Thread Safety (Java + Annotations)