2,543
社区成员
发帖
与我相关
我的任务
分享
// 函数名为 decodeLoop()
if (packet.stream_index == audioStream)
{
int len = avcodec_decode_audio4(pCodecCtx, pFrame, &frameFinished, &packet);
if (len > 0 && frameFinished)
{
int data_size = av_samples_get_buffer_size(pFrame->linesize,
pCodecCtx->channels, pFrame->nb_samples,
pCodecCtx->sample_fmt, 1);
// 保存到pcm文件
if (outFile != NULL)
{
fwrite(pFrame->linesize[0], 1, outlen, data_size);
audioFileSize += outlen;
fflush(outFile);
}
// 传递到java层
jbyteArray nativePixels = (*env)->NewByteArray(env, data_size);
(*env)->SetByteArrayRegion(env, nativePixels, 0, data_size, pFrame->linesize[0]);
return nativePixels;
}
}
int m_frequency;// 采样率
int m_channel; // 声道
int m_sampBit; // 采样精度
AudioTrack mAudioTrack;
//构造
//此时 frequency=44100, channel=1,
//自行设置的sampbit=SL_PCMSAMPLEFORMAT_FIXED_16即16 因为没有32
public MyAudioTrack(int frequency, int channel, int sampbit) {
m_frequency = frequency;
switch(channel)
{
case 0:
m_channel = AudioFormat.CHANNEL_CONFIGURATION_INVALID;
break;
case 1:
m_channel = AudioFormat.CHANNEL_CONFIGURATION_MONO;
break;
case 2:
m_channel = AudioFormat.CHANNEL_CONFIGURATION_STEREO;
m_frequency = m_frequency /2; //保证播放速度
break;
default:
m_channel = AudioFormat.CHANNEL_CONFIGURATION_DEFAULT;
break;
}
switch(sampbit)
{
case 0:
m_sampBit = AudioFormat.ENCODING_INVALID ;
break;
case 8:
m_sampBit = AudioFormat.ENCODING_PCM_8BIT;
break;
case 16:
m_sampBit = AudioFormat.ENCODING_PCM_16BIT;
break;
default:
m_sampBit = AudioFormat.ENCODING_DEFAULT;
break;
}
}
public void init() {
// 获得构建对象的最小缓冲区大小
int minBufSize = AudioTrack.getMinBufferSize(m_sampleRate, m_channel,m_sampBit);
mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, m_frequency ,
m_channel, m_sampBit, minBufSize, AudioTrack.MODE_STREAM);
mAudioTrack.play();
}
//循环调用ff_thread.decodeLoop() 返回解码的结果 给一个byte[]nativePixels
while((nativePixels = ff_thread.decodeLoop())!=null)
{
myAudioTrack.playAudioTrack(nativePixels, 0, nativePixels.length);
}
//out_channels=1 out_sample_rate=44100
reSampleCtx = av_audio_resample_init(out_channels, pCodecCtx->channels,
out_sample_rate, pCodecCtx->sample_rate, AV_SAMPLE_FMT_S16,
AV_SAMPLE_FMT_S16, 16, 10, 0, 1);
///////////////////////////////////////////////////////
short* outBuffer;
outBuffer = (short *) malloc(sizeof(short) * data_size);
int outlen = audio_resample(reSampleCtx, outBuffer,
(short *) pFrame->data[0], data_size);
jbyteArray nativePixels = (*env)->NewByteArray(env, outlen);
(*env)->SetByteArrayRegion(env, nativePixels, 0, outlen,outBuffer);
free(outBuffer);
outBuffer = NULL;
return nativePixels;