2011-10-19 181 views
4

私はOPAL voip SIPスタックを使用して作業中のVoIPアプリケーションがあります。gstreamerとffmpegを使用したH.264デコード

私はOpalLocalEndpointというクラスをオーバーライドし、エンコードされたデータをgstreamerパイプラインとの間で読み書きします。読書のために、私はappsinkから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などとも同じ問題を抱えていますが、それぞれ別の方法でも同じです。

+0

私は2つのアイデアを持っていますが、実験として試しても構いません。あなたのSIPアプリケーションでは、すべての10101010バイトのようなテストパターンを送信しようとします。反対側を観察する。 – Szocske

+0

2番目に、netcatのような単純なネットワークトランスポータでメディアジェネレータとシンクを試してみましょう。 – Szocske

+0

@Szocske、私はデータがwireshark経由でもう一方の端に細かくすることを確認できます。私はおそらく問題は、RTFパケットの断片化にあると思う?また、問題がlibavcodecとffmpegのffdec_h264の間にいくつかの非互換性があるかどうか不思議です。 また、sipアプリケーションのネットワークトランスポートレイヤにはアクセスできません。これは、opalによって管理されるためです。もし私がアクセスできないなら、私はそれをオフにし、udpsink/udpsrcでgstrtpbinを使い、それを使って終了します。 –

答えて

2

それ以外の点では優れたスタックであるVOIPスタックは、バグがあるか、RTPパケットをパッケージ化して送信する方法がわかりません。私はそれをバイパスし、gstreamer udpsinkとudpsrcを介してデータを送信し、正常に動作します。今私の残る質問は、スタックの開発チームに向けられます。ご協力いただきありがとうございます。

+0

私を助けることができますか?私は、IPとUDPポートを使って音声を送信する2つのgstreamerパイプラインを持っています。そして、私は、1つのLinuxがもう一方の電話を呼び出す、つまり両方のパイプラインが音声交換を開始します。 P.s私はこのスレッドに関連していますが、私はここに尋ねました –

+0

@feryうん、ちょうど私に電子メールを送ってください。それは私のプロフィールページにあります。 –

+0

私はこの問題について新しい質問を作成しました。それを確認してください:http://stackoverflow.com/questions/20329685/signaling-a-wi-fi-head-set –

関連する問題