int audio_decode_frame(AVCodecContext *aCodecCtx, uint8_t *audio_buf, int buf_size) {
static AVPacket pkt;
static uint8_t *audio_pkt_data = NULL;
static int audio_pkt_size = 0;
static AVFrame frame;
int len1, data_size = 0;
for(;;) {
while(audio_pkt_size > 0) {
int got_frame = 0;
len1 = avcodec_decode_audio4(aCodecCtx, &frame, &got_frame, &pkt);
if(len1 < 0) {
/* if error, skip frame */
audio_pkt_size = 0;
break;
}
audio_pkt_data += len1;
audio_pkt_size -= len1;
data_size = 0;
if( got_frame ) {
int in_samples = frame.nb_samples;
short *sample_buffer = (short*)malloc(frame.nb_samples * 2 * 2);
memset(sample_buffer, 0, frame.nb_samples * 4);
int i=0;
float *inputChannel0 = (float*)(frame.extended_data[0]);
// Mono
if( frame.channels == 1 ) {
for( i=0; i<in_samples; i++ ) {
float sample = *inputChannel0++;
if( sample < -1.0f ) {
sample = -1.0f;
} else if( sample > 1.0f ) {
sample = 1.0f;
}
sample_buffer[i] = (int16_t)(sample * 32767.0f);
}
} else { // Stereo
float* inputChannel1 = (float*)(frame.extended_data[1]);
for( i=0; i<in_samples; i++) {
sample_buffer[i*2] = (int16_t)((*inputChannel0++) * 32767.0f);
sample_buffer[i*2+1] = (int16_t)((*inputChannel1++) * 32767.0f);
}
}
memcpy(audio_buf,sample_buffer,in_samples*4);
free(sample_buffer);
}
audio_pkt_size -= len1;
if (frame.nb_samples <= 0)
{
continue;
}
data_size = frame.nb_samples * 4;
return data_size;
}
if(pkt.data)
av_free_packet(&pkt);
if(quit) {
return -1;
}
if(packet_queue_get(&audioq, &pkt, 1) < 0) {
return -1;
}
audio_pkt_data = pkt.data;
audio_pkt_size = pkt.size;
}
}
[原创]解决ffmpeg-tutorial的噪声问题
最新推荐文章于 2023-02-22 13:37:47 发布