1

私はこのクラスを作りました:

class AudioSegmentCustom(AudioSegment):

    def fade_override(self, seg, fade_len=100):
        seg1, seg2 = AudioSegment._sync(self, seg)
        final = seg1[:-fade_len]
        a_fin = seg1[-fade_len:].fade(to_gain=-120, start=0, end=float('inf'))
        a_fin *= seg2[:fade_len]
        return (final + a_fin) + seg2[fade_len:]

私が直面している問題は、いくつかのAudioSegmentCustom変数を作成するときです。それらを「追加」すると、add操作は元の親タイプを返します =AudioSegment

したがって、次のコードは機能しません。

final = AudioSegmentCustom.from_mp3(mp3_src) + AudioSegment.from_mp3(mp3_other)
final = final.fade_override(...blabla...)

私が得るから:

'AudioSegment' object has no attribute 'fade_override'

...オブジェクトから始めたとしても、「唯一の」オブジェクトAudioSegmentCustomで終わります。AudioSegment新しく作成されたオブジェクトのタイプを「強制」する方法は何ですか?

必要な場合に備えて:

class AudioSegment(object):
    def __add__(self, arg):
        if isinstance(arg, AudioSegment):
            return self.append(arg, crossfade=0)
        else:
            return self.apply_gain(arg)
4

1 に答える 1

1

問題は のようですAudioSegment._spawn()

AudioSegment必要最小限のインスタンスを無条件に返します。これは通常のメソッドであるため、次のようにオーバーライドできますAudioSegmentCustom

def _spawn(self, data, overrides={}):
    """
    Creates a new audio segment using the metadata from the current one
    and the data passed in. Should be used whenever an AudioSegment is
    being returned by an operation that would alters the current one,
    since AudioSegment objects are immutable.
    """
    # accept lists of data chunks
    if isinstance(data, list):
        data = b''.join(data)

    # accept file-like objects
    if hasattr(data, 'read'):
        if hasattr(data, 'seek'):
            data.seek(0)
        data = data.read()

    metadata = {
        'sample_width': self.sample_width,
        'frame_rate': self.frame_rate,
        'frame_width': self.frame_width,
        'channels': self.channels
    }
    metadata.update(overrides)
    return self.__class__(data=data, metadata=metadata)

コピー&ペーストは確かに良い習慣ではありませんが、仕事はします。

ただし、を返す一方で、 をAudioSegmentCustom + AudioSegment返すため、非対称性が導入されることに注意してください。これは - もう一度 - で追加で提供することで修正できます。の前に呼び出されます。AudioSegmentCustomAudioSegment + AudioSegmentCustomAudioSegment__radd__()AudioSegmentCustomAudioSegment.__add__()

于 2016-05-08T11:02:21.087 に答える