我正在设计一个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。
不能弄清楚什么是错的。
任何帮助表示感谢。
答案 0 :(得分:0)
MP3是一种基于帧的格式,因此您需要将完整的帧传递给decode_audio3才能生成有意义的结果。它不像zlib,你可以用任何大小的数据块(甚至1个字节)来获取并最终得到一些输出。确保: