混合来自两个已解码 FFmpeg AVFrame* 对象的 PCM 数据
Mix PCM data from two decoded FFmpeg AVFrame* objects
我目前正在使用 FFMpeg AutoGen 项目(当然是在 C# 中)来解码音频文件中的帧并将它们添加到正在写入视频的新流中。这一切都正常工作,但我想知道如何将两个 AVFrame* 对象混合在一起(在解码后)。
我以前混合过 PCM 数据,但想知道 FFmpeg 是否有内置的 API 来更有效地完成工作。
我目前是这样做的:
short* baseFrameBuffer1 = (short*)baseFrame->data_0;
short* baseFrameBuffer2 = (short*)baseFrame->data_1;
short* readFrameBuffer1 = (short*)readFrame->data_0;
short* readFrameBuffer2 = (short*)readFrame->data_1;
for (int frameIndex = 0; frameIndex< 1024; frameIndex++)
{
int dataSample1 = GetInRangeSample(baseFrameBuffer1[frameIndex] + readFrameBuffer1[frameIndex]);
int dataSample2 = GetInRangeSample(baseFrameBuffer2[frameIndex] + readFrameBuffer2[frameIndex]);
baseFrame->data_0[frameIndex] = (byte)dataSample1;
baseFrame->data_1[frameIndex] = (byte)dataSample2;
}
private static int GetInRangeSample(int sample)
{
if (sample > short.MaxValue)
{
sample = short.MaxValue;
}
if (sample < short.MinValue)
{
sample = short.MinValue;
}
return sample;
}
您可以使用 amix filter in libavfilter.
我目前正在使用 FFMpeg AutoGen 项目(当然是在 C# 中)来解码音频文件中的帧并将它们添加到正在写入视频的新流中。这一切都正常工作,但我想知道如何将两个 AVFrame* 对象混合在一起(在解码后)。
我以前混合过 PCM 数据,但想知道 FFmpeg 是否有内置的 API 来更有效地完成工作。
我目前是这样做的:
short* baseFrameBuffer1 = (short*)baseFrame->data_0;
short* baseFrameBuffer2 = (short*)baseFrame->data_1;
short* readFrameBuffer1 = (short*)readFrame->data_0;
short* readFrameBuffer2 = (short*)readFrame->data_1;
for (int frameIndex = 0; frameIndex< 1024; frameIndex++)
{
int dataSample1 = GetInRangeSample(baseFrameBuffer1[frameIndex] + readFrameBuffer1[frameIndex]);
int dataSample2 = GetInRangeSample(baseFrameBuffer2[frameIndex] + readFrameBuffer2[frameIndex]);
baseFrame->data_0[frameIndex] = (byte)dataSample1;
baseFrame->data_1[frameIndex] = (byte)dataSample2;
}
private static int GetInRangeSample(int sample)
{
if (sample > short.MaxValue)
{
sample = short.MaxValue;
}
if (sample < short.MinValue)
{
sample = short.MinValue;
}
return sample;
}
您可以使用 amix filter in libavfilter.