Какой кодировщик используется командой PHP $ POST для звукового объекта? - PullRequest
0 голосов
/ 09 ноября 2019

Первая последовательность аудиосэмплов записана в JavaScript из браузера в моно, формате PCM, 16-битном и 96000 Гц. Я записал этот аудиофайл в виде большого двоичного объекта на сервер через объект JavaScript FormData, используя ajax.

Это необработанные аудиосэмплы. Когда я получил аудио из списка каталогов веб-сервера,Я получил вторую последовательность аудио образцов. Он был понижен до 48000 Гц, и образцы были изменены. Какой кодер используется?

Код PHP на стороне сервера:

    $input = $_FILES['audio']['tmp_name']; //audio blob
    $output = $_POST['filename'];

    if(move_uploaded_file($input, $output))
        exit('Audio file Uploaded');

Код JavaScript на стороне клиента:

    function send_audio(fn, blob){

        var formData = new FormData();

        formData.append("filename", fn);
        formData.append('audio', blob);
        $.ajax({
            url:'save_audio.php',
            type:'post',
            data: formData,
            contentType:false,
            processData:false,
            cache:false,
            success: function(data){
                console.log("send_audio success!");
                console.log(data);
            }
        });
    }

1 Ответ

0 голосов
/ 10 ноября 2019

Непонятно, что происходит, но учтите следующее:

(1) Попробуйте 16-бит не 32-бит на выборку (может помочь).

Нет необходимости записывать эти аудиосэмплы со скоростью 32 бита на семпл. Это означает, что вы используете 4 байта для записи одного значения выборки, которое умещается в 2 байта (16 бит).

Максимальное значение 30465 (байты x77 x01), а минимальное значение -32513 (байты x80 xFF).
Заметили, что эти значения занимают два байта? Используя 4 байта, вы получаете x00 x00 x77 x01. Трата для хранения дополнительных 00.

Два байта содержат максимальное значение 65535. Или даже 32767, если вы разделите на две части как +32767 и -32767.

(2) Убедитесь, что нет путаницы между кодированием байтов (как шестнадцатеричное) и цифрами (как целые числа).

Байты записываются в файл в шестнадцатеричном виде. Ваши значения, кажется, портятся при преобразовании целых чисел в шестнадцатеричный формат. Также 16 бит против 32 бит для

Некоторые примеры из ваших чисел по сравнению с 16-битным шестнадцатеричным байтом:

  FIRST SEQ:        SECOND SEQ:
value   | hex       | value   | hex

100       00 64      612        02 64
553       02 29      41         00 29
203       00 CB      -309       FE CB
-409      FE 67      103        00 67
68        00 44      836        03 44
953       03 B9      185        00 B9
154       00 9A      -102       FF 9A
-127      FF 81      385        01 81

Обратите внимание на значение целого числа 100 при записи в видеhex (байтовые значения) становится байтом x64, по какой-то причине перед этим 64 добавляется 2, что делает его x0264, который преобразуется в целочисленное значение 612.

Во второй последовательности, откуда эти дополнительные 02 и FE и т. Д.? Почему, если в гексе первого seq есть 00, то для второго seq теперь добавлено что-то дополнительное? Даже наоборот (сначала = что-то, затем второе = что-то удалено, чтобы стать 00)?

Вам необходимо дважды проверить код записи . Это добавляет какое-то увеличивающееся число к записанному значению ?? Потому что, как вы знаете, за 2 следует 3, и этот шаблон присутствует во второй последовательности. Также верно, что за FE следует FF (и, следовательно, перед FE будет FD, FC, FB, FA и т. Д.).

Если вы все ещетогда я не могу это объяснить:

  • Запись на 16-битной частоте с частотой 44 100 Гц, как это делают обычные люди. Тогда позже усложняется, если простая установка работает хорошо. Почему 32-битный и 96000 Гц? Это научный тест?

  • Используйте Hex Editor для просмотра ваших байтов с обеих сторон (сохраненный файл BLOB через JS, против файла, загруженного через PHP) и сравните любые изменения между двумя файлами.

  • Покажите, как / что делает ваш код записи.

  • Поделитесь байтами "Я получил аудио из Интернетасервер " (сохранить как файл) для проверки.

Может быть, кто-то еще может помочь вам. Я не использую html-формы, поэтому, может быть, там есть опция кодирования для типа данных POST?

...