Мне нужно преобразовать аудиоданные из 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
.