【发布时间】:2014-01-31 12:20:25
【问题描述】:
我正在设计一个 android 应用程序,我在其中接收来自 Red5 服务器的实时 mp3 数据流,我需要播放它。
我无法使用媒体播放器类播放它,因为我没有任何流的 url,也无法使用文件。另一种选择是使用音频轨道类,但只需要 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。
不知道怎么回事。
任何帮助表示赞赏。
【问题讨论】:
-
要查找错误原因,请尝试查看 ffmpeg 输出。如果在设备上很难做到,您可以重定向 ffmpeg 输出并通过自己的回调执行日志记录(参见
av_log_set_callback和av_log_set_level)
标签: android ffmpeg java-native-interface audiotrack