【问题标题】:Generate WAV and add a second (stereo) channel生成 WAV 并添加第二个(立体声)通道
【发布时间】:2017-06-29 20:04:53
【问题描述】:

我在 stackoverflow 上发现了以下令人难以置信的代码。请谁能帮我添加第二个频道(立体声)

会有 nchannels = 2 必须(以某种方式)增加文件大小,并且必须添加 2. 数组(即 samples2)。

当我尝试时,我只能达到更高的频率。

非常感谢来自德国:Martin

$freqOfTone = 440;
$sampleRate = 44100;
$samplesCount = 80000;

$amplitude = 0.25 * 32768;
$w = 2 * pi() * $freqOfTone / $sampleRate;

$samples = array();
for ($n = 0; $n < $samplesCount; $n++) {
$samples[] = (int)($amplitude *  sin($n * $w));
}

$srate = 44100; //sample rate
$bps = 16; //bits per sample
$Bps = $bps/8; //bytes per sample /// I EDITED

$str = call_user_func_array("pack",
array_merge(array("VVVVVvvVVvvVVv*"),
    array(//header
        0x46464952, //RIFF
        160038,      //File size
        0x45564157, //WAVE
        0x20746d66, //"fmt " (chunk)
        16, //chunk size
        1, //compression
        1, //nchannels
        $srate, //sample rate
        $Bps*$srate, //bytes/second
        $Bps, //block align
        $bps, //bits/sample
        0x61746164, //"data"
        160000 //chunk size
    ),
    $samples //data
)
);
$myfile = fopen("sine.wav", "wb") or die("Unable to open file!");
fwrite($myfile, $str);

【问题讨论】:

  • 别担心 :D 需要时间,我记得自己是从头开始的。享受吧!

标签: php audio wav channels riff


【解决方案1】:

从问题到答案的移动解决方案:

自我解决方案:我检查了 recorder.js Web Worker,找到了 SPEC 以及如何使用它。这是一个稍微修改的代码,用于在 1 秒内从右扬声器向左发出音调。也许它可以帮助某人。

$freqOfTone = 440;
$sampleRate = 44100;
$samplesCount = 80000;

$amplitude = 0.25 * 32768;
$w = 2 * pi() * $freqOfTone / $sampleRate;

$samples = array();
$samples2 = array();
for ($n = 0; $n < $samplesCount; $n++) {
    $samples[] = (int)($amplitude*($n/$samplesCount) *  sin($n * $w));
    $samples2[] = (int)($amplitude*(1-$n/$samplesCount) *  sin($n * $w ));
}

function interleave($l,$r){
 $data=array();
$ix=0;
for($i=0;$i<count($l);$i++){
   $data[$ix++]=$l[$i];
   $data[$ix++]=$r[$i];
 }
 return $data;
}

$stereo=interleave($samples,$samples2);


echo(count($samples));
echo(count($stereo));

$srate = 44100; //sample rate
$bps = 16; //bits per sample
$Bps = $bps/8; //bytes per sample /// I EDITED


$samples_merge=array_merge($samples,$samples2);

$str = call_user_func_array("pack",
    array_merge(array("VVVVVvvVVvvVVv*"),
       array(//header
          0x46464952, //RIFF
           80000*2*2+36,      //File size  *2*Channels +36
        0x45564157, //WAVE
        0x20746d66, //"fmt " (chunk)
        16, //chunk size
        1, //compression
        2, //nchannels
        $srate, //sample rate
        $Bps*$srate, //bytes/second
        $Bps, //block align
        $bps, //bits/sample
        0x61746164, //"data"
        80000 * 2 *2 //chunk size (filesize * 2 *Channels)
    ),
    $stereo // Stereo tone left[0], right[0], left[1], right[1], ...
)
);
$myfile = fopen("sine.wav", "wb") or die("Unable to open file!");
fwrite($myfile, $str);
fclose($myfile);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多