При декодировании закодированных опус-данных в Python с помощью opuslib возникает некоторый шум - PullRequest
0 голосов
/ 27 мая 2019

Я кодировал аудиофайл с помощью opuslib в python, когда декодирую его, на нем есть какой-то шум, и его качество ниже, чем у основного файла. Я использовал эту библиотеку: https://github.com/jlaine/opuslib

Я не знаю, почему это произошло. даже я пробовал другие размеры кадров, другие скорости и другие битрейты, но я не мог это исправить. в чем проблема именно ??

FFMPEG_BIN = "ffmpeg"  # on Linux
import subprocess as sp

import pyaudio

import opuslib
import opuslib.api.ctl
from opuslib.api import decoder as opus_decoder
from opuslib.api import encoder as opus_encoder


class OpusCodec():

    def __init__(self, *args, **kwargs):
        self.frame_size = 2880  # 960
        self.channels = 2
        self.rate = 48000  
        self.bitrate = 64000
        print(opus_encoder.get_size(1))
        self.decoder = opus_decoder.create_state(self.rate, self.channels)
        self.encoder = opus_encoder.create_state(self.rate, self.channels, opuslib.APPLICATION_AUDIO)
        err = opus_encoder.encoder_ctl(self.encoder, opuslib.api.ctl.set_bitrate, self.bitrate)
        # print(err)
        opus_encoder.encoder_ctl(self.encoder, opuslib.api.ctl.set_signal, opuslib.SIGNAL_MUSIC)
        # opus_encoder.encoder_ctl(self.encoder,opuslib.api.ctl.set_complexity, 10)

    def encode(self, data, **kwargs):
        if not 'frame_size' in kwargs:
            kwargs['frame_size'] = self.frame_size
        out = opus_encoder.encode(self.encoder, data, self.frame_size, len(data))
        return out

    def decode(self, data, **kwargs):
        if not 'frame_size' in kwargs:
            kwargs['frame_size'] = self.frame_size
        out = opus_decoder.decode(self.decoder, data, len(data), self.frame_size, 0, self.channels)
        return out[0:int(len(out) / 2)]

def main():
    op = OpusCodec()

    command = [FFMPEG_BIN,
               '-i', "shallow-main.mp3",
               '-f', 's16le',
               '-acodec', 'pcm_s16le',
               '-ar', str(op.rate),  # ouput will have 44100 Hz
               '-ac', str(op.channels),  # stereo (set to '1' for mono)
               '-']

    pipe = sp.Popen(command, stdout=sp.PIPE, bufsize=10 ** 8)

    data = []
    while True:
        da = pipe.stdout.read(op.frame_size * op.channels)
        if not da:
            break
        data.append(da)
    # print(data[0])
    # playing(op, data)
    # str
    # eamout.write(da)

    encdata = []
    for x in data:
        encdata.append(op.encode(x))
    # print(encdata[0])

    print("DATA LENGTH :", len(b''.join(data)))
    print("ENCDATA LENGTH :", len(b''.join(encdata)))
    decdata = []
    for x in encdata:
        decdata.append(op.decode(x))
    print("DECDATA LENGTH :", len(b''.join(decdata)))
    # print(decdata[0])

    playing(op, decdata)

def playing(op, data):
    frame_size = op.frame_size
    FORMAT = pyaudio.paInt16
    CHANNELS = op.channels
    RATE = op.rate
    p = pyaudio.PyAudio()
    streamout = p.open(format=FORMAT,
                       channels=CHANNELS,
                       rate=RATE,
                       output=True,
                       output_device_index=p.get_default_input_device_info()["index"],
                       frames_per_buffer=frame_size)

    for da in data:
        streamout.write(da)

    # streamin.close()
    streamout.close()


main()

Вы можете услышать два аудиофайла ниже и полностью понять, в чем заключается моя цель. основной аудиофайл: https://www.dropbox.com/s/l2znt9ql0sxpa7n/shallow-main.mp3?dl=0 декодированный аудиофайл: https://www.dropbox.com/s/sb6wwqjpsvkepwf/shallow-decode.opus?dl=0

...