我试图重新制作doc/examples/transcoding.c
以便编码opus音频。我怎么能这样做?
这就是我现在所拥有的:
encoder = avcodec_find_encoder(AV_CODEC_ID_OPUS);
if (!encoder) {
av_log(NULL, AV_LOG_FATAL, "Necessary encoder not found\n");
return AVERROR_INVALIDDATA;
}
enc_ctx = avcodec_alloc_context3(encoder);
if (!enc_ctx) {
av_log(NULL, AV_LOG_FATAL, "Failed to allocate the encoder context\n");
return AVERROR(ENOMEM);
}
enc_ctx->thread_count = 1;
/* enc_ctx->sample_rate = dec_ctx->sample_rate; */
enc_ctx->sample_rate = 48000;
/* enc_ctx->channel_layout = dec_ctx->channel_layout; */
enc_ctx->channel_layout = AV_CH_LAYOUT_MONO;
enc_ctx->channels = av_get_channel_layout_nb_channels(enc_ctx->channel_layout);
/* take first format from list of supported formats */
enc_ctx->sample_fmt = encoder->sample_fmts[0];
enc_ctx->time_base = (AVRational){1, enc_ctx->sample_rate};
enc_ctx->bit_rate = 32000;
我应该转换为48000 Hz和带滤波器的单声道,还是编码器会自行计算出来?
如何将音频从一个数据包复制到另一个数据包? (看起来每个数据包应包含恰好20ms的音频,即960个样本)。这个页面https://ffmpeg.org/doxygen/trunk/structAVFrame.html说明了AVFrame.buf
,如何从那里复制所有样本?
[libopus @ 02ec1d60] more samples than frame size (avcodec_encode_audio2)