[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