Hi!<div><br></div><div>I'm using libav to encode raw RGB24 frames to h264 and muxing it to flv. This works</div><div>all fine and I've streamed for more then 48 hours w/o any problems!  My next step</div><div>is to add audio to the stream. I'll be capturing live audio and I want to encode it </div>
<div>in real time using speex, mp3 or nelly moser.  </div><div><br></div><div>Background info</div><div>----------------------</div><div>I'm new to digital audio and therefore I might be doing things wrong. But basically my application</div>
<div>gets a "float" buffer with interleaved audio.  The buffer contains 256 samples per channel, </div><div>and I have 2 channels. Because I might be mixing terminology, this is how I use the </div><div>data:</div>
<div><br></div><div><div><br></div><div>// input = array with audio samples</div><div>// bufferSize = 256</div><div>// nChannels = 2</div><div>void audioIn(float * input, int bufferSize, int nChannels) {</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>// convert from float to S16</div>
<div>        short* buf = new signed short[bufferSize * 2];</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>for(int i = 0; i < bufferSize; ++i) {  // loop over all samples</div><div><span class="Apple-tab-span" style="white-space:pre">           </span>int dx = i * 2;</div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span>buf[dx + 0] = (float)input[dx + 0] * numeric_limits<short>::max();  // convert frame  of the first channel</div><div><span class="Apple-tab-span" style="white-space:pre">             </span>buf[dx + 1] = (float)input[dx + 1] * numeric_limits<short>::max();  // convert frame  of the second channel</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>}</div><div><br></div><div>        // add this to the libav wrapper. </div><div><span class="Apple-tab-span" style="white-space:pre">  </span>av.addAudioFrame((unsigned char*)buf, bufferSize, nChannels);</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>delete[] buf;</div><div>}</div></div><div><br></div><div>Now that I have a buffer, where each sample is 16 bits, I pass this short* buffer,  to my </div>
<div>wrapper "av.addAudioFrame()"  function.  In this function I create a buffer, before I encode </div><div>the audio. From what I read,  the AVCodecContext of the audio encoder sets the frame_size. </div><div>
This frame_size must match the number of samples in the buffer when calling avcodec_encode_audio2().  </div><div>Why I think this, is because of what is documented here: </div><div><a href="http://libav.org/doxygen/master/group__lavc__encoding.html#ga93a49fbd0973b216dcb8a8c5dffe1d82">http://libav.org/doxygen/master/group__lavc__encoding.html#ga93a49fbd0973b216dcb8a8c5dffe1d82</a> </div>
<div><br></div><div>              Then, especially the line: "If it is not set, frame->nb_samples must be equal to avctx->frame_size </div><div>               for all frames except the last." (Please correct me here if I'm wrong about this).</div>
<div><br></div><div>After encoding I call av_interleaved_write_frame() to actually write the frame. </div><div>When I use mp3 as codec my application runs for about 1-2 minutes and then my server, which is</div><div>receiving the video/audio stream (flv, tcp), disconnects with a message "Frame too large: 14485504".</div>
<div>Also in my logs I see several messages from libav: "Stream over/underflow detected." </div><div><br></div><div>Questions:</div><div>------------</div><div>- There quite some bits I'm not sure of, even when going through the source code of libav and therefore</div>
<div>I hope if someone has an working example of encoding audio which comes from a buffer which which</div><div>comes from "outside" libav (i.e. your own application). </div><div><br></div><div>- As I wrote above I need to keep track of a buffer before I can encode. </div>
<div>Does someone else has some code which does this? I'm using AVAudioFifo now. The functions</div><div>which encodes the audio and fills/read the buffer is here too: <a href="https://gist.github.com/62f717bbaa69ac7196be">https://gist.github.com/62f717bbaa69ac7196be</a></div>
<div><br></div><div>- I compiled with --enable-debug=3 and disable optimizations, but I'm not seeing any</div><div>debug information. How can I make libav more verbose? </div><div><br></div><div>Thanks!</div><div>roxlu</div>
<div><br></div>







<div><br></div><div><br></div>