sorry, no webchat, is a videoconference program. And I'm using UDP as you can read down on the mail.<br>The problem is that speex packages alone work great, but to split speex/theora packages on the arrive I need to use some kind of container, and I'm trying ogg.
<br><br><div><span class="gmail_quote">On 8/7/06, <b class="gmail_sendername">Jean-Marc Valin</b> &lt;<a href="mailto:jean-marc.valin@usherbrooke.ca">jean-marc.valin@usherbrooke.ca</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
If by webchat you mean anything interactive, then I can already tell you<br>what the problem is. TCP+Ogg. For anything real-time, you want UDP/RTP<br>without Ogg. Also, you need to take into account the fact that computers
<br>do *not* have accurate clock and their soundcards drift. None of these<br>problems are fatal, but you need to take that into account in the<br>design.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Jean-Marc<br><br>On Mon, 2006-08-07 at 02:53 +0200, Jere Gmail wrote:
<br>&gt; I'm currently working on a speex + theora webchat.<br>&gt; I have both working alone, but to make them work together and to know<br>&gt; where the package goes, I'm trying to use ogg packages.<br>&gt; With theora there has been no problem, but with speex I can't make it
<br>&gt; work. The problem is that for a second it works great, but then it<br>&gt; begings to gain lag, and in a little time it has 5-10 lag seconds<br>&gt; (into the same machine, working on loopback). Currently I'm packaging
<br>&gt; 4 frames per package (FRAMES_PACKET=4).<br>&gt; Any help will be greatly appreciated.<br>&gt;<br>&gt;<br>&gt; Into the encoder I have this code:<br>&gt;<br>&gt; speex_bits_reset(&amp;enc_bits);<br>&gt; for(int i=0;i&lt;FRAMES_PACKET;i++)
<br>&gt; {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; int nb_samples;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; //Here I get the microphone data.<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; while((nb_samples=Check_Mic(Mic_data))==0);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; speex_encode_int(enc_state, Mic_data, &amp;enc_bits);<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; total_samples += nb_samples;
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; speex_bits_insert_terminator(&amp;enc_bits);<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; //The time stamp<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; if(i==0)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((int*)packet)[0]=total_samples;<br>&gt; }<br>&gt; int nbBytes = speex_bits_write(&amp;enc_bits, packet+4, 2000);
<br>&gt; tam=nbBytes+4;<br>&gt;<br>&gt; //Now the ogg package<br>&gt; op.packet = (unsigned char *)packet;<br>&gt; op.bytes = nbBytes+4;<br>&gt; op.b_o_s = 0;<br>&gt; op.packetno = packet_id;<br>&gt; packet_id++;<br>&gt;<br>
&gt; ogg_stream_packetin(&amp;os, &amp;op);<br>&gt; ogg_stream_flush(&amp;os, &amp;audio_page);<br>&gt;<br>&gt; return audio_page;<br>&gt; }<br>&gt;<br>&gt; As for the decoder I have this.<br>&gt;<br>&gt; //Incoming data from udp is on buffer
<br>&gt; char *buffer=ogg_sync_buffer(&amp;oy,4096);<br>&gt; memcpy(buffer,buff,len);<br>&gt; ogg_sync_wrote(&amp;oy,len);<br>&gt; while(ogg_sync_pageout(&amp;oy,&amp;audio_page)&gt;0)<br>&gt; {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; if (stream_init == 0)
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ogg_stream_init(&amp;os, ogg_page_serialno(&amp;audio_page));<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stream_init = 1;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; queue_page(&amp;audio_page);<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; while(ogg_stream_packetout(&amp;os,&amp;op)&gt;0)
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int b;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ogg_stream_pagein(&amp;os, &amp;audio_page);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int len=(audio_page.body_len-4)/FRAMES_PACKET;<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *datos=(char*)op.packet;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char m[100];
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sprintf(m,&quot;paq %d&quot;, op.packetno);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System::Console::WriteLine(gcnew String(m));<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int t=((int *)datos)[0];<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;FRAMES_PACKET;i++)
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; speex_jitter_put(&amp;jitter,(datos+4)+len*i,len,t<br>&gt; +FRAME_SIZE*i);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&gt; }<br>&gt;<br>&gt;<br>&gt; --<br>&gt; <a href="http://www.apple.com">http://www.apple.com</a><br>&gt; A veces me da por ahi. Otras como que no.
<br>&gt; _______________________________________________<br>&gt; Speex-dev mailing list<br>&gt; <a href="mailto:Speex-dev@xiph.org">Speex-dev@xiph.org</a><br>&gt; <a href="http://lists.xiph.org/mailman/listinfo/speex-dev">
http://lists.xiph.org/mailman/listinfo/speex-dev</a><br></blockquote></div><br><br clear="all"><br>-- <br><a href="http://www.apple.com">http://www.apple.com</a><br>A veces me da por ahi. Otras como que no.