2012-01-19 3 views
3

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 값을 읽으려고했으나 예상보다 다른 이미지가 나타납니다. 그 이유는 알지 못합니다.

+0

코드가 도움이 될 수 있습니다. –

+1

이이 문제를 해결했습니다. 파일이 20 MB처럼 크면, 바이트를 읽지 않습니다. 즉, 어쨌든 나는 aproximation이 필요하기 때문에 점프합니다. 나는 사운드 데이터에서 매 10 번째 긴 번호를 취한다. 작은 파일의 경우 모든 2 번째 긴 번호를 사용합니다. 이렇게 나는 이것을 해결했다. – Vlad

+0

좋은 해결책;). –

답변

0

이 문제를 해결했습니다. 파일이 20 MB처럼 크면, 바이트를 읽지 않습니다. 즉, 어쨌든 나는 aproximation이 필요하기 때문에 점프합니다. 나는 사운드 데이터에서 매 10 번째 긴 번호를 취한다. 작은 파일의 경우 모든 2 번째 긴 번호를 사용합니다. 이렇게 나는 이것을 해결했다.

관련 문제