使用Audiotrack在Android中播放javacv-ffmpeg解码音频

时间:2014-03-31 11:24:37

标签: android audio ffmpeg javacv audiotrack

我正在开发Android应用程序,我需要播放来自Red5服务器的AAC现场音频流 我已经使用javacv-ffmpeg成功解码了音频流 但我的问题是如何播放解码样本的音频 我试过按照以下方式

int len = avcodec.avcodec_decode_audio4( audio_c,  samples_frame,  got_frame,  pkt2);
if (len <= 0){
    this.pkt2.size(0);
} else {
    if (this.got_frame[0] != 0) {
            long pts = avutil.av_frame_get_best_effort_timestamp(samples_frame);
            int sample_format = samples_frame.format();
                   int planes = avutil.av_sample_fmt_is_planar(sample_format) != 0 ? samples_frame.channels() : 1;
                   int data_size = avutil.av_samples_get_buffer_size((IntPointer)null, audio_c.channels(), samples_frame.nb_samples(), audio_c.sample_fmt(), 1) / planes;

                   if ((samples_buf == null) || (samples_buf.length != planes)) {

                       samples_ptr = new BytePointer[planes];
                       samples_buf = new Buffer[planes];
                   }
                           BytePointer ptemp = samples_frame.data(0);
               BytePointer[] temp_ptr = new BytePointer[1];
               temp_ptr[0] = ptemp.capacity(sample_size);
               ByteBuffer btemp = ptemp.asBuffer();
               byte[] buftemp = new byte[sample_size];
               btemp.get(buftemp, 0, buftemp.length);

                           play the buftemp[] with audiotrack.....
        }

但是扬声器只能听到噪音,是否需要对AVFrame decode_audio4(...)进行处理。{{1}}。 使用AAC编解码器正确编码传入音频流 任何帮助,建议表示赞赏 提前谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用FFmpegFrameGrabber类来捕获流。并使用FloatBuffer类提取音频。这是一个java示例

['C1', 'D1', 'E1', 'S1', 'C2', 'D2', 'E2', 'S2', 'S4', 'S6', 'W373']

答案 1 :(得分:1)

因为您在buftemp[]格式中获得的数据采用此AV_SAMPLE_FMT_FLTP格式,因此您必须使用AV_SAMPLE_FMT_S16将其更改为SwrContext格式,然后您的问题将是解决。