首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用libreplaygain.so和numpy获得合理的结果

无法使用libreplaygain.so和numpy获得合理的结果
EN

Stack Overflow用户
提问于 2013-02-08 03:46:10
回答 1查看 136关注 0票数 0

我一次又一次地尝试使用libreplaygain.so (ReplayGain是一种计算音频响度的算法。)从python传递来自音频文件的数据。这是libreplaygain的the header file。一般来说,我对ctypes和C语言都不太了解,所以我希望这可能是我愚蠢的问题,对其他人来说也很明显!下面是我使用的脚本:

代码语言:javascript
复制
import numpy as np
from scipy.io import wavfile
import ctypes
replaygain = ctypes.CDLL('libreplaygain.so')


def calculate_replaygain(samples, frame_rate=44100):
    """
    inspired from https://github.com/vontrapp/replaygain
    """
    replaygain.gain_init_analysis(frame_rate)
    block_size = 10000
    channel_count = samples.shape[1]
    i = 0
    samples = samples.astype(np.float64)

    while i * block_size < samples.shape[0]:
        channel_left = samples[i*block_size:(i+1)*block_size,0]
        channel_right = samples[i*block_size:(i+1)*block_size,1]

        samples_p_left = channel_left.ctypes.data_as(ctypes.POINTER(ctypes.c_double))
        samples_p_right = channel_right.ctypes.data_as(ctypes.POINTER(ctypes.c_double))

        replaygain.gain_analyze_samples(samples_p_left, samples_p_right, channel_left.shape[0], channel_count)
        i += 1

    return replaygain.gain_get_chapter()


if __name__ == '__main__':
    frame_rate, samples = wavfile.read('directions.wav')
    samples = samples.astype(np.float64) / 2**15
    gain = calculate_replaygain(samples, frame_rate=frame_rate)
    print "Recommended gain: %f dB" % gain
    gain = calculate_replaygain(np.random.random((441000, 2)) * 2 - 1, frame_rate=44100)
    print "Recommended gain: %f dB" % gain

脚本运行,但我无法获得与命令行工具replaygain相同的值。事实上,我总是得到80.0。你可以用任何声音文件替换'directions.wav‘...并将结果与命令replaygain <soundfile.wav>的结果进行比较。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-08 04:25:48

gain_get_chapter()返回一个double,但是the ctypes docs say“默认假设函数返回的是C类型”。你应该像这样做

代码语言:javascript
复制
replaygain.gain_get_chapter.restype = ctypes.c_double

您还应该检查gain_init_analysisgain_analyze_samples的返回值;如果这两个返回值都不是1,则说明出了问题。(它们实际上是int,所以您不需要在那里做任何其他事情。)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14759680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档