我使用FFmpeg庫進行個人項目,我需要關於一件事的幫助。我有立體聲音樂文件,我想將此立體聲轉換爲單聲道音效?這個庫有可能嗎?有內部的功能來完成這項工作嗎?我的項目是C/C++。如何使用FFmpeg將立體聲轉換爲單聲道?
我在FFmpeg網站的Doxygen文檔上搜索了這個論壇,但是我沒有找到有趣的東西。
感謝您的閱讀!
我使用FFmpeg庫進行個人項目,我需要關於一件事的幫助。我有立體聲音樂文件,我想將此立體聲轉換爲單聲道音效?這個庫有可能嗎?有內部的功能來完成這項工作嗎?我的項目是C/C++。如何使用FFmpeg將立體聲轉換爲單聲道?
我在FFmpeg網站的Doxygen文檔上搜索了這個論壇,但是我沒有找到有趣的東西。
感謝您的閱讀!
使用swr_convert
從libswresample到格式之間進行轉換。就像:
#include "libswresample/swresample.h"
au_convert_ctx = swr_alloc();
out_channel_layout = AV_CH_LAYOUT_MONO;
out_sample_fmt = AV_SAMPLE_FMT_S16;
out_sample_rate = 44100;
out_channels = av_get_channel_layout_nb_channels(out_channel_layout);
in_sample_fmt = pCodecCtx->sample_fmt;
in_channel_layout=av_get_default_channel_layout(pCodecCtx->channels);
au_convert_ctx=swr_alloc_set_opts(au_convert_ctx,out_channel_layout, out_sample_fmt, out_sample_rate,
in_channel_layout, in_sample_fmt, pCodecCtx->sample_rate, 0, NULL);
swr_init(au_convert_ctx);
//Generate your frame of original audio, then use swr_convert to convert to mono,
//converted number of samples will now be in out_buffer.
int converted = swr_convert(au_convert_ctx, &out_buffer, MAX_AUDIO_FRAME_SIZE, (const uint8_t **)&pFrame->data , pFrame->nb_samples);
//...
swr_free(&au_convert_ctx);
爲了讓你開始。這將轉換任何原始格式到44100 kHz單聲道。您也可以使用pCodecCtx->sample_rate
作爲輸出採樣率。
這是最靈活和最簡單的解決方案。
正如我在評論中提到的那樣,您可以自己重新採樣。這取決於你已經擁有的和你使用的格式,所以我不能給你即時運行的代碼,但我可以給你一個例子(僞/真實代碼混合)。
在對幀進行編碼並完成了必須完成的操作之後,數據緩衝區中將填充音頻。現在取決於您的格式(請參閱here)以及您擁有多少個頻道。讓我們假設它是16位簽署立體聲,比你的緩衝會是什麼樣子:
+-----+-----+-----+-----+-----+
| LS1 | RS1 | LS2 | RS2 | ... |
+-----+-----+-----+-----+-----+
// LS = LEFT SAMPLE 16 Bit
// RS = RIGHT SAMPLE 16 Bit
現在通過緩衝迭代並一起計算左,右樣品。
for(int i=0; i<sample_size; i+=2) {
auto r = (static_cast<int32_t>(buffer[i]) + buffer[i+1])/2;
buffer[i] = buffer[i+1] = r;
}
就是這樣......
正如我記得沒有功能,但你可以很容易地轉換它自己通過計算兩個流在一起。 – user1810087
你有沒有任何代碼給例子? – Meugiwara