video-streaming - 使用 Gstreamer 框架为 mp4 容器同步流式传输音频和视频

标签 video-streaming gstreamer rtp libav

我是 gstreamer 的新手,我想将一个包含音频和视频的 mp4 视频从我的主机(Ubuntu PC)传输到目标板。我只成功传输了视频。但是流媒体(音频和视频)并没有发生。

仅流式传输视频的管道如下

发件人:

gst-launch-1.0 -v filesrc location = video.mp4 ! decodebin ! x264enc ! rtph264pay ! udpsink host=192.168.2.136 port=5000



接收者:

gst-launch-1.0 -v udpsrc port=5000 caps="application/x-rtp, media=video, clock-rate=90000, encoding-name=H264, payload=96, ssrc=3394826012, timestamp-offset=2215812541, seqnum-offset=46353" ! rtph264depay ! avdec_h264 ! videoconvert ! ximagesink sync=false



因此,可以在目标上看到视频。

仅从 mp4 文件流式传输音频。

仅流式传输视频的管道如下

发件人:

gst-launch-1.0 -v filesrc location=video.mp4 ! qtdemux name=demuxer demuxer. ! queue ! rtpmp4apay pt=97 ! udpsink host=192.168.2.69 port=5000



接收者:

gst-launch-1.0 -v udpsrc port=5000 caps="application/x-rtp, media=audio, clock-rate=44100, encoding-name=MP4A-LATM, cpresent=0, config=40002420, payload=97, ssrc=3386264266, timestamp-offset=2822202855, seqnum-offset=17719" ! rtpmp4adepay ! decodebin ! alsasink &



这也运行成功。

但是当我尝试在管道下方同步流式传输音频/视频时:

发件人:

gst-launch-1.0 -v filesrc location=sample.mp4 ! qtdemux name=demux demux. ! queue ! rtph264pay pt=96 ! udpsink host=192.168.3.101 port=5000 demux. ! queue ! rtpmp4apay pt=97 ! udpsink host=192.168.3.101 port=5001



接收者:

gst-launch-1.0 -v udpsrc port=5000 caps="application/x-rtp, media=video, clock-rate=90000, encoding-name=H264, payload=96, ssrc=2226494377, timestamp-offset=3242004369, seqnum-offset=17021" ! rtph264depay ! decodebin ! ximagesink udpsrc port=5001 caps="application/x-rtp, media=audio, clock-rate=44100, encoding-name=MP4A-LATM, cpresent=0, config=40002420, payload=97, ssrc=1499706502, timestamp-offset=190741668, seqnum-offset=24774" ! rtpmp4adepay ! decodebin ! alsasink



但是:得到如下输出:

ERROR: from element /GstPipeline:pipeline0/GstDecodeBin:decodebin1/GstFaad:faad0: Could not decode stream.



失败。
请有人建议我一个管道,它可以在目标设备上同步传输音频/视频。

提前致谢。

最佳答案

RTP 中的 AAC 以及 gstreamer 中的其他 RTP 负载程序似乎存在问题。

正如在另一个答案中提到的那样,如果希望在接收器端进行同步播放,无论如何最好不要解复用和拆分视频和音频。此外,可流式传输的容器格式还可以改进整体功能。

因此,我的建议是将数据流重新混合成 MPEG2-TS 并通过 RTP 传输。这有几个优点,例如丢包后良好的重新同步以及 A/V 始终保持同步。

例子

这对我使用 gstreamer 1.2.4 有效:

发件人

gst-launch-1.0 -v filesrc location=/foo/bar.mp4 ! \
  qtdemux name=demux demux. ! h264parse config-interval=10 ! queue ! mux. \
  mpegtsmux name=mux ! rtpmp2tpay ! udpsink host=10.0.0.1 port=5003 \
  demux. ! aacparse ! queue ! mux.

接收器(文件)
gst-launch-1.0 -v udpsrc port=5003 caps="application/x-rtp" ! \
  rtpmp2tdepay ! tsparse !  filesink location=/foo/bar.ts

接收器(输出)

此命令基于问题中的命令,无法使用 ALSA 进行测试:
gst-launch-1.0 -v udpsrc port=5003 caps="application/x-rtp" ! \
  rtpmp2tdepay ! tsparse ! tsdemux name=demux \
  demux. ! queue ! audioconvert ! alsasink \
  demux. ! queue ! xvimagesink

关于video-streaming - 使用 Gstreamer 框架为 mp4 容器同步流式传输音频和视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35843178/

相关文章:

ffmpeg - 在 macOS 上捕获相机 + 麦克风并编码为 h264/aac

ffmpeg - 将 RTMP 流式传输到 JANUS-Gateway 仅显示比特率但没有视频

ffmpeg - 哪些过滤器会影响 ffmpeg 编码速度

Android:视频不从原始文件夹播放

android - 如何使用gradle以编程方式将libc++ _ shared.so包含到我的APK中?

Python 无法使用 Gstreamer 访问 USB 麦克风以在 Raspberry Pi 上使用 Pocketsphinx 执行语音识别

java - 通过java捕获RTP

networking - 为什么RTP使用UDP而不是TCP?

c++ - 如何在保持低延迟的同时流式传输实时音频和视频

video-streaming - 还有其他选项可以在不使用 azure 媒体服务的情况下直接流式传输 blob 视频吗?