voip - 使用 gstreamer 和 ffmpeg 进行 H.264 解码

标签 voip sip gstreamer sdp

我有一个正在使用 OPAL voip SIP 堆栈的 voip 应用程序。

我正在覆盖一个名为 OpalLocalEndpoint 的类,并从我的 gstreamer 管道读取/写入编码数据。对于读取,我从应用程序接收器中获取 rtp 负载数据,而对于写入,我将负载数据推送到 appsrc。

我从wireshark捕获了SDP文件。

这是应用程序的客户端。

v=0
o=- 1319058426 1 IN IP4 192.168.0.71
s=Opal SIP Session
c=IN IP4 192.168.0.71
t=0 0
m=audio 5086 RTP/AVP 125 0 8 124 101
a=sendrecv
a=rtpmap:125 Speex/16000/1
a=fmtp:125 sr=16000,mode=any
a=rtpmap:0 PCMU/8000/1
a=rtpmap:8 PCMA/8000/1
a=rtpmap:124 Speex/8000/1
a=fmtp:124 sr=8000,mode=any
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16,32,36
m=video 5088 RTP/AVP 109 108 34 114
b=AS:4096
b=TIAS:4096000
a=sendrecv
a=rtpmap:109 h264/90000
a=fmtp:109 packetization-mode=1;profile-level-id=42C01E
a=rtpmap:108 h263-1998/90000
a=fmtp:108 D=1;F=1;I=1;J=1;CIF=1;CIF4=1;QCIF=1;CUSTOM=320,240,1;CUSTOM=640,480,1
a=rtpmap:34 h263/90000
a=fmtp:34 F=1;CIF=1;CIF4=1;QCIF=1
a=rtpmap:114 MP4V-ES/90000
a=fmtp:114 profile-level-id=5

这是服务器回复客户端
v=0
o=- 1319058099 1 IN IP4 192.168.0.215
s=HHP Video Codec/1.0
c=IN IP4 192.168.0.215
t=0 0
m=audio 5006 RTP/AVP 125 0 8 124
a=inactive
a=rtpmap:125 Speex/16000/1
a=rtpmap:0 PCMU/8000/1
a=rtpmap:8 PCMA/8000/1
a=rtpmap:124 Speex/8000/1
a=maxptime:20
m=video 5004 RTP/AVP 109
b=AS:2048
b=TIAS:2048000
a=sendrecv
a=rtpmap:109 h264/90000
a=fmtp:109 packetization-mode=1;profile-level-id=42c01e

我对数据进行编码:
 v4l2src name=videoSrc ! video/x-raw-yuv, format=(fourcc)I420, width=352, height=288, framerate=(fraction)30/1 ! videobalance name=VideoBalance ! textoverlay name=chanNameFilter ! textoverlay name=osdMessageFilter ! textoverlay name=sessionTimerOverlay ! x264enc byte-stream=true bframes=0 b-adapt=0 tune=0x4 speed-preset=3 bitrate=256 sliced-threads=false profile=0 ! rtph264pay mtu=1412 ! appsink name=videoAppSink sync=false

并尝试解码传入的数据
appsrc is-live=true do-timestamp=false typefind=true name=videoAppSrc ! application/x-rtp, media=video, payload=109, clock-rate=90000, encoding-type=H264, byte-stream=true, access-unit=true ! rtph264depay ! ffdec_h264 !  xvimagesink name=videoOutputSink

然而,虽然编码数据显示在客户端上(一开始没有,我必须添加所有这些属性,直到它最终正确显示),我一直无法让解码端工作。

它显示了一个主要是灰色的屏幕,带有粉红色、黄色和绿色的光点。有时我会得到更多正确的颜色,而大多数时候只是灰色。

如果我使用这个完全相同的管道与 VLC 交互,它工作正常。我的猜测是我在某处搞砸了帽子。任何人都可以提供关于我应该寻找什么的任何想法吗?

我的其他每个编码器也遇到了同样的问题,即 theora、h263 等……尽管每个编码器的方式不同。

最佳答案

事实证明,VOIP 堆栈,这是一个出色的堆栈,要么有错误,要么我不明白它打包和传输 RTP 数据包的方式。我绕过它并通过 gstreamer udpsink 和 udpsrc 发送数据,它工作正常。现在我剩下的唯一问题将被提交给堆栈的开发团队。谢谢你的帮助。

关于voip - 使用 gstreamer 和 ffmpeg 进行 H.264 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7828522/

相关文章:

sdk - 需要关于 Ozeki(IP 语音)VoIP SIP SDK 的反馈

android - 在 Marshmallow 的锁屏上显示 VOIP 来电

sip - Asterisk ,SIP 重传超时

c - Gstreamer:如何在 C 中设置 videomixer sink_0 上限

audio - 如何在gstreamer中混合音频和视频

c# - 是否有任何 C# 库包装 Xmpp Jingle 或包装用另一种语言编写的 Xmpp Jingle 库

php - 集成 php mysql 和 voip 以及文本到语音

SIP编解码协商

voip - SIP 和 H.323 的区别

linux - 如何在 Linux 上为 gstreamer 安装 video.h?