[FFmpeg-devel] Complte code to play mp3 using ffmpeg

kalla dalayya dalu547 at gmail.com
Sat Oct 26 17:01:03 CEST 2013


Hi,
     Iam able to play .wav files using ffmpeg and audiotrack but not mp3
.am getting noise while playing mp3.So help me iam new to ffmpeg through
links or code.am attaching my java and c code once see this and suggest me

Thanks &Regards
Naidu.
Hyderabad
-------------- next part --------------
package com.music;

import java.io.FileOutputStream;

import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.os.Bundle;
import android.os.Environment;

public class MainActivity extends Activity 
{

	private AudioTrack track;
    private FileOutputStream os;
    byte[] bytes;
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         
        createEngine();
        
        int bufSize = 8 * AudioTrack.getMinBufferSize(44100,
				AudioFormat.CHANNEL_OUT_STEREO,
				AudioFormat.ENCODING_PCM_16BIT);
       
        track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
				AudioFormat.CHANNEL_OUT_STEREO,
				AudioFormat.ENCODING_PCM_16BIT, bufSize,
				AudioTrack.MODE_STREAM);

        
        bytes = new byte[bufSize];
        final String wavefile = Environment.getExternalStorageDirectory().getAbsolutePath()+"/pani_da.wav";
       
        try
        {
        	new Thread(new Runnable() 
        	{
				@Override
				public void run() 
				{
					playwav(wavefile,bytes);
					playmp3(mp3file,bytes);
				}
			}).start();
        	
        }
        catch (Exception e) 
        {
        	e.getStackTrace();
		}
    }
         //calling from music.c
    void playSound(final byte[] buf, final int size) 
    {  
    	           track.write(buf, 0, size);
			       track.play();
    }

    private native void createEngine();
    private native void playwav(String filewave, byte[] array);
	static 
	{
		
		System.loadLibrary("ffmpeg");
		
	}
}
-------------- next part --------------
#include <jni.h>

#include <assert.h>
#include <string.h>
#include <android/log.h>
#include <errno.h>
#include <math.h>

#include <libavcodec/avcodec.h>
#include "libavformat/avformat.h"

#include <libavutil/opt.h>
#include <libavcodec/avcodec.h>
#include <libavutil/channel_layout.h>
#include <libavutil/common.h>
#include <libavutil/imgutils.h>
#include <libavutil/mathematics.h>
#include <libavutil/samplefmt.h>

#define INBUF_SIZE 4096
#define AUDIO_INBUF_SIZE 20480
#define AUDIO_REFILL_THRESH 4096




JNIEXPORT void JNICALL Java_com_music_MainActivity_createEngine(JNIEnv *env, jclass clazz)
{
	__android_log_print(6, "music.c", "create engine called");
	avcodec_init();
	av_register_all();

}

JNIEXPORT void JNICALL  Java_com_music_MainActivity_playwav(JNIEnv* env, jobject obj,jstring file,jbyteArray array)
{
       jboolean            isCopy;
        int                 audioStream=-1;
        int                 res;
        int                 decoded = 0;
        AVFormatContext     *pFormatCtx;
        AVCodecContext      *aCodecCtx;
        AVCodec             *aCodec;
        AVPacket            packet;

        jclass              cls = (*env)->GetObjectClass(env, obj);
        jmethodID           play = (*env)->GetMethodID(env, cls, "playSound", "([BI)V");

        const char *        szfile = (*env)->GetStringUTFChars(env, file, &isCopy);
        int16_t *           pAudioBuffer = (int16_t *) av_malloc (AVCODEC_MAX_AUDIO_FRAME_SIZE*2+FF_INPUT_BUFFER_PADDING_SIZE);


        res = av_open_input_file(&pFormatCtx, szfile, NULL, 0, NULL);
        res = av_find_stream_info(pFormatCtx);
        int i;
        for(i=0; i < pFormatCtx->nb_streams; i++)
        {
          if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO &&
             audioStream < 0)
          {
            audioStream=i;
          }
        }

        aCodecCtx=pFormatCtx->streams[audioStream]->codec;
        aCodec = avcodec_find_decoder(aCodecCtx->codec_id);
        res = avcodec_open(aCodecCtx, aCodec);
        av_init_packet(&packet);

        int x,y;
        x=0;y=0;
        while (av_read_frame(pFormatCtx, &packet)>= 0)
        {

            if (aCodecCtx->codec_type == AVMEDIA_TYPE_AUDIO)
            {
                        int data_size = AVCODEC_MAX_AUDIO_FRAME_SIZE*2+FF_INPUT_BUFFER_PADDING_SIZE;
                        int size=packet.size;
                        y=0;
                        decoded = 0;
                        while(size > 0)
                        {

                                int len = avcodec_decode_audio3(aCodecCtx, pAudioBuffer, &data_size, &packet);
                                jbyte *bytes = (*env)->GetByteArrayElements(env, array, NULL);

                                memcpy(bytes + decoded, pAudioBuffer, len);
                                (*env)->ReleaseByteArrayElements(env, array, bytes, 0);
                                (*env)->CallVoidMethod(env, obj, play, array, len);

                                size -= len;
                                decoded += len;

                       }
                       av_free_packet(&packet);
            }

     }

        av_close_input_file(pFormatCtx);

        (*env)->ReleaseStringUTFChars(env, file, szfile);

 }


More information about the ffmpeg-devel mailing list