2016-02-22 7 views
-1

Я хотел бы обновить AV аудио кодер с помощью функции avcodec_encode_audio (deprecated) в avcodec_encode_audio2, без изменения структуры существующего кодера:FFmpeg аудио кодер Новая функция кодирования

outBytes = avcodec_encode_audio(m_handle, dst, sizeBytes, (const short int*)m_samBuf); 

где:

1) m_handle AVCodecContext

2) ДСТ, uint8_t * буфер назначения

3) sizeBytes, размер uint32_t из destinatio п буфер

4) m_samBuf недействительные * для ввода порции данных для кодирования (это разливается в: Const короткого INT *)

это есть просто способ сделать это?

Im tryng с:

int gotPack = 1; 
memset (&m_Packet, 0, sizeof (m_Packet)); 
m_Frame = av_frame_alloc(); 

av_init_packet(&m_Packet); 
m_Packet.data = dst; 
m_Packet.size = sizeBytes; 

uint8_t* buffer = (uint8_t*)m_samBuf; 
m_Frame->nb_samples = m_handle->frame_size; 

avcodec_fill_audio_frame(m_Frame,m_handle->channels,m_handle->sample_fmt,buffer,m_FrameSize,1); 

outBytes = avcodec_encode_audio2(m_handle, &m_Packet, m_Frame, &gotPack); 
char error[256]; 
av_strerror(outBytes,error,256); 

if (outBytes<0){ 
    m_server->log(1,1,"Input data: %d, encode function call error: %s \n",gotPack, error); 
    return AUDIOWRAPPER_ERROR; 
} 
av_frame_free(&m_Frame); 

компилируется, но ничего не кодируют, я не здесь звук на выходе, если я труба выходной поток на MPlayer, которым был warking до обновления.

Что я делаю неправильно?

Кодер принимает только два формата дискретизации:

AV_SAMPLE_FMT_S16,   ///< signed 16 bits 
AV_SAMPLE_FMT_FLT,   ///< float 

вот как выделяется буфер:

free(m_samBuf); 
int bps = 2; 
if(m_handle->codec->sample_fmts[0] == AV_SAMPLE_FMT_FLT) { 
    bps = 4; 
} 
m_FrameSize = bps * m_handle->frame_size * m_handle->channels; 
m_samBuf = malloc(m_FrameSize); 
m_numSam = 0; 

ответ

0

avcodec_fill_audio_frame вы должны получить там

memset (&m_Packet, 0, sizeof (m_Packet)); 
memset (&m_Frame, 0, sizeof (m_Frame)); 

av_init_packet(&m_Packet); 

m_Packet.data = dst; 
m_Packet.size = sizeBytes; 

m_Frame->nb_samples = //you need to get this value from somewhere, it is the number of samples (per channel) this frame represents 
avcodec_fill_audio_frame(m_Frame, m_handle->channels, m_handle->sample_fmt, 
     buffer, 
     sizeBytes, 1); 


int gotPack = 1; 

avcodec_encode_audio2(m_handle, &m_Packet, &m_Frame, &gotPack); 
+0

Вы можете столкнуться вопрос что формат аудио в m_samBuf не совпадает с форматом ввода. avcodec_encode_audio() принял чередующееся 16-битное целочисленное аудио, avcodec_encode_audio2() принимает чередующийся или плоский звук в любом формате, и кодер выбирает, какой из них вы должны использовать. Возможно, вам понадобится использовать libswresample для преобразования между чередованием 16-битного целого числа и формата кодировщика. –

+0

Спасибо, человек! Могу ли я рассчитать выборку на каждый канал, например: 'm_Frame-> nb_samples = m_handle-> sample_rate/m_handle-> channels;' или аналогичный? – mattobob

+0

как преобразовать образцы для avcodec_encode_audio2(), не может быть настолько сложным ... – mattobob