mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2025-12-12 01:00:29 +08:00
h264_bitrate streamer param
This commit is contained in:
parent
83f9406fa0
commit
83184952f6
@ -90,6 +90,7 @@ from ..validators.hid import valid_hid_mouse_move
|
|||||||
from ..validators.kvm import valid_stream_quality
|
from ..validators.kvm import valid_stream_quality
|
||||||
from ..validators.kvm import valid_stream_fps
|
from ..validators.kvm import valid_stream_fps
|
||||||
from ..validators.kvm import valid_stream_resolution
|
from ..validators.kvm import valid_stream_resolution
|
||||||
|
from ..validators.kvm import valid_stream_h264_bitrate
|
||||||
|
|
||||||
from ..validators.ugpio import valid_ugpio_driver
|
from ..validators.ugpio import valid_ugpio_driver
|
||||||
from ..validators.ugpio import valid_ugpio_channel
|
from ..validators.ugpio import valid_ugpio_channel
|
||||||
@ -359,6 +360,10 @@ def _get_config_scheme() -> Dict:
|
|||||||
"resolution": Option("", type=(lambda arg: (valid_stream_resolution(arg) if arg else ""))),
|
"resolution": Option("", type=(lambda arg: (valid_stream_resolution(arg) if arg else ""))),
|
||||||
"available_resolutions": Option([], type=functools.partial(valid_string_list, subval=valid_stream_resolution)),
|
"available_resolutions": Option([], type=functools.partial(valid_string_list, subval=valid_stream_resolution)),
|
||||||
|
|
||||||
|
"h264_bitrate": Option(0, type=(lambda arg: (valid_stream_h264_bitrate(arg) if arg else 0))),
|
||||||
|
"h264_min_bitrate": Option(100, type=valid_stream_h264_bitrate),
|
||||||
|
"h264_max_bitrate": Option(16000, type=valid_stream_h264_bitrate),
|
||||||
|
|
||||||
"host": Option("localhost", type=valid_ip_or_host),
|
"host": Option("localhost", type=valid_ip_or_host),
|
||||||
"port": Option(0, type=valid_port),
|
"port": Option(0, type=valid_port),
|
||||||
"unix": Option("", type=valid_abs_path, only_if="!port", unpack_as="unix_path"),
|
"unix": Option("", type=valid_abs_path, only_if="!port", unpack_as="unix_path"),
|
||||||
|
|||||||
@ -55,6 +55,7 @@ from ...validators.basic import valid_bool
|
|||||||
from ...validators.kvm import valid_stream_quality
|
from ...validators.kvm import valid_stream_quality
|
||||||
from ...validators.kvm import valid_stream_fps
|
from ...validators.kvm import valid_stream_fps
|
||||||
from ...validators.kvm import valid_stream_resolution
|
from ...validators.kvm import valid_stream_resolution
|
||||||
|
from ...validators.kvm import valid_stream_h264_bitrate
|
||||||
|
|
||||||
from ... import aiotools
|
from ... import aiotools
|
||||||
from ... import aioproc
|
from ... import aioproc
|
||||||
@ -103,6 +104,11 @@ class StreamerResolutionNotSupported(OperationError):
|
|||||||
super().__init__("This streamer does not support resolution settings")
|
super().__init__("This streamer does not support resolution settings")
|
||||||
|
|
||||||
|
|
||||||
|
class StreamerH264NotSupported(OperationError):
|
||||||
|
def __init__(self) -> None:
|
||||||
|
super().__init__("This streamer does not support H264")
|
||||||
|
|
||||||
|
|
||||||
# =====
|
# =====
|
||||||
@dataclasses.dataclass(frozen=True)
|
@dataclasses.dataclass(frozen=True)
|
||||||
class _Component: # pylint: disable=too-many-instance-attributes
|
class _Component: # pylint: disable=too-many-instance-attributes
|
||||||
@ -220,6 +226,7 @@ class KvmdServer(HttpServer): # pylint: disable=too-many-arguments,too-many-ins
|
|||||||
("quality", valid_stream_quality, StreamerQualityNotSupported),
|
("quality", valid_stream_quality, StreamerQualityNotSupported),
|
||||||
("desired_fps", valid_stream_fps, None),
|
("desired_fps", valid_stream_fps, None),
|
||||||
("resolution", valid_stream_resolution, StreamerResolutionNotSupported),
|
("resolution", valid_stream_resolution, StreamerResolutionNotSupported),
|
||||||
|
("h264_bitrate", valid_stream_h264_bitrate, StreamerH264NotSupported),
|
||||||
]:
|
]:
|
||||||
value = request.query.get(name)
|
value = request.query.get(name)
|
||||||
if value:
|
if value:
|
||||||
|
|||||||
@ -62,33 +62,46 @@ class _StreamerParams:
|
|||||||
__RESOLUTION = "resolution"
|
__RESOLUTION = "resolution"
|
||||||
__AVAILABLE_RESOLUTIONS = "available_resolutions"
|
__AVAILABLE_RESOLUTIONS = "available_resolutions"
|
||||||
|
|
||||||
|
__H264_BITRATE = "h264_bitrate"
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
desired_fps: int,
|
desired_fps: int,
|
||||||
max_fps: int,
|
max_fps: int,
|
||||||
|
|
||||||
quality: int,
|
quality: int,
|
||||||
|
|
||||||
resolution: str,
|
resolution: str,
|
||||||
available_resolutions: List[str],
|
available_resolutions: List[str],
|
||||||
|
|
||||||
|
h264_bitrate: int,
|
||||||
|
h264_min_bitrate: int,
|
||||||
|
h264_max_bitrate: int,
|
||||||
) -> None:
|
) -> None:
|
||||||
|
|
||||||
self.__has_quality = bool(quality)
|
self.__has_quality = bool(quality)
|
||||||
self.__has_resolution = bool(resolution)
|
self.__has_resolution = bool(resolution)
|
||||||
|
self.__has_h264 = bool(h264_bitrate)
|
||||||
|
|
||||||
self.__params: Dict = {
|
self.__params: Dict = {self.__DESIRED_FPS: min(desired_fps, max_fps)}
|
||||||
self.__DESIRED_FPS: desired_fps,
|
self.__limits: Dict = {self.__MAX_FPS: max_fps}
|
||||||
**({self.__QUALITY: quality} if self.__has_quality else {}),
|
|
||||||
**({self.__RESOLUTION: resolution} if self.__has_resolution else {}),
|
|
||||||
}
|
|
||||||
|
|
||||||
self.__limits: Dict = {
|
if self.__has_quality:
|
||||||
self.__MAX_FPS: max_fps,
|
self.__params[self.__QUALITY] = quality
|
||||||
**({self.__AVAILABLE_RESOLUTIONS: available_resolutions} if self.__has_resolution else {}),
|
|
||||||
}
|
if self.__has_resolution:
|
||||||
|
self.__params[self.__RESOLUTION] = resolution
|
||||||
|
self.__limits[self.__AVAILABLE_RESOLUTIONS] = available_resolutions
|
||||||
|
|
||||||
|
if self.__has_h264:
|
||||||
|
self.__params[self.__H264_BITRATE] = min(max(h264_bitrate, h264_min_bitrate), h264_max_bitrate)
|
||||||
|
self.__limits[self.__H264_BITRATE] = {"min": h264_min_bitrate, "max": h264_max_bitrate}
|
||||||
|
|
||||||
def get_features(self) -> Dict:
|
def get_features(self) -> Dict:
|
||||||
return {
|
return {
|
||||||
self.__QUALITY: self.__has_quality,
|
self.__QUALITY: self.__has_quality,
|
||||||
self.__RESOLUTION: self.__has_resolution,
|
self.__RESOLUTION: self.__has_resolution,
|
||||||
|
"h264": self.__has_h264,
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_limits(self) -> Dict:
|
def get_limits(self) -> Dict:
|
||||||
@ -113,6 +126,12 @@ class _StreamerParams:
|
|||||||
if params[self.__RESOLUTION] in self.__limits[self.__AVAILABLE_RESOLUTIONS]:
|
if params[self.__RESOLUTION] in self.__limits[self.__AVAILABLE_RESOLUTIONS]:
|
||||||
new_params[self.__RESOLUTION] = params[self.__RESOLUTION]
|
new_params[self.__RESOLUTION] = params[self.__RESOLUTION]
|
||||||
|
|
||||||
|
if self.__H264_BITRATE in params and self.__has_h264:
|
||||||
|
min_bitrate = self.__limits[self.__H264_BITRATE]["min"]
|
||||||
|
max_bitrate = self.__limits[self.__H264_BITRATE]["max"]
|
||||||
|
if min_bitrate <= params[self.__H264_BITRATE] <= max_bitrate:
|
||||||
|
new_params[self.__H264_BITRATE] = params[self.__H264_BITRATE]
|
||||||
|
|
||||||
self.__params = new_params
|
self.__params = new_params
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -74,3 +74,7 @@ def valid_stream_resolution(arg: Any) -> str:
|
|||||||
width = int(valid_number(parts[0], min=1, name=f"{name} (width)"))
|
width = int(valid_number(parts[0], min=1, name=f"{name} (width)"))
|
||||||
height = int(valid_number(parts[1], min=1, name=f"{name} (height)"))
|
height = int(valid_number(parts[1], min=1, name=f"{name} (height)"))
|
||||||
return f"{width}x{height}"
|
return f"{width}x{height}"
|
||||||
|
|
||||||
|
|
||||||
|
def valid_stream_h264_bitrate(arg: Any) -> int:
|
||||||
|
return int(valid_number(arg, min=100, max=16000, name="stream H264 bitrate"))
|
||||||
|
|||||||
@ -32,6 +32,7 @@ from kvmd.validators.kvm import valid_log_seek
|
|||||||
from kvmd.validators.kvm import valid_stream_quality
|
from kvmd.validators.kvm import valid_stream_quality
|
||||||
from kvmd.validators.kvm import valid_stream_fps
|
from kvmd.validators.kvm import valid_stream_fps
|
||||||
from kvmd.validators.kvm import valid_stream_resolution
|
from kvmd.validators.kvm import valid_stream_resolution
|
||||||
|
from kvmd.validators.kvm import valid_stream_h264_bitrate
|
||||||
|
|
||||||
|
|
||||||
# =====
|
# =====
|
||||||
@ -126,3 +127,17 @@ def test_ok__valid_stream_resolution(arg: Any) -> None:
|
|||||||
def test_fail__valid_stream_resolution(arg: Any) -> None:
|
def test_fail__valid_stream_resolution(arg: Any) -> None:
|
||||||
with pytest.raises(ValidatorError):
|
with pytest.raises(ValidatorError):
|
||||||
print(valid_stream_resolution(arg))
|
print(valid_stream_resolution(arg))
|
||||||
|
|
||||||
|
|
||||||
|
# =====
|
||||||
|
@pytest.mark.parametrize("arg", ["100", " 16000 ", 5000])
|
||||||
|
def test_ok__valid_stream_h264_bitrate(arg: Any) -> None:
|
||||||
|
value = valid_stream_h264_bitrate(arg)
|
||||||
|
assert type(value) == int # pylint: disable=unidiomatic-typecheck
|
||||||
|
assert value == int(str(arg).strip())
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("arg", ["0", "-1", "100.0", 5000.1, None, ""])
|
||||||
|
def test_fail__valid_stream_h264_bitrate(arg: Any) -> None:
|
||||||
|
with pytest.raises(ValidatorError):
|
||||||
|
print(valid_stream_h264_bitrate(arg))
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user