содержимое аудиофайла изменяется при загрузке в облачное хранилище Google

#javascript #python-3.x #google-cloud-storage #mp3 #wav

#javascript #python-3.x #google-облачное хранилище #mp3 #wav

Вопрос:

Я загружаю MP3 файл в облачное хранилище Google, затем конвертирую его в WAV файл и сохраняю результат в облачном хранилище. Проблема сейчас в том, что при попытке прочитать WAV файл с scipy.io выдается ошибка —> Unexpected end of file

затем я локально конвертировал свой MP3-файл и загрузил его в облачное хранилище, вызвал его и открыл, как я делал с другим, и все сработало, как ожидалось.

После этого я заметил, что, несмотря на то, что преобразование было выполнено с помощью одного и того же скрипта, два файла имеют одинаковый размер, и при открытии медиаплеером они имеют одинаковую длину, и кажется, что нет разницы в качестве звука, но при преобразовании их в строки и печати их в консоли показывает, что они не идентичны.

Примечания :

  • MP3-файл, загруженный в облако с использованием html-формы и сохраненный с типом audio / mpeg
  • Файл WAV был преобразован с использованием следующего кода и сохранен с типом audio / Wav :

      const remoteWriteStream =
    
     storage.bucket(bucketName).file("path/to/file/file.wav")
    
    .createWriteStream({
        contentType: 'audio/wav'
    })
    
    ffmpeg(audioContent)
        .withAudioChannels(1)
        .toFormat('wav')
        .on('error', (err) => {
            console.log("error while conversion "   err)
            reject(err)
        })
        .on('progress', (progress) => {
            console.log("conversion in progress")
        })
        .on('end', () => {
            console.log("conversion from mp3 to wav finished")
            resolve()
        })
        .pipe(remoteWriteStream, { end: true })
      
  • код для локального преобразования файла :

     ffmpeg(mp3File)
    .withAudioChannels(1)
    .toFormat('wav')
    .on('error', (err) => {
        console.log("error while conversion "   err)
        reject(err)
    })
    .on('progress', (progress) => {
        console.log("conversion in progress")
    })
    .on('end', () => {
        console.log("conversion from mp3 to wav finished")
        resolve()
    })
    .save('path/to/save/file/file.wav')
      
  • Преобразование выполняется с помощью JavaScript в обоих случаях, а вызов и открытие waV-файла выполняется с помощью python

  • код для вызова и открытия WAV-файла из облака :

wavBucketFileBlob = bucket.get_blob('path/to/file/in/cloud/file.wav')
wavBucketFileString = wavBucketFileBlob.download_as_string()

rate,audio = wavfile.read(io.BytesIO(wavBucketFileString))

** РЕДАКТИРОВАТЬ : **

Я думаю, что проблема в заголовке :

файл wav, который не может быть прочитан (сохранен в облаке как audio / wav) :

 b'RIFF$x01Ax01WAVEfmt x10x00x00x00x01x00x01x00Dxacx00x00x88Xx01x00x02x00x10x00LISTxf8x00x00x00INFOIARTnx00x00x00Cat Powerx00ICMT6x00x00x00https://open.spotify.com/track/2ilo3w0stilJKeQZS61FeNx00ICOPx1dx00x00x002018 Domino Recording Co Ltdx00x00ICRDx05x00x00x002018x00x00IGNRx08x00x00x00Art Popx00INAMx05x00x00x00Stayx00x00IPRDtx00x00x00Wandererx00x00IPRTx05x00x00x006/11x00x00ISFTx0ex00x00x00Lavf58.24.100x00ITCHx14x00x00x00Domino Recording Cox00datax00x00Ax01x00
  

wav-файл, который можно прочитать (автоматически сохраняется в облаке при загрузке в виде аудио / x-wav):

 b'RIFFxffxffxffxffWAVEfmt x10x00x00x00x01x00x01x00Dxacx00x00x88Xx01x00x02x00x10x00LISTxf8x00x00x00INFOIARTnx00x00x00Cat Powerx00ICMT6x00x00x00https://open.spotify.com/track/2ilo3w0stilJKeQZS61FeNx00ICOPx1dx00x00x002018 Domino Recording Co Ltdx00x00ICRDx05x00x00x002018x00x00IGNRx08x00x00x00Art Popx00INAMx05x00x00x00Stayx00x00IPRDtx00x00x00Wandererx00x00IPRTx05x00x00x006/11x00x00ISFTx0ex00x00x00Lavf58.24.100x00ITCHx14x00x00x00Domino Recording Cox00dataxffxffxffxff
  

Я пытался при конвертации моего mp3 в wav сохранить его как audio / x-wav, поскольку это, похоже, работает, но это было не так .. у меня все еще была та же проблема.

Мой обходной путь :

Я использовал scipy.io для открытия чтения файла wav, поэтому я переключился на soundfile , который решил мою проблему, но с недостатком -> качество моего вывода после дальнейшей обработки кажется ниже (но не очень заметно), чем при использовании scipy.io

Комментарии:

1. У вас есть представление о том, в чем разница между двумя файлами? Интересно, есть ли что-то очень заметное, что может указывать на причину, например, какой-то конкретный байт постоянно изменяется на нули или что-то в этом роде.

2. Я обновил свой вопрос, указав разницу, которую я заметил между двумя файлами, и найденный обходной путь. Я хотел бы понять причину этого. Любые объяснения приветствуются.

3. «cksize» во втором примере равен xff xff xff xff, что заставляет меня думать, что проблема в том, что scipy.io не знает, насколько большой будет wave, когда начнет ее потоковую передачу в GCS, что каким-то образом вызывает проблемы в дальнейшем.

4. интересно.. интересно, почему существует небольшая разница в качестве, если два файла одинаковы. Связано ли это с тем, как scipy.io и soundfile интерпретировать входные данные? Пока я просто смирюсь с этим. Спасибо за объяснение