| import cython |
| from cython.cimports import libav as lib |
| from cython.cimports.av.audio.format import AudioFormat, get_audio_format |
| from cython.cimports.av.audio.frame import AudioFrame, alloc_audio_frame |
| from cython.cimports.av.audio.layout import AudioLayout, get_audio_layout |
| from cython.cimports.av.frame import Frame |
| from cython.cimports.av.packet import Packet |
|
|
|
|
| @cython.cclass |
| class AudioCodecContext(CodecContext): |
| @cython.cfunc |
| def _prepare_frames_for_encode(self, input_frame: Frame | None): |
| frame: AudioFrame | None = input_frame |
| allow_var_frame_size: cython.bint = ( |
| self.ptr.codec.capabilities & lib.AV_CODEC_CAP_VARIABLE_FRAME_SIZE |
| ) |
|
|
| |
| |
| if not self.resampler: |
| self.resampler = AudioResampler( |
| format=self.format, |
| layout=self.layout, |
| rate=self.ptr.sample_rate, |
| frame_size=None if allow_var_frame_size else self.ptr.frame_size, |
| ) |
| frames = self.resampler.resample(frame) |
| if input_frame is None: |
| frames.append(None) |
|
|
| return frames |
|
|
| @cython.cfunc |
| def _alloc_next_frame(self) -> Frame: |
| return alloc_audio_frame() |
|
|
| @cython.cfunc |
| def _setup_decoded_frame(self, frame: Frame, packet: Packet): |
| CodecContext._setup_decoded_frame(self, frame, packet) |
| aframe: AudioFrame = frame |
| aframe._init_user_attributes() |
|
|
| @property |
| def frame_size(self): |
| """ |
| Number of samples per channel in an audio frame. |
| |
| :type: int |
| """ |
| return self.ptr.frame_size |
|
|
| @property |
| def sample_rate(self): |
| """ |
| Sample rate of the audio data, in samples per second. |
| |
| :type: int |
| """ |
| return self.ptr.sample_rate |
|
|
| @sample_rate.setter |
| def sample_rate(self, value: cython.int): |
| self.ptr.sample_rate = value |
|
|
| @property |
| def rate(self): |
| """Another name for :attr:`sample_rate`.""" |
| return self.sample_rate |
|
|
| @rate.setter |
| def rate(self, value): |
| self.sample_rate = value |
|
|
| @property |
| def channels(self): |
| return self.layout.nb_channels |
|
|
| @property |
| def layout(self): |
| """ |
| The audio channel layout. |
| |
| :type: AudioLayout |
| """ |
| return get_audio_layout(self.ptr.ch_layout) |
|
|
| @layout.setter |
| def layout(self, value): |
| layout: AudioLayout = AudioLayout(value) |
| self.ptr.ch_layout = layout.layout |
|
|
| @property |
| def format(self): |
| """ |
| The audio sample format. |
| |
| :type: AudioFormat |
| """ |
| return get_audio_format(self.ptr.sample_fmt) |
|
|
| @format.setter |
| def format(self, value): |
| format: AudioFormat = AudioFormat(value) |
| self.ptr.sample_fmt = format.sample_fmt |
|
|