<div dir="ltr">Hi guys,<div><br></div><div>I am trying to do a stream player in android but I need to read a array of bytes and then decode every packet of array of bytes. In the end started to make my AAC decoder work with the ffmpeg example of decoder. But I ran into the same problem of this guy:</div>
<div><br></div><div><a href="http://stackoverflow.com/questions/13499480/decode-aac-to-pcm-with-ffmpeg-on-android">http://stackoverflow.com/questions/13499480/decode-aac-to-pcm-with-ffmpeg-on-android</a></div><div><br></div>
<div>But the decoder does not work. I am receiving a error as follows:</div><div><br></div><div><div>TNS filter order %d is greater than maximum %d.</div><div>Error while decoding: -1</div></div><div><br></div><div>If I use the ffmpeg to decode it works fine.</div>
<div><br></div><div>ffmpeg -i audio.mp4 audio.wav</div><div><br></div><div>Environment:</div><div>ffmpeg 1.2</div><div>Android ndkr9b</div><div><div><br></div><div>Follows my source code:</div><div>







<p class="">    AVCodec *codec;</p>
<p class="">    AVCodecContext *c= NULL;</p>
<p class="">    <span class="">int</span> len;</p>
<p class="">    FILE *f, *outfile;</p>
<p class="">    uint8_t inbuf[AUDIO_INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];</p>
<p class="">    AVPacket avpkt;</p>
<p class="">    AVFrame *decoded_frame = NULL;</p>
<p class="">    av_log_set_callback(&my_ffmpeg_log);</p>
<p class="">    av_init_packet(&avpkt);</p>
<p class=""><br></p>
<p class="">    printf(<span class="">"Decode audio file %s to %s\n"</span>, filename, outfilename);</p>
<p class=""><br></p>
<p class=""><span class="">    </span>/* find the <span class="">mpeg</span> audio decoder */</p>
<p class="">    codec = avcodec_find_decoder(AV_CODEC_ID_AAC);</p>
<p class="">    <span class="">if</span> (!codec) {</p>
<p class=""><span class="">        LOGV(</span>"<span class="">Codec</span> not found\n"<span class="">);</span></p>
<p class="">        <span class="">return</span>;</p>
<p class="">    }</p>
<p class=""><br></p>
<p class="">    c = avcodec_alloc_context3(codec);</p>
<p class="">    c->channels = 2;</p>
<p class="">    c->sample_rate = 48000;</p>
<p class=""><br></p>
<p class="">    <span class="">if</span> (!c) {</p>
<p class=""><span class="">        LOGV(</span>"Could not  allocate audio <span class="">codec</span> context\n"<span class="">);</span></p>
<p class="">        <span class="">return</span>;</p>
<p class="">    }</p>
<p class=""><br></p>
<p class=""><span class="">    </span>/* open it */</p>
<p class="">    <span class="">if</span> (avcodec_open2(c, codec, NULL) < 0) {</p>
<p class=""><span class="">        LOGV(</span>"Could not open <span class="">codec</span>\n"<span class="">);</span></p>
<p class="">        <span class="">return</span>;</p>
<p class="">    }</p>
<p class=""><br></p>
<p class="">    f = fopen(filename, <span class="">"</span><span class="">rb</span><span class="">"</span>);</p>
<p class="">    <span class="">if</span> (!f) {</p>
<p class="">        LOGV(<span class="">"Could not open %s\n"</span>, filename);</p>
<p class="">        <span class="">return</span>;</p>
<p class="">    }</p>
<p class="">    outfile = fopen(outfilename, <span class="">"</span><span class="">wb</span><span class="">"</span>);</p>
<p class="">    <span class="">if</span> (!outfile) {</p>
<p class="">        av_free(c);</p>
<p class="">        <span class="">return</span>;</p>
<p class="">    }</p>
<p class=""><br></p>
<p class=""><span class="">    </span>/* decode until <span class="">eof</span> */</p>
<p class="">    avpkt.data = inbuf;</p>
<p class="">    avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f);</p>
<p class=""><br></p>
<p class="">    <span class="">while</span> (avpkt.size > 0) {</p>
<p class="">        <span class="">int</span> got_frame = 0;</p>
<p class=""><br></p>
<p class="">        <span class="">if</span> (!decoded_frame) {</p>
<p class="">            <span class="">if</span> (!(decoded_frame = avcodec_alloc_frame())) {</p>
<p class=""><span class="">                LOGV(</span>"Could not allocate audio frame\n"<span class="">);</span></p>
<p class="">                <span class="">return</span>;</p>
<p class="">            }</p>
<p class="">        } <span class="">else</span></p>
<p class="">            avcodec_get_frame_defaults(decoded_frame);</p>
<p class=""><br></p>
<p class="">        len = avcodec_decode_audio4(c, decoded_frame, &got_frame, &avpkt);</p>
<p class="">        <span class="">if</span> (len < 0) {</p>
<p class=""><span class="">            LOGV(</span>"Error while decoding: %d\n"<span class="">, len);</span></p>
<p class="">            <span class="">return</span>;</p>
<p class="">        }</p>
<p class="">        <span class="">if</span> (got_frame) {</p>
<p class=""><span class="">            </span>/* if a frame has been decoded, output it */</p>
<p class="">            <span class="">int</span> data_size = av_samples_get_buffer_size(NULL, c->channels,</p>
<p class="">                                                       decoded_frame->nb_samples,</p>
<p class="">                                                       c->sample_fmt, 1);</p>
<p class="">            fwrite(decoded_frame->data[0], 1, data_size, outfile);</p>
<p class="">        }</p>
<p class="">        avpkt.size -= len;</p>
<p class="">        avpkt.data += len;</p>
<p class="">        avpkt.dts =</p>
<p class="">        avpkt.pts = AV_NOPTS_VALUE;</p>
<p class="">        <span class="">if</span> (avpkt.size < AUDIO_REFILL_THRESH) {</p>
<p class=""><span class="">            </span>/* Refill the input buffer, to avoid trying to decode</p>
<p class="">             * incomplete frames. Instead of this, one could also use</p>
<p class="">             * a parser, or use a proper container format through</p>
<p class="">             * <span class="">libavformat</span>. */</p>
<p class="">            memmove(inbuf, avpkt.data, avpkt.size);</p>
<p class="">            avpkt.data = inbuf;</p>
<p class="">            len = fread(avpkt.data + avpkt.size, 1,</p>
<p class="">                        AUDIO_INBUF_SIZE - avpkt.size, f);</p>
<p class="">            <span class="">if</span> (len > 0)</p>
<p class="">                avpkt.size += len;</p>
<p class="">        }</p>
<p class="">    }</p>
<p class=""><br></p>
<p class="">    fclose(outfile);</p>
<p class="">    fclose(f);</p>
<p class=""><br></p>
<p class="">    avcodec_close(c);</p>
<p class="">    av_free(c);</p>
<p class="">    avcodec_free_frame(&decoded_frame);</p></div><div><br></div>-- <br><b>Atenciosamente, Marcelo Paes Rech.</b><br>E-mail: <a href="mailto:marcelopaesrech@gmail.com" target="_blank">marcelopaesrech@gmail.com</a><br>
Blog: <a href="http://marcelopaesrech.blogspot.com" target="_blank">http://marcelopaesrech.blogspot.com</a><br><img src="http://marcelorech.files.wordpress.com/2010/10/images.jpg"><br>
</div></div>