Как кодировать 3840 nb_samples в кодек, который запрашивает 1024, используя ffmpeg - PullRequest
0 голосов
/ 03 июля 2018

FFmpeg имеет пример кода мультиплексирования на https://ffmpeg.org/doxygen/4.0/muxing_8c-example.html

Этот код генерирует покадровое видео и аудио. Что я пытаюсь сделать, это изменить

ost->tmp_frame = alloc_audio_frame(AV_SAMPLE_FMT_S16, c->channel_layout,
                                       c->sample_rate, nb_samples);

до

ost->tmp_frame = alloc_audio_frame(AV_SAMPLE_FMT_S16, c->channel_layout,
                                       c->sample_rate, 3840);

, чтобы он генерировал 3840 выборок на канал вместо 1024 выборок, что является значением по умолчанию для nb_samples (кодек aac).

Я попытался объединить код из https://ffmpeg.org/doxygen/4.0/transcode_aac_8c-example.html, в котором есть пример буферизации кадров.

Моя результирующая программа дает сбой при генерации аудиосэмплов через пару кадров при назначении * q ++ нового значения на первой итерации:

/* Prepare a 16 bit dummy audio frame of 'frame_size' samples and
 * 'nb_channels' channels. */
static AVFrame *get_audio_frame(OutputStream *ost)
{
    AVFrame *frame = ost->tmp_frame;
    int j, i, v;
    int16_t *q = (int16_t*)frame->data[0];
    /* check if we want to generate more frames */
    if (av_compare_ts(ost->next_pts, ost->enc->time_base,
                      STREAM_DURATION, (AVRational){ 1, 1 }) >= 0)
        return NULL;
    for (j = 0; j <frame->nb_samples; j++) {
        v = (int)(sin(ost->t) * 10000);
        for (i = 0; i < ost->enc->channels; i++)
            *q++ = v;
        ost->t     += ost->tincr;
        ost->tincr += ost->tincr2;
    }
    frame->pts = ost->next_pts;
    ost->next_pts  += frame->nb_samples;
    return frame;
}

Может быть, я не понимаю логику кодирования.

Вот полный источник, который я придумала:

https://paste.ee/p/b07qf

Причина, по которой я пытаюсь выполнить эту задачу, заключается в том, что у меня есть карта захвата SDK, которая выводит 2-канальный 16-битовый необработанный pcm 48000 Гц, который имеет 3840 выборок на канал, и я пытаюсь закодировать его вывод в aac. Таким образом, в основном, если я получу пример муксинга для работы с 3840 nb_samples, это поможет мне понять концепцию.

Я уже смотрел на Как кодировать преобразованный PCM-звук в AAC с использованием ffmpeg-API, когда число входных отсчетов pcm не равно 1024 , но в примере используется «encodeFrame», что в примерах из документации по ffmpeg отсутствует. не используете или я ошибаюсь.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 26 июля 2018

Хорошо, вот решение для всех, кто заинтересован.

Поскольку кодек принимает 1024 сэмпла, нам нужно поместить 1920 сэмплов в буфер и одновременно подавать 1024 сэмпла кодека.

Я забраковал код буферизации из: Как кодировать преобразованный PCM-звук в AAC с использованием ffmpeg-API, когда количество входных отсчетов pcm не равно 1024

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...