Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>I was able to solve my problem by taking the audio_decode_example code found in the api_example.c file in libavcodec of the ffmpeg source and modify it to suit my needs. Below is the code. Just to note, it doesn't dynamically pick the correct codec to decode with, that is something I'll have to fix next along with a few other items. The java code remains untouched.</p> <pre><code>void Java_com_rohaupt_RRD2_player_Example(JNIEnv* env, jobject obj,jstring file,jbyteArray array) { jboolean isfilenameCopy; const char * filename = (*env)-&gt;GetStringUTFChars(env, file, &amp;isfilenameCopy); AVCodec *codec; AVCodecContext *c= NULL; int out_size, len; FILE *f, *outfile; uint8_t *outbuf; uint8_t inbuf[AUDIO_INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE]; AVPacket avpkt; jclass cls = (*env)-&gt;GetObjectClass(env, obj); jmethodID play = (*env)-&gt;GetMethodID(env, cls, "playSound", "([BI)V");//At the begining of your main function av_init_packet(&amp;avpkt); printf("Audio decoding\n"); /* find the mpeg audio decoder */ codec = avcodec_find_decoder(CODEC_ID_MP3); if (!codec) { fprintf(stderr, "codec not found\n"); exit(1); } c= avcodec_alloc_context(); /* open it */ if (avcodec_open(c, codec) &lt; 0) { fprintf(stderr, "could not open codec\n"); exit(1); } outbuf = malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE); f = fopen(filename, "rb"); if (!f) { fprintf(stderr, "could not open %s\n", filename); exit(1); } /* decode until eof */ avpkt.data = inbuf; avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f); while (avpkt.size &gt; 0) { out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE; len = avcodec_decode_audio3(c, (short *)outbuf, &amp;out_size, &amp;avpkt); if (len &lt; 0) { fprintf(stderr, "Error while decoding\n"); exit(1); } if (out_size &gt; 0) { /* if a frame has been decoded, output it */ jbyte *bytes = (*env)-&gt;GetByteArrayElements(env, array, NULL); memcpy(bytes, outbuf, out_size); // (*env)-&gt;ReleaseByteArrayElements(env, array, bytes, 0); (*env)-&gt;CallVoidMethod(env, obj, play, array, out_size); } avpkt.size -= len; avpkt.data += len; if (avpkt.size &lt; AUDIO_REFILL_THRESH) { /* Refill the input buffer, to avoid trying to decode * incomplete frames. Instead of this, one could also use * a parser, or use a proper container format through * libavformat. */ memmove(inbuf, avpkt.data, avpkt.size); avpkt.data = inbuf; len = fread(avpkt.data + avpkt.size, 1, AUDIO_INBUF_SIZE - avpkt.size, f); if (len &gt; 0) avpkt.size += len; } } fclose(f); free(outbuf); avcodec_close(c); av_free(c); } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload