使用ffmpeg播放带有audiotrack的mp3数据

时间:2014-01-31 12:20:26

标签: android ffmpeg java-native-interface audiotrack

我正在设计一个Android应用程序,我从Red5服务器收到实时mp3数据流,我需要播放它。

我无法使用媒体播放器类播放它,因为我没有任何网址流,也不能使用文件。另一种选择是使用音频轨道类,但仅需要PCM数据。所以需要将mp3转换为pcm,所以使用ffmpeg。

我的转换代码是

AVCodec *codec;
AVCodecContext *c= NULL;
int out_size, len;
uint8_t *outbuf;

int iplen=(*env)->GetArrayLength(env, mp3buf);
int16_t inbuf[AUDIO_INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
AVPacket avpkt;
av_init_packet(&avpkt);
av_register_all();
avcodec_register_all();

codec = avcodec_find_decoder(CODEC_ID_MP3);
if(!codec){
    __android_log_print(ANDROID_LOG_DEBUG, "logfromjni", "Codec not found");
}
c = avcodec_alloc_context();
outbuf = malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE);
avpkt.data = (*env)->GetByteArrayElements(env,mp3buf,NULL);

avpkt.size = (*env)->GetArrayLength(env, mp3buf);
out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
int ao=avcodec_open(c, codec);
    if (ao < 0) {
        __android_log_print(ANDROID_LOG_DEBUG, "logfromjni", "avcodec not open");
    }
    len = avcodec_decode_audio3(c, (short *)outbuf, &out_size, &avpkt);

问题是avcodec_decode_audio3(c, (short *)outbuf, &out_size, &avpkt);总是返回-1。

不能弄清楚什么是错的。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:0)

MP3是一种基于帧的格式,因此您需要将完整的帧传递给decode_audio3才能生成有意义的结果。它不像zlib,你可以用任何大小的数据块(甚至1个字节)来获取并最终得到一些输出。确保:

  • 您的服务器以适当的帧发送数据;
  • 您在客户端正确处理这些帧(请记住,来自服务器的两个2kb send()不会在recv()中产生两个2kb块,而是在一个4kb块中);
  • 您将完整的块传递给decode_audio3。