我尝试了几种不同的方法来生成视频文件的DTFT灰度PNG,但是我的结果与其他人发布的结果不太一样。我尝试用scikit image创建一个PNG,而不是使用matplotlib在屏幕上绘图(在其他项目中使用它之后,我信任它)。在
这是我的代码,它需要一个mp4文件(这里我使用的是隐藏在DTFT中的Aphex Twin's song with the notorious Demon Face)。我特别感兴趣的是使用the av library来处理这个问题,我非常确信它正确地读取了文件并生成了一个浮点数数组。在
import numpy as np
import av
import skimage.io
import scipy.signal as signal
container = av.open("tmp/aphex.mp4")
frames = container.streams.audio[0].frames
chunk = container.streams.audio[0].frame_size // 2 # bug in av?
rate = container.streams.audio[0].rate
fltp = np.zeros((frames, chunk), dtype=float)
for n, frame in enumerate(container.decode(audio=0)):
fltp[n, :] = np.frombuffer(frame.planes[0], dtype=float)
fltp = fltp.flatten()
# check that it worked by playing it (just one channel)
fltp.tofile("tmp/aphex.raw")
# play -t raw -r 44100 -e floating-point -b 32 -c 1 tmp/aphex.raw
custom_chunk = 4096
freqs, times, data = signal.spectrogram(fltp,
fs=rate,
nperseg=custom_chunk,
detrend="linear")
data = data - np.min(data)
data = data / np.max(data)
data = 1 - data
skimage.io.imsave("tmp/aphex.png", data)
但是这会产生一个非常稀疏的图像(这是一个图像,老实说,不是一个很大的垂直空间)如果我添加以下几行
^{pr2}$为了引入一个日志比例(和很多人一样),那么它看起来更奇怪(由于2MB上传限制而被裁剪)
我试过很多其他的方法,比如试着使每一列都正常化(这看起来稍微好一点,但还是很奇怪),但是我的光谱图看起来还是跟他们想象的不一样。在
有人知道我做错了什么吗?在
(我也试着用数字.fft.rfft/直接在每一块。。。我的照片看起来和这些照片差不多。我也试过一些不同的电影/歌曲)
目前没有回答
相关问题 更多 >
编程相关推荐