我正在开发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编解码器正确编码传入音频流
任何帮助,建议表示赞赏
提前谢谢。
答案 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
格式,然后您的问题将是解决。