Размер кадра аудиокодера ffmpeg - PullRequest
2 голосов
/ 02 апреля 2020

Мне нужно преобразовать аудиоданные из AV_CODEC_ID_PCM_S16LE в AV_CODEC_ID_PCM_ALAW, и я использую этот код в качестве примера. Пример кода по существу делает это (проверка ошибок опущена для краткости):

const AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_MP2);
AVCodecContext* c = avcodec_alloc_context3(codec);
c->bit_rate       = 64000;
c->sample_fmt     = AV_SAMPLE_FMT_S16;
c->sample_rate    = select_sample_rate(codec);
c->channel_layout = select_channel_layout(codec);
c->channels       = av_get_channel_layout_nb_channels(c->channel_layout);
avcodec_open2(c, codec, NULL);
AVFrame* frame = av_frame_alloc();
frame->nb_samples     = c->frame_size;
frame->format         = c->sample_fmt;
frame->channel_layout = c->channel_layout;

Код примера впоследствии использует c->frame_size в a для l oop.

Мой код похож на выше со следующими отличиями:

const AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_PCM_ALAW);
c->sample_rate    = 8000;
c->channel_layout = AV_CH_LAYOUT_MONO;
c->channels       = 1;

После вызова avcodec_open2, c->frame_size равен нулю. Пример кода никогда не устанавливает размер кадра, поэтому я предполагаю, что он ожидает либо avcodec_alloc_context3, либо avcodec_open2, чтобы установить его. Это правильное предположение? Используется ли настройка размера кадра на основе кода c? Если мне нужно явно установить размер кадра, есть ли рекомендуемый размер?

РЕДАКТИРОВАТЬ:

Исходя из ответа @ the-kamilz, получается, что пример кода не является устойчивым. В примере предполагается, что будет установлено c->frame_size, но это зависит от кода c. В моем случае codec->capabilities фактически было установлено на AV_CODEC_CAP_VARIABLE_FRAME_SIZE. Поэтому я изменил свой код, чтобы проверить c->frame_size и использовать его, только если он не равен нулю. Если он равен нулю, я просто выбрал произвольные данные за одну секунду для frame->nb_samples.

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

В документации FFmpeg это упоминается как:

int AVCodecContext :: frame_size

Количество выборок на канал в аудиокадре.

encoding: устанавливается с помощью libavcode c в avcodec_open2(). Каждый представленный кадр, кроме последнего, должен содержать ровно frame_size выборок на канал.
Может быть 0, если для кода c установлено AV_CODEC_CAP_VARIABLE_FRAME_SIZE, тогда размер кадра не ограничен.
decoding : могут быть установлены некоторыми декодерами для указания постоянного размера кадра

Надеюсь, это поможет.

0 голосов
/ 14 апреля 2020

вы не контролируете размер кадра явно, он устанавливается кодером в зависимости от кодеков, предоставленных во время инициализации (открытия)

после успешного выполнения avcodec_open2(), вы можете получить размер буфера кадра с av_samples_get_buffer_size ()

...