248 lines
7.8 KiB
Python
248 lines
7.8 KiB
Python
|
"""Module to change the configuration of FFmpeg libraries (such as libavformat).
|
||
|
|
||
|
It affects functionalities in :py:mod:`torio.io`.
|
||
|
"""
|
||
|
from typing import Dict, List, Tuple
|
||
|
|
||
|
import torio
|
||
|
|
||
|
ffmpeg_ext = torio._extension.lazy_import_ffmpeg_ext()
|
||
|
|
||
|
|
||
|
def get_versions() -> Dict[str, Tuple[int]]:
|
||
|
"""Get the versions of FFmpeg libraries
|
||
|
|
||
|
Returns:
|
||
|
dict: mapping from library names to version string,
|
||
|
i.e. `"libavutil": (56, 22, 100)`.
|
||
|
"""
|
||
|
return ffmpeg_ext.get_versions()
|
||
|
|
||
|
|
||
|
def get_log_level() -> int:
|
||
|
"""Get the log level of FFmpeg.
|
||
|
|
||
|
See :py:func:`set_log_level` for the detail.
|
||
|
"""
|
||
|
return ffmpeg_ext.get_log_level()
|
||
|
|
||
|
|
||
|
def set_log_level(level: int):
|
||
|
"""Set the log level of FFmpeg (libavformat etc)
|
||
|
|
||
|
Arguments:
|
||
|
level (int): Log level. The larger, the more verbose.
|
||
|
|
||
|
The following values are common values, the corresponding ``ffmpeg``'s
|
||
|
``-loglevel`` option value and desription.
|
||
|
|
||
|
* ``-8`` (``quiet``):
|
||
|
Print no output.
|
||
|
* ``0`` (``panic``):
|
||
|
Something went really wrong and we will crash now.
|
||
|
* ``8`` (``fatal``):
|
||
|
Something went wrong and recovery is not possible.
|
||
|
For example, no header was found for a format which depends
|
||
|
on headers or an illegal combination of parameters is used.
|
||
|
* ``16`` (``error``):
|
||
|
Something went wrong and cannot losslessly be recovered.
|
||
|
However, not all future data is affected.
|
||
|
* ``24`` (``warning``):
|
||
|
Something somehow does not look correct.
|
||
|
This may or may not lead to problems.
|
||
|
* ``32`` (``info``):
|
||
|
Standard information.
|
||
|
* ``40`` (``verbose``):
|
||
|
Detailed information.
|
||
|
* ``48`` (``debug``):
|
||
|
Stuff which is only useful for libav* developers.
|
||
|
* ``56`` (``trace``):
|
||
|
Extremely verbose debugging, useful for libav* development.
|
||
|
|
||
|
"""
|
||
|
ffmpeg_ext.set_log_level(level)
|
||
|
|
||
|
|
||
|
def get_demuxers() -> Dict[str, str]:
|
||
|
"""Get the available demuxers.
|
||
|
|
||
|
Returns:
|
||
|
Dict[str, str]: Mapping from demuxer (format) short name to long name.
|
||
|
|
||
|
Example
|
||
|
>>> for k, v in get_demuxers().items():
|
||
|
>>> print(f"{k}: {v}")
|
||
|
... aa: Audible AA format files
|
||
|
... aac: raw ADTS AAC (Advanced Audio Coding)
|
||
|
... aax: CRI AAX
|
||
|
... ac3: raw AC-3
|
||
|
"""
|
||
|
return ffmpeg_ext.get_demuxers()
|
||
|
|
||
|
|
||
|
def get_muxers() -> Dict[str, str]:
|
||
|
"""Get the available muxers.
|
||
|
|
||
|
Returns:
|
||
|
Dict[str, str]: Mapping from muxer (format) short name to long name.
|
||
|
|
||
|
Example
|
||
|
>>> for k, v in get_muxers().items():
|
||
|
>>> print(f"{k}: {v}")
|
||
|
... a64: a64 - video for Commodore 64
|
||
|
... ac3: raw AC-3
|
||
|
... adts: ADTS AAC (Advanced Audio Coding)
|
||
|
... adx: CRI ADX
|
||
|
... aiff: Audio IFF
|
||
|
"""
|
||
|
return ffmpeg_ext.get_muxers()
|
||
|
|
||
|
|
||
|
def get_audio_decoders() -> Dict[str, str]:
|
||
|
"""Get the available audio decoders.
|
||
|
|
||
|
Returns:
|
||
|
Dict[str, str]: Mapping from decoder short name to long name.
|
||
|
|
||
|
Example
|
||
|
>>> for k, v in get_audio_decoders().items():
|
||
|
>>> print(f"{k}: {v}")
|
||
|
... a64: a64 - video for Commodore 64
|
||
|
... ac3: raw AC-3
|
||
|
... adts: ADTS AAC (Advanced Audio Coding)
|
||
|
... adx: CRI ADX
|
||
|
... aiff: Audio IFF
|
||
|
"""
|
||
|
return ffmpeg_ext.get_audio_decoders()
|
||
|
|
||
|
|
||
|
def get_audio_encoders() -> Dict[str, str]:
|
||
|
"""Get the available audio encoders.
|
||
|
|
||
|
Returns:
|
||
|
Dict[str, str]: Mapping from encoder short name to long name.
|
||
|
|
||
|
Example
|
||
|
>>> for k, v in get_audio_encoders().items():
|
||
|
>>> print(f"{k}: {v}")
|
||
|
... comfortnoise: RFC 3389 comfort noise generator
|
||
|
... s302m: SMPTE 302M
|
||
|
... aac: AAC (Advanced Audio Coding)
|
||
|
... ac3: ATSC A/52A (AC-3)
|
||
|
... ac3_fixed: ATSC A/52A (AC-3)
|
||
|
... alac: ALAC (Apple Lossless Audio Codec)
|
||
|
"""
|
||
|
return ffmpeg_ext.get_audio_encoders()
|
||
|
|
||
|
|
||
|
def get_video_decoders() -> Dict[str, str]:
|
||
|
"""Get the available video decoders.
|
||
|
|
||
|
Returns:
|
||
|
Dict[str, str]: Mapping from decoder short name to long name.
|
||
|
|
||
|
Example
|
||
|
>>> for k, v in get_video_decoders().items():
|
||
|
>>> print(f"{k}: {v}")
|
||
|
... aasc: Autodesk RLE
|
||
|
... aic: Apple Intermediate Codec
|
||
|
... alias_pix: Alias/Wavefront PIX image
|
||
|
... agm: Amuse Graphics Movie
|
||
|
... amv: AMV Video
|
||
|
... anm: Deluxe Paint Animation
|
||
|
"""
|
||
|
return ffmpeg_ext.get_video_decoders()
|
||
|
|
||
|
|
||
|
def get_video_encoders() -> Dict[str, str]:
|
||
|
"""Get the available video encoders.
|
||
|
|
||
|
Returns:
|
||
|
Dict[str, str]: Mapping from encoder short name to long name.
|
||
|
|
||
|
Example
|
||
|
>>> for k, v in get_audio_encoders().items():
|
||
|
>>> print(f"{k}: {v}")
|
||
|
... a64multi: Multicolor charset for Commodore 64
|
||
|
... a64multi5: Multicolor charset for Commodore 64, extended with 5th color (colram)
|
||
|
... alias_pix: Alias/Wavefront PIX image
|
||
|
... amv: AMV Video
|
||
|
... apng: APNG (Animated Portable Network Graphics) image
|
||
|
... asv1: ASUS V1
|
||
|
... asv2: ASUS V2
|
||
|
"""
|
||
|
return ffmpeg_ext.get_video_encoders()
|
||
|
|
||
|
|
||
|
def get_input_devices() -> Dict[str, str]:
|
||
|
"""Get the available input devices.
|
||
|
|
||
|
Returns:
|
||
|
Dict[str, str]: Mapping from device short name to long name.
|
||
|
|
||
|
Example
|
||
|
>>> for k, v in get_input_devices().items():
|
||
|
>>> print(f"{k}: {v}")
|
||
|
... avfoundation: AVFoundation input device
|
||
|
... lavfi: Libavfilter virtual input device
|
||
|
"""
|
||
|
return ffmpeg_ext.get_input_devices()
|
||
|
|
||
|
|
||
|
def get_output_devices() -> Dict[str, str]:
|
||
|
"""Get the available output devices.
|
||
|
|
||
|
Returns:
|
||
|
Dict[str, str]: Mapping from device short name to long name.
|
||
|
|
||
|
Example
|
||
|
>>> for k, v in get_output_devices().items():
|
||
|
>>> print(f"{k}: {v}")
|
||
|
... audiotoolbox: AudioToolbox output device
|
||
|
"""
|
||
|
return ffmpeg_ext.get_output_devices()
|
||
|
|
||
|
|
||
|
def get_input_protocols() -> List[str]:
|
||
|
"""Get the supported input protocols.
|
||
|
|
||
|
Returns:
|
||
|
List[str]: The names of supported input protocols
|
||
|
|
||
|
Example
|
||
|
>>> print(get_input_protocols())
|
||
|
... ['file', 'ftp', 'hls', 'http','https', 'pipe', 'rtmp', 'tcp', 'tls', 'udp', 'unix']
|
||
|
"""
|
||
|
return ffmpeg_ext.get_input_protocols()
|
||
|
|
||
|
|
||
|
def get_output_protocols() -> List[str]:
|
||
|
"""Get the supported output protocols.
|
||
|
|
||
|
Returns:
|
||
|
list of str: The names of supported output protocols
|
||
|
|
||
|
Example
|
||
|
>>> print(get_output_protocols())
|
||
|
... ['file', 'ftp', 'http', 'https', 'md5', 'pipe', 'prompeg', 'rtmp', 'tee', 'tcp', 'tls', 'udp', 'unix']
|
||
|
"""
|
||
|
return ffmpeg_ext.get_output_protocols()
|
||
|
|
||
|
|
||
|
def get_build_config() -> str:
|
||
|
"""Get the FFmpeg build configuration
|
||
|
|
||
|
Returns:
|
||
|
str: Build configuration string.
|
||
|
|
||
|
Example
|
||
|
>>> print(get_build_config())
|
||
|
--prefix=/Users/runner/miniforge3 --cc=arm64-apple-darwin20.0.0-clang --enable-gpl --enable-hardcoded-tables --enable-libfreetype --enable-libopenh264 --enable-neon --enable-libx264 --enable-libx265 --enable-libaom --enable-libsvtav1 --enable-libxml2 --enable-libvpx --enable-pic --enable-pthreads --enable-shared --disable-static --enable-version3 --enable-zlib --enable-libmp3lame --pkg-config=/Users/runner/miniforge3/conda-bld/ffmpeg_1646229390493/_build_env/bin/pkg-config --enable-cross-compile --arch=arm64 --target-os=darwin --cross-prefix=arm64-apple-darwin20.0.0- --host-cc=/Users/runner/miniforge3/conda-bld/ffmpeg_1646229390493/_build_env/bin/x86_64-apple-darwin13.4.0-clang # noqa
|
||
|
"""
|
||
|
return ffmpeg_ext.get_build_config()
|
||
|
|
||
|
|
||
|
def clear_cuda_context_cache():
|
||
|
"""Clear the CUDA context used by CUDA Hardware accelerated video decoding"""
|
||
|
ffmpeg_ext.clear_cuda_context_cache()
|