Кодирование аудиоданных с использованием ffmpeg - PullRequest
1 голос
/ 29 мая 2019

Я получаю байтовый массив (int8_t*) и хочу использовать FFMPEG для кодирования его в FLAC. Все примеры, которые я нашел, считывают данные из файлов, что не так для меня. Следуя оригинальным документам (см. здесь ), я предложил следующее решение:

#include "libavcodec/avcodec.h"

// ...

// params:
//  audioData: original audio data
//  len: length of the byte array (audio data)
//  sampleRate: sample rate of the original audio data
//  frameSize: frame size of the original data
uint8_t* encodeToFlac(uint8_t* audioData, int len, int sampleRate, int frameSize) {
  uint8_t* convertedAudioData;

  // Context information
  AVCodecContext* context = avcodec_alloc_context();
  context->bit_rate = 64000;
  context->sample_rate = sampleRate;
  context->channels = 2;
  context->frame_size = frameSize;

  short* samples = malloc(frameSize * 2 * context->channels);
  int outAudioDataSize = len * 2;
  convertedAudioData = malloc(outAudioDataSize);
  int outSize = avcodec_encode_audio(c, convertedAudioData, outAudioDataSize, samples);

  return convertedAudioData;
}

У меня есть две основные проблемы с вышеуказанным решением:

  1. Я не указал, какой должна быть конечная кодировка (например, MP3, FLAC и т. Д.), Что заставляет меня задуматься, правильно ли я использую библиотеку FFMPEG?

  2. Есть ли у меня вся необходимая информация об источнике - оригинальные аудиоданные? Я не уверен, что у меня есть вся необходимая информация для кодирования.

1 Ответ

0 голосов
/ 30 мая 2019

Вы почти на месте, следуйте этому примеру: https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/encode_audio.c

Ответ на 1-й вопрос: Там вы увидите codec = avcodec_find_encoder(AV_CODEC_ID_MP2).
В вашем случае, как вы уже догадались, это, вероятно, будет codec = avcodec_find_encoder(AV_CODEC_ID_FLAC) и соответственно проверьте / исправите другие значения.

Что касается второго ... Я уверен, что вы сами это выясните, особенно вы должны установить это правильно (строка 158) c->sample_fmt = AV_SAMPLE_FMT_S16 в соответствии с форматированием массива int8_t.

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

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