使用ffmpeg对音频数据进行编码

3

我正在接收一个字节数组(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. 我是否拥有关于源音频数据的所有必要信息?我不确定我是否拥有执行编码所需的所有必要信息。


直接使用libflac会更容易。 - szatmary
这不是ffmpeg的一部分,对吧?恐怕我没有别的可用的东西,除了ffmpeg。 - Matin Kh
我恐怕除了ffmpeg之外没有其他可用的东西。你可以下载它。 - szatmary
可以,但不是这个项目,我不能。 - Matin Kh
1个回答

1

你已经接近成功了,按照这个例子操作即可:https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/encode_audio.c

第一个问题的答案如下: 在那里你会看到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数组格式进行设置。

希望能对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接