PHP에서 wav 파일의 사운드 웨이브를 그리는 스크립트를 개발했습니다. Althoug 잘 작동 20 분 약 2 ~ 3 분 정도는 이미지를 그리는 소리. 특정 픽셀의 웨이브를 나타 내기 위해 샘플 그룹의 피크 값을 사용하고 있습니다. 또한 long 값, 즉 4 바이트를 동시에 가져 와서 음수 및 양수 값을 왼쪽, 오른쪽으로 가져옵니다. 또한 하나의 개선점은 동일한 반복에서 4 개의 긴 값을 취한다는 것입니다.PHP에서 사운드 웨이브 그리기
wav는 a-law 스테레오 16 비트이지만 pcm 값을 얻기 위해 디코딩 알고리즘을 사용하므로 16 비트가 8 비트가됩니다. 샘플 당
8000Hz, 8 비트, 64 Kbps까지, 스테레오, A-법
I 1500 픽셀 너비 이미지를 생성 할 필요가있다.
일부 alghoritm 또는 웹 페이지에서 스크립트의 성능을 향상시키는 방법도 도움이 될 것입니다.
Audacity는 약 2-3 초 내에 같은 소리의 이미지를 생성합니다.
감사합니다. 필요한 경우 몇 가지 코드를 게시합니다.
여기
for ($i = 0; $i < $this->blocktotal/4; $i+=4)
{
// unpack 32 bit numbers from the sound data in groups of 4
$blocks[] = @unpack('L', substr($this->data, $i * 4, 4));
$blocks[] = @unpack('L', substr($this->data, ($i + 1) * 4, 4));
$blocks[] = @unpack('L', substr($this->data, ($i + 2) * 4, 4));
$blocks[] = @unpack('L', substr($this->data, ($i + 3) * 4, 4));
}
32 비트 = 4 * 8 비트, 각 비트가 오른쪽에서 왼쪽 오른쪽 좌측 채널의 음향 데이터의 블록을 판독하는 싸이클이다. 따라서 위의 사이클의 한 줄에 대해 오른쪽 채널에 대해 왼쪽과 두 개의 값을 가져옵니다. 하지만 20 MB 파일에 대해 $ this-> blocktotal = 20147456을 얻으므로 위의주기가 약 5 백만 번 반복됩니다. 개선을위한 아이디어? 같은 시간에 8 개의 Long 값을 읽으려고했으나 예상보다 다른 이미지가 나타납니다. 그 이유는 알지 못합니다.
코드가 도움이 될 수 있습니다. –
이이 문제를 해결했습니다. 파일이 20 MB처럼 크면, 바이트를 읽지 않습니다. 즉, 어쨌든 나는 aproximation이 필요하기 때문에 점프합니다. 나는 사운드 데이터에서 매 10 번째 긴 번호를 취한다. 작은 파일의 경우 모든 2 번째 긴 번호를 사용합니다. 이렇게 나는 이것을 해결했다. – Vlad
좋은 해결책;). –