使用 gstreamer 在 android 手机中流式传输网络内容
Posted
技术标签:
【中文标题】使用 gstreamer 在 android 手机中流式传输网络内容【英文标题】:Streaming Network content in android phone using gstreamer 【发布时间】:2016-08-02 19:04:41 【问题描述】:我是 Gstreamer 的新手。我正在尝试使用 gstreamer 进行网络流式传输。我可以使用下面的 gst 命令来实现。它对我来说工作正常。
在发射器:gst-launch-1.0 -v filesrc location=/home/user/Downloads/big_buck_bunny_480p_h264.mov!解码器! x264enc ! rtph264pay! udpsink 主机=127.0.0.1 端口=5000
在接收方:gst-launch-1.0 -v udpsrc port=5000 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264 ,有效载荷=(int)96“! rtph264depay!解码器!视频转换!自动视频接收器
在这里,我使用同一台 Ubuntu PC 来传输和接收视频。
但现在我想在我的 android 手机而不是 ubuntu PC 上播放接收到的视频。 我的意思是 ubuntu PC 应该作为发射器,android 手机作为接收器。有什么方法可以实现吗?
安卓手机连接到网络 10.xx.yy.zz 。 (Android手机和Ubuntu PC在同一个局域网中)所以我将发射器的udpsink主机更改为10.xx.yy.zz。现在我期待视频可以在 android 设备上播放。但它没有。我在发射器和接收器端收到以下日志消息
在发射机处: /gstpipeline:pipeline0/gstrth264pay:rtph264pay0.gstpad:sink:caps = video / x-h264,codec_data =(buffer)016400305680becb22cd9608f162d9608f162d9608f162d96010568ebecb22cd9608f162d96010568ebecb22cd9608f162d96010568ebecb22c,stream-format =(string)avc,对齐=(string)au,level =(字符串)3 , profile=(string)high, width=(int)854, height=(int)480, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)24/1 /GstPipeline:pipeline0/GstRtpH264Pay:rtph264pay0: 时间戳 = 456403579 /GstPipeline:pipeline0/GstRtpH264Pay:rtph264pay0: seqnum = 50171 管道预装... 将管道设置为 PLAYING ... 新时钟:GstSystemClock
在接收方: (string)H264, payload=(int)96" !rtph264depay !decodebin !videoconvert !autovideosink 将管道设置为 PAUSED ... /GstPipeline:pipeline0/GstUDPSrc:udpsrc0.GstPad:src: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int )96 /GstPipeline:pipeline0/GstRtpH264Depay:rtph264depay0.GstPad:sink: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int )96 管道是实时的,不需要 PREROLL ... 将管道设置为 PLAYING ... 新时钟:GstSystemClock
请帮忙。提前致谢。
【问题讨论】:
【参考方案1】:对于 android,您可以使用 vlc。也许您需要 sdp 文件来处理这个流,就像在这个问题中一样 - check comments。
或者你可以在没有 sdp 的情况下使用 mpegtsmux 来做到这一点,就像在this 答案中一样。在 vlc 上,你可以使用“打开实时流”并放在那里 udp://@:5000(其中 5000 是端口您在发送器管道中使用过)
对于 IP 问题 - 如果它与 Ubuntu PC 位于同一 LAN 上,是的,它会起作用(如果不使用详细信息编辑您的问题)。
您可以尝试使用另一台 PC(而不是 android)和 vlc - 使用我上面描述的 mpegtsmux。
【讨论】:
您好 otopolsky,根据您的建议,我想使用 SDP 来实现这一点。 SDP 对我来说是新话题 :( 我在网上查了一下,但找不到令人信服的解决方案来进行 SDP 设置。如果您有任何关于 SDP 文件设置的信息,能否分享给我?关于 IP 问题——是的两台 PC(传输器)和android手机(接收器)是同一局域网。我将udpsink主机更改为10.xx.yy.zz(android手机的IP),但在手机端没有观察到任何活动。发射器终端显示并暂停:管道是 PREROLLED。将 piepline 设置为播放新时钟:GstSystemClock @deepu 你明白了吗?我忘了回答这个评论,你只需创建可能类似于this question 的 sdp 文件,然后以某种方式将其传递给 vlc.. 我不知道如何在 vlc 的 android 版本上执行此操作..以上是关于使用 gstreamer 在 android 手机中流式传输网络内容的主要内容,如果未能解决你的问题,请参考以下文章
使用 gstreamer 在 android 上录制音频(使用 Qt5)
将使用 NDK 和 Gstreamer 的 Eclipse android 项目迁移到 Android Studio