Я использую API Win32 для реализации программы записи на рабочем столе. Функция видеозахвата работает, но я не собираюсь помещать звук в структуру данных FFmpeg.Как заполнить AVFrame аудиоданными
Приведенный ниже код получит данные выходного аудио по умолчанию.
// Set wave format when sampling the audio
WAVEFORMATEX wf;
wf->wFormatTag = WAVE_FORMAT_PCM;
wf->nChannels = 1;
wf->nSamplesPerSec = 12000;
wf->nBlockAlign = 1;
wf->wBitsPerSample = 8;
wf->cbSize = 0;
wf->nAvgBytesPerSec = nChannels * nSamplesPerSec * wBitsPerSample/8;
// Open wave input channel
HWAVEIN hWaveIn;
OpenWaveIn(&hWaveIn,&wf);
// Prepare Wave In Header and allocate memory
WAVEHDR waveHdr;
DWORD dataSize = 240000L;
PrepareWaveIn(&hWaveIn, &waveHdr, dataSize);
// Start recording
StartRecord(&hWaveIn);
// Stop recording
MMTIME mmt;
StopRecord(&hWaveIn, &mmt);
waveHdr->lpData
является указателем на заблокированный буфер данных.
Вопрос в том, как я могу реализовать функцию ниже, позвольте waveHdr->->lpData
сохранить в AVFrame
?
static AVFrame *get_audio_frame(OutputStream *ost)
{
AVFrame *frame = ost->tmp_frame;
int j, i, v;
int16_t *q = (int16_t*)frame->data[0];
AVRational arg;
arg.num = 1;
arg.den = 1;
//the transform code should be put here
frame->pts = ost->next_pts;
ost->next_pts += frame->nb_samples;
return frame;
}
Кто-нибудь знает, как это реализовать?
Вы должны использовать AVCodec для кодирования звука, я думаю. См. Http://ffmpeg.org/doxygen/trunk/encoding-example_8c-source.html – sashoalm