Я очень новичок в FFMpeg и сейчас пытаюсь преобразовать аудиоданные из формата PCM AV_SAMPLE_FMT_S16 в формат Mp3 AV_SAMPLE_FMT_FLTP.
Для этого я использую AudioResampleContext из FFMpeg
av_opt_set_int( audioResampleCtx, "in_sample_fmt", m_aplayer->aCodecCtx->sample_fmt, 0);
av_opt_set_int( audioResampleCtx, "in_sample_rate", m_aplayer->aCodecCtx->sample_rate, 0);
av_opt_set_int( audioResampleCtx, "in_channels", m_aplayer->aCodecCtx->channels,0);
av_opt_set_int( audioResampleCtx, "out_channel_layout", audioCodecCtx->channel_layout, 0);
av_opt_set_int( audioResampleCtx, "out_sample_fmt", audioCodecCtx->sample_fmt, 0);
av_opt_set_int( audioResampleCtx, "out_sample_rate", audioCodecCtx->sample_rate, 0);
av_opt_set_int( audioResampleCtx, "out_channels", audioCodecCtx->channels, 0);
Преобразование работает хорошо, так как я могу слушать свой mp3-файл, но проблема в том, что мой оригинальный файл имеет длину 60 секунд, а выходной mp3-файл — всего 34 секунды. Я слышу, что он очень ускоряется, как будто звук ускоряется. При поиске информации с помощью FFMpeg я вижу, что битрейт просто вырос с 128 кбит / с до 64 кбит / с.
РЕДАКТИРОВАТЬ:
Чтобы закончить с дополнительной информацией, я хочу сжать некоторые необработанные аудиоданные с помощью кодека mp3 и иметь выходной формат output.mp3. Формат образца необработанных аудиоданных AV_SAMPLE_FMT_S16, а поддерживаемый формат образца для кодека mp3 — FLTP (или S16P).
Поэтому я делаю пример преобразования формата из AV_SAMPLE_FMT_S16 в AV_SAMPLE_FMT_FLTP, но в нем отсутствует половина данных.
Может ли кто-нибудь помочь мне с этим? Я знаю, что упускаю что-то очень простое, но я просто не могу понять, что.
EDIT: 2
Вот код, который выполняет повторную выборку (взято из https://github.com/martin-steghoefer/debian-karlyriceditor/blob/master/src/ffmpegvideoencoder.cpp) Источник звука — это не AVFrame, а просто массив байтов:
// Resample the input into the audioSampleBuffer until we proceed the whole decoded data
if ( (err = avresample_convert( audioResampleCtx,
NULL,
0,
0,
audioFrame->data,
0,
audioFrame->nb_samples )) < 0 )
{
qWarning( "Error resampling decoded audio: %d", err );
return -1;
}
if( avresample_available( audioResampleCtx ) >= audioFrame->nb_samples )
{
// Read a frame audio data from the resample fifo
if ( avresample_read( audioResampleCtx, audioFrame->data, audioFrame->nb_samples ) != audioFrame->nb_samples )
{
qWarning( "Error reading resampled audio: %d", err );
return -1;
}
//Init packet, do the encoding and write data to file
Спасибо за помощь !
Задача ещё не решена.
Других решений пока нет …