LINUX.ORG.RU

FFMPEG raw буффер в AVFilter

 


0

1

Всем привет.

Есть WAV файл (stereo, 11025 Hz, 32 bit float). Я читаю файл блоками (для примера пусть будет 1000 байт) и передаю этот буффер на обработку аудио-фильтрами. И вот столкнулся с проблемой, что не могу понять какие правила действуют для конвертации raw data buffer <-> AVFrame.

Собственно пробовал 2 подхода: 1.

void buffer_to_frame(AVFrame* frame, const std::vector<char>& in_data) 
{
    frame->channels = 2;
    frame->sample_rate = 11025;
    frame->nb_samples = 100;
    frame->format = AV_SAMPLE_FMT_FLTP;

    av_frame_get_buffer(frame, 0);
    memcpy(frame->data[0], in_data.data(), in_data.size());
}

2. После применения фильтров получаю новый AVFrame в котором все данные лежат в frame->data[0] (1 plane) и как его конвертировать обратно не ясно.

void buffer_to_frame(const std::vector<char>& in_buffer, AVFrame* frame)
{
    float* src = (float*)in_buffer.data();
    float* dst_channel1 = (float*)frame->data[0];
    float* dst_channel2 = (float*)frame->data[1];

    for (int i = 0, j = 0; i < frame->nb_samples; i++, j += 2)
    {
        dst_channel1[i] = src[j];
        dst_channel2[i] = src[j+1];
    }
}

В обеих случаях при применении некоторых фильтров на выходе получается неприятный звук писка, что натолкает меня на мысль, что конвертация буфера в фрейм и наоборот неправильная.

Решение

Некоторые аудио-фильтры меняют формат AVFrame и если вы хотите получить на выходе фрейм в определенном формате, то нужно в конец графа фильтров добавить фильтр «aformat» и специфицировать какой должен быть формат выходящего фрейма.

skident ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.