我的播放器,音頻像是電視信號不好,需要動一下天線稳其,有那種沙沙聲合武。
明確音頻數(shù)據(jù)問題,在get音頻數(shù)據(jù)處找問題乐导。
- 音調(diào)不對膜毁,原因是我用的播放器只能播放 packed類型pcm數(shù)據(jù)徒像,所以做了planar-->packed類型轉(zhuǎn)換后添,將AV_SAMPLE_FMT_FLTP planar的樣本格式轉(zhuǎn)成AV_SAMPLE_FMT_S32 packed 類型的笨枯。
- 有雜音,原因是音頻原樣本格式是AV_SAMPLE_FMT_FLTP遇西,float類型 32位馅精,而我用的opensl播放,只支持int類型的樣本粱檀,所以需要轉(zhuǎn)換成32位的int類型 洲敢,即AVSampleFormat::AV_SAMPLE_FMT_S32。
代碼如下
int YaoAVFrame::getAudioPackedData(unsigned char * data){
//每個樣本的字節(jié)數(shù) * 每個聲道的樣本數(shù) * 聲道數(shù)
int bufferSize = getPerSampleSize() * getNBSamples() * getChannels();
if(data == nullptr){
return bufferSize;
}
// 判斷是 Packed 還是 Plane
int isPanar = av_sample_fmt_is_planar((AVSampleFormat)imp->frame->format);
if(isPanar){
//EyerLog("Planar\n");
SwrContext * swrCtx = swr_alloc_set_opts(
NULL,
imp->frame->channel_layout,
// av_get_packed_sample_fmt((AVSampleFormat)imp->frame->format),
AVSampleFormat::AV_SAMPLE_FMT_S32,
imp->frame->sample_rate,
imp->frame->channel_layout,
(AVSampleFormat)imp->frame->format,
imp->frame->sample_rate,
0,
NULL
);
swr_init(swrCtx);
int ret = swr_convert(swrCtx, &data, imp->frame->nb_samples, (const uint8_t **)imp->frame->data, imp->frame->nb_samples);
swr_free(&swrCtx);
}
else{
//EyerLog("Packed\n");
memcpy(data, imp->frame->data[0], bufferSize);
}
return 0;
}