Projects
Multimedia
obs-studio
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 135
View file
obs-studio.changes
Changed
@@ -1,4 +1,197 @@ ------------------------------------------------------------------- +Wed Mar 11 21:37:36 UTC 2026 - darix <packman@nordisch.org> + +- Update to version 32.1.0: + * linux-v4l2: Fix spurious fd closing + * libobs/util: Fix fd management in os_process_pipe_create + * CI: Add local exceptions to flatpak-builder-lint + * linux-pipewire: Fix uninitialized camera resolution access + * CI: Update Signing action commit + * CI: Update ECC cert with fixed one + +------------------------------------------------------------------- +Thu Mar 05 00:09:04 UTC 2026 - darix <packman@nordisch.org> + +- Update to version 32.1.0~rc3: + * frontend: Only send event when scene list changed + * obs-websocket: Update version to 5.7.2 + * CI: Update commit for windows signing workflow + * CI: Update code signing certificates + +------------------------------------------------------------------- +Sat Feb 28 20:52:51 UTC 2026 - darix <packman@nordisch.org> + +- Update to version 32.1.0~rc2: + * obs-websocket: Update version to 5.7.1 + * frontend: Improve plugin manager safe mode behavior + * Update Code of Conduct instructions (#13164) + * Update README.rst to include directly a link to the Code of Conduct + * frontend: Update parent logic for systray menu projector items + * frontend: Update parent logic, remove explicit delete calls + * frontend: Fix unclean shutdown on Windows + * frontend: Fix duplicated layout name + * frontend: Set mixer toolbar size policy + * cmake: Make release builds more reproducible + * updater: Update CMake to make builds more reproducible + * updater: Add log window and additional log messages + * updater: Check return values in ClearShaderCache + * docs: Fix typo in obs_enum_canvases description + * obs-browser: Update version to 2.26.8 + * frontend: Ignore sources with disabled audio in mixer + * obs-filters: Remove unnecessary nvafx-load.h header + * frontend: Defer mixer rename dialog + * frontend: Skip background paint for invalid sizes + * libobs: Properly handle NULL data in json + * frontend: Fix VolumeControl rendering + * updater: Fix incorrect format specifier + * updater: Don't force file flushes when writing new files + * updater: Improve exception handling + * updater: Fix various race conditions and error handling + * rtmp-services: Remove defunct STAGE TEN + * frontend: Round all output theme values + +------------------------------------------------------------------- +Fri Feb 06 01:51:03 UTC 2026 - darix <packman@nordisch.org> + +- Update to version 32.1.0~rc1: + * frontend: Update unassigned audio track warning text + * frontend: Adjust log upload text for current logs + * file-updater: Use exact types to avoid clang-19 errors + * plugins: Use exact types to avoid clang-19 errors + * frontend: Add needed FreeBSD sys/ headers for libprocstat.h to compile + * image-source: Fix interrupted transitions + * frontend: Clean up mixer hidden state + * obs-browser: Update version to 2.26.7 + * frontend: Fix macOS crash in application shutdown + * frontend: Fix Youtube app dock destruction + * shared/media-playback: Fix corrupt MaxCLL when reading HDR metadata + * frontend: Add headphones icon in Light Theme + * frontend: Add horizontal and vertical icon in Light Theme + * frontend: Fix monitoring icon color in Acri theme + * frontend: Fix monitoring icon color in Rachni theme + * rtmp-services: Add Sportify + * frontend: Update previewed sources in mixer by visibility + * frontend: Close rename dialog if name unchanged + * frontend: Use disabled meter colors when output muted + * frontend: Revert Add Source dialog update + * obs-browser: Update version to 2.26.6 + * frontend: Restrict audio meter update region + * frontend: Force update volume meter backgrounds + * linux-pipewire: Fix camera framerate listing + * frontend: Implement sizeHint for VolumeMeter + * rtmp-services: Remove legacy SharePlay.tv servers + * frontend: Properly update studio mode mixer + * frontend: Fix audio mixer monitoring state + * frontend: Update menu text when switching layouts + * frontend: Fix default value for full-height docks + * frontend: Make Add Existing Button translatable + * frontend: Make Audio Mixer Hidden Button translatable + +------------------------------------------------------------------- +Fri Jan 16 23:45:59 UTC 2026 - darix <packman@nordisch.org> + +- Update to version 32.1.0~beta2: + * libobs, frontend: Signal transition_stop for cancelled transitions + * frontend: Prevent setting transition during transitions + * libobs: Add obs_transition_is_active + * linux-pulseaudio: Fix bad channels message format + * linux-pipewire: Fix format description + * libobs: Restore only canvases that have video info + * frontend: Refresh meter background on style change + * frontend: Fix audio mixer dialog on classic theme + * frontend: Only round final theme values + * frontend: Add vcs-browser to metainfo + * frontend: Remove unused audio mixer widgets + * frontend: Fix Audio Mixer toolbar tooltips + * frontend: Round theme variables with "px" units + +------------------------------------------------------------------- +Thu Jan 15 00:45:53 UTC 2026 - darix <packman@nordisch.org> + +- Update to version 32.1.0~beta1: + * libobs: Update version to 32.1.0 + * frontend: Fix groups not being saved to collection + * frontend: Replace add source dropdown with dialog + * linux-pipewire: Make camera framerate non-mandatory + * plugins: Fix typos + * libobs-metal: Fix typos + * libobs: Fix typos + * frontend: Fix typos + * docs: Fix typos + * CI: Fix typo + * cmake: Fix typo + * mac-capture: Avoid inadvertent capture of screen content + * nv-filters: Skip Blur filter for HDR + * nv-filters: Remove stage image for Video FX + * nv-filters: Fix banding issues with Blur effects + * CI: Add Xcode compile cache to scheduled cleanup + * docs: Add audio encoder priming sample APIs + * obs-ffmpeg: Set initial_padding in FFmpeg muxer + * obs-libfdk: Implement priming samples API + * obs-ffmpeg: Implement priming samples API + * coreaudio-encoder: Implement priming samples API + * libobs: Add API for getting priming samples from audio encoders + * frontend: Display volume source names with QLabel + * frontend: Refactor and update Audio Mixer + * frontend: Add Menu Checkbox widget + * frontend: Add icon recoloring to state style event filter + * frontend: Create event filter for widget state styles + * libobs-metal: Use concurrency-friendly present + * CI: Replace ccache with Xcode compile cache + * cmake: Remove ccache support from Xcode builds + * frontend: Fix QSystemTrayIcon and QMenu delete order + * Remove buildspec file from project + * CI: Remove buildspec usage from Windows builds + * CI: Remove buildspec usage from Zsh scripts + * CI: Replace buildspec in Appcast update action + * cmake: Update buildspec system to use preset file + * cmake: Add dependency information to preset + * frontend-tools: Add lua registered source to module + * build-aux,CI: Update Flatpak to 2026-01-09 deps + * obs-browser: Update version to 2.26.4 + * Update translations from Crowdin + * build-aux: Update gersemi formatting script + * cmake: Apply gersemi 0.25 formatting + * CI: Update gersemi formula + * obs-outputs: Fix chapter ts when using file splitting + * libobs: Restore original video_t for encoders when GPU scaling is used + * frontend: Add more source undo/redo actions + * frontend: Update transform dialog + * frontend: Create AlignmentSelector widget + * frontend: Make sure all scene item properties are copied + * frontend: Sync Preview/Program size and positioning + * frontend: Refactor OBSBasic::Save to only save frontend canvas scenes/groups + * rtmp-services: Remove defunct servers/services + * frontend: Disable dock animations + * frontend: Move transition preview button to button box + * frontend: Rearrange default dock positions + * libobs: Remove "using namespace std" from headers + * frontend: Remove implicit capture of "this" using "=" + * frontend: Replace "=" capture with "this" + * coreaudio-encoder: Use canonical format enum instead of bitwise or + * cmake: Disable char8_t on macOS with C++20 + * mac-avcapture/legacy: Move comparison operator up + * frontend: Use palette for Light theme audio mixer + * frontend: Round display size for projectors + * build-aux,CI: Replace Flatpak KDE SDK with Freedesktop SDK + * build-aux: Replace Flatpak modules with pre-compiled dependencies + * plugins: Set missed default bitrates to 6000 kbps + * frontend: Remove Source from source names + * frontend: Remove "using namespace std" from headers + * shared/bpm: Fix NAL type for HEVC user data SEIs + * libobs: Fix NAL type for HEVC caption SEIs + * frontend/cmake: Enable Qt strict mode + * frontend,shared: Replace and disable contextless connect calls + * frontend: Replace and disable QString to QUrl casts + * frontend,shared: Replace and disable QByteArray to char * casts + * frontend: Replace #defines in YoutubeApiWrappers + * frontend: Avoid unnecessary QString<->const char * conversions + * frontend: Increase media playback slider fidelity + * frontend: Cleanup Qt GuiPrivate linkage + * obs-webrtc: Add Simulcast Support +- drop 12328.patch + +------------------------------------------------------------------- Thu Jan 15 00:36:59 UTC 2026 - darix <packman@nordisch.org> - Downgrade to ffmpeg 7 until I clarified the vlc part
View file
obs-studio.spec
Changed
@@ -50,7 +50,7 @@ %endif Name: obs-studio -Version: 32.0.4 +Version: 32.1.0 Release: 0 Summary: A recording/broadcasting program Group: Productivity/Multimedia/Video/Editors and Convertors @@ -66,8 +66,6 @@ Patch1: 0001-Prefix-modinfo-with-sbin-since-not-in-normal-path.patch Patch2: libx264-optional.patch Patch3: ffmpeg-x11-linking.patch -# quilt refreshed version of https://patch-diff.githubusercontent.com/raw/obsproject/obs-studio/pull/12328.patch -Patch4: 12328.patch BuildRequires: update-desktop-files BuildRequires: cmake >= 2.8.12 BuildRequires: extra-cmake-modules
View file
12328.patch
Deleted
@@ -1,111 +0,0 @@ -From 26dfacbd4f5217258a2f1c5472a544c65a182d10 Mon Sep 17 00:00:00 2001 -From: tytan652 <tytan652@tytanium.xyz> -Date: Tue, 1 Jul 2025 20:53:48 +0200 -Subject: PATCH frontend: Cleanup Qt GuiPrivate linkage - -Remove unneeded linkages and guard needed ones for Qt versions earlier -than 6.9.0. ---- - frontend/cmake/os-freebsd.cmake | 6 +++++- - frontend/cmake/os-linux.cmake | 6 +++++- - frontend/plugins/aja-output-ui/CMakeLists.txt | 3 --- - frontend/plugins/decklink-output-ui/CMakeLists.txt | 3 --- - frontend/plugins/frontend-tools/CMakeLists.txt | 2 -- - 5 files changed, 10 insertions(+), 10 deletions(-) - -Index: obs-studio/frontend/cmake/os-freebsd.cmake -=================================================================== ---- obs-studio.orig/frontend/cmake/os-freebsd.cmake -+++ obs-studio/frontend/cmake/os-freebsd.cmake -@@ -7,7 +7,11 @@ target_sources( - utility/system-info-posix.cpp - ) - target_compile_definitions(obs-studio PRIVATE OBS_INSTALL_PREFIX="${OBS_INSTALL_PREFIX}") --target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate Qt::DBus procstat) -+target_link_libraries(obs-studio PRIVATE Qt::DBus procstat) -+ -+if(Qt6_VERSION AND Qt6_VERSION VERSION_LESS "6.9.0") -+ target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate) -+endif() - - find_package(Libpci REQUIRED) - target_link_libraries(obs-studio PRIVATE Libpci::pci) -Index: obs-studio/frontend/cmake/os-linux.cmake -=================================================================== ---- obs-studio.orig/frontend/cmake/os-linux.cmake -+++ obs-studio/frontend/cmake/os-linux.cmake -@@ -10,7 +10,11 @@ target_compile_definitions( - obs-studio - PRIVATE OBS_INSTALL_PREFIX="${OBS_INSTALL_PREFIX}" $<$<BOOL:${ENABLE_PORTABLE_CONFIG}>:ENABLE_PORTABLE_CONFIG> - ) --target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate Qt::DBus) -+target_link_libraries(obs-studio PRIVATE Qt::DBus) -+ -+if(Qt6_VERSION AND Qt6_VERSION VERSION_LESS "6.9.0") -+ target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate) -+endif() - - find_package(Libpci REQUIRED) - target_link_libraries(obs-studio PRIVATE Libpci::pci) -Index: obs-studio/frontend/plugins/aja-output-ui/CMakeLists.txt -=================================================================== ---- obs-studio.orig/frontend/plugins/aja-output-ui/CMakeLists.txt -+++ obs-studio/frontend/plugins/aja-output-ui/CMakeLists.txt -@@ -10,8 +10,6 @@ find_package(LibAJANTV2 REQUIRED) - find_package(Qt6 REQUIRED Widgets) - - if(OS_LINUX OR OS_FREEBSD OR OS_OPENBSD) -- find_package(Qt6 REQUIRED Gui) -- - find_package(X11 REQUIRED) - endif() - -@@ -47,7 +45,6 @@ target_link_libraries( - Qt::Widgets - AJA::LibAJANTV2 - $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:X11::X11> -- $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:Qt::GuiPrivate> - ) - - target_link_options(aja-output-ui PRIVATE $<$<PLATFORM_ID:Windows>:/IGNORE:4099>) -Index: obs-studio/frontend/plugins/decklink-output-ui/CMakeLists.txt -=================================================================== ---- obs-studio.orig/frontend/plugins/decklink-output-ui/CMakeLists.txt -+++ obs-studio/frontend/plugins/decklink-output-ui/CMakeLists.txt -@@ -8,8 +8,6 @@ endif() - find_package(Qt6 REQUIRED Widgets) - - if(OS_LINUX OR OS_FREEBSD OR OS_OPENBSD) -- find_package(Qt6 REQUIRED Gui) -- - find_package(X11 REQUIRED) - endif() - -@@ -38,7 +36,6 @@ target_link_libraries( - Qt::Widgets - "$<$<PLATFORM_ID:Darwin>:$<LINK_LIBRARY:FRAMEWORK,Cocoa.framework>>" - $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:X11::X11> -- $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:Qt::GuiPrivate> - ) - - if(OS_WINDOWS) -Index: obs-studio/frontend/plugins/frontend-tools/CMakeLists.txt -=================================================================== ---- obs-studio.orig/frontend/plugins/frontend-tools/CMakeLists.txt -+++ obs-studio/frontend/plugins/frontend-tools/CMakeLists.txt -@@ -3,7 +3,6 @@ cmake_minimum_required(VERSION 3.28...3. - find_package(Qt6 REQUIRED Widgets) - - if(OS_LINUX OR OS_FREEBSD OR OS_OPENBSD) -- find_package(Qt6 REQUIRED Gui) - find_package(X11 REQUIRED) - endif() - -@@ -65,7 +64,6 @@ target_link_libraries( - Qt::Widgets - "$<$<PLATFORM_ID:Darwin>:$<LINK_LIBRARY:FRAMEWORK,Cocoa>>" - $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:X11::X11> -- $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:Qt::GuiPrivate> - ) - - add_subdirectory("${CMAKE_SOURCE_DIR}/shared/obs-scripting" "${CMAKE_BINARY_DIR}/shared/obs-scripting")
View file
_service
Changed
@@ -1,7 +1,8 @@ <services> <service name="tar_scm" mode="manual"> <param name="versionformat">@PARENT_TAG@</param> - <param name="revision">32.0.4</param> + <param name="revision">32.1.0</param> + <param name="url">https://github.com/obsproject/obs-studio.git</param> <param name="versionrewrite-pattern">(\.\d+)-(a-z.*)</param> <param name="versionrewrite-replacement">\1~\2</param>
View file
_servicedata
Changed
@@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/obsproject/obs-studio.git</param> - <param name="changesrevision">dcdbd2e9048ae66237fdab32dbba72b745b1b9c5</param> + <param name="changesrevision">5533a277e4400203b50114c993f89878d50a27b9</param> </service> </servicedata> \ No newline at end of file
View file
obs-studio-32.0.4.tar.xz/build-aux/modules
Deleted
-(directory)
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/10-mbedtls.json
Deleted
@@ -1,24 +0,0 @@ -{ - "name": "mbedtls", - "buildsystem": "cmake-ninja", - "builddir": true, - "config-opts": - "-DCMAKE_BUILD_TYPE=Release", - "-DCMAKE_POSITION_INDEPENDENT_CODE=ON", - "-DUSE_SHARED_MBEDTLS_LIBRARY=ON", - "-DUSE_STATIC_MBEDTLS_LIBRARY=OFF", - "-DENABLE_TESTING=OFF", - "-DENABLE_PROGRAMS=OFF" - , - "cleanup": - "/include" - , - "sources": - { - "type": "git", - "url": "https://github.com/Mbed-TLS/mbedtls.git", - "commit": "c765c831e5c2a0971410692f92f7a81d6ec65ec2", - "tag": "v3.6.4" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/20-aom.json.disabled
Deleted
@@ -1,25 +0,0 @@ -{ - "name": "aom", - "buildsystem": "cmake-ninja", - "builddir": true, - "config-opts": - "-DBUILD_SHARED_LIBS=ON", - "-DENABLE_DOCS=OFF", - "-DENABLE_EXAMPLES=OFF", - "-DENABLE_TESTDATA=OFF", - "-DENABLE_TESTS=OFF", - "-DENABLE_TOOLS=OFF " - , - "cleanup": - "/include", - "/lib/pkgconfig" - , - "sources": - { - "type": "git", - "url": "https://aomedia.googlesource.com/aom.git", - "tag": "v3.9.0", - "commit": "6cab58c3925e0f4138e15a4ed510161ea83b6db1" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/20-librist.json
Deleted
@@ -1,22 +0,0 @@ -{ - "name": "librist", - "buildsystem": "meson", - "builddir": true, - "config-opts": - "-Duse_mbedtls=true", - "-Dtest=false", - "-Dbuilt_tools=false", - "-Dbuiltin_cjson=true" - , - "cleanup": - "/include", - "/lib/pkgconfig" - , - "sources": - { - "type": "git", - "url": "https://code.videolan.org/rist/librist.git", - "commit": "809390b3b75a259a704079d0fb4d8f1b5f7fa956" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/20-nv-codec.json
Deleted
@@ -1,18 +0,0 @@ -{ - "name": "nv-codec", - "no-autogen": true, - "make-install-args": - "PREFIX=/app" - , - "cleanup": - "*" - , - "sources": - { - "type": "git", - "url": "https://github.com/FFmpeg/nv-codec-headers.git", - "tag": "n12.2.72.0", - "commit": "c69278340ab1d5559c7d7bf0edf615dc33ddbba7" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/20-srt.json
Deleted
@@ -1,23 +0,0 @@ -{ - "name": "srt", - "buildsystem": "cmake-ninja", - "config-opts": - "-DCMAKE_BUILD_TYPE=Release", - "-DENABLE_STATIC=OFF", - "-DENABLE_APPS=OFF", - "-DENABLE_LOGGING=OFF" - , - "cleanup": - "/include", - "/lib/pkgconfig", - "/bin" - , - "sources": - { - "type": "git", - "url": "https://github.com/Haivision/srt.git", - "tag": "v1.5.3", - "commit": "09f35c0f1743e23f514cb41444504a7faeacf89e" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/20-svt-av1.json
Deleted
@@ -1,25 +0,0 @@ -{ - "name": "svt-av1", - "buildsystem": "cmake-ninja", - "builddir": true, - "config-opts": - "-DCMAKE_BUILD_TYPE=Release", - "-DBUILD_SHARED_LIBS=ON", - "-DBUILD_APPS=OFF", - "-DBUILD_DEC=ON", - "-DBUILD_ENC=ON", - "-DBUILD_TESTING=OFF" - , - "cleanup": - "/include", - "/lib/pkgconfig" - , - "sources": - { - "type": "git", - "url": "https://gitlab.com/AOMediaCodec/SVT-AV1.git", - "tag": "v2.3.0", - "commit": "6e69def4ec283fe0b71195671245c3b768bebdef" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/20-x264.json
Deleted
@@ -1,18 +0,0 @@ -{ - "name": "x264", - "config-opts": - "--disable-cli", - "--enable-shared" - , - "cleanup": - "/include", - "/lib/pkgconfig" - , - "sources": - { - "type": "git", - "url": "https://code.videolan.org/videolan/x264.git", - "commit": "eaa68fad9e5d201d42fde51665f2d137ae96baf0" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/30-ffmpeg.json
Deleted
@@ -1,54 +0,0 @@ -{ - "name": "ffmpeg", - "config-opts": - "--enable-gpl", - "--enable-shared", - "--disable-static", - "--enable-gnutls", - "--disable-doc", - "--disable-programs", - "--disable-devices", - "--enable-libopus", - "--enable-libvpx", - "--enable-libvorbis", - "--enable-libx264", - "--enable-nvenc", - "--enable-libsrt", - "--enable-librist", - "--enable-libaom", - "--enable-libsvtav1" - , - "cleanup": - "/share/ffmpeg" - , - "sources": - { - "type": "git", - "url": "https://github.com/FFmpeg/FFmpeg.git", - "tag": "n7.1.1", - "commit": "db69d06eeeab4f46da15030a80d539efb4503ca8", - "disable-shallow-clone": true - }, - { - "type": "git", - "dest": "obs-deps", - "url": "https://github.com/obsproject/obs-deps.git", - "tag": "2024-09-05", - "commit": "45b7d2cfac0e2ac256d458c7466a925b0a94de35" - }, - { - "type": "patch", - "paths": - "patches/ffmpeg/0001-lavc-vaapi_encode-Query-surface-alignment.patch", - "patches/ffmpeg/0002-lavc-vaapi_encode_h265-Use-surface-alignment.patch" - - }, - { - "type": "shell", - "commands": - "patch -Np1 -i obs-deps/deps.ffmpeg/patches/FFmpeg/0001-flvdec-handle-unknown.patch", - "patch -Np1 -i obs-deps/deps.ffmpeg/patches/FFmpeg/0002-libaomenc-presets.patch" - - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/40-luajit.json
Deleted
@@ -1,24 +0,0 @@ -{ - "name": "luajit", - "no-autogen": true, - "cleanup": - "/bin", - "/include", - "/lib/pkgconfig", - "*.a" - , - "sources": - { - "type": "git", - "url": "https://github.com/LuaJIT/LuaJIT.git", - "commit": "a4f56a459a588ae768801074b46ba0adcfb49eb1", - "disable-shallow-clone": true - }, - { - "type": "shell", - "commands": - "sed -i 's|/usr/local|/app|' ./Makefile" - - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/40-plog.json
Deleted
@@ -1,19 +0,0 @@ -{ - "name": "plog", - "buildsystem": "cmake-ninja", - "config-opts": - "-DCMAKE_BUILD_TYPE=Release", - "-DPLOG_BUILD_SAMPLES=OFF" - , - "cleanup": - "*" - , - "sources": - { - "type": "git", - "url": "https://github.com/SergiusTheBest/plog.git", - "tag": "1.1.10", - "commit": "e21baecd4753f14da64ede979c5a19302618b752" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/40-usrsctp.json
Deleted
@@ -1,22 +0,0 @@ -{ - "name": "usrsctp", - "buildsystem": "cmake-ninja", - "//": "Disable SCTP IP code. Packets are handle by WebRTC so we don't need it", - "config-opts": - "-DCMAKE_BUILD_TYPE=Release", - "-Dsctp_build_shared_lib=ON", - "-Dsctp_build_programs=OFF", - "-Dsctp_inet=OFF", - "-Dsctp_inet6=OFF", - "-Dsctp_werror=OFF", - "-DCMAKE_POSITION_INDEPENDENT_CODE=ON" - , - "sources": - { - "type": "git", - "url": "https://github.com/sctplab/usrsctp.git", - "tag": "0.9.5.0", - "commit": "07f871bda23943c43c9e74cc54f25130459de830" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/50-intel-media-sdk.json
Deleted
@@ -1,34 +0,0 @@ -{ - "name": "intel-media-sdk", - "buildsystem": "cmake-ninja", - "builddir": true, - "config-opts": - "-DCMAKE_BUILD_TYPE=Release", - "-DBUILD_SAMPLES=OFF", - "-DBUILD_TUTORIALS=OFF", - "-DENABLE_OPENCL=OFF", - "-DENABLE_WAYLAND=OFF", - "-DENABLE_X11=OFF", - "-DENABLE_X11_DRI3=OFF" - , - "cleanup": - "/include", - "/lib/pkgconfig" - , - "sources": - { - "type": "git", - "url": "https://github.com/Intel-Media-SDK/MediaSDK.git", - "commit": "869b60a6c3d7b5e9f7c3b3b914986322dca4bbae", - "tag": "intel-mediasdk-23.2.2" - }, - { - "type": "patch", - "path": "patches/intel-media-sdk/010-intel-media-sdk-fix-reproducible-build.patch" - }, - { - "type": "patch", - "path": "patches/intel-media-sdk/020-intel-media-sdk-gcc13-fix.patch" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/50-jansson.json
Deleted
@@ -1,24 +0,0 @@ -{ - "name": "jansson", - "buildsystem": "cmake-ninja", - "builddir": true, - "config-opts": - "-DCMAKE_BUILD_TYPE=Release", - "-DJANSSON_EXAMPLES=OFF", - "-DJANSSON_BUILD_DOCS=OFF", - "-DJANSSON_BUILD_SHARED_LIBS=ON", - "-DJANSSON_WITHOUT_TESTS=ON" - , - "cleanup": - "/include", - "/lib/pkgconfig" - , - "sources": - { - "type": "git", - "url": "https://github.com/akheron/jansson.git", - "tag": "v2.14", - "commit": "684e18c927e89615c2d501737e90018f4930d6c5" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/50-libdatachannel.json
Deleted
@@ -1,21 +0,0 @@ -{ - "name": "libdatachannel", - "buildsystem": "cmake-ninja", - "config-opts": - "-DCMAKE_BUILD_TYPE=Release", - "-DNO_EXAMPLES=ON", - "-DNO_TESTS=ON", - "-DNO_WEBSOCKET=ON", - "-DUSE_NICE=ON", - "-DPREFER_SYSTEM_LIB=ON" - , - "sources": - { - "type": "git", - "url": "https://github.com/paullouisageneau/libdatachannel.git", - "disable-submodules": true, - "tag": "v0.21.1", - "commit": "898bdffe7340134f0891633cc7a6f6d2132c31c3" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/50-libqrcodegencpp.json
Deleted
@@ -1,27 +0,0 @@ -{ - "name": "libqrcodegencpp", - "buildsystem": "cmake-ninja", - "builddir": true, - "config-opts": - "-DCMAKE_BUILD_TYPE=Release", - "-DBUILD_SHARED_LIBS=ON" - , - "post-install": - "rm -rf /app/include/qrcodegen", - "rm -rf /app/lib/cmake/qrcodegen", - "rm -rf /app/lib/pkgconfig/qrcodegen.pc", - "rm -rf /app/lib/libqrcodegen.*" - , - "sources": - { - "type": "archive", - "url": "https://github.com/nayuki/QR-Code-generator/archive/refs/tags/v1.8.0.tar.gz", - "sha256": "2ec0a4d33d6f521c942eeaf473d42d5fe139abcfa57d2beffe10c5cf7d34ae60" - }, - { - "type": "archive", - "url": "https://github.com/EasyCoding/qrcodegen-cmake/archive/refs/tags/v1.8.0-cmake3.tar.gz", - "sha256": "2037b0596e5651ce020f4d36e958d24672dbee75631bdb09ae8a45659121f4d0" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/50-libvpl.json
Deleted
@@ -1,25 +0,0 @@ -{ - "name": "libvpl", - "buildsystem": "cmake-ninja", - "builddir": true, - "config-opts": - "-DCMAKE_BUILD_TYPE=Release", - "-DENABLE_LIBDIR_IN_RUNTIME_SEARCH=ON", - "-DINSTALL_DEV=ON", - "-DBUILD_EXAMPLES=OFF", - "-DBUILD_EXPERIMENTAL=OFF", - "-DBUILD_SHARED_LIBS=ON" - , - "cleanup": - "/include", - "/lib/pkgconfig" - , - "sources": - { - "type": "git", - "url": "https://github.com/intel/libvpl.git", - "commit": "025d43d086a3e663184cb49febe86152bf05409f", - "tag": "v2.14.0" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/50-ntv2.json
Deleted
@@ -1,30 +0,0 @@ -{ - "name": "ntv2", - "buildsystem": "cmake-ninja", - "builddir": true, - "config-opts": - "-DCMAKE_BUILD_TYPE=Release", - "-DAJANTV2_BUILD_OPENSOURCE=ON", - "-DAJANTV2_BUILD_SHARED=OFF", - "-DAJANTV2_DISABLE_DEMOS=ON", - "-DAJANTV2_DISABLE_DRIVER=ON", - "-DAJANTV2_DISABLE_TESTS=ON", - "-DAJANTV2_DISABLE_TOOLS=ON", - "-DAJANTV2_DISABLE_PLUGINS=ON", - "-DAJA_INSTALL_HEADERS=ON", - "-DAJA_INSTALL_SOURCES=OFF", - "-DAJA_INSTALL_MISC=OFF", - "-DAJA_INSTALL_CMAKE=OFF" - , - "cleanup": - "/include" - , - "sources": - { - "type": "git", - "url": "https://github.com/aja-video/libajantv2.git", - "tag": "ntv2_17_0_1", - "commit": "b6acce6b135c3d9ae7a2bce966180b159ced619f" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/50-pipewire.json.disabled
Deleted
@@ -1,32 +0,0 @@ -{ - "name": "pipewire", - "buildsystem": "meson", - "config-opts": - "-Daudiotestsrc=disabled", - "-Droc=disabled", - "-Dvideotestsrc=disabled", - "-Dvolume=disabled", - "-Dvulkan=disabled", - "-Ddocs=disabled", - "-Dman=disabled", - "-Dbluez5-codec-ldac=disabled", - "-Dbluez5-codec-aptx=disabled", - "-Dlibcamera=disabled", - "-Dudevrulesdir=/app/lib/udev/rules.d/", - "-Dsession-managers=", - "-Dtests=disabled", - "-Dexamples=disabled", - "-Dpw-cat=disabled" - , - "cleanup": - "/bin" - , - "sources": - { - "type": "git", - "url": "https://github.com/pipewire/pipewire.git", - "tag": "0.3.65", - "commit": "9558a5d5e0360d8af822431c76ee858a8c7495ac" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/50-rnnoise.json
Deleted
@@ -1,21 +0,0 @@ -{ - "name": "rnnoise", - "config-opts": - "--enable-shared", - "-C", - "--disable-dependency-tracking", - "--disable-doc", - "--disable-examples" - , - "cleanup": - "/include", - "/lib/pkgconfig" - , - "sources": - { - "type": "git", - "url": "https://github.com/xiph/rnnoise.git", - "commit": "085d8f484af6141b1b88281a4043fb9215cead01" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/50-swig.json
Deleted
@@ -1,21 +0,0 @@ -{ - "name": "swig", - "config-opts": - "--without-boost", - "--without-pcre", - "--without-alllang", - "--with-lua=/app/bin/luajit-2.1.0-beta3", - "--with-luaincl=/app/include/luajit-2.1", - "--with-python3" - , - "cleanup": - "*" - , - "sources": - { - "type": "archive", - "url": "https://prdownloads.sourceforge.net/swig/swig-4.0.2.tar.gz", - "sha256": "d53be9730d8d58a16bf0cbd1f8ac0c0c3e1090573168bfa151b01eb47fa906fc" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/50-v4l-utils.json
Deleted
@@ -1,22 +0,0 @@ -{ - "name": "v4l-utils", - "config-opts": - "--disable-static", - "--disable-doxygen-doc", - "--disable-libdvbv5", - "--disable-v4l-utils", - "--disable-qv4l2", - "--with-udevdir=/app/lib/udev/" - , - "cleanup": - "/include", - "/lib/pkgconfig" - , - "sources": - { - "type": "archive", - "url": "https://linuxtv.org/downloads/v4l-utils/v4l-utils-1.22.0.tar.bz2", - "sha256": "1069e5d7909bcc563baeaadc3a5c496f0e658524c413cf7818816e37bfcea344" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/50-vpl-gpu-rt.json
Deleted
@@ -1,28 +0,0 @@ -{ - "name": "vpl-gpu-rt", - "buildsystem": "cmake-ninja", - "builddir": true, - "config-opts": - "-DCMAKE_BUILD_TYPE=Release", - "-DBUILD_RUNTIME=ON", - "-DBUILD_TESTS=OFF", - "-DBUILD_TOOLS=OFF" - , - "cleanup": - "/lib/pkgconfig" - , - "sources": - { - "type": "git", - "url": "https://github.com/intel/vpl-gpu-rt.git", - "commit": "7277c25ec5362e92d2fa334e2ce356c473ba4778", - "tag": "intel-onevpl-24.4.4" - }, - { - "type": "shell", - "commands": - "sed -i 's/CMAKE_VERBOSE_MAKEFILE ON/CMAKE_VERBOSE_MAKEFILE OFF/g' builder/profiles/onevpl.cmake" - - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/90-asio.json
Deleted
@@ -1,17 +0,0 @@ -{ - "name": "asio", - "buildsystem": "simple", - "build-commands": - "mkdir -p /app/include", - "cp asio/include/asio.hpp /app/include/", - "cp -R asio/include/asio /app/include/" - , - "sources": - { - "type": "git", - "url": "https://github.com/chriskohlhoff/asio.git", - "tag": "asio-1-32-0", - "commit": "03ae834edbace31a96157b89bf50e5ee464e5ef9" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/90-nlohmann-json.json
Deleted
@@ -1,17 +0,0 @@ -{ - "name": "nlohmann-json", - "buildsystem": "cmake-ninja", - "builddir": true, - "config-opts": - "-DCMAKE_BUILD_TYPE=Release", - "-DJSON_BuildTests=OFF" - , - "sources": - { - "type": "git", - "url": "https://github.com/nlohmann/json.git", - "tag": "v3.11.3", - "commit": "9cca280a4d0ccf0c08f47a99aa71d1b0e52f8d03" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/90-simde.json
Deleted
@@ -1,16 +0,0 @@ -{ - "name": "simde", - "buildsystem": "meson", - "builddir": true, - "config-opts": - "-Dtests=false" - , - "sources": - { - "type": "git", - "url": "https://github.com/simd-everywhere/simde.git", - "tag": "v0.8.2", - "commit": "71fd833d9666141edcd1d3c109a80e228303d8d7" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/90-uthash.json
Deleted
@@ -1,19 +0,0 @@ -{ - "name": "uthash", - "buildsystem": "simple", - "build-commands": - "mkdir -p /app/include", - "cp src/{utarray.h,uthash.h,utlist.h,utringbuffer.h,utstack.h,utstring.h} /app/include/" - , - "cleanup": - "*" - , - "sources": - { - "type": "git", - "url": "https://github.com/troydhanson/uthash.git", - "tag": "v2.3.0", - "commit": "e493aa90a2833b4655927598f169c31cfcdf7861" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/90-websocketpp.json
Deleted
@@ -1,19 +0,0 @@ -{ - "name": "websocketpp", - "buildsystem": "cmake-ninja", - "builddir": true, - "config-opts": - "-DCMAKE_BUILD_TYPE=Release", - "-DENABLE_CPP11=ON", - "-DBUILD_EXAMPLES=OFF", - "-DBUILD_TESTS=OFF" - , - "sources": - { - "type": "git", - "url": "https://github.com/zaphoyd/websocketpp.git", - "tag": "0.8.2", - "commit": "56123c87598f8b1dd471be83ca841ceae07f95ba" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/99-cef.json
Deleted
@@ -1,24 +0,0 @@ -{ - "name": "cef", - "build-options": { - "no-debuginfo": true - }, - "buildsystem": "simple", - "build-commands": - "mkdir -p /app/cef/libcef_dll_wrapper", - "cp -R ./include /app/cef", - "cp -R ./Release /app/cef", - "cp -R ./Resources /app/cef", - "cp -R ./build/libcef_dll_wrapper/libcef_dll_wrapper.a /app/cef/libcef_dll_wrapper" - , - "cleanup": - "*" - , - "sources": - { - "type": "archive", - "url": "https://cdn-fastly.obsproject.com/downloads/cef_binary_6533_linux_x86_64_v6.tar.xz", - "sha256": "7963335519a19ccdc5233f7334c5ab023026e2f3e9a0cc417007c09d86608146" - } - -}
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/patches
Deleted
-(directory)
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/patches/ffmpeg
Deleted
-(directory)
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/patches/ffmpeg/0001-lavc-vaapi_encode-Query-surface-alignment.patch
Deleted
@@ -1,115 +0,0 @@ -From bcfbf2bac8f9eeeedc407b40596f5c7aaa0d5b47 Mon Sep 17 00:00:00 2001 -From: David Rosca <nowrep@gmail.com> -Date: Tue, 22 Oct 2024 17:26:58 +0200 -Subject: PATCH 1/2 lavc/vaapi_encode: Query surface alignment - -It needs to create temporary config to query surface attribute. - -Signed-off-by: Timo Rothenpieler <timo@rothenpieler.org> ---- - libavcodec/vaapi_encode.c | 66 +++++++++++++++++++++++++++++++++++++++ - libavcodec/vaapi_encode.h | 4 +++ - 2 files changed, 70 insertions(+) - -diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c -index b593d976ef..8960e6b20a 100644 ---- a/libavcodec/vaapi_encode.c -+++ b/libavcodec/vaapi_encode.c -@@ -1133,6 +1133,68 @@ fail: - return err; - } - -+static av_cold int vaapi_encode_surface_alignment(av_unused AVCodecContext *avctx) -+{ -+#if VA_CHECK_VERSION(1, 21, 0) -+ VAAPIEncodeContext *ctx = avctx->priv_data; -+ VASurfaceAttrib *attr_list = NULL; -+ unsigned int attr_count = 0; -+ VAConfigID va_config; -+ VAStatus vas; -+ int err = 0; -+ -+ vas = vaCreateConfig(ctx->hwctx->display, -+ ctx->va_profile, ctx->va_entrypoint, -+ NULL, 0, &va_config); -+ if (vas != VA_STATUS_SUCCESS) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to create temp encode pipeline " -+ "configuration: %d (%s).\n", vas, vaErrorStr(vas)); -+ return AVERROR(EIO); -+ } -+ -+ vas = vaQuerySurfaceAttributes(ctx->hwctx->display, va_config, -+ 0, &attr_count); -+ if (vas != VA_STATUS_SUCCESS) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to query surface attributes: " -+ "%d (%s).\n", vas, vaErrorStr(vas)); -+ err = AVERROR_EXTERNAL; -+ goto fail; -+ } -+ -+ attr_list = av_malloc(attr_count * sizeof(*attr_list)); -+ if (!attr_list) { -+ err = AVERROR(ENOMEM); -+ goto fail; -+ } -+ -+ vas = vaQuerySurfaceAttributes(ctx->hwctx->display, va_config, -+ attr_list, &attr_count); -+ if (vas != VA_STATUS_SUCCESS) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to query surface attributes: " -+ "%d (%s).\n", vas, vaErrorStr(vas)); -+ err = AVERROR_EXTERNAL; -+ goto fail; -+ } -+ -+ for (unsigned int i = 0; i < attr_count; i++) { -+ if (attr_listi.type == VASurfaceAttribAlignmentSize) { -+ ctx->surface_alignment_width = -+ 1 << (attr_listi.value.value.i & 0xf); -+ ctx->surface_alignment_height = -+ 1 << ((attr_listi.value.value.i & 0xf0) >> 4); -+ break; -+ } -+ } -+ -+fail: -+ av_freep(&attr_list); -+ vaDestroyConfig(ctx->hwctx->display, va_config); -+ return err; -+#else -+ return 0; -+#endif -+} -+ - static const VAAPIEncodeRCMode vaapi_encode_rc_modes = { - // Bitrate Quality - // | Maxrate | HRD/VBV -@@ -2111,6 +2173,10 @@ av_cold int ff_vaapi_encode_init(AVCodecContext *avctx) - if (err < 0) - goto fail; - -+ err = vaapi_encode_surface_alignment(avctx); -+ if (err < 0) -+ goto fail; -+ - if (ctx->codec->get_encoder_caps) { - err = ctx->codec->get_encoder_caps(avctx); - if (err < 0) -diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h -index 40a3f4e064..8e3eab9f27 100644 ---- a/libavcodec/vaapi_encode.h -+++ b/libavcodec/vaapi_encode.h -@@ -260,6 +260,10 @@ typedef struct VAAPIEncodeContext { - * This is a RefStruct reference. - */ - VABufferID *coded_buffer_ref; -+ -+ // Surface alignment required by driver. -+ int surface_alignment_width; -+ int surface_alignment_height; - } VAAPIEncodeContext; - - typedef struct VAAPIEncodeType { --- -2.43.0 -
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/patches/ffmpeg/0002-lavc-vaapi_encode_h265-Use-surface-alignment.patch
Deleted
@@ -1,32 +0,0 @@ -From d0facac679faf45d3356dff2e2cb382580d7a521 Mon Sep 17 00:00:00 2001 -From: David Rosca <nowrep@gmail.com> -Date: Tue, 22 Oct 2024 17:26:59 +0200 -Subject: PATCH 2/2 lavc/vaapi_encode_h265: Use surface alignment - -This is needed to correctly set conformance window crop with Mesa AMD. - -Signed-off-by: Timo Rothenpieler <timo@rothenpieler.org> ---- - libavcodec/vaapi_encode_h265.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c -index 2283bcc0b4..44d9fdbbd5 100644 ---- a/libavcodec/vaapi_encode_h265.c -+++ b/libavcodec/vaapi_encode_h265.c -@@ -951,8 +951,10 @@ static av_cold int vaapi_encode_h265_get_encoder_caps(AVCodecContext *avctx) - "min CB size %dx%d.\n", priv->ctu_size, priv->ctu_size, - priv->min_cb_size, priv->min_cb_size); - -- base_ctx->surface_width = FFALIGN(avctx->width, priv->min_cb_size); -- base_ctx->surface_height = FFALIGN(avctx->height, priv->min_cb_size); -+ base_ctx->surface_width = FFALIGN(avctx->width, -+ FFMAX(priv->min_cb_size, priv->common.surface_alignment_width)); -+ base_ctx->surface_height = FFALIGN(avctx->height, -+ FFMAX(priv->min_cb_size, priv->common.surface_alignment_height)); - - base_ctx->slice_block_width = base_ctx->slice_block_height = priv->ctu_size; - --- -2.43.0 -
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/patches/intel-media-sdk
Deleted
-(directory)
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/patches/intel-media-sdk/010-intel-media-sdk-fix-reproducible-build.patch
Deleted
@@ -1,22 +0,0 @@ -From f6925886f27a39eed2e43c5b7b6c342d00f7a970 Mon Sep 17 00:00:00 2001 -From: kpcyrd <git@rxv.cc> -Date: Mon, 17 May 2021 02:01:08 +0200 -Subject: PATCH Reproducible Builds: Do not record kernel version in binaries - ---- - builder/FindGlobals.cmake | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/builder/FindGlobals.cmake b/builder/FindGlobals.cmake -index 6c96fc8e03..b13886c380 100644 ---- a/builder/FindGlobals.cmake -+++ b/builder/FindGlobals.cmake -@@ -201,7 +201,7 @@ endif() - if( MFX_SYSTEM ) - set( BUILD_INFO "${MFX_SYSTEM} ${CMAKE_SYSTEM_VERSION} | ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}" ) - else() -- set( BUILD_INFO "${CMAKE_SYSTEM} ${CMAKE_SYSTEM_VERSION} | ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}" ) -+ set( BUILD_INFO "${CMAKE_SYSTEM_NAME} | ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}" ) - endif() - - if(UNIX AND MFX_GLIBC)
View file
obs-studio-32.0.4.tar.xz/build-aux/modules/patches/intel-media-sdk/020-intel-media-sdk-gcc13-fix.patch
Deleted
@@ -1,10 +0,0 @@ ---- a/api/mfx_dispatch/linux/mfxparser.cpp -+++ b/api/mfx_dispatch/linux/mfxparser.cpp -@@ -19,6 +19,7 @@ - // SOFTWARE. - - #include <ctype.h> -+#include <cstdint> - #include <stdio.h> - #include <stdlib.h> - #include <string.h>
View file
obs-studio-32.0.4.tar.xz/buildspec.json
Deleted
@@ -1,64 +0,0 @@ -{ - "dependencies": { - "prebuilt": { - "version": "2025-08-23", - "baseUrl": "https://github.com/obsproject/obs-deps/releases/download", - "label": "Pre-Built obs-deps", - "hashes": { - "macos-universal": "9403bb43fb0a9bb215739a5659ca274fe884dbbbcd22bd9ca781c961fb041c42", - "windows-x64": "8de229cff6f1981508c0eb646b35e644633a5855787b9f5d3b90ae2aeb87ffc1", - "windows-x86": "fb3c68b75911f292b3206e346053638db1c73605957207445a0a92b33ab5e00a", - "windows-arm64": "dd87ba00a6cbc153182fb62b3678a3b5021d1d11eb2730442060937a645eb97e" - } - }, - "qt6": { - "version": "2025-08-23", - "baseUrl": "https://github.com/obsproject/obs-deps/releases/download", - "label": "Pre-Built Qt6", - "hashes": { - "macos-universal": "990f11638b80a4509e14e8c315f6e4caa0861e37fcd3113a256fbff835ffca29", - "windows-x64": "c62e82483bc7c0bf199e8ac3220c66a85a6e8a0cd69a05b6d44f873b830e415f", - "windows-arm64": "cc8ec983de9b7d81aa98beeb1b989d707ee3c73b85b4d41c85d94114eba81f91" - }, - "debugSymbols": { - "windows-x64": "aae88a17e0211cb37db6a8602f2e20d69255be1f9700c699008ca5adbce1dde2", - "windows-arm64": "6e866490277a8b29e82a87fc2f22407f93ddaf86444ea0d284370339a05511b3" - } - }, - "cef": { - "version": "6533", - "baseUrl": "https://cdn-fastly.obsproject.com/downloads", - "label": "Chromium Embedded Framework", - "hashes": { - "macos-x86_64": "37bf7571a48c5dfa8519817e4a90a3503a0eb30f9eadd68f4c3e783e363f272a", - "macos-arm64": "429b50e74f6c174dcfe2f14d8204b54add497eaafe117f7b69ce6bb2354d2626", - "ubuntu-x86_64": "7963335519a19ccdc5233f7334c5ab023026e2f3e9a0cc417007c09d86608146", - "ubuntu-aarch64": "642514469eaa29a5c887891084d2e73f7dc2d7405f7dfa7726b2dbc24b309999", - "windows-x64": "922efbda1f2f8be9e5b2754d878a14d90afc81f04e94fc9101a7513e2b5cecc1", - "windows-arm64": "df9df4bd85826b4c071c6db404fd59cf93efd9c58ec3ab64e204466ae19bb02a" - }, - "revision": { - "macos-x86_64": 5, - "macos-arm64": 5, - "ubuntu-x86_64": 6, - "ubuntu-aarch64": 6, - "windows-x64": 2 - } - } - }, - "tools": { - "sparkle": { - "version": "2.6.4", - "baseUrl": "https://github.com/sparkle-project/Sparkle/releases/download", - "label": "Sparkle 2", - "hash": "50612a06038abc931f16011d7903b8326a362c1074dabccb718404ce8e585f0b" - }, - "ccache-win": { - "version": "4.8.1", - "baseUrl": "https://github.com/ccache/ccache/releases/download/", - "label": "Ccache for Windows x64", - "hash": "ca59770e9f46b59d6bec6e7036a17a27d601a0a5a0a721fe8e03fea734ccf732" - } - }, - "name": "obs-studio" -}
View file
obs-studio-32.0.4.tar.xz/cmake/macos/resources/ccache-launcher-c.in
Deleted
@@ -1,13 +0,0 @@ -#!/bin/sh - -if "$1" == "${CMAKE_C_COMPILER}" ; then - shift -fi - -export CCACHE_DEPEND=true -export CCACHE_DIRECT=true -export CCACHE_FILECLONE=true -export CCACHE_INODECACHE=true -export CCACHE_COMPILERCHECK='content' -export CCACHE_SLOPPINESS='modules,include_file_mtime,include_file_ctime,clang_index_store,system_headers' -exec "${CMAKE_C_COMPILER_LAUNCHER}" "${CMAKE_C_COMPILER}" "$@"
View file
obs-studio-32.0.4.tar.xz/cmake/macos/resources/ccache-launcher-cxx.in
Deleted
@@ -1,13 +0,0 @@ -#!/bin/sh - -if "$1" == "${CMAKE_CXX_COMPILER}" ; then - shift -fi - -export CCACHE_DEPEND=true -export CCACHE_DIRECT=true -export CCACHE_FILECLONE=true -export CCACHE_INODECACHE=true -export CCACHE_COMPILERCHECK='content' -export CCACHE_SLOPPINESS='modules,include_file_mtime,include_file_ctime,clang_index_store,system_headers' -exec "${CMAKE_CXX_COMPILER_LAUNCHER}" "${CMAKE_CXX_COMPILER}" "$@"
View file
obs-studio-32.0.4.tar.xz/frontend/components/HScrollArea.cpp
Deleted
@@ -1,13 +0,0 @@ -#include "HScrollArea.hpp" - -#include <QResizeEvent> - -#include "moc_HScrollArea.cpp" - -void HScrollArea::resizeEvent(QResizeEvent *event) -{ - if (!!widget()) - widget()->setMaximumHeight(event->size().height()); - - QScrollArea::resizeEvent(event); -}
View file
obs-studio-32.0.4.tar.xz/frontend/components/HScrollArea.hpp
Deleted
@@ -1,18 +0,0 @@ -#pragma once - -#include <QScrollArea> - -class QResizeEvent; - -class HScrollArea : public QScrollArea { - Q_OBJECT - -public: - inline HScrollArea(QWidget *parent = nullptr) : QScrollArea(parent) - { - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - } - -protected: - virtual void resizeEvent(QResizeEvent *event) override; -};
View file
obs-studio-32.0.4.tar.xz/frontend/utility/VolumeMeterTimer.cpp
Deleted
@@ -1,28 +0,0 @@ -#include "VolumeMeterTimer.hpp" - -#include <widgets/VolumeMeter.hpp> - -#include "moc_VolumeMeterTimer.cpp" - -void VolumeMeterTimer::AddVolControl(VolumeMeter *meter) -{ - volumeMeters.push_back(meter); -} - -void VolumeMeterTimer::RemoveVolControl(VolumeMeter *meter) -{ - volumeMeters.removeOne(meter); -} - -void VolumeMeterTimer::timerEvent(QTimerEvent *) -{ - for (VolumeMeter *meter : volumeMeters) { - if (meter->needLayoutChange()) { - // Tell paintEvent to update layout and paint everything - meter->update(); - } else { - // Tell paintEvent to paint only the bars - meter->update(meter->getBarRect()); - } - } -}
View file
obs-studio-32.0.4.tar.xz/frontend/utility/VolumeMeterTimer.hpp
Deleted
@@ -1,19 +0,0 @@ -#pragma once - -#include <QTimer> - -class VolumeMeter; - -class VolumeMeterTimer : public QTimer { - Q_OBJECT - -public: - inline VolumeMeterTimer() : QTimer() {} - - void AddVolControl(VolumeMeter *meter); - void RemoveVolControl(VolumeMeter *meter); - -protected: - void timerEvent(QTimerEvent *event) override; - QList<VolumeMeter *> volumeMeters; -};
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasic_VolControl.cpp
Deleted
@@ -1,317 +0,0 @@ -/****************************************************************************** - Copyright (C) 2023 by Lain Bailey <lain@obsproject.com> - Zachary Lund <admin@computerquip.com> - Philippe Groarke <philippe.groarke@gmail.com> - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -******************************************************************************/ - -#include "OBSBasic.hpp" - -#include <widgets/VolControl.hpp> - -using namespace std; - -void OBSBasic::UpdateVolumeControlsDecayRate() -{ - double meterDecayRate = config_get_double(activeConfiguration, "Audio", "MeterDecayRate"); - - for (size_t i = 0; i < volumes.size(); i++) { - volumesi->SetMeterDecayRate(meterDecayRate); - } -} - -void OBSBasic::UpdateVolumeControlsPeakMeterType() -{ - uint32_t peakMeterTypeIdx = config_get_uint(activeConfiguration, "Audio", "PeakMeterType"); - - enum obs_peak_meter_type peakMeterType; - switch (peakMeterTypeIdx) { - case 0: - peakMeterType = SAMPLE_PEAK_METER; - break; - case 1: - peakMeterType = TRUE_PEAK_METER; - break; - default: - peakMeterType = SAMPLE_PEAK_METER; - break; - } - - for (size_t i = 0; i < volumes.size(); i++) { - volumesi->setPeakMeterType(peakMeterType); - } -} - -void OBSBasic::ClearVolumeControls() -{ - for (VolControl *vol : volumes) - delete vol; - - volumes.clear(); -} - -void OBSBasic::RefreshVolumeColors() -{ - for (VolControl *vol : volumes) { - vol->refreshColors(); - } -} - -void OBSBasic::HideAudioControl() -{ - QAction *action = reinterpret_cast<QAction *>(sender()); - VolControl *vol = action->property("volControl").value<VolControl *>(); - obs_source_t *source = vol->GetSource(); - - if (!SourceMixerHidden(source)) { - SetSourceMixerHidden(source, true); - DeactivateAudioSource(source); - } -} - -void OBSBasic::UnhideAllAudioControls() -{ - auto UnhideAudioMixer = this(obs_source_t *source) /* -- */ - { - if (!obs_source_active(source)) - return true; - if (!SourceMixerHidden(source)) - return true; - - SetSourceMixerHidden(source, false); - ActivateAudioSource(source); - return true; - }; - - using UnhideAudioMixer_t = decltype(UnhideAudioMixer); - - auto PreEnum = (void *data, obs_source_t *source) -> bool /* -- */ - { - return (*static_cast<UnhideAudioMixer_t *>(data))(source); - }; - - obs_enum_sources(PreEnum, &UnhideAudioMixer); -} - -void OBSBasic::ToggleHideMixer() -{ - OBSSceneItem item = GetCurrentSceneItem(); - OBSSource source = obs_sceneitem_get_source(item); - - if (!SourceMixerHidden(source)) { - SetSourceMixerHidden(source, true); - DeactivateAudioSource(source); - } else { - SetSourceMixerHidden(source, false); - ActivateAudioSource(source); - } -} - -void OBSBasic::LockVolumeControl(bool lock) -{ - QAction *action = reinterpret_cast<QAction *>(sender()); - VolControl *vol = action->property("volControl").value<VolControl *>(); - obs_source_t *source = vol->GetSource(); - - OBSDataAutoRelease priv_settings = obs_source_get_private_settings(source); - obs_data_set_bool(priv_settings, "volume_locked", lock); - - vol->EnableSlider(!lock); -} - -void OBSBasic::VolControlContextMenu() -{ - VolControl *vol = reinterpret_cast<VolControl *>(sender()); - - /* ------------------- */ - - QAction lockAction(QTStr("LockVolume"), this); - lockAction.setCheckable(true); - lockAction.setChecked(SourceVolumeLocked(vol->GetSource())); - - QAction hideAction(QTStr("Hide"), this); - QAction unhideAllAction(QTStr("UnhideAll"), this); - QAction mixerRenameAction(QTStr("Rename"), this); - - QAction copyFiltersAction(QTStr("Copy.Filters"), this); - QAction pasteFiltersAction(QTStr("Paste.Filters"), this); - - QAction filtersAction(QTStr("Filters"), this); - QAction propertiesAction(QTStr("Properties"), this); - QAction advPropAction(QTStr("Basic.MainMenu.Edit.AdvAudio"), this); - - QAction toggleControlLayoutAction(QTStr("VerticalLayout"), this); - toggleControlLayoutAction.setCheckable(true); - toggleControlLayoutAction.setChecked( - config_get_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolControl")); - - /* ------------------- */ - - connect(&hideAction, &QAction::triggered, this, &OBSBasic::HideAudioControl, Qt::DirectConnection); - connect(&unhideAllAction, &QAction::triggered, this, &OBSBasic::UnhideAllAudioControls, Qt::DirectConnection); - connect(&lockAction, &QAction::toggled, this, &OBSBasic::LockVolumeControl, Qt::DirectConnection); - connect(&mixerRenameAction, &QAction::triggered, this, &OBSBasic::MixerRenameSource, Qt::DirectConnection); - - connect(©FiltersAction, &QAction::triggered, this, &OBSBasic::AudioMixerCopyFilters, Qt::DirectConnection); - connect(&pasteFiltersAction, &QAction::triggered, this, &OBSBasic::AudioMixerPasteFilters, - Qt::DirectConnection); - - connect(&filtersAction, &QAction::triggered, this, &OBSBasic::GetAudioSourceFilters, Qt::DirectConnection); - connect(&propertiesAction, &QAction::triggered, this, &OBSBasic::GetAudioSourceProperties, - Qt::DirectConnection); - connect(&advPropAction, &QAction::triggered, this, &OBSBasic::on_actionAdvAudioProperties_triggered, - Qt::DirectConnection); - - /* ------------------- */ - - connect(&toggleControlLayoutAction, &QAction::changed, this, &OBSBasic::ToggleVolControlLayout, - Qt::DirectConnection); - - /* ------------------- */ - - hideAction.setProperty("volControl", QVariant::fromValue<VolControl *>(vol)); - lockAction.setProperty("volControl", QVariant::fromValue<VolControl *>(vol)); - mixerRenameAction.setProperty("volControl", QVariant::fromValue<VolControl *>(vol)); - - copyFiltersAction.setProperty("volControl", QVariant::fromValue<VolControl *>(vol)); - pasteFiltersAction.setProperty("volControl", QVariant::fromValue<VolControl *>(vol)); - - filtersAction.setProperty("volControl", QVariant::fromValue<VolControl *>(vol)); - propertiesAction.setProperty("volControl", QVariant::fromValue<VolControl *>(vol)); - - /* ------------------- */ - - copyFiltersAction.setEnabled(obs_source_filter_count(vol->GetSource()) > 0); - pasteFiltersAction.setEnabled(!obs_weak_source_expired(copyFiltersSource)); - - QMenu popup; - vol->SetContextMenu(&popup); - popup.addAction(&lockAction); - popup.addSeparator(); - popup.addAction(&unhideAllAction); - popup.addAction(&hideAction); - popup.addAction(&mixerRenameAction); - popup.addSeparator(); - popup.addAction(©FiltersAction); - popup.addAction(&pasteFiltersAction); - popup.addSeparator(); - popup.addAction(&toggleControlLayoutAction); - popup.addSeparator(); - popup.addAction(&filtersAction); - popup.addAction(&propertiesAction); - popup.addAction(&advPropAction); - - // toggleControlLayoutAction deletes and re-creates the volume controls - // meaning that "vol" would be pointing to freed memory. - if (popup.exec(QCursor::pos()) != &toggleControlLayoutAction) - vol->SetContextMenu(nullptr); -} - -void OBSBasic::on_hMixerScrollArea_customContextMenuRequested() -{ - StackedMixerAreaContextMenuRequested(); -} - -void OBSBasic::on_vMixerScrollArea_customContextMenuRequested() -{ - StackedMixerAreaContextMenuRequested(); -} - -void OBSBasic::StackedMixerAreaContextMenuRequested() -{ - QAction unhideAllAction(QTStr("UnhideAll"), this); - - QAction advPropAction(QTStr("Basic.MainMenu.Edit.AdvAudio"), this); - - QAction toggleControlLayoutAction(QTStr("VerticalLayout"), this); - toggleControlLayoutAction.setCheckable(true); - toggleControlLayoutAction.setChecked( - config_get_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolControl")); - - /* ------------------- */ - - connect(&unhideAllAction, &QAction::triggered, this, &OBSBasic::UnhideAllAudioControls, Qt::DirectConnection); - - connect(&advPropAction, &QAction::triggered, this, &OBSBasic::on_actionAdvAudioProperties_triggered, - Qt::DirectConnection); - - /* ------------------- */ - - connect(&toggleControlLayoutAction, &QAction::changed, this, &OBSBasic::ToggleVolControlLayout, - Qt::DirectConnection); - - /* ------------------- */ - - QMenu popup; - popup.addAction(&unhideAllAction); - popup.addSeparator(); - popup.addAction(&toggleControlLayoutAction); - popup.addSeparator(); - popup.addAction(&advPropAction); - popup.exec(QCursor::pos()); -} - -void OBSBasic::ToggleMixerLayout(bool vertical) -{ - if (vertical) { - ui->stackedMixerArea->setMinimumSize(180, 220); - ui->stackedMixerArea->setCurrentIndex(1); - } else { - ui->stackedMixerArea->setMinimumSize(220, 0); - ui->stackedMixerArea->setCurrentIndex(0); - } -} - -void OBSBasic::ToggleVolControlLayout() -{ - bool vertical = !config_get_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolControl"); - config_set_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolControl", vertical); - ToggleMixerLayout(vertical); - - // We need to store it so we can delete current and then add - // at the right order - vector<OBSSource> sources; - for (size_t i = 0; i != volumes.size(); i++) - sources.emplace_back(volumesi->GetSource()); - - ClearVolumeControls(); - - for (const auto &source : sources) - ActivateAudioSource(source); -} - -void OBSBasic::on_actionMixerToolbarAdvAudio_triggered() -{ - on_actionAdvAudioProperties_triggered(); -} - -void OBSBasic::on_actionMixerToolbarMenu_triggered() -{ - QAction unhideAllAction(QTStr("UnhideAll"), this); - connect(&unhideAllAction, &QAction::triggered, this, &OBSBasic::UnhideAllAudioControls, Qt::DirectConnection); - - QAction toggleControlLayoutAction(QTStr("VerticalLayout"), this); - toggleControlLayoutAction.setCheckable(true); - toggleControlLayoutAction.setChecked( - config_get_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolControl")); - connect(&toggleControlLayoutAction, &QAction::changed, this, &OBSBasic::ToggleVolControlLayout, - Qt::DirectConnection); - - QMenu popup; - popup.addAction(&unhideAllAction); - popup.addSeparator(); - popup.addAction(&toggleControlLayoutAction); - popup.exec(QCursor::pos()); -}
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/VolControl.cpp
Deleted
@@ -1,400 +0,0 @@ -#include "VolControl.hpp" -#include "VolumeMeter.hpp" -#include "OBSBasic.hpp" - -#include <components/MuteCheckBox.hpp> -#include <components/OBSSourceLabel.hpp> -#include <components/VolumeSlider.hpp> - -#include <QMessageBox> - -#include "moc_VolControl.cpp" - -static inline Qt::CheckState GetCheckState(bool muted, bool unassigned) -{ - if (muted) - return Qt::Checked; - else if (unassigned) - return Qt::PartiallyChecked; - else - return Qt::Unchecked; -} - -static inline bool IsSourceUnassigned(obs_source_t *source) -{ - uint32_t mixes = (obs_source_get_audio_mixers(source) & ((1 << MAX_AUDIO_MIXES) - 1)); - obs_monitoring_type mt = obs_source_get_monitoring_type(source); - - return mixes == 0 && mt != OBS_MONITORING_TYPE_MONITOR_ONLY; -} - -static void ShowUnassignedWarning(const char *name) -{ - auto msgBox = =() { - QMessageBox msgbox(App()->GetMainWindow()); - msgbox.setWindowTitle(QTStr("VolControl.UnassignedWarning.Title")); - msgbox.setText(QTStr("VolControl.UnassignedWarning.Text").arg(name)); - msgbox.setIcon(QMessageBox::Icon::Information); - msgbox.addButton(QMessageBox::Ok); - - QCheckBox *cb = new QCheckBox(QTStr("DoNotShowAgain")); - msgbox.setCheckBox(cb); - - msgbox.exec(); - - if (cb->isChecked()) { - config_set_bool(App()->GetUserConfig(), "General", "WarnedAboutUnassignedSources", true); - config_save_safe(App()->GetUserConfig(), "tmp", nullptr); - } - }; - - QMetaObject::invokeMethod(App(), "Exec", Qt::QueuedConnection, Q_ARG(VoidFunc, msgBox)); -} - -void VolControl::OBSVolumeChanged(void *data, float db) -{ - Q_UNUSED(db); - VolControl *volControl = static_cast<VolControl *>(data); - - QMetaObject::invokeMethod(volControl, "VolumeChanged"); -} - -void VolControl::OBSVolumeLevel(void *data, const float magnitudeMAX_AUDIO_CHANNELS, - const float peakMAX_AUDIO_CHANNELS, const float inputPeakMAX_AUDIO_CHANNELS) -{ - VolControl *volControl = static_cast<VolControl *>(data); - - volControl->volMeter->setLevels(magnitude, peak, inputPeak); -} - -void VolControl::OBSVolumeMuted(void *data, calldata_t *calldata) -{ - VolControl *volControl = static_cast<VolControl *>(data); - bool muted = calldata_bool(calldata, "muted"); - - QMetaObject::invokeMethod(volControl, "VolumeMuted", Q_ARG(bool, muted)); -} - -void VolControl::VolumeChanged() -{ - slider->blockSignals(true); - slider->setValue((int)(obs_fader_get_deflection(obs_fader) * FADER_PRECISION)); - slider->blockSignals(false); - - updateText(); -} - -void VolControl::VolumeMuted(bool muted) -{ - bool unassigned = IsSourceUnassigned(source); - - auto newState = GetCheckState(muted, unassigned); - if (mute->checkState() != newState) - mute->setCheckState(newState); - - volMeter->muted = muted || unassigned; -} - -void VolControl::OBSMixersOrMonitoringChanged(void *data, calldata_t *) -{ - - VolControl *volControl = static_cast<VolControl *>(data); - QMetaObject::invokeMethod(volControl, "MixersOrMonitoringChanged", Qt::QueuedConnection); -} - -void VolControl::MixersOrMonitoringChanged() -{ - bool muted = obs_source_muted(source); - bool unassigned = IsSourceUnassigned(source); - - auto newState = GetCheckState(muted, unassigned); - if (mute->checkState() != newState) - mute->setCheckState(newState); - - volMeter->muted = muted || unassigned; -} - -void VolControl::SetMuted(bool) -{ - bool checked = mute->checkState() == Qt::Checked; - bool prev = obs_source_muted(source); - obs_source_set_muted(source, checked); - bool unassigned = IsSourceUnassigned(source); - - if (!checked && unassigned) { - mute->setCheckState(Qt::PartiallyChecked); - /* Show notice about the source no being assigned to any tracks */ - bool has_shown_warning = - config_get_bool(App()->GetUserConfig(), "General", "WarnedAboutUnassignedSources"); - if (!has_shown_warning) - ShowUnassignedWarning(obs_source_get_name(source)); - } - - auto undo_redo = (const std::string &uuid, bool val) { - OBSSourceAutoRelease source = obs_get_source_by_uuid(uuid.c_str()); - obs_source_set_muted(source, val); - }; - - QString text = QTStr(checked ? "Undo.Volume.Mute" : "Undo.Volume.Unmute"); - - const char *name = obs_source_get_name(source); - const char *uuid = obs_source_get_uuid(source); - OBSBasic::Get()->undo_s.add_action(text.arg(name), std::bind(undo_redo, std::placeholders::_1, prev), - std::bind(undo_redo, std::placeholders::_1, checked), uuid, uuid); -} - -void VolControl::SliderChanged(int vol) -{ - float prev = obs_source_get_volume(source); - - obs_fader_set_deflection(obs_fader, float(vol) / FADER_PRECISION); - updateText(); - - auto undo_redo = (const std::string &uuid, float val) { - OBSSourceAutoRelease source = obs_get_source_by_uuid(uuid.c_str()); - obs_source_set_volume(source, val); - }; - - float val = obs_source_get_volume(source); - const char *name = obs_source_get_name(source); - const char *uuid = obs_source_get_uuid(source); - OBSBasic::Get()->undo_s.add_action(QTStr("Undo.Volume.Change").arg(name), - std::bind(undo_redo, std::placeholders::_1, prev), - std::bind(undo_redo, std::placeholders::_1, val), uuid, uuid, true); -} - -void VolControl::updateText() -{ - QString text; - float db = obs_fader_get_db(obs_fader); - - if (db < -96.0f) - text = "-inf dB"; - else - text = QString::number(db, 'f', 1).append(" dB"); - - volLabel->setText(text); - - bool muted = obs_source_muted(source); - const char *accTextLookup = muted ? "VolControl.SliderMuted" : "VolControl.SliderUnmuted"; - - QString sourceName = obs_source_get_name(source); - QString accText = QTStr(accTextLookup).arg(sourceName); - - slider->setAccessibleName(accText); -} - -void VolControl::EmitConfigClicked() -{ - emit ConfigClicked(); -} - -void VolControl::SetMeterDecayRate(qreal q) -{ - volMeter->setPeakDecayRate(q); -} - -void VolControl::setPeakMeterType(enum obs_peak_meter_type peakMeterType) -{ - volMeter->setPeakMeterType(peakMeterType); -} - -VolControl::VolControl(OBSSource source_, bool showConfig, bool vertical) - : source(std::move(source_)), - levelTotal(0.0f), - levelCount(0.0f), - obs_fader(obs_fader_create(OBS_FADER_LOG)), - obs_volmeter(obs_volmeter_create(OBS_FADER_LOG)), - vertical(vertical), - contextMenu(nullptr) -{ - nameLabel = new OBSSourceLabel(source); - volLabel = new QLabel(); - mute = new MuteCheckBox(); - - volLabel->setObjectName("volLabel"); - volLabel->setAlignment(Qt::AlignCenter); - -#ifdef __APPLE__ - mute->setAttribute(Qt::WA_LayoutUsesWidgetRect); -#endif - - QString sourceName = obs_source_get_name(source); - setObjectName(sourceName); - - if (showConfig) { - config = new QPushButton(this); - config->setProperty("class", "icon-dots-vert"); - config->setAutoDefault(false); - - config->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - - config->setAccessibleName(QTStr("VolControl.Properties").arg(sourceName)); - - connect(config, &QAbstractButton::clicked, this, &VolControl::EmitConfigClicked); - } - - QVBoxLayout *mainLayout = new QVBoxLayout; - mainLayout->setContentsMargins(0, 0, 0, 0); - mainLayout->setSpacing(0); - - if (vertical) { - QHBoxLayout *nameLayout = new QHBoxLayout; - QHBoxLayout *controlLayout = new QHBoxLayout; - QHBoxLayout *volLayout = new QHBoxLayout; - QFrame *meterFrame = new QFrame; - QHBoxLayout *meterLayout = new QHBoxLayout; - - volMeter = new VolumeMeter(nullptr, obs_volmeter, true); - slider = new VolumeSlider(obs_fader, Qt::Vertical); - slider->setLayoutDirection(Qt::LeftToRight); - slider->setDisplayTicks(true); - - nameLayout->setAlignment(Qt::AlignCenter); - meterLayout->setAlignment(Qt::AlignCenter); - controlLayout->setAlignment(Qt::AlignCenter); - volLayout->setAlignment(Qt::AlignCenter); - - meterFrame->setObjectName("volMeterFrame"); - - nameLayout->setContentsMargins(0, 0, 0, 0); - nameLayout->setSpacing(0); - nameLayout->addWidget(nameLabel); - - controlLayout->setContentsMargins(0, 0, 0, 0); - controlLayout->setSpacing(0); - - // Add Headphone (audio monitoring) widget here - controlLayout->addWidget(mute); - - if (showConfig) { - controlLayout->addWidget(config); - } - - meterLayout->setContentsMargins(0, 0, 0, 0); - meterLayout->setSpacing(0); - meterLayout->addWidget(slider); - meterLayout->addWidget(volMeter); - - meterFrame->setLayout(meterLayout); - - volLayout->setContentsMargins(0, 0, 0, 0); - volLayout->setSpacing(0); - volLayout->addWidget(volLabel); - volLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, QSizePolicy::Minimum)); - - mainLayout->addItem(nameLayout); - mainLayout->addItem(volLayout); - mainLayout->addWidget(meterFrame); - mainLayout->addItem(controlLayout); - - volMeter->setFocusProxy(slider); - - // Default size can cause clipping of long names in vertical layout. - QFont font = nameLabel->font(); - QFontInfo info(font); - nameLabel->setFont(font); - - setMaximumWidth(110); - } else { - QHBoxLayout *textLayout = new QHBoxLayout; - QHBoxLayout *controlLayout = new QHBoxLayout; - QFrame *meterFrame = new QFrame; - QVBoxLayout *meterLayout = new QVBoxLayout; - QVBoxLayout *buttonLayout = new QVBoxLayout; - - volMeter = new VolumeMeter(nullptr, obs_volmeter, false); - volMeter->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); - - slider = new VolumeSlider(obs_fader, Qt::Horizontal); - slider->setLayoutDirection(Qt::LeftToRight); - slider->setDisplayTicks(true); - - textLayout->setContentsMargins(0, 0, 0, 0); - textLayout->addWidget(nameLabel); - textLayout->addWidget(volLabel); - textLayout->setAlignment(nameLabel, Qt::AlignLeft); - textLayout->setAlignment(volLabel, Qt::AlignRight); - - meterFrame->setObjectName("volMeterFrame"); - meterFrame->setLayout(meterLayout); - - meterLayout->setContentsMargins(0, 0, 0, 0); - meterLayout->setSpacing(0); - - meterLayout->addWidget(volMeter); - meterLayout->addWidget(slider); - - buttonLayout->setContentsMargins(0, 0, 0, 0); - buttonLayout->setSpacing(0); - - if (showConfig) { - buttonLayout->addWidget(config); - } - buttonLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding)); - buttonLayout->addWidget(mute); - - controlLayout->addItem(buttonLayout); - controlLayout->addWidget(meterFrame); - - mainLayout->addItem(textLayout); - mainLayout->addItem(controlLayout); - - volMeter->setFocusProxy(slider); - } - - setLayout(mainLayout); - - nameLabel->setText(sourceName); - - slider->setMinimum(0); - slider->setMaximum(int(FADER_PRECISION)); - - bool muted = obs_source_muted(source); - bool unassigned = IsSourceUnassigned(source); - mute->setCheckState(GetCheckState(muted, unassigned)); - volMeter->muted = muted || unassigned; - mute->setAccessibleName(QTStr("VolControl.Mute").arg(sourceName)); - obs_fader_add_callback(obs_fader, OBSVolumeChanged, this); - obs_volmeter_add_callback(obs_volmeter, OBSVolumeLevel, this); - - sigs.emplace_back(obs_source_get_signal_handler(source), "mute", OBSVolumeMuted, this); - sigs.emplace_back(obs_source_get_signal_handler(source), "audio_mixers", OBSMixersOrMonitoringChanged, this); - sigs.emplace_back(obs_source_get_signal_handler(source), "audio_monitoring", OBSMixersOrMonitoringChanged, - this); - - QWidget::connect(slider, &VolumeSlider::valueChanged, this, &VolControl::SliderChanged); - QWidget::connect(mute, &MuteCheckBox::clicked, this, &VolControl::SetMuted); - - obs_fader_attach_source(obs_fader, source); - obs_volmeter_attach_source(obs_volmeter, source); - - /* Call volume changed once to init the slider position and label */ - VolumeChanged(); -} - -void VolControl::EnableSlider(bool enable) -{ - slider->setEnabled(enable); -} - -VolControl::~VolControl() -{ - obs_fader_remove_callback(obs_fader, OBSVolumeChanged, this); - obs_volmeter_remove_callback(obs_volmeter, OBSVolumeLevel, this); - - sigs.clear(); - - if (contextMenu) - contextMenu->close(); -} - -void VolControl::refreshColors() -{ - volMeter->setBackgroundNominalColor(volMeter->getBackgroundNominalColor()); - volMeter->setBackgroundWarningColor(volMeter->getBackgroundWarningColor()); - volMeter->setBackgroundErrorColor(volMeter->getBackgroundErrorColor()); - volMeter->setForegroundNominalColor(volMeter->getForegroundNominalColor()); - volMeter->setForegroundWarningColor(volMeter->getForegroundWarningColor()); - volMeter->setForegroundErrorColor(volMeter->getForegroundErrorColor()); -}
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/VolControl.hpp
Deleted
@@ -1,66 +0,0 @@ -#pragma once - -#include <obs.hpp> - -#include <QFrame> - -class OBSSourceLabel; -class VolumeMeter; -class VolumeSlider; -class MuteCheckBox; -class QLabel; -class QPushButton; - -class VolControl : public QFrame { - Q_OBJECT - -private: - OBSSource source; - std::vector<OBSSignal> sigs; - OBSSourceLabel *nameLabel; - QLabel *volLabel; - VolumeMeter *volMeter; - VolumeSlider *slider; - MuteCheckBox *mute; - QPushButton *config = nullptr; - float levelTotal; - float levelCount; - OBSFader obs_fader; - OBSVolMeter obs_volmeter; - bool vertical; - QMenu *contextMenu; - - static void OBSVolumeChanged(void *param, float db); - static void OBSVolumeLevel(void *data, const float magnitudeMAX_AUDIO_CHANNELS, - const float peakMAX_AUDIO_CHANNELS, const float inputPeakMAX_AUDIO_CHANNELS); - static void OBSVolumeMuted(void *data, calldata_t *calldata); - static void OBSMixersOrMonitoringChanged(void *data, calldata_t *); - - void EmitConfigClicked(); - -private slots: - void VolumeChanged(); - void VolumeMuted(bool muted); - void MixersOrMonitoringChanged(); - - void SetMuted(bool checked); - void SliderChanged(int vol); - void updateText(); - -signals: - void ConfigClicked(); - -public: - explicit VolControl(OBSSource source, bool showConfig = false, bool vertical = false); - ~VolControl(); - - inline obs_source_t *GetSource() const { return source; } - - void SetMeterDecayRate(qreal q); - void setPeakMeterType(enum obs_peak_meter_type peakMeterType); - - void EnableSlider(bool enable); - inline void SetContextMenu(QMenu *cm) { contextMenu = cm; } - - void refreshColors(); -};
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/VolumeMeter.cpp
Deleted
@@ -1,954 +0,0 @@ -#include "VolumeMeter.hpp" - -#include <OBSApp.hpp> -#include <utility/VolumeMeterTimer.hpp> - -#include <QEvent> -#include <QMouseEvent> -#include <QPainter> - -#include "moc_VolumeMeter.cpp" - -// Size of the audio indicator in pixels -#define INDICATOR_THICKNESS 3 - -// Padding on top and bottom of vertical meters -#define METER_PADDING 1 - -std::weak_ptr<VolumeMeterTimer> VolumeMeter::updateTimer; - -static inline QColor color_from_int(long long val) -{ - QColor color(val & 0xff, (val >> 8) & 0xff, (val >> 16) & 0xff, (val >> 24) & 0xff); - color.setAlpha(255); - - return color; -} - -QColor VolumeMeter::getBackgroundNominalColor() const -{ - return p_backgroundNominalColor; -} - -QColor VolumeMeter::getBackgroundNominalColorDisabled() const -{ - return backgroundNominalColorDisabled; -} - -void VolumeMeter::setBackgroundNominalColor(QColor c) -{ - p_backgroundNominalColor = std::move(c); - - if (config_get_bool(App()->GetUserConfig(), "Accessibility", "OverrideColors")) { - backgroundNominalColor = - color_from_int(config_get_int(App()->GetUserConfig(), "Accessibility", "MixerGreen")); - } else { - backgroundNominalColor = p_backgroundNominalColor; - } -} - -void VolumeMeter::setBackgroundNominalColorDisabled(QColor c) -{ - backgroundNominalColorDisabled = std::move(c); -} - -QColor VolumeMeter::getBackgroundWarningColor() const -{ - return p_backgroundWarningColor; -} - -QColor VolumeMeter::getBackgroundWarningColorDisabled() const -{ - return backgroundWarningColorDisabled; -} - -void VolumeMeter::setBackgroundWarningColor(QColor c) -{ - p_backgroundWarningColor = std::move(c); - - if (config_get_bool(App()->GetUserConfig(), "Accessibility", "OverrideColors")) { - backgroundWarningColor = - color_from_int(config_get_int(App()->GetUserConfig(), "Accessibility", "MixerYellow")); - } else { - backgroundWarningColor = p_backgroundWarningColor; - } -} - -void VolumeMeter::setBackgroundWarningColorDisabled(QColor c) -{ - backgroundWarningColorDisabled = std::move(c); -} - -QColor VolumeMeter::getBackgroundErrorColor() const -{ - return p_backgroundErrorColor; -} - -QColor VolumeMeter::getBackgroundErrorColorDisabled() const -{ - return backgroundErrorColorDisabled; -} - -void VolumeMeter::setBackgroundErrorColor(QColor c) -{ - p_backgroundErrorColor = std::move(c); - - if (config_get_bool(App()->GetUserConfig(), "Accessibility", "OverrideColors")) { - backgroundErrorColor = - color_from_int(config_get_int(App()->GetUserConfig(), "Accessibility", "MixerRed")); - } else { - backgroundErrorColor = p_backgroundErrorColor; - } -} - -void VolumeMeter::setBackgroundErrorColorDisabled(QColor c) -{ - backgroundErrorColorDisabled = std::move(c); -} - -QColor VolumeMeter::getForegroundNominalColor() const -{ - return p_foregroundNominalColor; -} - -QColor VolumeMeter::getForegroundNominalColorDisabled() const -{ - return foregroundNominalColorDisabled; -} - -void VolumeMeter::setForegroundNominalColor(QColor c) -{ - p_foregroundNominalColor = std::move(c); - - if (config_get_bool(App()->GetUserConfig(), "Accessibility", "OverrideColors")) { - foregroundNominalColor = - color_from_int(config_get_int(App()->GetUserConfig(), "Accessibility", "MixerGreenActive")); - } else { - foregroundNominalColor = p_foregroundNominalColor; - } -} - -void VolumeMeter::setForegroundNominalColorDisabled(QColor c) -{ - foregroundNominalColorDisabled = std::move(c); -} - -QColor VolumeMeter::getForegroundWarningColor() const -{ - return p_foregroundWarningColor; -} - -QColor VolumeMeter::getForegroundWarningColorDisabled() const -{ - return foregroundWarningColorDisabled; -} - -void VolumeMeter::setForegroundWarningColor(QColor c) -{ - p_foregroundWarningColor = std::move(c); - - if (config_get_bool(App()->GetUserConfig(), "Accessibility", "OverrideColors")) { - foregroundWarningColor = - color_from_int(config_get_int(App()->GetUserConfig(), "Accessibility", "MixerYellowActive")); - } else { - foregroundWarningColor = p_foregroundWarningColor; - } -} - -void VolumeMeter::setForegroundWarningColorDisabled(QColor c) -{ - foregroundWarningColorDisabled = std::move(c); -} - -QColor VolumeMeter::getForegroundErrorColor() const -{ - return p_foregroundErrorColor; -} - -QColor VolumeMeter::getForegroundErrorColorDisabled() const -{ - return foregroundErrorColorDisabled; -} - -void VolumeMeter::setForegroundErrorColor(QColor c) -{ - p_foregroundErrorColor = std::move(c); - - if (config_get_bool(App()->GetUserConfig(), "Accessibility", "OverrideColors")) { - foregroundErrorColor = - color_from_int(config_get_int(App()->GetUserConfig(), "Accessibility", "MixerRedActive")); - } else { - foregroundErrorColor = p_foregroundErrorColor; - } -} - -void VolumeMeter::setForegroundErrorColorDisabled(QColor c) -{ - foregroundErrorColorDisabled = std::move(c); -} - -QColor VolumeMeter::getClipColor() const -{ - return clipColor; -} - -void VolumeMeter::setClipColor(QColor c) -{ - clipColor = std::move(c); -} - -QColor VolumeMeter::getMagnitudeColor() const -{ - return magnitudeColor; -} - -void VolumeMeter::setMagnitudeColor(QColor c) -{ - magnitudeColor = std::move(c); -} - -QColor VolumeMeter::getMajorTickColor() const -{ - return majorTickColor; -} - -void VolumeMeter::setMajorTickColor(QColor c) -{ - majorTickColor = std::move(c); -} - -QColor VolumeMeter::getMinorTickColor() const -{ - return minorTickColor; -} - -void VolumeMeter::setMinorTickColor(QColor c) -{ - minorTickColor = std::move(c); -} - -int VolumeMeter::getMeterThickness() const -{ - return meterThickness; -} - -void VolumeMeter::setMeterThickness(int v) -{ - meterThickness = v; - recalculateLayout = true; -} - -qreal VolumeMeter::getMeterFontScaling() const -{ - return meterFontScaling; -} - -void VolumeMeter::setMeterFontScaling(qreal v) -{ - meterFontScaling = v; - recalculateLayout = true; -} - -qreal VolumeMeter::getMinimumLevel() const -{ - return minimumLevel; -} - -void VolumeMeter::setMinimumLevel(qreal v) -{ - minimumLevel = v; -} - -qreal VolumeMeter::getWarningLevel() const -{ - return warningLevel; -} - -void VolumeMeter::setWarningLevel(qreal v) -{ - warningLevel = v; -} - -qreal VolumeMeter::getErrorLevel() const -{ - return errorLevel; -} - -void VolumeMeter::setErrorLevel(qreal v) -{ - errorLevel = v; -} - -qreal VolumeMeter::getClipLevel() const -{ - return clipLevel; -} - -void VolumeMeter::setClipLevel(qreal v) -{ - clipLevel = v; -} - -qreal VolumeMeter::getMinimumInputLevel() const -{ - return minimumInputLevel; -} - -void VolumeMeter::setMinimumInputLevel(qreal v) -{ - minimumInputLevel = v; -} - -qreal VolumeMeter::getPeakDecayRate() const -{ - return peakDecayRate; -} - -void VolumeMeter::setPeakDecayRate(qreal v) -{ - peakDecayRate = v; -} - -qreal VolumeMeter::getMagnitudeIntegrationTime() const -{ - return magnitudeIntegrationTime; -} - -void VolumeMeter::setMagnitudeIntegrationTime(qreal v) -{ - magnitudeIntegrationTime = v; -} - -qreal VolumeMeter::getPeakHoldDuration() const -{ - return peakHoldDuration; -} - -void VolumeMeter::setPeakHoldDuration(qreal v) -{ - peakHoldDuration = v; -} - -qreal VolumeMeter::getInputPeakHoldDuration() const -{ - return inputPeakHoldDuration; -} - -void VolumeMeter::setInputPeakHoldDuration(qreal v) -{ - inputPeakHoldDuration = v; -} - -void VolumeMeter::setPeakMeterType(enum obs_peak_meter_type peakMeterType) -{ - obs_volmeter_set_peak_meter_type(obs_volmeter, peakMeterType); - switch (peakMeterType) { - case TRUE_PEAK_METER: - // For true-peak meters EBU has defined the Permitted Maximum, - // taking into account the accuracy of the meter and further - // processing required by lossy audio compression. - // - // The alignment level was not specified, but I've adjusted - // it compared to a sample-peak meter. Incidentally Youtube - // uses this new Alignment Level as the maximum integrated - // loudness of a video. - // - // * Permitted Maximum Level (PML) = -2.0 dBTP - // * Alignment Level (AL) = -13 dBTP - setErrorLevel(-2.0); - setWarningLevel(-13.0); - break; - - case SAMPLE_PEAK_METER: - default: - // For a sample Peak Meter EBU has the following level - // definitions, taking into account inaccuracies of this meter: - // - // * Permitted Maximum Level (PML) = -9.0 dBFS - // * Alignment Level (AL) = -20.0 dBFS - setErrorLevel(-9.0); - setWarningLevel(-20.0); - break; - } -} - -void VolumeMeter::mousePressEvent(QMouseEvent *event) -{ - setFocus(Qt::MouseFocusReason); - event->accept(); -} - -void VolumeMeter::wheelEvent(QWheelEvent *event) -{ - QApplication::sendEvent(focusProxy(), event); -} - -VolumeMeter::VolumeMeter(QWidget *parent, obs_volmeter_t *obs_volmeter, bool vertical) - : QWidget(parent), - obs_volmeter(obs_volmeter), - vertical(vertical) -{ - setAttribute(Qt::WA_OpaquePaintEvent, true); - - // Default meter settings, they only show if - // there is no stylesheet, do not remove. - backgroundNominalColor.setRgb(0x26, 0x7f, 0x26); // Dark green - backgroundWarningColor.setRgb(0x7f, 0x7f, 0x26); // Dark yellow - backgroundErrorColor.setRgb(0x7f, 0x26, 0x26); // Dark red - foregroundNominalColor.setRgb(0x4c, 0xff, 0x4c); // Bright green - foregroundWarningColor.setRgb(0xff, 0xff, 0x4c); // Bright yellow - foregroundErrorColor.setRgb(0xff, 0x4c, 0x4c); // Bright red - - backgroundNominalColorDisabled.setRgb(90, 90, 90); - backgroundWarningColorDisabled.setRgb(117, 117, 117); - backgroundErrorColorDisabled.setRgb(65, 65, 65); - foregroundNominalColorDisabled.setRgb(163, 163, 163); - foregroundWarningColorDisabled.setRgb(217, 217, 217); - foregroundErrorColorDisabled.setRgb(113, 113, 113); - - clipColor.setRgb(0xff, 0xff, 0xff); // Bright white - magnitudeColor.setRgb(0x00, 0x00, 0x00); // Black - majorTickColor.setRgb(0x00, 0x00, 0x00); // Black - minorTickColor.setRgb(0x32, 0x32, 0x32); // Dark gray - minimumLevel = -60.0; // -60 dB - warningLevel = -20.0; // -20 dB - errorLevel = -9.0; // -9 dB - clipLevel = -0.5; // -0.5 dB - minimumInputLevel = -50.0; // -50 dB - peakDecayRate = 11.76; // 20 dB / 1.7 sec - magnitudeIntegrationTime = 0.3; // 99% in 300 ms - peakHoldDuration = 20.0; // 20 seconds - inputPeakHoldDuration = 1.0; // 1 second - meterThickness = 3; // Bar thickness in pixels - meterFontScaling = 0.7; // Font size for numbers is 70% of Widget's font size - channels = (int)audio_output_get_channels(obs_get_audio()); - - doLayout(); - updateTimerRef = updateTimer.lock(); - if (!updateTimerRef) { - updateTimerRef = std::make_shared<VolumeMeterTimer>(); - updateTimerRef->setTimerType(Qt::PreciseTimer); - updateTimerRef->start(16); - updateTimer = updateTimerRef; - } - - updateTimerRef->AddVolControl(this); -} - -VolumeMeter::~VolumeMeter() -{ - updateTimerRef->RemoveVolControl(this); -} - -void VolumeMeter::setLevels(const float magnitudeMAX_AUDIO_CHANNELS, const float peakMAX_AUDIO_CHANNELS, - const float inputPeakMAX_AUDIO_CHANNELS) -{ - uint64_t ts = os_gettime_ns(); - QMutexLocker locker(&dataMutex); - - currentLastUpdateTime = ts; - for (int channelNr = 0; channelNr < MAX_AUDIO_CHANNELS; channelNr++) { - currentMagnitudechannelNr = magnitudechannelNr; - currentPeakchannelNr = peakchannelNr; - currentInputPeakchannelNr = inputPeakchannelNr; - } - - // In case there are more updates then redraws we must make sure - // that the ballistics of peak and hold are recalculated. - locker.unlock(); - calculateBallistics(ts); -} - -inline void VolumeMeter::resetLevels() -{ - currentLastUpdateTime = 0; - for (int channelNr = 0; channelNr < MAX_AUDIO_CHANNELS; channelNr++) { - currentMagnitudechannelNr = -M_INFINITE; - currentPeakchannelNr = -M_INFINITE; - currentInputPeakchannelNr = -M_INFINITE; - - displayMagnitudechannelNr = -M_INFINITE; - displayPeakchannelNr = -M_INFINITE; - displayPeakHoldchannelNr = -M_INFINITE; - displayPeakHoldLastUpdateTimechannelNr = 0; - displayInputPeakHoldchannelNr = -M_INFINITE; - displayInputPeakHoldLastUpdateTimechannelNr = 0; - } -} - -bool VolumeMeter::needLayoutChange() -{ - int currentNrAudioChannels = obs_volmeter_get_nr_channels(obs_volmeter); - - if (!currentNrAudioChannels) { - struct obs_audio_info oai; - obs_get_audio_info(&oai); - currentNrAudioChannels = (oai.speakers == SPEAKERS_MONO) ? 1 : 2; - } - - if (displayNrAudioChannels != currentNrAudioChannels) { - displayNrAudioChannels = currentNrAudioChannels; - recalculateLayout = true; - } - - return recalculateLayout; -} - -// When this is called from the constructor, obs_volmeter_get_nr_channels has not -// yet been called and Q_PROPERTY settings have not yet been read from the -// stylesheet. -inline void VolumeMeter::doLayout() -{ - QMutexLocker locker(&dataMutex); - - if (displayNrAudioChannels) { - int meterSize = std::floor(22 / displayNrAudioChannels); - setMeterThickness(std::clamp(meterSize, 3, 7)); - } - recalculateLayout = false; - - tickFont = font(); - QFontInfo info(tickFont); - tickFont.setPointSizeF(info.pointSizeF() * meterFontScaling); - QFontMetrics metrics(tickFont); - if (vertical) { - // Each meter channel is meterThickness pixels wide, plus one pixel - // between channels, but not after the last. - // Add 4 pixels for ticks, space to hold our longest label in this font, - // and a few pixels before the fader. - QRect scaleBounds = metrics.boundingRect("-88"); - setMinimumSize(displayNrAudioChannels * (meterThickness + 1) - 1 + 10 + scaleBounds.width() + 2, 100); - } else { - // Each meter channel is meterThickness pixels high, plus one pixel - // between channels, but not after the last. - // Add 4 pixels for ticks, and space high enough to hold our label in - // this font, presuming that digits don't have descenders. - setMinimumSize(100, displayNrAudioChannels * (meterThickness + 1) - 1 + 4 + metrics.capHeight()); - } - - resetLevels(); -} - -inline bool VolumeMeter::detectIdle(uint64_t ts) -{ - double timeSinceLastUpdate = (ts - currentLastUpdateTime) * 0.000000001; - if (timeSinceLastUpdate > 0.5) { - resetLevels(); - return true; - } else { - return false; - } -} - -inline void VolumeMeter::calculateBallisticsForChannel(int channelNr, uint64_t ts, qreal timeSinceLastRedraw) -{ - if (currentPeakchannelNr >= displayPeakchannelNr || isnan(displayPeakchannelNr)) { - // Attack of peak is immediate. - displayPeakchannelNr = currentPeakchannelNr; - } else { - // Decay of peak is 40 dB / 1.7 seconds for Fast Profile - // 20 dB / 1.7 seconds for Medium Profile (Type I PPM) - // 24 dB / 2.8 seconds for Slow Profile (Type II PPM) - float decay = float(peakDecayRate * timeSinceLastRedraw); - displayPeakchannelNr = - std::clamp(displayPeakchannelNr - decay, std::min(currentPeakchannelNr, 0.f), 0.f); - } - - if (currentPeakchannelNr >= displayPeakHoldchannelNr || !isfinite(displayPeakHoldchannelNr)) { - // Attack of peak-hold is immediate, but keep track - // when it was last updated. - displayPeakHoldchannelNr = currentPeakchannelNr; - displayPeakHoldLastUpdateTimechannelNr = ts; - } else { - // The peak and hold falls back to peak - // after 20 seconds. - qreal timeSinceLastPeak = (uint64_t)(ts - displayPeakHoldLastUpdateTimechannelNr) * 0.000000001; - if (timeSinceLastPeak > peakHoldDuration) { - displayPeakHoldchannelNr = currentPeakchannelNr; - displayPeakHoldLastUpdateTimechannelNr = ts; - } - } - - if (currentInputPeakchannelNr >= displayInputPeakHoldchannelNr || - !isfinite(displayInputPeakHoldchannelNr)) { - // Attack of peak-hold is immediate, but keep track - // when it was last updated. - displayInputPeakHoldchannelNr = currentInputPeakchannelNr; - displayInputPeakHoldLastUpdateTimechannelNr = ts; - } else { - // The peak and hold falls back to peak after 1 second. - qreal timeSinceLastPeak = (uint64_t)(ts - displayInputPeakHoldLastUpdateTimechannelNr) * 0.000000001; - if (timeSinceLastPeak > inputPeakHoldDuration) { - displayInputPeakHoldchannelNr = currentInputPeakchannelNr; - displayInputPeakHoldLastUpdateTimechannelNr = ts; - } - } - - if (!isfinite(displayMagnitudechannelNr)) { - // The statements in the else-leg do not work with - // NaN and infinite displayMagnitude. - displayMagnitudechannelNr = currentMagnitudechannelNr; - } else { - // A VU meter will integrate to the new value to 99% in 300 ms. - // The calculation here is very simplified and is more accurate - // with higher frame-rate. - float attack = float((currentMagnitudechannelNr - displayMagnitudechannelNr) * - (timeSinceLastRedraw / magnitudeIntegrationTime) * 0.99); - displayMagnitudechannelNr = - std::clamp(displayMagnitudechannelNr + attack, (float)minimumLevel, 0.f); - } -} - -inline void VolumeMeter::calculateBallistics(uint64_t ts, qreal timeSinceLastRedraw) -{ - QMutexLocker locker(&dataMutex); - - for (int channelNr = 0; channelNr < MAX_AUDIO_CHANNELS; channelNr++) - calculateBallisticsForChannel(channelNr, ts, timeSinceLastRedraw); -} - -void VolumeMeter::paintInputMeter(QPainter &painter, int x, int y, int width, int height, float peakHold) -{ - QMutexLocker locker(&dataMutex); - QColor color; - - if (peakHold < minimumInputLevel) - color = backgroundNominalColor; - else if (peakHold < warningLevel) - color = foregroundNominalColor; - else if (peakHold < errorLevel) - color = foregroundWarningColor; - else if (peakHold <= clipLevel) - color = foregroundErrorColor; - else - color = clipColor; - - painter.fillRect(x, y, width, height, color); -} - -void VolumeMeter::paintHTicks(QPainter &painter, int x, int y, int width) -{ - qreal scale = width / minimumLevel; - - painter.setFont(tickFont); - QFontMetrics metrics(tickFont); - painter.setPen(majorTickColor); - - // Draw major tick lines and numeric indicators. - for (int i = 0; i >= minimumLevel; i -= 5) { - int position = int(x + width - (i * scale) - 1); - QString str = QString::number(i); - - // Center the number on the tick, but don't overflow - QRect textBounds = metrics.boundingRect(str); - int pos; - if (i == 0) { - pos = position - textBounds.width(); - } else { - pos = position - (textBounds.width() / 2); - if (pos < 0) - pos = 0; - } - painter.drawText(pos, y + 4 + metrics.capHeight(), str); - - painter.drawLine(position, y, position, y + 2); - } -} - -void VolumeMeter::paintVTicks(QPainter &painter, int x, int y, int height) -{ - qreal scale = height / minimumLevel; - - painter.setFont(tickFont); - QFontMetrics metrics(tickFont); - painter.setPen(majorTickColor); - - // Draw major tick lines and numeric indicators. - for (int i = 0; i >= minimumLevel; i -= 5) { - int position = y + int(i * scale) + METER_PADDING; - QString str = QString::number(i); - - // Center the number on the tick, but don't overflow - if (i == 0) { - painter.drawText(x + 10, position + metrics.capHeight(), str); - } else { - painter.drawText(x + 8, position + (metrics.capHeight() / 2), str); - } - - painter.drawLine(x, position, x + 2, position); - } -} - -#define CLIP_FLASH_DURATION_MS 1000 - -inline int VolumeMeter::convertToInt(float number) -{ - constexpr int min = std::numeric_limits<int>::min(); - constexpr int max = std::numeric_limits<int>::max(); - - // NOTE: Conversion from 'const int' to 'float' changes max value from 2147483647 to 2147483648 - if (number >= (float)max) - return max; - else if (number < min) - return min; - else - return int(number); -} - -void VolumeMeter::paintHMeter(QPainter &painter, int x, int y, int width, int height, float magnitude, float peak, - float peakHold) -{ - qreal scale = width / minimumLevel; - - QMutexLocker locker(&dataMutex); - int minimumPosition = x + 0; - int maximumPosition = x + width; - int magnitudePosition = x + width - convertToInt(magnitude * scale); - int peakPosition = x + width - convertToInt(peak * scale); - int peakHoldPosition = x + width - convertToInt(peakHold * scale); - int warningPosition = x + width - convertToInt(warningLevel * scale); - int errorPosition = x + width - convertToInt(errorLevel * scale); - - int nominalLength = warningPosition - minimumPosition; - int warningLength = errorPosition - warningPosition; - int errorLength = maximumPosition - errorPosition; - locker.unlock(); - - if (clipping) { - peakPosition = maximumPosition; - } - - if (peakPosition < minimumPosition) { - painter.fillRect(minimumPosition, y, nominalLength, height, - muted ? backgroundNominalColorDisabled : backgroundNominalColor); - painter.fillRect(warningPosition, y, warningLength, height, - muted ? backgroundWarningColorDisabled : backgroundWarningColor); - painter.fillRect(errorPosition, y, errorLength, height, - muted ? backgroundErrorColorDisabled : backgroundErrorColor); - } else if (peakPosition < warningPosition) { - painter.fillRect(minimumPosition, y, peakPosition - minimumPosition, height, - muted ? foregroundNominalColorDisabled : foregroundNominalColor); - painter.fillRect(peakPosition, y, warningPosition - peakPosition, height, - muted ? backgroundNominalColorDisabled : backgroundNominalColor); - painter.fillRect(warningPosition, y, warningLength, height, - muted ? backgroundWarningColorDisabled : backgroundWarningColor); - painter.fillRect(errorPosition, y, errorLength, height, - muted ? backgroundErrorColorDisabled : backgroundErrorColor); - } else if (peakPosition < errorPosition) { - painter.fillRect(minimumPosition, y, nominalLength, height, - muted ? foregroundNominalColorDisabled : foregroundNominalColor); - painter.fillRect(warningPosition, y, peakPosition - warningPosition, height, - muted ? foregroundWarningColorDisabled : foregroundWarningColor); - painter.fillRect(peakPosition, y, errorPosition - peakPosition, height, - muted ? backgroundWarningColorDisabled : backgroundWarningColor); - painter.fillRect(errorPosition, y, errorLength, height, - muted ? backgroundErrorColorDisabled : backgroundErrorColor); - } else if (peakPosition < maximumPosition) { - painter.fillRect(minimumPosition, y, nominalLength, height, - muted ? foregroundNominalColorDisabled : foregroundNominalColor); - painter.fillRect(warningPosition, y, warningLength, height, - muted ? foregroundWarningColorDisabled : foregroundWarningColor); - painter.fillRect(errorPosition, y, peakPosition - errorPosition, height, - muted ? foregroundErrorColorDisabled : foregroundErrorColor); - painter.fillRect(peakPosition, y, maximumPosition - peakPosition, height, - muted ? backgroundErrorColorDisabled : backgroundErrorColor); - } else { - if (!clipping) { - QTimer::singleShot(CLIP_FLASH_DURATION_MS, this, &() { clipping = false; }); - clipping = true; - } - - int end = errorLength + warningLength + nominalLength; - painter.fillRect(minimumPosition, y, end, height, - QBrush(muted ? foregroundErrorColorDisabled : foregroundErrorColor)); - } - - if (peakHoldPosition - 3 < minimumPosition) - ; // Peak-hold below minimum, no drawing. - else if (peakHoldPosition < warningPosition) - painter.fillRect(peakHoldPosition - 3, y, 3, height, - muted ? foregroundNominalColorDisabled : foregroundNominalColor); - else if (peakHoldPosition < errorPosition) - painter.fillRect(peakHoldPosition - 3, y, 3, height, - muted ? foregroundWarningColorDisabled : foregroundWarningColor); - else - painter.fillRect(peakHoldPosition - 3, y, 3, height, - muted ? foregroundErrorColorDisabled : foregroundErrorColor); - - if (magnitudePosition - 3 >= minimumPosition) - painter.fillRect(magnitudePosition - 3, y, 3, height, magnitudeColor); -} - -void VolumeMeter::paintVMeter(QPainter &painter, int x, int y, int width, int height, float magnitude, float peak, - float peakHold) -{ - qreal scale = height / minimumLevel; - - QMutexLocker locker(&dataMutex); - int minimumPosition = y + 0; - int maximumPosition = y + height; - int magnitudePosition = y + height - convertToInt(magnitude * scale); - int peakPosition = y + height - convertToInt(peak * scale); - int peakHoldPosition = y + height - convertToInt(peakHold * scale); - int warningPosition = y + height - convertToInt(warningLevel * scale); - int errorPosition = y + height - convertToInt(errorLevel * scale); - - int nominalLength = warningPosition - minimumPosition; - int warningLength = errorPosition - warningPosition; - int errorLength = maximumPosition - errorPosition; - locker.unlock(); - - if (clipping) { - peakPosition = maximumPosition; - } - - if (peakPosition < minimumPosition) { - painter.fillRect(x, minimumPosition, width, nominalLength, - muted ? backgroundNominalColorDisabled : backgroundNominalColor); - painter.fillRect(x, warningPosition, width, warningLength, - muted ? backgroundWarningColorDisabled : backgroundWarningColor); - painter.fillRect(x, errorPosition, width, errorLength, - muted ? backgroundErrorColorDisabled : backgroundErrorColor); - } else if (peakPosition < warningPosition) { - painter.fillRect(x, minimumPosition, width, peakPosition - minimumPosition, - muted ? foregroundNominalColorDisabled : foregroundNominalColor); - painter.fillRect(x, peakPosition, width, warningPosition - peakPosition, - muted ? backgroundNominalColorDisabled : backgroundNominalColor); - painter.fillRect(x, warningPosition, width, warningLength, - muted ? backgroundWarningColorDisabled : backgroundWarningColor); - painter.fillRect(x, errorPosition, width, errorLength, - muted ? backgroundErrorColorDisabled : backgroundErrorColor); - } else if (peakPosition < errorPosition) { - painter.fillRect(x, minimumPosition, width, nominalLength, - muted ? foregroundNominalColorDisabled : foregroundNominalColor); - painter.fillRect(x, warningPosition, width, peakPosition - warningPosition, - muted ? foregroundWarningColorDisabled : foregroundWarningColor); - painter.fillRect(x, peakPosition, width, errorPosition - peakPosition, - muted ? backgroundWarningColorDisabled : backgroundWarningColor); - painter.fillRect(x, errorPosition, width, errorLength, - muted ? backgroundErrorColorDisabled : backgroundErrorColor); - } else if (peakPosition < maximumPosition) { - painter.fillRect(x, minimumPosition, width, nominalLength, - muted ? foregroundNominalColorDisabled : foregroundNominalColor); - painter.fillRect(x, warningPosition, width, warningLength, - muted ? foregroundWarningColorDisabled : foregroundWarningColor); - painter.fillRect(x, errorPosition, width, peakPosition - errorPosition, - muted ? foregroundErrorColorDisabled : foregroundErrorColor); - painter.fillRect(x, peakPosition, width, maximumPosition - peakPosition, - muted ? backgroundErrorColorDisabled : backgroundErrorColor); - } else { - if (!clipping) { - QTimer::singleShot(CLIP_FLASH_DURATION_MS, this, &() { clipping = false; }); - clipping = true; - } - - int end = errorLength + warningLength + nominalLength; - painter.fillRect(x, minimumPosition, width, end, - QBrush(muted ? foregroundErrorColorDisabled : foregroundErrorColor)); - } - - if (peakHoldPosition - 3 < minimumPosition) - ; // Peak-hold below minimum, no drawing. - else if (peakHoldPosition < warningPosition) - painter.fillRect(x, peakHoldPosition - 3, width, 3, - muted ? foregroundNominalColorDisabled : foregroundNominalColor); - else if (peakHoldPosition < errorPosition) - painter.fillRect(x, peakHoldPosition - 3, width, 3, - muted ? foregroundWarningColorDisabled : foregroundWarningColor); - else - painter.fillRect(x, peakHoldPosition - 3, width, 3, - muted ? foregroundErrorColorDisabled : foregroundErrorColor); - - if (magnitudePosition - 3 >= minimumPosition) - painter.fillRect(x, magnitudePosition - 3, width, 3, magnitudeColor); -} - -void VolumeMeter::paintEvent(QPaintEvent *event) -{ - uint64_t ts = os_gettime_ns(); - qreal timeSinceLastRedraw = (ts - lastRedrawTime) * 0.000000001; - calculateBallistics(ts, timeSinceLastRedraw); - bool idle = detectIdle(ts); - - QRect widgetRect = rect(); - int width = widgetRect.width(); - int height = widgetRect.height(); - - QPainter painter(this); - - // Paint window background color (as widget is opaque) - QColor background = palette().color(QPalette::ColorRole::Window); - painter.fillRect(event->region().boundingRect(), background); - - if (vertical) - height -= METER_PADDING * 2; - - // timerEvent requests update of the bar(s) only, so we can avoid the - // overhead of repainting the scale and labels. - if (event->region().boundingRect() != getBarRect()) { - if (needLayoutChange()) - doLayout(); - - if (vertical) { - paintVTicks(painter, displayNrAudioChannels * (meterThickness + 1) - 1, 0, - height - (INDICATOR_THICKNESS + 3)); - } else { - paintHTicks(painter, INDICATOR_THICKNESS + 3, displayNrAudioChannels * (meterThickness + 1) - 1, - width - (INDICATOR_THICKNESS + 3)); - } - } - - if (vertical) { - // Invert the Y axis to ease the math - painter.translate(0, height + METER_PADDING); - painter.scale(1, -1); - } - - for (int channelNr = 0; channelNr < displayNrAudioChannels; channelNr++) { - - int channelNrFixed = (displayNrAudioChannels == 1 && channels > 2) ? 2 : channelNr; - - if (vertical) - paintVMeter(painter, channelNr * (meterThickness + 1), INDICATOR_THICKNESS + 2, meterThickness, - height - (INDICATOR_THICKNESS + 2), displayMagnitudechannelNrFixed, - displayPeakchannelNrFixed, displayPeakHoldchannelNrFixed); - else - paintHMeter(painter, INDICATOR_THICKNESS + 2, channelNr * (meterThickness + 1), - width - (INDICATOR_THICKNESS + 2), meterThickness, displayMagnitudechannelNrFixed, - displayPeakchannelNrFixed, displayPeakHoldchannelNrFixed); - - if (idle) - continue; - - // By not drawing the input meter boxes the user can - // see that the audio stream has been stopped, without - // having too much visual impact. - if (vertical) - paintInputMeter(painter, channelNr * (meterThickness + 1), 0, meterThickness, - INDICATOR_THICKNESS, displayInputPeakHoldchannelNrFixed); - else - paintInputMeter(painter, 0, channelNr * (meterThickness + 1), INDICATOR_THICKNESS, - meterThickness, displayInputPeakHoldchannelNrFixed); - } - - lastRedrawTime = ts; -} - -QRect VolumeMeter::getBarRect() const -{ - QRect rec = rect(); - if (vertical) - rec.setWidth(displayNrAudioChannels * (meterThickness + 1) - 1); - else - rec.setHeight(displayNrAudioChannels * (meterThickness + 1) - 1); - - return rec; -} - -void VolumeMeter::changeEvent(QEvent *e) -{ - if (e->type() == QEvent::StyleChange) - recalculateLayout = true; - - QWidget::changeEvent(e); -}
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/VolumeMeter.hpp
Deleted
@@ -1,222 +0,0 @@ -#pragma once - -#include <obs.hpp> - -#include <QMutex> -#include <QWidget> - -#define FADER_PRECISION 4096.0 - -class VolumeMeterTimer; - -class VolumeMeter : public QWidget { - Q_OBJECT - Q_PROPERTY(QColor backgroundNominalColor READ getBackgroundNominalColor WRITE setBackgroundNominalColor - DESIGNABLE true) - Q_PROPERTY(QColor backgroundWarningColor READ getBackgroundWarningColor WRITE setBackgroundWarningColor - DESIGNABLE true) - Q_PROPERTY( - QColor backgroundErrorColor READ getBackgroundErrorColor WRITE setBackgroundErrorColor DESIGNABLE true) - Q_PROPERTY(QColor foregroundNominalColor READ getForegroundNominalColor WRITE setForegroundNominalColor - DESIGNABLE true) - Q_PROPERTY(QColor foregroundWarningColor READ getForegroundWarningColor WRITE setForegroundWarningColor - DESIGNABLE true) - Q_PROPERTY( - QColor foregroundErrorColor READ getForegroundErrorColor WRITE setForegroundErrorColor DESIGNABLE true) - - Q_PROPERTY(QColor backgroundNominalColorDisabled READ getBackgroundNominalColorDisabled WRITE - setBackgroundNominalColorDisabled DESIGNABLE true) - Q_PROPERTY(QColor backgroundWarningColorDisabled READ getBackgroundWarningColorDisabled WRITE - setBackgroundWarningColorDisabled DESIGNABLE true) - Q_PROPERTY(QColor backgroundErrorColorDisabled READ getBackgroundErrorColorDisabled WRITE - setBackgroundErrorColorDisabled DESIGNABLE true) - Q_PROPERTY(QColor foregroundNominalColorDisabled READ getForegroundNominalColorDisabled WRITE - setForegroundNominalColorDisabled DESIGNABLE true) - Q_PROPERTY(QColor foregroundWarningColorDisabled READ getForegroundWarningColorDisabled WRITE - setForegroundWarningColorDisabled DESIGNABLE true) - Q_PROPERTY(QColor foregroundErrorColorDisabled READ getForegroundErrorColorDisabled WRITE - setForegroundErrorColorDisabled DESIGNABLE true) - - Q_PROPERTY(QColor clipColor READ getClipColor WRITE setClipColor DESIGNABLE true) - Q_PROPERTY(QColor magnitudeColor READ getMagnitudeColor WRITE setMagnitudeColor DESIGNABLE true) - Q_PROPERTY(QColor majorTickColor READ getMajorTickColor WRITE setMajorTickColor DESIGNABLE true) - Q_PROPERTY(QColor minorTickColor READ getMinorTickColor WRITE setMinorTickColor DESIGNABLE true) - Q_PROPERTY(int meterThickness READ getMeterThickness WRITE setMeterThickness DESIGNABLE true) - Q_PROPERTY(qreal meterFontScaling READ getMeterFontScaling WRITE setMeterFontScaling DESIGNABLE true) - - // Levels are denoted in dBFS. - Q_PROPERTY(qreal minimumLevel READ getMinimumLevel WRITE setMinimumLevel DESIGNABLE true) - Q_PROPERTY(qreal warningLevel READ getWarningLevel WRITE setWarningLevel DESIGNABLE true) - Q_PROPERTY(qreal errorLevel READ getErrorLevel WRITE setErrorLevel DESIGNABLE true) - Q_PROPERTY(qreal clipLevel READ getClipLevel WRITE setClipLevel DESIGNABLE true) - Q_PROPERTY(qreal minimumInputLevel READ getMinimumInputLevel WRITE setMinimumInputLevel DESIGNABLE true) - - // Rates are denoted in dB/second. - Q_PROPERTY(qreal peakDecayRate READ getPeakDecayRate WRITE setPeakDecayRate DESIGNABLE true) - - // Time in seconds for the VU meter to integrate over. - Q_PROPERTY(qreal magnitudeIntegrationTime READ getMagnitudeIntegrationTime WRITE setMagnitudeIntegrationTime - DESIGNABLE true) - - // Duration is denoted in seconds. - Q_PROPERTY(qreal peakHoldDuration READ getPeakHoldDuration WRITE setPeakHoldDuration DESIGNABLE true) - Q_PROPERTY(qreal inputPeakHoldDuration READ getInputPeakHoldDuration WRITE setInputPeakHoldDuration - DESIGNABLE true) - - friend class VolControl; - -private: - obs_volmeter_t *obs_volmeter; - static std::weak_ptr<VolumeMeterTimer> updateTimer; - std::shared_ptr<VolumeMeterTimer> updateTimerRef; - - inline void resetLevels(); - inline void doLayout(); - inline bool detectIdle(uint64_t ts); - inline void calculateBallistics(uint64_t ts, qreal timeSinceLastRedraw = 0.0); - inline void calculateBallisticsForChannel(int channelNr, uint64_t ts, qreal timeSinceLastRedraw); - - inline int convertToInt(float number); - void paintInputMeter(QPainter &painter, int x, int y, int width, int height, float peakHold); - void paintHMeter(QPainter &painter, int x, int y, int width, int height, float magnitude, float peak, - float peakHold); - void paintHTicks(QPainter &painter, int x, int y, int width); - void paintVMeter(QPainter &painter, int x, int y, int width, int height, float magnitude, float peak, - float peakHold); - void paintVTicks(QPainter &painter, int x, int y, int height); - - QMutex dataMutex; - - bool recalculateLayout = true; - uint64_t currentLastUpdateTime = 0; - float currentMagnitudeMAX_AUDIO_CHANNELS; - float currentPeakMAX_AUDIO_CHANNELS; - float currentInputPeakMAX_AUDIO_CHANNELS; - - int displayNrAudioChannels = 0; - float displayMagnitudeMAX_AUDIO_CHANNELS; - float displayPeakMAX_AUDIO_CHANNELS; - float displayPeakHoldMAX_AUDIO_CHANNELS; - uint64_t displayPeakHoldLastUpdateTimeMAX_AUDIO_CHANNELS; - float displayInputPeakHoldMAX_AUDIO_CHANNELS; - uint64_t displayInputPeakHoldLastUpdateTimeMAX_AUDIO_CHANNELS; - - QFont tickFont; - QColor backgroundNominalColor; - QColor backgroundWarningColor; - QColor backgroundErrorColor; - QColor foregroundNominalColor; - QColor foregroundWarningColor; - QColor foregroundErrorColor; - - QColor backgroundNominalColorDisabled; - QColor backgroundWarningColorDisabled; - QColor backgroundErrorColorDisabled; - QColor foregroundNominalColorDisabled; - QColor foregroundWarningColorDisabled; - QColor foregroundErrorColorDisabled; - - QColor clipColor; - QColor magnitudeColor; - QColor majorTickColor; - QColor minorTickColor; - - int meterThickness; - qreal meterFontScaling; - - qreal minimumLevel; - qreal warningLevel; - qreal errorLevel; - qreal clipLevel; - qreal minimumInputLevel; - qreal peakDecayRate; - qreal magnitudeIntegrationTime; - qreal peakHoldDuration; - qreal inputPeakHoldDuration; - - QColor p_backgroundNominalColor; - QColor p_backgroundWarningColor; - QColor p_backgroundErrorColor; - QColor p_foregroundNominalColor; - QColor p_foregroundWarningColor; - QColor p_foregroundErrorColor; - - uint64_t lastRedrawTime = 0; - int channels = 0; - bool clipping = false; - bool vertical; - bool muted = false; - -public: - explicit VolumeMeter(QWidget *parent = nullptr, obs_volmeter_t *obs_volmeter = nullptr, bool vertical = false); - ~VolumeMeter(); - - void setLevels(const float magnitudeMAX_AUDIO_CHANNELS, const float peakMAX_AUDIO_CHANNELS, - const float inputPeakMAX_AUDIO_CHANNELS); - QRect getBarRect() const; - bool needLayoutChange(); - - QColor getBackgroundNominalColor() const; - void setBackgroundNominalColor(QColor c); - QColor getBackgroundWarningColor() const; - void setBackgroundWarningColor(QColor c); - QColor getBackgroundErrorColor() const; - void setBackgroundErrorColor(QColor c); - QColor getForegroundNominalColor() const; - void setForegroundNominalColor(QColor c); - QColor getForegroundWarningColor() const; - void setForegroundWarningColor(QColor c); - QColor getForegroundErrorColor() const; - void setForegroundErrorColor(QColor c); - - QColor getBackgroundNominalColorDisabled() const; - void setBackgroundNominalColorDisabled(QColor c); - QColor getBackgroundWarningColorDisabled() const; - void setBackgroundWarningColorDisabled(QColor c); - QColor getBackgroundErrorColorDisabled() const; - void setBackgroundErrorColorDisabled(QColor c); - QColor getForegroundNominalColorDisabled() const; - void setForegroundNominalColorDisabled(QColor c); - QColor getForegroundWarningColorDisabled() const; - void setForegroundWarningColorDisabled(QColor c); - QColor getForegroundErrorColorDisabled() const; - void setForegroundErrorColorDisabled(QColor c); - - QColor getClipColor() const; - void setClipColor(QColor c); - QColor getMagnitudeColor() const; - void setMagnitudeColor(QColor c); - QColor getMajorTickColor() const; - void setMajorTickColor(QColor c); - QColor getMinorTickColor() const; - void setMinorTickColor(QColor c); - int getMeterThickness() const; - void setMeterThickness(int v); - qreal getMeterFontScaling() const; - void setMeterFontScaling(qreal v); - qreal getMinimumLevel() const; - void setMinimumLevel(qreal v); - qreal getWarningLevel() const; - void setWarningLevel(qreal v); - qreal getErrorLevel() const; - void setErrorLevel(qreal v); - qreal getClipLevel() const; - void setClipLevel(qreal v); - qreal getMinimumInputLevel() const; - void setMinimumInputLevel(qreal v); - qreal getPeakDecayRate() const; - void setPeakDecayRate(qreal v); - qreal getMagnitudeIntegrationTime() const; - void setMagnitudeIntegrationTime(qreal v); - qreal getPeakHoldDuration() const; - void setPeakHoldDuration(qreal v); - qreal getInputPeakHoldDuration() const; - void setInputPeakHoldDuration(qreal v); - void setPeakMeterType(enum obs_peak_meter_type peakMeterType); - virtual void mousePressEvent(QMouseEvent *event) override; - virtual void wheelEvent(QWheelEvent *event) override; - -protected: - void paintEvent(QPaintEvent *event) override; - void changeEvent(QEvent *e) override; -};
View file
obs-studio-32.0.4.tar.xz/plugins/obs-filters/nvafx-load.h
Deleted
@@ -1,297 +0,0 @@ -#include <Windows.h> -#include <stdio.h> -#include <stdbool.h> -#include <stddef.h> -#include <stdint.h> -#include <util/platform.h> -#include <util/windows/win-version.h> - -#define NVAFX_API - -#ifdef LIBNVAFX_ENABLED -#define MIN_AFX_SDK_VERSION (1 << 24 | 3 << 16 | 0 << 0) -static HMODULE nv_audiofx = NULL; -static HMODULE nv_cuda = NULL; - -/** Effects @ref NvAFX_EffectSelector */ -#define NVAFX_EFFECT_DENOISER "denoiser" -#define NVAFX_EFFECT_DEREVERB "dereverb" -#define NVAFX_EFFECT_DEREVERB_DENOISER "dereverb_denoiser" -#define NVAFX_EFFECT_AEC "aec" -#define NVAFX_EFFECT_SUPERRES "superres" - -/** Model paths */ -#define NVAFX_EFFECT_DENOISER_MODEL "\\models\\denoiser_48k.trtpkg" -#define NVAFX_EFFECT_DEREVERB_MODEL "\\models\\dereverb_48k.trtpkg" -#define NVAFX_EFFECT_DEREVERB_DENOISER_MODEL "\\models\\dereverb_denoiser_48k.trtpkg" - -#define NVAFX_CHAINED_EFFECT_DENOISER_16k_SUPERRES_16k_TO_48k "denoiser16k_superres16kto48k" -#define NVAFX_CHAINED_EFFECT_DEREVERB_16k_SUPERRES_16k_TO_48k "dereverb16k_superres16kto48k" -#define NVAFX_CHAINED_EFFECT_DEREVERB_DENOISER_16k_SUPERRES_16k_TO_48k "dereverb_denoiser16k_superres16kto48k" -#define NVAFX_CHAINED_EFFECT_SUPERRES_8k_TO_16k_DENOISER_16k "superres8kto16k_denoiser16k" -#define NVAFX_CHAINED_EFFECT_SUPERRES_8k_TO_16k_DEREVERB_16k "superres8kto16k_dereverb16k" -#define NVAFX_CHAINED_EFFECT_SUPERRES_8k_TO_16k_DEREVERB_DENOISER_16k "superres8kto16k_dereverb_denoiser16k" - -/** Parameter selectors */ - -#define NVAFX_PARAM_NUM_STREAMS "num_streams" -#define NVAFX_PARAM_USE_DEFAULT_GPU "use_default_gpu" -#define NVAFX_PARAM_USER_CUDA_CONTEXT "user_cuda_context" -#define NVAFX_PARAM_DISABLE_CUDA_GRAPH "disable_cuda_graph" -#define NVAFX_PARAM_ENABLE_VAD "enable_vad" -/** Effect parameters. @ref NvAFX_ParameterSelector */ -#define NVAFX_PARAM_MODEL_PATH "model_path" -#define NVAFX_PARAM_INPUT_SAMPLE_RATE "input_sample_rate" -#define NVAFX_PARAM_OUTPUT_SAMPLE_RATE "output_sample_rate" -#define NVAFX_PARAM_NUM_INPUT_SAMPLES_PER_FRAME "num_input_samples_per_frame" -#define NVAFX_PARAM_NUM_OUTPUT_SAMPLES_PER_FRAME "num_output_samples_per_frame" -#define NVAFX_PARAM_NUM_INPUT_CHANNELS "num_input_channels" -#define NVAFX_PARAM_NUM_OUTPUT_CHANNELS "num_output_channels" -#define NVAFX_PARAM_INTENSITY_RATIO "intensity_ratio" - -#pragma deprecated(NVAFX_PARAM_DENOISER_MODEL_PATH) -#define NVAFX_PARAM_DENOISER_MODEL_PATH NVAFX_PARAM_MODEL_PATH -#pragma deprecated(NVAFX_PARAM_DENOISER_SAMPLE_RATE) -#define NVAFX_PARAM_DENOISER_SAMPLE_RATE NVAFX_PARAM_SAMPLE_RATE -#pragma deprecated(NVAFX_PARAM_DENOISER_NUM_SAMPLES_PER_FRAME) -#define NVAFX_PARAM_DENOISER_NUM_SAMPLES_PER_FRAME NVAFX_PARAM_NUM_SAMPLES_PER_FRAME -#pragma deprecated(NVAFX_PARAM_DENOISER_NUM_CHANNELS) -#define NVAFX_PARAM_DENOISER_NUM_CHANNELS NVAFX_PARAM_NUM_CHANNELS -#pragma deprecated(NVAFX_PARAM_DENOISER_INTENSITY_RATIO) -#define NVAFX_PARAM_DENOISER_INTENSITY_RATIO NVAFX_PARAM_INTENSITY_RATIO -/** Number of audio channels **/ -#pragma deprecated(NVAFX_PARAM_NUM_CHANNELS) -#define NVAFX_PARAM_NUM_CHANNELS "num_channels" -/** Sample rate (unsigned int). Currently supported sample rate(s): 48000, 16000 */ -#pragma deprecated(NVAFX_PARAM_SAMPLE_RATE) -#define NVAFX_PARAM_SAMPLE_RATE "sample_rate" -/** Number of samples per frame (unsigned int). This is immutable parameter */ -#pragma deprecated(NVAFX_PARAM_NUM_SAMPLES_PER_FRAME) -#define NVAFX_PARAM_NUM_SAMPLES_PER_FRAME "num_samples_per_frame" - -typedef enum { - /** Success */ - NVAFX_STATUS_SUCCESS = 0, - /** Failure */ - NVAFX_STATUS_FAILED = 1, - /** Handle invalid */ - NVAFX_STATUS_INVALID_HANDLE = 2, - /** Parameter value invalid */ - NVAFX_STATUS_INVALID_PARAM = 3, - /** Parameter value immutable */ - NVAFX_STATUS_IMMUTABLE_PARAM = 4, - /** Insufficient data to process */ - NVAFX_STATUS_INSUFFICIENT_DATA = 5, - /** Effect not supported */ - NVAFX_STATUS_EFFECT_NOT_AVAILABLE = 6, - /** Given buffer length too small to hold requested data */ - NVAFX_STATUS_OUTPUT_BUFFER_TOO_SMALL = 7, - /** Model file could not be loaded */ - NVAFX_STATUS_MODEL_LOAD_FAILED = 8, - - /** (32 bit SDK only) COM server was not registered, please see user manual for details */ - NVAFX_STATUS_32_SERVER_NOT_REGISTERED = 9, - /** (32 bit SDK only) COM operation failed */ - NVAFX_STATUS_32_COM_ERROR = 10, - /** GPU supported. The SDK requires Turing and above GPU with Tensor cores */ - NVAFX_STATUS_GPU_UNSUPPORTED = 11, -} NvAFX_Status; - -#define NVAFX_TRUE 1 -#define NVAFX_FALSE 0 -typedef char NvAFX_Bool; - -typedef const char *NvAFX_EffectSelector; -typedef const char *NvAFX_ParameterSelector; -typedef void *NvAFX_Handle; - -typedef NvAFX_Status NVAFX_API (*NvAFX_GetEffectList_t)(int *num_effects, NvAFX_EffectSelector *effects); -typedef NvAFX_Status NVAFX_API (*NvAFX_CreateEffect_t)(NvAFX_EffectSelector code, NvAFX_Handle *effect); -typedef NvAFX_Status NVAFX_API (*NvAFX_CreateChainedEffect_t)(NvAFX_EffectSelector code, NvAFX_Handle *effect); -typedef NvAFX_Status NVAFX_API (*NvAFX_DestroyEffect_t)(NvAFX_Handle effect); -typedef NvAFX_Status NVAFX_API (*NvAFX_SetU32_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name, - unsigned int val); -typedef NvAFX_Status NVAFX_API (*NvAFX_SetU32List_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name, - unsigned int *val, unsigned int size); -typedef NvAFX_Status NVAFX_API (*NvAFX_SetString_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name, - const char *val); -typedef NvAFX_Status NVAFX_API (*NvAFX_SetStringList_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name, - const char **val, unsigned int size); -typedef NvAFX_Status NVAFX_API (*NvAFX_SetFloat_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name, float val); -typedef NvAFX_Status NVAFX_API (*NvAFX_SetFloatList_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name, - float *val, unsigned int size); -typedef NvAFX_Status NVAFX_API (*NvAFX_GetU32_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name, - unsigned int *val); -typedef NvAFX_Status NVAFX_API (*NvAFX_GetString_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name, char *val, - int max_length); -typedef NvAFX_Status NVAFX_API (*NvAFX_GetStringList_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name, - char **val, int *max_length, unsigned int size); -typedef NvAFX_Status NVAFX_API (*NvAFX_GetFloat_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name, float *val); -typedef NvAFX_Status NVAFX_API (*NvAFX_GetFloatList_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name, - float *val, unsigned int size); -typedef NvAFX_Status NVAFX_API (*NvAFX_Load_t)(NvAFX_Handle effect); -typedef NvAFX_Status NVAFX_API (*NvAFX_GetSupportedDevices_t)(NvAFX_Handle effect, int *num, int *devices); -typedef NvAFX_Status NVAFX_API (*NvAFX_Run_t)(NvAFX_Handle effect, const float **input, float **output, - unsigned num_samples, unsigned num_channels); -typedef NvAFX_Status NVAFX_API (*NvAFX_Reset_t)(NvAFX_Handle effect); - -/* cuda */ -typedef enum cudaError_enum { - CUDA_SUCCESS = 0, - CUDA_ERROR_INVALID_VALUE = 1, - CUDA_ERROR_OUT_OF_MEMORY = 2, - CUDA_ERROR_NOT_INITIALIZED = 3, - CUDA_ERROR_DEINITIALIZED = 4, - CUDA_ERROR_PROFILER_DISABLED = 5, - CUDA_ERROR_PROFILER_NOT_INITIALIZED = 6, - CUDA_ERROR_PROFILER_ALREADY_STARTED = 7, - CUDA_ERROR_PROFILER_ALREADY_STOPPED = 8, - CUDA_ERROR_NO_DEVICE = 100, - CUDA_ERROR_INVALID_DEVICE = 101, - CUDA_ERROR_INVALID_IMAGE = 200, - CUDA_ERROR_INVALID_CONTEXT = 201, - CUDA_ERROR_CONTEXT_ALREADY_CURRENT = 202, - CUDA_ERROR_MAP_FAILED = 205, - CUDA_ERROR_UNMAP_FAILED = 206, - CUDA_ERROR_ARRAY_IS_MAPPED = 207, - CUDA_ERROR_ALREADY_MAPPED = 208, - CUDA_ERROR_NO_BINARY_FOR_GPU = 209, - CUDA_ERROR_ALREADY_ACQUIRED = 210, - CUDA_ERROR_NOT_MAPPED = 211, - CUDA_ERROR_NOT_MAPPED_AS_ARRAY = 212, - CUDA_ERROR_NOT_MAPPED_AS_POINTER = 213, - CUDA_ERROR_ECC_UNCORRECTABLE = 214, - CUDA_ERROR_UNSUPPORTED_LIMIT = 215, - CUDA_ERROR_CONTEXT_ALREADY_IN_USE = 216, - CUDA_ERROR_INVALID_SOURCE = 300, - CUDA_ERROR_FILE_NOT_FOUND = 301, - CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND = 302, - CUDA_ERROR_SHARED_OBJECT_INIT_FAILED = 303, - CUDA_ERROR_OPERATING_SYSTEM = 304, - CUDA_ERROR_INVALID_HANDLE = 400, - CUDA_ERROR_NOT_FOUND = 500, - CUDA_ERROR_NOT_READY = 600, - CUDA_ERROR_LAUNCH_FAILED = 700, - CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES = 701, - CUDA_ERROR_LAUNCH_TIMEOUT = 702, - CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING = 703, - CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED = 704, - CUDA_ERROR_PEER_ACCESS_NOT_ENABLED = 705, - CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE = 708, - CUDA_ERROR_CONTEXT_IS_DESTROYED = 709, - CUDA_ERROR_ASSERT = 710, - CUDA_ERROR_TOO_MANY_PEERS = 711, - CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED = 712, - CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED = 713, - CUDA_ERROR_UNKNOWN = 999 -} CUresult; -typedef struct CUctx_st *CUcontext; -typedef CUresult(__stdcall *cuCtxGetCurrent_t)(CUcontext *pctx); -typedef CUresult(__stdcall *cuCtxPopCurrent_t)(CUcontext *pctx); -typedef CUresult(__stdcall *cuInit_t)(unsigned int Flags); - -static NvAFX_GetEffectList_t NvAFX_GetEffectList = NULL; -static NvAFX_CreateEffect_t NvAFX_CreateEffect = NULL; -static NvAFX_CreateChainedEffect_t NvAFX_CreateChainedEffect = NULL; -static NvAFX_DestroyEffect_t NvAFX_DestroyEffect = NULL; -static NvAFX_SetU32_t NvAFX_SetU32 = NULL; -static NvAFX_SetU32List_t NvAFX_SetU32List = NULL; -static NvAFX_SetString_t NvAFX_SetString = NULL; -static NvAFX_SetStringList_t NvAFX_SetStringList = NULL; -static NvAFX_SetFloat_t NvAFX_SetFloat = NULL; -static NvAFX_SetFloatList_t NvAFX_SetFloatList = NULL; -static NvAFX_GetU32_t NvAFX_GetU32 = NULL; -static NvAFX_GetString_t NvAFX_GetString = NULL; -static NvAFX_GetStringList_t NvAFX_GetStringList = NULL; -static NvAFX_GetFloat_t NvAFX_GetFloat = NULL; -static NvAFX_GetFloatList_t NvAFX_GetFloatList = NULL; -static NvAFX_Load_t NvAFX_Load = NULL; -static NvAFX_GetSupportedDevices_t NvAFX_GetSupportedDevices = NULL; -static NvAFX_Run_t NvAFX_Run = NULL; -static NvAFX_Reset_t NvAFX_Reset; -/* cuda */ -static cuCtxGetCurrent_t cuCtxGetCurrent = NULL; -static cuCtxPopCurrent_t cuCtxPopCurrent = NULL; -static cuInit_t cuInit = NULL; - -void release_lib(void) -{ - NvAFX_GetEffectList = NULL; - NvAFX_CreateEffect = NULL; - NvAFX_CreateChainedEffect = NULL; - NvAFX_DestroyEffect = NULL; - NvAFX_SetU32 = NULL; - NvAFX_SetU32List = NULL; - NvAFX_SetString = NULL; - NvAFX_SetStringList = NULL; - NvAFX_SetFloat = NULL; - NvAFX_SetFloatList = NULL; - NvAFX_GetU32 = NULL; - NvAFX_GetString = NULL; - NvAFX_GetStringList = NULL; - NvAFX_GetFloat = NULL; - NvAFX_GetFloatList = NULL; - NvAFX_Load = NULL; - NvAFX_GetSupportedDevices = NULL; - NvAFX_Run = NULL; - NvAFX_Reset = NULL; - if (nv_audiofx) { - FreeLibrary(nv_audiofx); - nv_audiofx = NULL; - } - cuCtxGetCurrent = NULL; - cuCtxPopCurrent = NULL; - cuInit = NULL; - if (nv_cuda) { - FreeLibrary(nv_cuda); - nv_cuda = NULL; - } -} - -static bool nvafx_get_sdk_path(char *buffer, const size_t len) -{ - DWORD ret = GetEnvironmentVariableA("NVAFX_SDK_DIR", buffer, (DWORD)len); - - if (!ret || ret >= len - 1) - return false; - - return true; -} - -static bool load_lib(void) -{ - char pathMAX_PATH; - if (!nvafx_get_sdk_path(path, sizeof(path))) - return false; - - SetDllDirectoryA(path); - nv_audiofx = LoadLibrary(L"NVAudioEffects.dll"); - SetDllDirectoryA(NULL); - nv_cuda = LoadLibrary(L"nvcuda.dll"); - return !!nv_audiofx && !!nv_cuda; -} - -static unsigned int get_lib_version(void) -{ - static unsigned int version = 0; - static bool version_checked = false; - - if (version_checked) - return version; - - version_checked = true; - - char pathMAX_PATH; - if (!nvafx_get_sdk_path(path, sizeof(path))) - return 0; - - SetDllDirectoryA(path); - - struct win_version_info nto_ver = {0}; - if (get_dll_ver(L"NVAudioEffects.dll", &nto_ver)) - version = nto_ver.major << 24 | nto_ver.minor << 16 | nto_ver.build << 8 | nto_ver.revis << 0; - - SetDllDirectoryA(NULL); - return version; -} -#endif
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/oc-FR.ini
Deleted
@@ -1,1 +0,0 @@ -VLCSource="Font vidèo VLC"
View file
obs-studio-32.0.4.tar.xz/.github/actions/build-obs/action.yaml -> obs-studio-32.1.0.tar.xz/.github/actions/build-obs/action.yaml
Changed
@@ -99,7 +99,7 @@ .github/scripts/Build-Windows.ps1 @BuildArgs - name: Create Summary 📊 - if: contains(fromJSON('"Linux", "macOS"'), runner.os) + if: runner.os == 'Linux' shell: zsh --no-rcs --errexit --pipefail {0} run: | : Create Summary 📊
View file
obs-studio-32.0.4.tar.xz/.github/actions/check-changes/action.yaml -> obs-studio-32.1.0.tar.xz/.github/actions/check-changes/action.yaml
Changed
@@ -46,7 +46,7 @@ shopt -s dotglob # 4b825dc642cb6eb9a060e54bf8d69288fbee4904 is a "hidden" sha1 hash of - # the "empty tree", retrived via 'git hash-object -t tree /dev/null', + # the "empty tree", retrieved via 'git hash-object -t tree /dev/null', # and used here as a last-resort fallback to always provide a valid # git ref.
View file
obs-studio-32.0.4.tar.xz/.github/actions/flatpak-builder-lint/action.yaml -> obs-studio-32.1.0.tar.xz/.github/actions/flatpak-builder-lint/action.yaml
Changed
@@ -32,7 +32,7 @@ : Run flatpak-builder-lint return=0 - result="$(flatpak-builder-lint --exceptions ${{ inputs.artifact }} ${{ inputs.path }})" || return=$? + result="$(flatpak-builder-lint --exceptions --user-exceptions ${GITHUB_ACTION_PATH}/exceptions.json ${{ inputs.artifact }} ${{ inputs.path }})" || return=$? if ${return} != 0 && -z "${result}" ; then echo "::error::Error while running flatpak-builder-lint"
View file
obs-studio-32.1.0.tar.xz/.github/actions/flatpak-builder-lint/exceptions.json
Added
@@ -0,0 +1,8 @@ +{ + "com.obsproject.Studio": + "finish-args-flatpak-spawn-access", + "external-gitmodule-url-found", + "finish-args-host-filesystem-access", + "appstream-flathub-manifest-url-not-reachable" + +}
View file
obs-studio-32.0.4.tar.xz/.github/actions/run-gersemi/action.yaml -> obs-studio-32.1.0.tar.xz/.github/actions/run-gersemi/action.yaml
Changed
@@ -50,7 +50,7 @@ if (( ${+RUNNER_DEBUG} )) setopt XTRACE print ::group::Install gersemi - brew install --quiet obsproject/tools/gersemi + brew install --quiet obsproject/tools/gersemi@0.25 print ::endgroup:: print ::group::Run gersemi
View file
obs-studio-32.0.4.tar.xz/.github/actions/sparkle-appcast/action.yaml -> obs-studio-32.1.0.tar.xz/.github/actions/sparkle-appcast/action.yaml
Changed
@@ -55,7 +55,13 @@ local base_url local hash IFS=';' read -r version base_url hash <<< \ - "$(jq -r '.tools.sparkle | {version, baseUrl, hash} | join(";")' buildspec.json)" + "$(jq -r ' + .configurePresets + | select(.name=="dependencies") + | .vendor"obsproject.com/obs-studio".tools.sparkle + | {version, baseUrl, hash} + | join(";") + ' CMakePresets.json)" mkdir -p Sparkle && pushd Sparkle curl -s -L -O "${base_url}/${version}/Sparkle-${version}.tar.xz"
View file
obs-studio-32.0.4.tar.xz/.github/actions/windows-signing/prod-gc.crt -> obs-studio-32.1.0.tar.xz/.github/actions/windows-signing/prod-gc.crt
Changed
@@ -1,8 +1,8 @@ -----BEGIN CERTIFICATE----- -MIIHYDCCBUigAwIBAgIQBt9dqZiAp4FVJf/AvIvPsjANBgkqhkiG9w0BAQsFADBp +MIIHYDCCBUigAwIBAgIQCTRoMeK9NItAQamXbU8PnjANBgkqhkiG9w0BAQsFADBp MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMT OERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0 -IDIwMjEgQ0ExMB4XDTI1MDExNjAwMDAwMFoXDTI4MDExNTIzNTk1OVowaDELMAkG +IDIwMjEgQ0ExMB4XDTI1MTExNzAwMDAwMFoXDTI4MDExNTIzNTk1OVowaDELMAkG A1UEBhMCVVMxEDAOBgNVBAgTB1d5b21pbmcxETAPBgNVBAcTCFNoZXJpZGFuMRkw FwYDVQQKExBPQlMgUHJvamVjdCwgTExDMRkwFwYDVQQDExBPQlMgUHJvamVjdCwg TExDMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA07e66QJeFjyk8p5l @@ -27,16 +27,16 @@ lAYIKwYBBQUHAQEEgYcwgYQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj ZXJ0LmNvbTBcBggrBgEFBQcwAoZQaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t L0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNB -MS5jcnQwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAgEAaTE2qTXwECkUafRQ -TlWT26xO9hZON1CxW+OUsHaaH35YkNwo4UZ6s46fIX4/bbCFGz5duplDfAmVs/LG -+AehgWKA0dyMBSyFc89XXhzvfr0bXMbUxD3kgrmJzH8QMbZGwJU89/U3Zo1OYPjd -Xgm7xK2GdCKyW7Vz0vxi1U/lYZNPXm9SPpH2xlOqECZCrG7IHQWGMt6EWStp2o2j -7Jxj4NyRTKhR5sXGXfUXJlPuW3/82lvZxTHFe9V7QSAm1gswOZYWaOfjyvkoObUL -abZ4XNrxpzdVeJLMXX/a7F67mFwYpTWHSujGWVJpFzEpY267S+Exsvm15ZZkK1Ih -seT+Qks5JZZMMJjHCxaUyjit0UKADe/uDglW/6kimCMIGCgigZkx+hOAfPeRxouk -gC6jXfbGs+DLFom9wYPN8VFpFpwnoH+acglCSVZtF8BCMCI62/viwYE65v9p/Qmq -qSrR61y4EIkF9gAVDReCCTzvXDLBWx7jpRFXcPmG4JaLFesHj7rezgkTe/YA57KI -vc1geLf06UlucvxQ3sotiElMsTEZkB9blqd36PMsrLdPwJ/Q37zZX1XHfZKEF09N -DXXolHdqgWiiG56gNtFoXN3aT/9V/cRz8muZIy5l6Jm0vvK4jkyTV1D5bEutfgcK -k57TSjQGzCNnVLphmQTNIJNWQ7s= +MS5jcnQwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAgEAKhWQvdUAI3TLwy0j +DBZflHdzq2qnsF7v7OCQEiG46CA1/37ZJrBx6B5u23Z4dS7Ruji679WAnhq5oxkC +uRVwmjtcDmZ8m1iDmbN0yZzfyhzWYUDQJfOQRtRVJC/3MKy6uPw9IZsInOZDWEeg +rVoKLnkrxSbFFRoKtzOrkFqO+bdo+atEUbYsPFAMXzvXTlEvuYqB5iWWbtA2/wN7 +dFPkB1T9PBp803PU10AeKxwI4q+Ih+Iul3hiPflvFtoY4SX8JBioEWBugcmiL6w9 +8A88zGnONFcuA2iVFjvJKon6g87mQMulqmZGgBjNmXipDQlsC3rUkdZHJrsKq6mI +Pkx5EFfIKJ/ibSQ5f6eKfPboh6hF7JutdoOEZ8Zo2A5M/1WV/kO18IJsKGDPEWBa +Y+kvSzdU1j9p7IGU6QRLrBTHO5yUyIoEVAXIPs4g6bRawFHVcO8zebAhg+CmDWsG +JT7BDQeiVWuFHs9w6YlQoPQsCl7SL0v8d2JeXajchK65owCyV6dNctBzIIU0/5tW +eHGB+jd9Sd6b8z8lgdTBQRBMOxBw5+GGieR6VklPqnLo6nZiX1PVPauTIrp0XP0E +Z/n6TCQpUc+EqD7dFAjxRQh0HV3Zx2Xc8QCtLc2cI+ShQrgGXyqo0GlhalNDZkj8 +WbVFjeU1iU9tPlee5BDXberDjFg= -----END CERTIFICATE-----
View file
obs-studio-32.0.4.tar.xz/.github/actions/windows-signing/prod.crt -> obs-studio-32.1.0.tar.xz/.github/actions/windows-signing/prod.crt
Changed
@@ -1,26 +1,25 @@ -----BEGIN CERTIFICATE----- -MIIEYzCCA+mgAwIBAgIQDUFqBoO4wZHe6N7uxU2rNzAKBggqhkjOPQQDAzBkMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xPDA6BgNVBAMTM0Rp -Z2lDZXJ0IEdsb2JhbCBHMyBDb2RlIFNpZ25pbmcgRUNDIFNIQTM4NCAyMDIxIENB -MTAeFw0yNDAxMjgwMDAwMDBaFw0yNzAxMjcyMzU5NTlaMIHPMRMwEQYLKwYBBAGC -NzwCAQMTAlVTMRgwFgYLKwYBBAGCNzwCAQITB1d5b21pbmcxHTAbBgNVBA8MFFBy -aXZhdGUgT3JnYW5pemF0aW9uMRcwFQYDVQQFEw4yMDIzLTAwMTI3MjI1MjELMAkG -A1UEBhMCVVMxEDAOBgNVBAgTB1d5b21pbmcxETAPBgNVBAcTCFNoZXJpZGFuMRkw -FwYDVQQKExBPQlMgUHJvamVjdCwgTExDMRkwFwYDVQQDExBPQlMgUHJvamVjdCwg -TExDMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEqTLCTWIc06ek5TtAQC3l910Ifnuk -cd3EnGuBuPTpQ41oscNjcBGCOphtUEdgivn2Vbn2XReD+u5bNpf5gdaEmvOuJoIj -/NN/yVqZsEQMkF8iQwNAPyQkPF/NrgO6VTR5o4IB8jCCAe4wHwYDVR0jBBgwFoAU -m1+wNrqdBq4ZJ73AoCLAi4s4d+0wHQYDVR0OBBYEFPPrwCDxNi6AiZftFVF3ep6b -W1jbMD0GA1UdIAQ2MDQwMgYFZ4EMAQMwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3 -dy5kaWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggr -BgEFBQcDAzCBqwYDVR0fBIGjMIGgME6gTKBKhkhodHRwOi8vY3JsMy5kaWdpY2Vy -dC5jb20vRGlnaUNlcnRHbG9iYWxHM0NvZGVTaWduaW5nRUNDU0hBMzg0MjAyMUNB -MS5jcmwwTqBMoEqGSGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEds -b2JhbEczQ29kZVNpZ25pbmdFQ0NTSEEzODQyMDIxQ0ExLmNybDCBjgYIKwYBBQUH -AQEEgYEwfzAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFcG -CCsGAQUFBzAChktodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRH -bG9iYWxHM0NvZGVTaWduaW5nRUNDU0hBMzg0MjAyMUNBMS5jcnQwCQYDVR0TBAIw -ADAKBggqhkjOPQQDAwNoADBlAjEAwcabTk6TwhmuhWtqdmx5UZvO4RdU/IBxcQ1i -ZSA9NfQqK4fs48refxEB/rz7bR+2AjBhgW5WdpPv8xv2gqO2D1XVSynuMVQi62Ii -O/MY6qCzjzXtCKUoufNIezML/5OX1so= +MIIEIzCCA6mgAwIBAgIQA/1HO4x/Q51pGXj/sSt/ZzAKBggqhkjOPQQDAzBTMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xKzApBgNVBAMTIkRp +Z2lDZXJ0IEc1IENTIEVDQyBTSEEzODQgMjAyMSBDQTEwHhcNMjYwMzA1MDAwMDAw +WhcNMjcwMTI3MjM1OTU5WjCBzzETMBEGCysGAQQBgjc8AgEDEwJVUzEYMBYGCysG +AQQBgjc8AgECEwdXeW9taW5nMR0wGwYDVQQPDBRQcml2YXRlIE9yZ2FuaXphdGlv +bjEXMBUGA1UEBRMOMjAyMy0wMDEyNzIyNTIxCzAJBgNVBAYTAlVTMRAwDgYDVQQI +EwdXeW9taW5nMREwDwYDVQQHEwhTaGVyaWRhbjEZMBcGA1UEChMQT0JTIFByb2pl +Y3QsIExMQzEZMBcGA1UEAxMQT0JTIFByb2plY3QsIExMQzB2MBAGByqGSM49AgEG +BSuBBAAiA2IABKkywk1iHNOnpOU7QEAt5fddCH57pHHdxJxrgbj06UONaLHDY3AR +gjqYbVBHYIr59lW59l0Xg/ruWzaX+YHWhJrzriaCI/zTf8lambBEDJBfIkMDQD8k +JDxfza4DulU0eaOCAcMwggG/MB8GA1UdIwQYMBaAFNcdx/rG+oJ0IEVxNBIvVdWY +QZJeMB0GA1UdDgQWBBTz68Ag8TYugImX7RVRd3qem1tY2zA9BgNVHSAENjA0MDIG +BWeBDAEDMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQ +UzAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwgY0GA1UdHwSB +hTCBgjA/oD2gO4Y5aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0RzVD +U0VDQ1NIQTM4NDIwMjFDQTEuY3JsMD+gPaA7hjlodHRwOi8vY3JsNC5kaWdpY2Vy +dC5jb20vRGlnaUNlcnRHNUNTRUNDU0hBMzg0MjAyMUNBMS5jcmwwfgYIKwYBBQUH +AQEEcjBwMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wSAYI +KwYBBQUHMAKGPGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEc1 +Q1NFQ0NTSEEzODQyMDIxQ0ExLmNydDAJBgNVHRMEAjAAMAoGCCqGSM49BAMDA2gA +MGUCMDuU78m1lTDkCHRpMd1nOvvuRCTSglIo+pN9T0G1ziPi+MyeyVmERc2lqXlW +TANo+wIxAL+y4Ttsw4Vs9qoFArNpA0EIIz2tKdKgRGNjcPNSZq6ZQkiyVFN4xsjc +FCONL0pZJw== -----END CERTIFICATE-----
View file
obs-studio-32.0.4.tar.xz/.github/scripts/.Brewfile -> obs-studio-32.1.0.tar.xz/.github/scripts/.Brewfile
Changed
@@ -1,4 +1,3 @@ -brew "ccache" brew "cmake" brew "git" brew "jq"
View file
obs-studio-32.0.4.tar.xz/.github/scripts/.build.zsh -> obs-studio-32.1.0.tar.xz/.github/scripts/.build.zsh
Changed
@@ -40,15 +40,9 @@ if (( ! ${+SCRIPT_HOME} )) typeset -g SCRIPT_HOME=${ZSH_ARGZERO:A:h} local host_os=${${(s:-:)ZSH_ARGZERO:t:r}2} local project_root=${SCRIPT_HOME:A:h:h} - local buildspec_file=${project_root}/buildspec.json fpath=(${SCRIPT_HOME}/utils.zsh ${fpath}) - autoload -Uz log_group log_error log_output check_${host_os} setup_ccache - - if ! -r ${buildspec_file} { - log_error 'Missing buildspec.json in project checkout.' - return 2 - } + autoload -Uz log_group log_error log_output check_${host_os} local -i debug=0 @@ -104,14 +98,14 @@ set -- ${(@)args} check_${host_os} - setup_ccache if ${host_os} == ubuntu { - autoload -Uz setup_ubuntu && setup_ubuntu + autoload -Uz setup_ubuntu setup_ccache + setup_ccache + setup_ubuntu } - local product_name - read -r product_name <<< "$(jq -r '.name' ${buildspec_file})" + local product_name='obs-studio' pushd ${project_root} @@ -123,7 +117,14 @@ case ${target} { macos-*) - cmake_args+=(--preset 'macos-ci' -DCMAKE_OSX_ARCHITECTURES:STRING=${target##*-}) + cmake_args+=( + --preset 'macos-ci' + -DCMAKE_OSX_ARCHITECTURES:STRING=${target##*-} + ) + + if (( debug )) { + cmake_args+=(CMAKE_XCODE_ATTRIBUTE_COMPILATION_CACHE_ENABLE_DIAGNOSTIC_REMARKS:STRING=YES) + } typeset -gx NSUnbufferedIO=YES
View file
obs-studio-32.0.4.tar.xz/.github/scripts/.package.zsh -> obs-studio-32.1.0.tar.xz/.github/scripts/.package.zsh
Changed
@@ -40,7 +40,6 @@ if (( ! ${+SCRIPT_HOME} )) typeset -g SCRIPT_HOME=${ZSH_ARGZERO:A:h} local host_os=${${(s:-:)ZSH_ARGZERO:t:r}2} local project_root=${SCRIPT_HOME:A:h:h} - local buildspec_file=${project_root}/buildspec.json fpath=(${SCRIPT_HOME}/utils.zsh ${fpath}) autoload -Uz log_error log_output log_group check_${host_os} @@ -104,9 +103,7 @@ check_${host_os} - local product_name - read -r product_name <<< \ - "$(jq -r '.name' ${buildspec_file})" + local product_name='obs-studio' local commit_version='0.0.0' local commit_distance='0'
View file
obs-studio-32.0.4.tar.xz/.github/scripts/Build-Windows.ps1 -> obs-studio-32.1.0.tar.xz/.github/scripts/Build-Windows.ps1
Changed
@@ -36,7 +36,6 @@ $ScriptHome = $PSScriptRoot $ProjectRoot = Resolve-Path -Path "$PSScriptRoot/../.." - $BuildSpecFile = "${ProjectRoot}/buildspec.json" $UtilityFunctions = Get-ChildItem -Path $PSScriptRoot/utils.pwsh/*.ps1 -Recurse @@ -45,8 +44,6 @@ . $Utility.FullName } - $BuildSpec = Get-Content -Path ${BuildSpecFile} -Raw | ConvertFrom-Json - Install-BuildDependencies -WingetFile "${ScriptHome}/.Wingetfile" Push-Location -Stack BuildTemp
View file
obs-studio-32.0.4.tar.xz/.github/scripts/Package-Windows.ps1 -> obs-studio-32.1.0.tar.xz/.github/scripts/Package-Windows.ps1
Changed
@@ -34,7 +34,6 @@ $ScriptHome = $PSScriptRoot $ProjectRoot = Resolve-Path -Path "$PSScriptRoot/../.." - $BuildSpecFile = "${ProjectRoot}/buildspec.json" $UtilityFunctions = Get-ChildItem -Path $PSScriptRoot/utils.pwsh/*.ps1 -Recurse
View file
obs-studio-32.0.4.tar.xz/.github/scripts/utils.zsh/setup_ubuntu -> obs-studio-32.1.0.tar.xz/.github/scripts/utils.zsh/setup_ubuntu
Changed
@@ -23,9 +23,13 @@ local deps_hash IFS=';' read -r deps_version deps_baseurl deps_label deps_hash deps_revision <<< \ - "$(jq -r --arg target "${target}" \ - '.dependencies"cef" | {version, baseUrl, "label", "hash": .hashes$target, "revision": .revision$target} | join(";")' \ - ${buildspec_file})" + "$(jq -r --arg target "${target}" ' + .configurePresets + | select(.name=="dependencies") + | .vendor"obsproject.com/obs-studio".dependencies"cef" + | {version, baseUrl, "label", "hash": .hashes$target, "revision": .revision$target} + | join(";") + ' ${project_root}/CMakePresets.json)" if (( ! deps_version )) { log_error 'No valid cef spec found in buildspec.json.'
View file
obs-studio-32.0.4.tar.xz/.github/workflows/build-project.yaml -> obs-studio-32.1.0.tar.xz/.github/workflows/build-project.yaml
Changed
@@ -80,8 +80,8 @@ : Set Up Environment 🔧 if (( ${+RUNNER_DEBUG} )) setopt XTRACE - print '::group::Enable Xcode 16.4' - sudo xcode-select --switch /Applications/Xcode_16.4.app/Contents/Developer + print '::group::Enable Xcode 26.1' + sudo xcode-select --switch /Applications/Xcode_26.1.app/Contents/Developer print '::endgroup::' print '::group::Clean Homebrew Environment' @@ -97,13 +97,19 @@ local -A arch_names=(x86_64 intel arm64 apple) print "cpuName=${arch_names${{ matrix.target }}}" >> $GITHUB_OUTPUT + local xcode_cas_path="${HOME}/Library/Developer/Xcode/DerivedData/CompilationCache.noindex" + + if ! -d ${xcode_cas_path} mkdir -p ${xcode_cas_path} + + print "xcodeCasPath=${xcode_cas_path}" >> $GITHUB_OUTPUT + - uses: actions/cache/restore@v4 - id: ccache-cache + id: xcode-cache with: - path: ${{ github.workspace }}/.ccache - key: ${{ runner.os }}-ccache-${{ matrix.target }}-${{ needs.check-event.outputs.config }} + path: ${{ steps.setup.outputs.xcodeCasPath }} + key: ${{ runner.os }}-xcode-${{ matrix.target }}-${{ needs.check-event.outputs.config }} restore-keys: | - ${{ runner.os }}-ccache-${{ matrix.target }}- + ${{ runner.os }}-xcode-${{ matrix.target }}- - name: Set Up Code Signing 🔑 uses: ./.github/actions/setup-macos-codesigning @@ -129,6 +135,7 @@ YOUTUBE_CLIENTID_HASH: ${{ secrets.YOUTUBE_CLIENTID_HASH }} YOUTUBE_SECRET: ${{ secrets.YOUTUBE_SECRET }} YOUTUBE_SECRET_HASH: ${{ secrets.YOUTUBE_SECRET_HASH }} + XCODE_CAS_PATH: ${{ steps.setup.outputs.xcodeCasPath }} with: target: ${{ matrix.target }} config: ${{ needs.check-event.outputs.config }} @@ -163,10 +170,10 @@ path: ${{ github.workspace }}/build_macos/obs-studio-*-macos-${{ steps.setup.outputs.cpuName }}-dSYMs.tar.xz - uses: actions/cache/save@v4 - if: github.event_name != 'pull_request' && steps.ccache-cache.outputs.cache-hit != 'true' + if: github.event_name != 'pull_request' && steps.xcode-cache.outputs.cache-hit != 'true' with: - path: ${{ github.workspace }}/.ccache - key: ${{ runner.os }}-ccache-${{ matrix.target }}-${{ needs.check-event.outputs.config }} + path: ${{ steps.setup.outputs.xcodeCasPath }} + key: ${{ runner.os }}-xcode-${{ matrix.target }}-${{ needs.check-event.outputs.config }} ubuntu-build: name: Ubuntu 🐧 @@ -249,7 +256,7 @@ env: FLATPAK_BUILD_SHARE_PATH: flatpak_app/files/share container: - image: ghcr.io/flathub-infra/flatpak-github-actions:kde-6.8 + image: ghcr.io/flathub-infra/flatpak-github-actions:freedesktop-25.08 options: --privileged volumes: - /usr/local/lib/android:/to_clean/android @@ -312,7 +319,7 @@ git config --global --add safe.directory "${GITHUB_WORKSPACE}" - cache_key='flatpak-builder-${{ hashFiles('build-aux/**/*.json') }}' + cache_key='flatpak-builder-${{ hashFiles('build-aux/com.obsproject.Studio.json') }}' cache_ref='master' read -r id key size unit created accessed <<< \ "$(gh cache list --ref "refs/heads/${cache_ref}" --key "${cache_key}-x86_64" | head -1)"
View file
obs-studio-32.0.4.tar.xz/.github/workflows/publish.yaml -> obs-studio-32.1.0.tar.xz/.github/workflows/publish.yaml
Changed
@@ -87,7 +87,7 @@ YOUTUBE_SECRET: ${{ secrets.YOUTUBE_SECRET }} YOUTUBE_SECRET_HASH: ${{ secrets.YOUTUBE_SECRET_HASH }} container: - image: ghcr.io/flathub-infra/flatpak-github-actions:kde-6.8 + image: ghcr.io/flathub-infra/flatpak-github-actions:freedesktop-25.08 options: --privileged volumes: - /usr/local/lib/android:/to_clean/android @@ -153,7 +153,7 @@ git config --global --add safe.directory "${GITHUB_WORKSPACE}" - cache_key='flatpak-builder-${{ hashFiles('build-aux/**/*.json') }}' + cache_key='flatpak-builder-${{ hashFiles('build-aux/com.obsproject.Studio.json') }}' cache_ref='master' read -r id key size unit created accessed <<< \ "$(gh cache list --ref "refs/heads/${cache_ref}" --key "${cache_key}-x86_64" | head -1)"
View file
obs-studio-32.0.4.tar.xz/.github/workflows/push.yaml -> obs-studio-32.1.0.tar.xz/.github/workflows/push.yaml
Changed
@@ -207,7 +207,7 @@ sign-windows-build: name: Windows Signing ✍️ - uses: obsproject/obs-studio/.github/workflows/sign-windows.yaml@68c01125d2300a236a93ec693376b491f1173744 + uses: obsproject/obs-studio/.github/workflows/sign-windows.yaml@1933c9e3205d67068f2c858a52ec06b68e3e65ee if: github.repository_owner == 'obsproject' && github.ref_type == 'tag' needs: build-project permissions:
View file
obs-studio-32.0.4.tar.xz/.github/workflows/scheduled.yaml -> obs-studio-32.1.0.tar.xz/.github/workflows/scheduled.yaml
Changed
@@ -69,7 +69,7 @@ fi done <<< \ "$(gh api repos/${GITHUB_REPOSITORY}/actions/caches \ - --jq '.actions_caches. | select(.ref|test("refs/heads/master")) | select(.key|test(".*-ccache-*")) | {id, key} | join(";")')" + --jq '.actions_caches. | select(.ref|test("refs/heads/master")) | select(.key|test(".*-(ccache|xcode)-*")) | {id, key} | join(";")')" echo '::endgroup::'
View file
obs-studio-32.0.4.tar.xz/AUTHORS -> obs-studio-32.1.0.tar.xz/AUTHORS
Changed
@@ -7,8 +7,8 @@ jpark37 PatTheMav derrod - Ryan Foster Sebastian Beckmann + Ryan Foster cg2121 R1CH Palana @@ -17,14 +17,14 @@ Norihiro Kamae fryshorts Georges Basile Stavracas Neto - DDRBoxman pkv + DDRBoxman Kurt Kartaltepe Rodney Gol-D-Ace + Warchamp7 BtbN tt2468 - Warchamp7 Shaolin Exeldro kc5nra @@ -36,24 +36,24 @@ SuslikV Paul Hindt Vainock - Ed Maste shiina424 + Ed Maste CodeYan01 Reboot Martell Malone + Penwywern jcm Ford Smith - Penwywern columbarius Alex Luccisano dodgepong HomeWorld - Alex Anderson Joel Bethke + Service Checker + Alex Anderson Translation Updater brittneysclark Dmitry-Me - Service Checker Tommy Vercetti 田七不甜 SCG82 @@ -63,6 +63,7 @@ juvester mvji wangshaohui + Sean DuBois craftwar sorayuki Dead133 @@ -71,7 +72,6 @@ Jimi Huotari JohannMG Maya Venkatraman - Sean DuBois Radzaquiel Scratch Socapex @@ -203,6 +203,7 @@ Albert Alex Miller Alexander Schittler + Amin.MasterkinG Andreas Reischuck Andrei Nistor Andrew Francis @@ -265,6 +266,7 @@ Stéphane Cottin Suman Manjunath Take Vos + Tarulia Taylor Blau Thomas Schnitzler Thulinma @@ -321,7 +323,6 @@ Ali Kaviani Amin Mahmoudi Amin Shayan - Amin.MasterkinG Anastasiia Sidorovskaia Andrew Andrew Story @@ -386,6 +387,7 @@ Cray Elliott Crocodile Gena Damian Marcin Szymański + Dan Coffey Dan Dascalescu Daniel Escoz Daniel Hill @@ -416,6 +418,7 @@ Ethan Lee Evgeny Pavlov Faeez Kadiri + Fortune-SOOP Francisco Oltra Frank Frank Gehann @@ -576,7 +579,6 @@ Stripchat Susko3 TDV Alinsa - Tarulia Teemu Kauhanen Terje Gundersen Thomas Crider @@ -643,6 +645,7 @@ gkvjwa guangong7628 hellowanda + hongqingwan iRonBot iamflorencejay izwb003 @@ -653,6 +656,7 @@ jeremiah joelgerard jsnkan + katahtonic ka’imi kiwialec kokole @@ -668,6 +672,7 @@ michael bishop nd nico + nixflorp nkmerrill pantonvich partouf @@ -727,6 +732,7 @@ наб 张昆 练亮斌 + 태스키_박태연 Translators: Afrikaans: @@ -755,6 +761,7 @@ Abdullah AL-Qahtani (Za7ef_SA) lazerns majdcomp + Ziad (ZiadElsayed1797) Rami Kattan (rkattan) Fady Adal (fadyadal) Saud Alali (saud_alali) @@ -832,7 +839,7 @@ Azerbaijani: Aqil Novruzov (aqilnova) sanandev05 - ShahinF27 (Khan27) + ShahinF27 Mirsahin Mirserifov (mirsahin.mirsarifov) Magiraliyev Sədi Məmmədov (sedi9816) @@ -841,6 +848,7 @@ Javid-An unknowndomain Kənan Axundov (kenanaxundov2) + gaspard.larrouturou Bashkir: Әлмәт Ак Арыслан (19082004amir) Bashquart (RadMir2) @@ -998,7 +1006,7 @@ Michaelwu (michaelwucoc) Yi-Jyun Pan (pan93412) yunluzhang - Chaya Levine (candysweetplayzmc) + Sora (candysweetplayzmc) copyliu Boyuan Yang (073plan) CharlieTheCat @@ -1014,6 +1022,7 @@ nkh0472 Bing Feng (fengbing123) David Hwang (davidxuang) + OV3RWR1T3_ (FR0Z3) jyc001 for_the_zero 科技小白堂 (lipeng0820) @@ -1030,6 +1039,7 @@ OBS-Staff WaterOtaku Small Dianer (smalldianer) + alicee augustwentith (alice_kbbb) OYYZ Bob Wei (BobWaver) Haoran Du (bingchuanjuzi) @@ -1233,6 +1243,7 @@ Issa1553 unknowndomain matwey + 遥汐Aelura (kldhsh123) Seb King (spud) HENRY MARTIN (n3rdl0rd) Cristhofer Sanchez Solano (JafetSS) @@ -1253,7 +1264,7 @@ Endysis GarbageAtSB Roofers - Benedek-Sároncsi Mihály (Cubebanyasz) + Minta Máté (Cubebanyasz) Roktim Ibne Hasan (roktimih) tossing nkerr @@ -1270,10 +1281,12 @@ Infinity ArcAngel (SirColdcrown) Marco Ciampa (ciampix) Fitik + Nova (Argenta) David M. (Syndyo) TNT The Noob (tntthenoob) Estonian: Mr Wildlore (wildlore) + urmo tan (urmotan1) MartinEwing Agu Ratas (aguratas) Avernys (Avernys_tv) @@ -1297,11 +1310,12 @@ CodeYan01 Loyd Stephen Jayme (loydjayme25) jermel - Raffy K. Guzman (Raffy_King) + StartsMercury + Raffy (Dharma_Buddha) Gol D. Ace (goldace) Iver (IverCoder) nkamae - Zed (Lyze_PH) + Zed (lyze_ff) arnoldsecret denove Hagen Peter Marquez (HAJDog247) @@ -1323,9 +1337,11 @@ Gol D. Ace (goldace) Pyscowicz Qwertele + Arthur Kallinen (AKFilmIt) (akfilmit) sZnvARmNaq kettukettu milo willow (millow) + ziizaa (zeezaa) sienideluxe3 Obama (Obama44) YummyTomatoes @@ -1354,7 +1370,7 @@ Peter Noël Muller (PeterNMuller) Tocram2 (tocram2) Benjamin Cambour (lesinfox) - Lucatacos + Takoz Sipokad Yberion Léo (leeo97one) @@ -1393,9 +1409,11 @@ Julien R. (Turtiii) Thomas BLANC (thb5309) Aime23 + Maxime77 Grisou2907 BaguetteDePain_ Christophe Carvalho Vilas-Boas (ChristopheCVB) + Zalki Anat ROCHUT (arochut) Christophe Gesché (Moosh-be) Keter LordFR (YorHaDen) @@ -1414,10 +1432,8 @@ Nans Yolopix tburette - Maxime77 Richard Stanway (r1ch) Adrien “GameZone Tv” de Decker (redcraft007) - Zalki EvanK ButterflyOfFire ⁂ (BoFFire) Aryoll (Naomi_CAST) @@ -1464,6 +1480,7 @@ Fernando Bello (1fbr) Alex Smotra (smotraalex75) Gol D. Ace (goldace) + Andrea (apalpadoira) unknowndomain css chaironeko @@ -1482,6 +1499,7 @@ German: Gol D. Ace (goldace) Michael Fabian Dirks (Xaymar) + Mr-Update Letoonik Tillikum Soyer (Tillikum) Sven Kirschbaum (fallobst22) (fallobst22) @@ -1503,7 +1521,6 @@ EinfachMerlin Arion2000 WurstOnAir - Mr-Update yojixe Der Ston (derston) Splinter Cel (4eloweck) @@ -1515,6 +1532,7 @@ MatsMTN Richard Stanway (r1ch) J T (JT4) + Dominik (dschwarzd56) Jesper Mahel (kinsej) Palana deexbeam @@ -1522,6 +1540,7 @@ Jonathan (greenbigfrog) Achampnator Geisteskranker + assistantmaster Enderdrache LP (enderdrachelp) Joshua Weber (joshuaw) David (Tulpedublone) @@ -1531,7 +1550,7 @@ Patrick Frings (Ragnos) Robin Hielscher (Jack0r) unknowndomain - xxOrdulu52xx (RuesanG) + xxOrdulu52xx css Tomasz 'grocal' Grodzki (grocal) David Schmidt (Dav32_1) @@ -1552,8 +1571,8 @@ Greek: swatzniker (dimitrisrtg324) Katerina (katerinaramm) - Scourgemcdak jimkats + Scourgemcdak Mepharees Iwannhs Kokkinhs (pigot12) TheMetalHelper @@ -1596,7 +1615,6 @@ amirsher lonelywolf11 David Furman (thefourCraft) - Omer I.S. (omeritzics) idanbo27 Yonatan (yonatando) עידו דנה (idodana01) @@ -1632,6 +1650,7 @@ Bashishtha Narayan Singh (bashishtha) Saswata Banerjee (azure.saswata) nkamae + Syed Ali Naqi Hasni (syedalinaqihasni) BIJAY NAYAK (bijaykumar) Ravindra Pednekar (raviped) Rahul Dhangar (rahuldhangar) @@ -1668,9 +1687,10 @@ Biró Bence (birobence19) Levente Parádi (Techno.HaX) unknowndomain + therealnandy abydosan (abydoshun) not.skelly - Benedek-Sároncsi Mihály (Cubebanyasz) + Minta Máté (Cubebanyasz) damagepy OBS-Staff Icelandic: @@ -1721,7 +1741,7 @@ Marco Ciampa (ciampix) Alessandro Sarto (alesarto03) Tommaso Cammelli (tomganguz) (tomganguz) - Christian Mazzola (Alphaaa) + Christian Mazzola (ChriMazzola) Martazza Alfonso Scarpino (alfonso.scarpino) mauriziopersi @@ -1773,8 +1793,8 @@ CKK COBALT (CKKCOBALT) Hiroki IWAMA (higamma) SeasonChannel3322 (SeasonChannel32) - nishi-ruse akawshi + nishi-ruse meitel1014 (meitel1234) kotobato ラズベリージャム (rpiuser1923) @@ -1797,6 +1817,7 @@ Yuki Yu (Yukiyu) Diogo Ramos (dr03ramos) ushu kura (kuraushu) + pinkoro Kabyle: Yacine Bouklif (YacineBouklif) ZiriSut @@ -1819,9 +1840,9 @@ hibiya inemuri (hibiya) EP45 yeoneer + Hwanyong Lee (grbear) AlexKoala (alexkoala) 임세훈 (sh9351) - Hwanyong Lee (grbear) vyteking 임시이름 (H_FeelsGood) PaperCore (pprfp) @@ -1867,12 +1888,13 @@ ROkelbow bkrhnr Lao: + bone NI (bounkirdni) nirankoon.singpraseuth (nirankoon) Baker123 Latvian: oskars - Andris Liepiņš (ahgpuc) rinalds rinalds (rinalds.dobelis) + Andris Liepiņš (ahgpuc) Arthur (ArthurLV) Imants Vancāns (Imants565) Dejelnieks (dejelnieks212) @@ -1947,11 +1969,12 @@ OsteHovel Lauren (loritsi) Legend27 - Pederva + Pigwin_ Scott Alvin Westbye (scottalwest00) unknowndomain chaironeko Mats Andreassen (MatsA) + barecharge Norwegian Nynorsk: Bjørn I. (bjorni) Imre Eilertsen (DandelionSprout) @@ -2044,7 +2067,7 @@ cooky Portuguese: horus68 - Ev1lbl0w + Ricardo Subtil (rsubtil) João Vieira (joaofvieira) batatasmor Manuela Silva (mansil) @@ -2078,6 +2101,7 @@ Tiago Mesquita (tiagomesquita) Hélder Ferreira (Mtx32) Rafa.Godoy + moonlightz (moonlightzzz) Portuguese, Brazilian: Diogo Ramos (dr03ramos) Shaolin (admshao) @@ -2094,7 +2118,7 @@ Guilherme Dias (Darkaiser) Gabriel Conceição Nunes (GabrielCNunes) Pedro Brantes (brantes) - TFSThiagoBR98 + Thiago França (TFSThiagoBR98) Bruno Lopes Mattos Luiz (lopestranslate) CaioWzy mizifih @@ -2158,6 +2182,7 @@ Com.praideal Com.praideal (ccompraideal) Carlos Adriano de Souza (cadriza) Tomy Grado (tomygrado) + Jair Reis Junior (jairreisjunior.pessoal) andre.krdoso dlageBR park (TheBugMeNot) @@ -2198,6 +2223,7 @@ PoisonedReality_exe (2xotravity) Diamyx unknowndomain + ICalz Plays (romanu100) alex123 alex123 (dumitruvalentin44) OBS-Staff chaironeko @@ -2218,12 +2244,13 @@ Kolya Майнкрафт (KolyaYT_) Maxim Gribanov (MaximGribanov) OBS-Staff + Oleg (yokidjo) Romka Almazniy (turbozver) Fitik Gol D. Ace (goldace) PanForPancakes - Artem (Artem4ik) tochnonechelovek + Artem (Artem4ik) Gleb (Apeol4) Yaroslav (MrYadro) css @@ -2255,13 +2282,14 @@ Mr Misha (MrMisha) Nikita Epifanov (Nikets) Fik Dencer (4Soul) - ExZo + exzolink Tihonov Matvey (Rythmical) RaspingMango (RaspingMango637) Vlad (KoTmaxHo) keirokeer Vladimir (jeffors) xtemp09 + Dan Ten (daniil.317.d) Myasko Mikhailus_ Mikhail Paulyshka (Mixaill) @@ -2274,6 +2302,7 @@ Sergei Fug1t1v3 (fug) Максим Куренков (kuplay) pavuma + kana86 Цезарь Ролл (CeaserRoll) Walt Gee (vovanych) unknowndomain @@ -2314,6 +2343,7 @@ Scottish Gaelic: GunChleoc Endo (Balisong) + Dani K (SkiaSDK) Alex Hall (Decidy) Alex Smotra (smotraalex75) unknowndomain @@ -2344,6 +2374,7 @@ Gol D. Ace (goldace) Rale Sarcevic (ralesarcevic) unknowndomain + Marko Šekuljica (markoshaq) OBS-Staff scienceangel Silesian: @@ -2438,7 +2469,7 @@ amssusgameplays (willifake052) D E B (D_E_B) Stephen Q (qstephen73) - Rall Ball (Krynlix) + Krynlix Jaire (corpi.98) Luis Carlos González Morales (luiscarlosgm) Dominik K. (mezotv) @@ -2501,12 +2532,13 @@ dandalion jermel jbeguna04 + StartsMercury philiparniebinag TheBMG Playz (thebmgplayzyt) Napstaguy04 Gol D. Ace (goldace) Red Dayao (steemitph) - Zed (Lyze_PH) + Zed (lyze_ff) Laarnice unknowndomain Raylir @@ -2517,12 +2549,14 @@ rooban23 Devanathan T (nathandeva26895) Gol D. Ace (goldace) + Kolappan N (kolappannathan) unknowndomain Naveen Techs (alexonpeace) Tatar: Әлмәт Ак Арыслан (19082004amir) Timur Seber (seber) Рушан Мухутдинов (deflecta) + Ilgiz Zigangirov (inov8) Telugu: Sampath Reddy (Sampath123) ror0ror02 @@ -2552,8 +2586,10 @@ Worawut Weerawan (nero.exe) PlyKung (plykung) ธีร์ ธีรพล (teraphonk) + Aelirea Yu (aelireayu) Oat. Thanawat (thanawat6484) 盛凤阁 (execzero) + Afdol Kareena (adrmnq) nongnoobjung (kitcharuk_4) 301-14 สิรวิชญ์ ศรีคําเมือง (Sam_Hanhyongsok2006) Anucha (achn.syps) @@ -2565,6 +2601,7 @@ Enigmatic_ Tinnaphat Somsang (tinarskii) OBS-Staff + platong (PLATONG98) Gol D. Ace (goldace) Ryan Gleeson (Ryan_7149) วรภร หนูปลอด6.1 (woraporn.hnu) @@ -2580,10 +2617,11 @@ Emir (dirt3009) Nejdet ACAR (nejdetacar) Cemal Dursun (cmldrs) + Serhat Öktem (delidolu1adam) Kayhan (SwitchAlpha) Savas Tokmak (Laserist) Burkicannjr - Serhat Öktem (delidolu1adam) + Samo (SamoE) Umut kılıç (kilic190787) Burak Eker (mburakeker) Bora Atıcı (Brtc) @@ -2626,12 +2664,12 @@ ilba ilba (ilbailba) BedirhanGltkn (bedirhangltkn) Ege Uzun (kise5478) - Tora (tlhbrky) + Toraichi (toraichi) bkzspam Ferhat Geçdoğan (ferhatgec) Onur Yılmaz (Makaron3422) TahaCelik - Baran Moroğan (okunamayanad) + Baran Mordoğan (okunamayanad) Ata Çağan Atamer (atamerco23) mustafaa Botuser @@ -2682,6 +2720,7 @@ Dekanenko (dekanenko) slvvko Dijerom + Magnust (Limichoper) Юрій (Devinit) ROkelbow Oleh Hnat (aetrnm) @@ -2694,6 +2733,7 @@ Andy (anry025) kateryna.roiko Andrey (Fokz) + fraffrog (zfraaaaa) NoPressure Kirill Stuzhuk (kirillstuzhuk) បងមាន តែអូន (cheaiphone267) @@ -2738,6 +2778,7 @@ Bui Huy Quang (bhuyquang1) Bach Le (BachWumpus) nguyenthanhphong + Loc Huynh (loccun) BIGO - 지혜 (parkjihye98) Nguyen Vu (songnguxyz) Blog Đào Lê Minh (daoleminh2010)
View file
obs-studio-32.0.4.tar.xz/CMakePresets.json -> obs-studio-32.1.0.tar.xz/CMakePresets.json
Changed
@@ -21,6 +21,69 @@ } }, { + "name": "dependencies", + "hidden": true, + "vendor": { + "obsproject.com/obs-studio": { + "dependencies": { + "prebuilt": { + "version": "2025-08-23", + "baseUrl": "https://github.com/obsproject/obs-deps/releases/download", + "label": "Pre-Built obs-deps", + "hashes": { + "macos-universal": "9403bb43fb0a9bb215739a5659ca274fe884dbbbcd22bd9ca781c961fb041c42", + "windows-x64": "8de229cff6f1981508c0eb646b35e644633a5855787b9f5d3b90ae2aeb87ffc1", + "windows-x86": "fb3c68b75911f292b3206e346053638db1c73605957207445a0a92b33ab5e00a", + "windows-arm64": "dd87ba00a6cbc153182fb62b3678a3b5021d1d11eb2730442060937a645eb97e" + } + }, + "qt6": { + "version": "2025-08-23", + "baseUrl": "https://github.com/obsproject/obs-deps/releases/download", + "label": "Pre-Built Qt6", + "hashes": { + "macos-universal": "990f11638b80a4509e14e8c315f6e4caa0861e37fcd3113a256fbff835ffca29", + "windows-x64": "c62e82483bc7c0bf199e8ac3220c66a85a6e8a0cd69a05b6d44f873b830e415f", + "windows-arm64": "cc8ec983de9b7d81aa98beeb1b989d707ee3c73b85b4d41c85d94114eba81f91" + }, + "debugSymbols": { + "windows-x64": "aae88a17e0211cb37db6a8602f2e20d69255be1f9700c699008ca5adbce1dde2", + "windows-arm64": "6e866490277a8b29e82a87fc2f22407f93ddaf86444ea0d284370339a05511b3" + } + }, + "cef": { + "version": "6533", + "baseUrl": "https://cdn-fastly.obsproject.com/downloads", + "label": "Chromium Embedded Framework", + "hashes": { + "macos-x86_64": "37bf7571a48c5dfa8519817e4a90a3503a0eb30f9eadd68f4c3e783e363f272a", + "macos-arm64": "429b50e74f6c174dcfe2f14d8204b54add497eaafe117f7b69ce6bb2354d2626", + "ubuntu-x86_64": "7963335519a19ccdc5233f7334c5ab023026e2f3e9a0cc417007c09d86608146", + "ubuntu-aarch64": "642514469eaa29a5c887891084d2e73f7dc2d7405f7dfa7726b2dbc24b309999", + "windows-x64": "922efbda1f2f8be9e5b2754d878a14d90afc81f04e94fc9101a7513e2b5cecc1", + "windows-arm64": "df9df4bd85826b4c071c6db404fd59cf93efd9c58ec3ab64e204466ae19bb02a" + }, + "revision": { + "macos-x86_64": 5, + "macos-arm64": 5, + "ubuntu-x86_64": 6, + "ubuntu-aarch64": 6, + "windows-x64": 2 + } + } + }, + "tools": { + "sparkle": { + "version": "2.6.4", + "baseUrl": "https://github.com/sparkle-project/Sparkle/releases/download", + "label": "Sparkle 2", + "hash": "50612a06038abc931f16011d7903b8326a362c1074dabccb718404ce8e585f0b" + } + } + } + } + }, + { "name": "macos", "displayName": "macOS", "description": "Default macOS build (single architecture only)", @@ -53,7 +116,8 @@ "warnings": {"dev": true, "deprecated": true}, "cacheVariables": { "CMAKE_COMPILE_WARNING_AS_ERROR": true, - "ENABLE_CCACHE": true + "CMAKE_XCODE_ATTRIBUTE_COMPILATION_CACHE_ENABLE_CACHING": "YES", + "CMAKE_XCODE_ATTRIBUTE_COMPILATION_CACHE_CAS_PATH": "$penv{XCODE_CAS_PATH}" } }, {
View file
obs-studio-32.0.4.tar.xz/README.rst -> obs-studio-32.1.0.tar.xz/README.rst
Changed
@@ -59,6 +59,10 @@ Instead, please use Crowdin. For more information read this page: https://obsproject.com/wiki/How-To-Contribute-Translations-For-OBS +- Contributors to OBS Studio and related repositories are expected to + follow our Code of Conduct, which can be read here: + https://github.com/obsproject/obs-studio/blob/master/COC.rst + - Other ways to contribute are by helping people out with support on our forums or in our community chat. Please limit support to topics you fully understand -- bad advice is worse than no advice. When it
View file
obs-studio-32.0.4.tar.xz/build-aux/.run-format.zsh -> obs-studio-32.1.0.tar.xz/build-aux/.run-format.zsh
Changed
@@ -92,16 +92,23 @@ } ;; gersemi) - local formatter=gersemi - if (( ${+commandsgersemi} )) { - local gersemi_version=($(gersemi --version)) - if ! is-at-least 0.21.0 ${gersemi_version2}; then - log_error "gersemi is not version 0.21.0 or above (found ${gersemi_version2}." - exit 2 - fi + if (( ${+commandsgersemi-0.25} )) { + local formatter=gersemi-0.25 + } elif (( ${+commandsgersemi} )) { + local formatter=gersemi + } else { + log_error "No viable gersemi version found (required 0.25.0)" + exit 2 } + local gersemi_version=($(${formatter} --version)) + + if ! is-at-least 0.25.0 ${gersemi_version2}; then + log_error "gersemi is not version 0.25.0 or above (found ${gersemi_version2}." + exit 2 + fi + if (( ! #source_files )) source_files=(CMakeLists.txt (libobs|libobs-*|frontend|plugins|deps|shared|cmake|test)/**/(CMakeLists.txt|*.cmake)(.N)) source_files=(${source_files:#*/(jansson|decklink/*/decklink-sdk|obs-websocket|obs-browser|libdshowcapture)/*}) @@ -112,16 +119,29 @@ local -a source_files=($@) local file local -a command=(${formatter} -c --no-cache ${source_files}) + local -i in_error=0 if (( ${#source_files} )) { while read -r line; do local -a line_tokens=(${(z)line}) if (( #line_tokens )) { - file=${line_tokens1//*${project_root}\//} - - log_error "${file} requires formatting changes." + file=${line_tokens1} + + if -r ${file} { + in_error=0 + file=${file//*${project_root}\//} + + log_error "${file} requires formatting changes." + } else { + if (( in_error )) { + log_output "${line}" + } else { + log_error "${line}" + } + in_error=1 + } } else { - log_error "${line}" + log_output "${line}" } if (( fail_on_error == 2 )) return 2
View file
obs-studio-32.0.4.tar.xz/build-aux/README.md -> obs-studio-32.1.0.tar.xz/build-aux/README.md
Changed
@@ -49,24 +49,3 @@ ```sh python3 ./build-aux/format-manifest.py com.obsproject.Studio.json ``` - -## OBS Studio Flatpak Manifest - -The manifest is composed of multiple files: - - The main manifest `com.obsproject.Studio.json` - - The `modules` folder which contains OBS Studio dependencies modules - -### Manifest modules - -Modules are ordered/dispatched in numbered categories following a short list of rules: -- A module must not depend on another module from the same category, so a module can only depend on modules from lower numbered categories. -- A module without dependencies must be placed in the highest numbered category in use, excluding categories meant for specific types of dependency. - -Actual categories: - - `99-`: CEF - - `90-`: Headers-only libraries that are dependencies of only OBS Studio - - `50-`: Modules that are dependencies of only OBS Studio - - `40-`: Modules that are dependencies of the `50-` category - - `30-`: FFmpeg - - `20-`: Modules that are dependencies of FFmpeg - - `10-`: Modules that are dependencies of the `20-` category
View file
obs-studio-32.0.4.tar.xz/build-aux/com.obsproject.Studio.json -> obs-studio-32.1.0.tar.xz/build-aux/com.obsproject.Studio.json
Changed
@@ -1,8 +1,8 @@ { "id": "com.obsproject.Studio", - "runtime": "org.kde.Platform", - "runtime-version": "6.8", - "sdk": "org.kde.Sdk", + "runtime": "org.freedesktop.Platform", + "runtime-version": "25.08", + "sdk": "org.freedesktop.Sdk", "command": "obs", "finish-args": "--socket=wayland", @@ -30,44 +30,101 @@ }, "org.freedesktop.LinuxAudio.Plugins": { "directory": "extensions/Plugins", - "version": "24.08", + "version": "25.08", "add-ld-path": "lib", "merge-dirs": "vst", "subdirectories": true, "no-autodownload": true } }, - "cleanup": - "/share/man", - "*.la" - , "modules": - "modules/10-mbedtls.json", - "modules/20-librist.json", - "modules/20-nv-codec.json", - "modules/20-srt.json", - "modules/20-svt-av1.json", - "modules/20-x264.json", - "modules/30-ffmpeg.json", - "modules/40-luajit.json", - "modules/40-plog.json", - "modules/40-usrsctp.json", - "modules/50-intel-media-sdk.json", - "modules/50-jansson.json", - "modules/50-libdatachannel.json", - "modules/50-libqrcodegencpp.json", - "modules/50-libvpl.json", - "modules/50-ntv2.json", - "modules/50-rnnoise.json", - "modules/50-swig.json", - "modules/50-v4l-utils.json", - "modules/50-vpl-gpu-rt.json", - "modules/90-asio.json", - "modules/90-nlohmann-json.json", - "modules/90-simde.json", - "modules/90-uthash.json", - "modules/90-websocketpp.json", - "modules/99-cef.json", + { + "name": "obs-deps-base", + "buildsystem": "simple", + "build-commands": + "tar -xvf base.tar.xz -C /" + , + "sources": + { + "type": "file", + "dest-filename": "base.tar.xz", + "url": "https://github.com/obsproject/obs-deps-buildstream/releases/download/2026-01-09/flatpak-base-x86_64-2026-01-09.tar.xz", + "sha256": "664ff7c2e3cfa552a6b16e7b78428c1940a5a42f85911b5e4d57a053f0dcc9e1" + } + + }, + { + "name": "obs-deps-devel", + "buildsystem": "simple", + "build-commands": + "tar -xvf devel.tar.xz -C /" + , + "sources": + { + "type": "file", + "dest-filename": "devel.tar.xz", + "url": "https://github.com/obsproject/obs-deps-buildstream/releases/download/2026-01-09/flatpak-devel-x86_64-2026-01-09.tar.xz", + "sha256": "214a18feff6d7e1ed5b42820ac806eafec50029e41f03c197f76e06eafb591dc" + } + + }, + { + "name": "obs-deps-devtools", + "buildsystem": "simple", + "build-commands": + "tar -xvf devtools.tar.xz -C /" + , + "cleanup": + "*" + , + "sources": + { + "type": "file", + "dest-filename": "devtools.tar.xz", + "url": "https://github.com/obsproject/obs-deps-buildstream/releases/download/2026-01-09/flatpak-devtools-x86_64-2026-01-09.tar.xz", + "sha256": "f3381b9661925a593ebe42dded1a87f86d54e49c7fde92567f2f19d37564bb61" + } + + }, + { + "name": "qt", + "buildsystem": "simple", + "build-commands": + "tar -xvf qt.tar.xz -C /" + , + "sources": + { + "type": "file", + "dest-filename": "qt.tar.xz", + "url": "https://github.com/obsproject/obs-deps-buildstream/releases/download/2026-01-09/flatpak-qt-x86_64-2026-01-09.tar.xz", + "sha256": "57c5c90cd5824d2a634ba92a0a2ad1b1a57347ee14a9eae41cf77c74970cee11" + } + + }, + { + "name": "cef", + "build-options": { + "no-debuginfo": true + }, + "buildsystem": "simple", + "build-commands": + "mkdir -p /app/cef/libcef_dll_wrapper", + "cp -R ./include /app/cef", + "cp -R ./Release /app/cef", + "cp -R ./Resources /app/cef", + "cp -R ./build/libcef_dll_wrapper/libcef_dll_wrapper.a /app/cef/libcef_dll_wrapper" + , + "cleanup": + "*" + , + "sources": + { + "type": "archive", + "url": "https://cdn-fastly.obsproject.com/downloads/cef_binary_6533_linux_x86_64_v6.tar.xz", + "sha256": "7963335519a19ccdc5233f7334c5ab023026e2f3e9a0cc417007c09d86608146" + } + + }, { "name": "obs", "buildsystem": "cmake-ninja",
View file
obs-studio-32.0.4.tar.xz/build-aux/format-manifest.py -> obs-studio-32.1.0.tar.xz/build-aux/format-manifest.py
Changed
@@ -39,41 +39,12 @@ manifest_string = manifest.read() manifest_data = json.loads(manifest_string) - module_list = manifest_data.get("modules", ) - - obs_object = module_list-1 - - if type(obs_object) != dict: - logger.error( - f"❌ Last element in modules list is not the obs-studio object" - ) - return 2 - - new_module_list = - - for module in module_list: - if type(module) == str: - if not os.path.isfile(os.path.join(manifest_path, module)): - logger.warning( - f"⚠️ Specified module {os.path.basename(module)} not found." - ) - continue - - new_module_list.append(module) - - new_module_list.sort() - new_module_list.append(obs_object) - manifest_data"modules" = new_module_list - new_manifest_string = ( f"{json.dumps(manifest_data, indent=4, ensure_ascii=False)}\n" ) if arguments.check: - if new_module_list != module_list: - logger.error(f"❌ Module list failed order validation") - return 2 - elif new_manifest_string != manifest_string: + if new_manifest_string != manifest_string: logger.error(f"❌ Manifest file is not correctly formatted") return 2 else:
View file
obs-studio-32.0.4.tar.xz/cmake/common/buildspec_common.cmake -> obs-studio-32.1.0.tar.xz/cmake/common/buildspec_common.cmake
Changed
@@ -46,11 +46,37 @@ return(PROPAGATE found CMAKE_PREFIX_PATH) endfunction() +function(_get_dependency_data variable_name) + file(READ "${CMAKE_CURRENT_SOURCE_DIR}/CMakePresets.json" preset_data) + + string(JSON configure_presets GET ${preset_data} "configurePresets") + + string(JSON preset_count LENGTH "${configure_presets}") + math(EXPR preset_count "${preset_count}-1") + + foreach(index RANGE 0 ${preset_count}) + string(JSON preset_member_data GET "${configure_presets}" ${index}) + string(JSON preset_name GET ${preset_member_data} "name") + + if(preset_name STREQUAL dependencies) + string(JSON vendor_data GET ${preset_member_data} "vendor") + string(JSON vendor_data GET ${vendor_data} "obsproject.com/obs-studio") + string(JSON dependency_data GET ${vendor_data} "dependencies") + break() + else() + continue() + endif() + endforeach() + + set(${variable_name} "${dependency_data}") + + return(PROPAGATE ${variable_name}) +endfunction() + # _check_dependencies: Fetch and extract pre-built OBS build dependencies function(_check_dependencies) - file(READ "${CMAKE_CURRENT_SOURCE_DIR}/buildspec.json" buildspec) - - string(JSON dependency_data GET ${buildspec} dependencies) + set(dependencies_list ${ARGV}) + _get_dependency_data(dependency_data) foreach(dependency IN LISTS dependencies_list) if(dependency STREQUAL cef AND NOT ENABLE_BROWSER) @@ -92,8 +118,7 @@ if(EXISTS "${dependencies_dir}/.dependency_${dependency}_${arch}.sha256") file( - READ - "${dependencies_dir}/.dependency_${dependency}_${arch}.sha256" + READ "${dependencies_dir}/.dependency_${dependency}_${arch}.sha256" OBS_DEPENDENCY_${dependency}_${arch}_HASH ) endif()
View file
obs-studio-32.0.4.tar.xz/cmake/common/helpers_common.cmake -> obs-studio-32.1.0.tar.xz/cmake/common/helpers_common.cmake
Changed
@@ -227,8 +227,7 @@ endif() list( - APPEND - qt_plugins_Core + APPEND qt_plugins_Core platforms printsupport styles
View file
obs-studio-32.0.4.tar.xz/cmake/finders/FindAMF.cmake -> obs-studio-32.1.0.tar.xz/cmake/finders/FindAMF.cmake
Changed
@@ -37,8 +37,7 @@ if(EXISTS "${AMF_INCLUDE_DIR}/AMF/core/Version.h") file( - STRINGS - "${AMF_INCLUDE_DIR}/AMF/core/Version.h" + STRINGS "${AMF_INCLUDE_DIR}/AMF/core/Version.h" _version_string REGEX "^.*VERSION_(MAJOR|MINOR|RELEASE|BUILD_NUM) \t+0-9+ \t*$" )
View file
obs-studio-32.0.4.tar.xz/cmake/finders/FindAsio.cmake -> obs-studio-32.1.0.tar.xz/cmake/finders/FindAsio.cmake
Changed
@@ -50,8 +50,7 @@ set(Asio_VERSION ${PC_Asio_VERSION}) elseif(EXISTS "${Asio_INCLUDE_DIR}/asio/version.hpp") file( - STRINGS - "${Asio_INCLUDE_DIR}/asio/version.hpp" + STRINGS "${Asio_INCLUDE_DIR}/asio/version.hpp" _version_string REGEX "#define \t+ASIO_VERSION \t+0-9+ \t+\\/\\/ \t0-9+\\.0-9+\\.0-9+" )
View file
obs-studio-32.0.4.tar.xz/cmake/finders/FindCEF.cmake -> obs-studio-32.1.0.tar.xz/cmake/finders/FindCEF.cmake
Changed
@@ -71,8 +71,7 @@ if(CEF_INCLUDE_DIR) file( - STRINGS - "${CEF_INCLUDE_DIR}/cef_version.h" + STRINGS "${CEF_INCLUDE_DIR}/cef_version.h" _VERSION_STRING REGEX "^.*CEF_VERSION_(MAJOR|MINOR|PATCH) \t+0-9+ \t*$" )
View file
obs-studio-32.0.4.tar.xz/cmake/finders/FindFFmpeg.cmake -> obs-studio-32.1.0.tar.xz/cmake/finders/FindFFmpeg.cmake
Changed
@@ -202,16 +202,14 @@ elseif(EXISTS "${FFmpeg_${component}_INCLUDE_DIR}/${component_libname}/version.h") if(EXISTS "${FFmpeg_${component}_INCLUDE_DIR}/${component_libname}/version_major.h") file( - STRINGS - "${FFmpeg_${component}_INCLUDE_DIR}/${component_libname}/version_major.h" + STRINGS "${FFmpeg_${component}_INCLUDE_DIR}/${component_libname}/version_major.h" _version_string REGEX "^.*VERSION_MAJOR \t+0-9+ \t*$" ) string(REGEX REPLACE ".*VERSION_MAJOR \t+(0-9+).*" "\\1" _version_major "${_version_string}") file( - STRINGS - "${FFmpeg_${component}_INCLUDE_DIR}/${component_libname}/version.h" + STRINGS "${FFmpeg_${component}_INCLUDE_DIR}/${component_libname}/version.h" _version_string REGEX "^.*VERSION_(MINOR|MICRO) \t+0-9+ \t*$" ) @@ -219,8 +217,7 @@ string(REGEX REPLACE ".*VERSION_MICRO \t+(0-9+).*" "\\1" _version_patch "${_version_string}") else() file( - STRINGS - "${FFmpeg_${component}_INCLUDE_DIR}/${component_libname}/version.h" + STRINGS "${FFmpeg_${component}_INCLUDE_DIR}/${component_libname}/version.h" _version_string REGEX "^.*VERSION_(MAJOR|MINOR|MICRO) \t+0-9+ \t*$" ) @@ -292,8 +289,7 @@ if(EXISTS "${FFmpeg_avutil_INCLUDE_DIR}/libavutil/ffversion.h") file( - STRINGS - "${FFmpeg_avutil_INCLUDE_DIR}/libavutil/ffversion.h" + STRINGS "${FFmpeg_avutil_INCLUDE_DIR}/libavutil/ffversion.h" _version_string REGEX "^.*FFMPEG_VERSION \t+\"n?0-9a-z\\~+.-+\" \t*$" )
View file
obs-studio-32.0.4.tar.xz/cmake/finders/FindFFnvcodec.cmake -> obs-studio-32.1.0.tar.xz/cmake/finders/FindFFnvcodec.cmake
Changed
@@ -50,8 +50,7 @@ set(FFnvcodec_VERSION ${PC_FFnvcodec_VERSION}) elseif(EXISTS "${FFnvcodec_INCLUDE_DIR}/ffnvcodec/nvEncodeAPI.h") file( - STRINGS - "${FFnvcodec_INCLUDE_DIR}/ffnvcodec/nvEncodeAPI.h" + STRINGS "${FFnvcodec_INCLUDE_DIR}/ffnvcodec/nvEncodeAPI.h" _version_string REGEX "^.*NVENCAPI_(MAJOR|MINOR)_VERSION \t+0-9+ \t*$" )
View file
obs-studio-32.0.4.tar.xz/cmake/finders/FindLibAJANTV2.cmake -> obs-studio-32.1.0.tar.xz/cmake/finders/FindLibAJANTV2.cmake
Changed
@@ -122,8 +122,7 @@ if(LibAJANTV2_FOUND) list( - APPEND - LibAJANTV2_INCLUDE_DIRS + APPEND LibAJANTV2_INCLUDE_DIRS ${LibAJANTV2_INCLUDE_DIR} ${LibAJANTV2_INCLUDE_DIR}/ajaanc ${LibAJANTV2_INCLUDE_DIR}/ajabase
View file
obs-studio-32.0.4.tar.xz/cmake/finders/FindLibVLC.cmake -> obs-studio-32.1.0.tar.xz/cmake/finders/FindLibVLC.cmake
Changed
@@ -64,8 +64,7 @@ set(LibVLC_VERSION ${PC_LibVLC_VERSION}) elseif(EXISTS "${LibVLC_INCLUDE_DIR}/libvlc_version.h") file( - STRINGS - "${LibVLC_INCLUDE_DIR}/libvlc_version.h" + STRINGS "${LibVLC_INCLUDE_DIR}/libvlc_version.h" _VERSION_STRING REGEX "^.*LIBVLC_VERSION_(MAJOR|MINOR|PATCH) \t+0-9+ \t*$" )
View file
obs-studio-32.0.4.tar.xz/cmake/finders/FindLibva.cmake -> obs-studio-32.1.0.tar.xz/cmake/finders/FindLibva.cmake
Changed
@@ -79,8 +79,7 @@ set(Libva_VERSION ${PC_Libva_VERSION}) elseif(EXISTS "${Libva_INCLUDE_DIR}/va_version.h") file( - STRINGS - "${Libva_INCLUDE_DIR}/va_version.h" + STRINGS "${Libva_INCLUDE_DIR}/va_version.h" _VERSION_STRING REGEX "^.*(MAJOR|MINOR|MICRO)_VERSION \t+0-9+ \t*$" )
View file
obs-studio-32.0.4.tar.xz/cmake/finders/FindMbedTLS.cmake -> obs-studio-32.1.0.tar.xz/cmake/finders/FindMbedTLS.cmake
Changed
@@ -109,8 +109,7 @@ set(MbedTLS_VERSION ${PC_MbedTLS_VERSION}) elseif(EXISTS "${MbedTLS_INCLUDE_DIR}/mbedtls/build_info.h") file( - STRINGS - "${MbedTLS_INCLUDE_DIR}/mbedtls/build_info.h" + STRINGS "${MbedTLS_INCLUDE_DIR}/mbedtls/build_info.h" _VERSION_STRING REGEX "#define \t+MBEDTLS_VERSION_STRING \t+.+" ) @@ -123,8 +122,7 @@ ) elseif(EXISTS "${MbedTLS_INCLUDE_DIR}/mbedtls/version.h") file( - STRINGS - "${MbedTLS_INCLUDE_DIR}/mbedtls/version.h" + STRINGS "${MbedTLS_INCLUDE_DIR}/mbedtls/version.h" _VERSION_STRING REGEX "#define \t+MBEDTLS_VERSION_STRING \t+.+" )
View file
obs-studio-32.0.4.tar.xz/cmake/finders/FindPipeWire.cmake -> obs-studio-32.1.0.tar.xz/cmake/finders/FindPipeWire.cmake
Changed
@@ -74,8 +74,7 @@ set(PipeWire_VERSION ${PC_PipeWire_VERSION}) elseif(EXISTS "${PipeWire_INCLUDE_DIR}/pipewire/version.h") file( - STRINGS - "${PipeWire_INCLUDE_DIR}/pipewire/version.h" + STRINGS "${PipeWire_INCLUDE_DIR}/pipewire/version.h" _version_string REGEX "^.*PW_(MAJOR|MINOR|MICRO) \t+0-9+ \t*$" )
View file
obs-studio-32.0.4.tar.xz/cmake/finders/FindPulseAudio.cmake -> obs-studio-32.1.0.tar.xz/cmake/finders/FindPulseAudio.cmake
Changed
@@ -63,8 +63,7 @@ set(PulseAudio_VERSION ${PC_PulseAudio_VERSION}) elseif(EXISTS "${PulseAudio_INCLUDE_DIR}/version.h") file( - STRINGS - "${PulseAudio_INCLUDE_DIR}/version.h" + STRINGS "${PulseAudio_INCLUDE_DIR}/version.h" _VERSION_STRING REGEX "^.*pa_get_headers_version\\(\\)\t +\\(\".*\"\\) \t*$" )
View file
obs-studio-32.0.4.tar.xz/cmake/finders/FindSIMDe.cmake -> obs-studio-32.1.0.tar.xz/cmake/finders/FindSIMDe.cmake
Changed
@@ -48,8 +48,7 @@ if(EXISTS "${SIMDe_INCLUDE_DIR}/simde/simde-common.h") file( - STRINGS - "${SIMDe_INCLUDE_DIR}/simde/simde-common.h" + STRINGS "${SIMDe_INCLUDE_DIR}/simde/simde-common.h" _version_string REGEX "^.*VERSION_(MAJOR|MINOR|MICRO) \t+0-9+ \t*$" )
View file
obs-studio-32.0.4.tar.xz/cmake/finders/FindUthash.cmake -> obs-studio-32.1.0.tar.xz/cmake/finders/FindUthash.cmake
Changed
@@ -37,8 +37,7 @@ if(EXISTS "${Uthash_INCLUDE_DIR}/uthash.h") file( - STRINGS - "${Uthash_INCLUDE_DIR}/uthash.h" + STRINGS "${Uthash_INCLUDE_DIR}/uthash.h" _version_string REGEX "#define \t+UTHASH_VERSION \t+0-9+\\.0-9+\\.0-9+" )
View file
obs-studio-32.0.4.tar.xz/cmake/finders/FindWebsocketpp.cmake -> obs-studio-32.1.0.tar.xz/cmake/finders/FindWebsocketpp.cmake
Changed
@@ -42,8 +42,7 @@ if(EXISTS "${Websocketpp_INCLUDE_DIR}/websocketpp/version.hpp") file( - STRINGS - "${Websocketpp_INCLUDE_DIR}/websocketpp/version.hpp" + STRINGS "${Websocketpp_INCLUDE_DIR}/websocketpp/version.hpp" _version_string REGEX "^.*(major|minor|patch)_version \t+= \t+0-9+" )
View file
obs-studio-32.0.4.tar.xz/cmake/linux/helpers.cmake -> obs-studio-32.1.0.tar.xz/cmake/linux/helpers.cmake
Changed
@@ -183,7 +183,7 @@ COMMAND "${CMAKE_COMMAND}" -E copy_directory "${cef_root_location}/Resources/locales" "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/locales" - COMMENT "Add Chromium Embedded Framwork to library directory" + COMMENT "Add Chromium Embedded Framework to library directory" ) install( @@ -227,8 +227,7 @@ file(GLOB_RECURSE data_files "${CMAKE_CURRENT_SOURCE_DIR}/data/*") foreach(data_file IN LISTS data_files) cmake_path( - RELATIVE_PATH - data_file + RELATIVE_PATH data_file BASE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/data/" OUTPUT_VARIABLE relative_path )
View file
obs-studio-32.0.4.tar.xz/cmake/macos/buildspec.cmake -> obs-studio-32.1.0.tar.xz/cmake/macos/buildspec.cmake
Changed
@@ -9,8 +9,6 @@ set(arch universal) set(platform macos-${arch}) - file(READ "${CMAKE_CURRENT_SOURCE_DIR}/buildspec.json" buildspec) - set(dependencies_dir "${CMAKE_CURRENT_SOURCE_DIR}/.deps") set(prebuilt_filename "macos-deps-VERSION-ARCH-REVISION.tar.xz") set(prebuilt_destination "obs-deps-VERSION-ARCH") @@ -20,7 +18,7 @@ set(cef_destination "cef_binary_VERSION_macos_ARCH") set(dependencies_list prebuilt qt6 cef) - _check_dependencies() + _check_dependencies(${dependencies_list}) execute_process( COMMAND "xattr" -r -d com.apple.quarantine "${dependencies_dir}/${destination}"
View file
obs-studio-32.0.4.tar.xz/cmake/macos/compilerconfig.cmake -> obs-studio-32.1.0.tar.xz/cmake/macos/compilerconfig.cmake
Changed
@@ -9,11 +9,14 @@ message(FATAL_ERROR "Building OBS Studio on macOS requires Xcode generator.") endif() -include(ccache) include(compiler_common) add_compile_options("$<$<NOT:$<COMPILE_LANGUAGE:Swift>>:-fopenmp-simd>") +if(CMAKE_CXX_STANDARD GREATER_EQUAL 20) + add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-char8_t>) +endif() + # Ensure recent enough Xcode and platform SDK function(check_sdk_requirements) set(obs_macos_minimum_sdk 15.0) # Keep in sync with Xcode
View file
obs-studio-32.0.4.tar.xz/cmake/macos/helpers.cmake -> obs-studio-32.1.0.tar.xz/cmake/macos/helpers.cmake
Changed
@@ -357,8 +357,7 @@ list(FILTER data_files EXCLUDE REGEX "\\.DS_Store$") foreach(data_file IN LISTS data_files) cmake_path( - RELATIVE_PATH - data_file + RELATIVE_PATH data_file BASE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/data/" OUTPUT_VARIABLE relative_path )
View file
obs-studio-32.0.4.tar.xz/cmake/macos/xcode.cmake -> obs-studio-32.1.0.tar.xz/cmake/macos/xcode.cmake
Changed
@@ -4,20 +4,6 @@ set(CMAKE_XCODE_GENERATE_SCHEME TRUE) -# Use a compiler wrapper to enable ccache in Xcode projects -if(ENABLE_CCACHE AND CCACHE_PROGRAM) - configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/macos/resources/ccache-launcher-c.in" ccache-launcher-c) - configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/macos/resources/ccache-launcher-cxx.in" ccache-launcher-cxx) - - execute_process( - COMMAND chmod a+rx "${CMAKE_CURRENT_BINARY_DIR}/ccache-launcher-c" "${CMAKE_CURRENT_BINARY_DIR}/ccache-launcher-cxx" - ) - set(CMAKE_XCODE_ATTRIBUTE_CC "${CMAKE_CURRENT_BINARY_DIR}/ccache-launcher-c") - set(CMAKE_XCODE_ATTRIBUTE_CXX "${CMAKE_CURRENT_BINARY_DIR}/ccache-launcher-cxx") - set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_C_COMPILER}") - set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_CXX_COMPILER}") -endif() - # Set project variables set(CMAKE_XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION ${OBS_BUILD_NUMBER}) set(CMAKE_XCODE_ATTRIBUTE_DYLIB_COMPATIBILITY_VERSION 1.0.0) @@ -83,7 +69,7 @@ set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMATvariant=Release dwarf-with-dsym) set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMATvariant=MinSizeRel dwarf-with-dsym) -# Make all symbols hidden by default (currently overriden by CMake's compiler flags) +# Make all symbols hidden by default (currently overridden by CMake's compiler flags) set(CMAKE_XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN YES) set(CMAKE_XCODE_ATTRIBUTE_GCC_INLINES_ARE_PRIVATE_EXTERN YES)
View file
obs-studio-32.0.4.tar.xz/cmake/windows/buildspec.cmake -> obs-studio-32.1.0.tar.xz/cmake/windows/buildspec.cmake
Changed
@@ -11,9 +11,8 @@ set(multiValueArgs "") cmake_parse_arguments(PARSE_ARGV 0 _HQCC "${options}" "${oneValueArgs}" "${multiValueArgs}") - file(READ "${CMAKE_CURRENT_SOURCE_DIR}/buildspec.json" buildspec) + _get_dependency_data(dependency_data) - string(JSON dependency_data GET ${buildspec} dependencies) string(JSON data GET ${dependency_data} qt6) string(JSON version GET ${data} version) @@ -100,7 +99,7 @@ endif() set(platform windows-${arch}) - _check_dependencies() + _check_dependencies(${dependencies_list}) if(NOT CMAKE_VS_PLATFORM_NAME STREQUAL Win32) _handle_qt_cross_compile(${CMAKE_HOST_SYSTEM_PROCESSOR} DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.deps/${qt6_destination}")
View file
obs-studio-32.0.4.tar.xz/cmake/windows/compilerconfig.cmake -> obs-studio-32.1.0.tar.xz/cmake/windows/compilerconfig.cmake
Changed
@@ -92,6 +92,7 @@ $<$<OR:$<CONFIG:Release>,$<CONFIG:MinSizeRel>>:/LTCG> $<$<OR:$<CONFIG:Release>,$<CONFIG:MinSizeRel>>:/OPT:REF> $<$<OR:$<CONFIG:Release>,$<CONFIG:MinSizeRel>>:/OPT:ICF> + $<$<OR:$<CONFIG:Release>,$<CONFIG:MinSizeRel>>:/EMITTOOLVERSIONINFO:NO> /DEBUG /Brepro )
View file
obs-studio-32.0.4.tar.xz/cmake/windows/helpers.cmake -> obs-studio-32.1.0.tar.xz/cmake/windows/helpers.cmake
Changed
@@ -305,8 +305,7 @@ file(GLOB_RECURSE data_files "${CMAKE_CURRENT_SOURCE_DIR}/data/*") foreach(data_file IN LISTS data_files) cmake_path( - RELATIVE_PATH - data_file + RELATIVE_PATH data_file BASE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/data/" OUTPUT_VARIABLE relative_path )
View file
obs-studio-32.0.4.tar.xz/docs/sphinx/graphics.rst -> obs-studio-32.1.0.tar.xz/docs/sphinx/graphics.rst
Changed
@@ -198,7 +198,7 @@ - **POSITION** - Position value (*float4*). - **NORMAL** - Normal value (*float4*). - **TANGENT** - Tangent value (*float4*). -- **TEXCOORD0..7** - Texture cooordinate value (*float2*, *float3*, or +- **TEXCOORD0..7** - Texture coordinate value (*float2*, *float3*, or *float4*). Here is an example of a vertex semantic structure:
View file
obs-studio-32.0.4.tar.xz/docs/sphinx/reference-core.rst -> obs-studio-32.1.0.tar.xz/docs/sphinx/reference-core.rst
Changed
@@ -332,7 +332,7 @@ enumeration. Use :c:func:`obs_canvas_get_ref()` or - :c:func:`obs_canvas_get_weak_encoder()` if you want to retain a + :c:func:`obs_canvas_get_weak_canvas()` if you want to retain a reference after obs_enum_canvases finishes. ---------------------
View file
obs-studio-32.0.4.tar.xz/docs/sphinx/reference-encoders.rst -> obs-studio-32.1.0.tar.xz/docs/sphinx/reference-encoders.rst
Changed
@@ -167,6 +167,12 @@ - **OBS_ENCODER_CAP_SCALING** - Encoder implements its own scaling logic, desiring to receive unscaled frames +.. member:: size_t (*get_priming_samples)(void *data) + + Returns the number of priming samples that must be skipped for correct playback for audio produced by this encoder. + Only required for lossy codecs such as AAC or Opus. + + :return: Number of samples Encoder Packet Structure (encoder_packet) ----------------------------------------- @@ -590,6 +596,16 @@ --------------------- +.. function:: uint32_t obs_encoder_get_priming_samples(const obs_encoder_t *encoder) + + Gets the number of samples that shall be skipped when playing back the encoded audio. + Commonly referred to as "encoder delay" or "priming samples" in AAC/Opus. + + :return: Number of priming samples + + .. versionadded:: 32.1 + +--------------------- Functions used by encoders --------------------------
View file
obs-studio-32.0.4.tar.xz/docs/sphinx/reference-libobs-util-source-profiler.rst -> obs-studio-32.1.0.tar.xz/docs/sphinx/reference-libobs-util-source-profiler.rst
Changed
@@ -86,6 +86,6 @@ This function exists to avoid having to allocate new memory each time a profiling result is queried. - :param source: Source to get profiling informatio for + :param source: Source to get profiling information for :param result: Result object to fill :return: *true* if data for the source exists, *false* otherwise
View file
obs-studio-32.0.4.tar.xz/docs/sphinx/reference-properties.rst -> obs-studio-32.1.0.tar.xz/docs/sphinx/reference-properties.rst
Changed
@@ -157,7 +157,7 @@ - **OBS_TEXT_PASSWORD** - Single line of text (passworded) - **OBS_TEXT_MULTILINE** - Multi-line text - **OBS_TEXT_INFO** - Read-only informative text, behaves differently - depending on wether description, string value and long description + depending on whether description, string value and long description are set :return: The property
View file
obs-studio-32.0.4.tar.xz/docs/sphinx/reference-sources.rst -> obs-studio-32.1.0.tar.xz/docs/sphinx/reference-sources.rst
Changed
@@ -1852,6 +1852,12 @@ --------------------- +.. function:: void obs_transition_is_active(obs_source_t *transition) + + :return: *true* if the transition is currently transitioning, *false* otherwise. + +--------------------- + .. function:: void obs_transition_set_size(obs_source_t *transition, uint32_t cx, uint32_t cy) void obs_transition_get_size(const obs_source_t *transition, uint32_t *cx, uint32_t *cy)
View file
obs-studio-32.0.4.tar.xz/frontend/OBSApp.cpp -> obs-studio-32.1.0.tar.xz/frontend/OBSApp.cpp
Changed
@@ -75,11 +75,6 @@ extern string opt_starting_collection; extern string opt_starting_profile; -#ifndef _WIN32 -int OBSApp::sigintFd2; -int OBSApp::sigtermFd2; -#endif - // GPU hint exports for AMD/NVIDIA laptops #ifdef _MSC_VER extern "C" __declspec(dllexport) DWORD NvOptimusEnablement = 1; @@ -144,6 +139,15 @@ return launchAction; } + +QAccessibleInterface *alignmentSelectorFactory(const QString &classname, QObject *object) +{ + if (classname == QLatin1String("AlignmentSelector")) { + if (auto *w = qobject_cast<AlignmentSelector *>(object)) + return new AccessibleAlignmentSelector(w); + } + return nullptr; +} } // namespace QObject *CreateShortcutFilter() @@ -282,6 +286,13 @@ #define DEFAULT_LANG "en-US" +#ifndef _WIN32 +std::array<int, 2> OBSApp::sigIntFileDescriptor{0, 0}; +std::array<int, 2> OBSApp::sigTermFileDescriptor{0, 0}; +std::array<int, 2> OBSApp::sigAbrtFileDescriptor{0, 0}; +std::array<int, 2> OBSApp::sigQuitFileDescriptor{0, 0}; +#endif + bool OBSApp::InitGlobalConfigDefaults() { config_set_default_uint(appConfig, "General", "MaxLogs", 10); @@ -361,8 +372,9 @@ config_set_default_bool(userConfig, "BasicWindow", "ShowSourceIcons", true); config_set_default_bool(userConfig, "BasicWindow", "ShowContextToolbars", true); config_set_default_bool(userConfig, "BasicWindow", "StudioModeLabels", true); + config_set_default_bool(userConfig, "BasicWindow", "SideDocks", true); - config_set_default_bool(userConfig, "BasicWindow", "VerticalVolControl", false); + config_set_default_bool(userConfig, "BasicWindow", "VerticalVolumeControl", true); config_set_default_bool(userConfig, "BasicWindow", "MultiviewMouseSwitch", true); @@ -372,6 +384,11 @@ config_set_default_bool(userConfig, "BasicWindow", "MediaControlsCountdownTimer", true); + config_set_default_bool(App()->GetUserConfig(), "BasicWindow", "MixerShowInactive", false); + config_set_default_bool(App()->GetUserConfig(), "BasicWindow", "MixerKeepInactiveLast", false); + config_set_default_bool(App()->GetUserConfig(), "BasicWindow", "MixerShowHidden", false); + config_set_default_bool(App()->GetUserConfig(), "BasicWindow", "MixerKeepHiddenLast", false); + config_set_default_int(userConfig, "Appearance", "FontScale", 10); config_set_default_int(userConfig, "Appearance", "Density", 1); } @@ -732,7 +749,7 @@ blog(LOG_INFO, "Using preferred locale '%s'", locale_.c_str()); locale = locale_; - // set application default locale to the new choosen one + // set application default locale to the new chosen one if (!locale.empty()) QLocale::setDefault(QLocale(QString::fromStdString(locale).replace('-', '_'))); @@ -802,7 +819,7 @@ goto fail; } - branchesText = branchesFile.readAll(); + branchesText = branchesFile.readAll().toStdString(); if (branchesText.empty()) { error = "File empty."; goto fail; @@ -877,15 +894,25 @@ #endif #ifndef _WIN32 - /* Handle SIGINT properly */ - socketpair(AF_UNIX, SOCK_STREAM, 0, sigintFd); - snInt = new QSocketNotifier(sigintFd1, QSocketNotifier::Read, this); - connect(snInt, &QSocketNotifier::activated, this, &OBSApp::ProcessSigInt); - - /* Handle SIGTERM */ - socketpair(AF_UNIX, SOCK_STREAM, 0, sigtermFd); - snTerm = new QSocketNotifier(sigtermFd1, QSocketNotifier::Read, this); - connect(snTerm, &QSocketNotifier::activated, this, &OBSApp::ProcessSigTerm); + // Add POSIX signal handlers: + // * SIGINT + // * SIGTERM + // * SIGABRT + // * SIGQUIT + + using SignalCallback = decltype(&OBSApp::processSigInt); + + auto connectSignal = this(std::array<int, 2> &fileDescriptor, QPointer<QSocketNotifier> ¬ifier, + SignalCallback callback) -> void { + socketpair(AF_UNIX, SOCK_STREAM, 0, fileDescriptor.data()); + notifier = new QSocketNotifier(fileDescriptor1, QSocketNotifier::Read, this); + connect(notifier, &QSocketNotifier::activated, this, callback); + }; + + connectSignal(sigIntFileDescriptor, sigIntNotifier, &OBSApp::processSigInt); + connectSignal(sigTermFileDescriptor, sigTermNotifier, &OBSApp::processSigTerm); + connectSignal(sigAbrtFileDescriptor, sigAbrtNotifier, &OBSApp::processSigAbrt); + connectSignal(sigQuitFileDescriptor, sigQuitNotifier, &OBSApp::processSigQuit); #endif connect(qApp, &QGuiApplication::commitDataRequest, this, &OBSApp::commitData, Qt::DirectConnection); @@ -1022,6 +1049,8 @@ { ProfileScope("OBSApp::AppInit"); + QAccessible::installFactory(alignmentSelectorFactory); + if (!MakeUserDirs()) throw "Failed to create required user directories"; if (!InitGlobalConfig()) @@ -1237,24 +1266,26 @@ mainWindow->setAttribute(Qt::WA_DeleteOnClose, true); +#ifndef __APPLE__ connect(QApplication::instance(), &QApplication::aboutToQuit, this, this() { - /* Ensure OBSMainWindow gets closed */ if (mainWindow) { - mainWindow->close(); - delete mainWindow; + QPointer<OBSBasic> basicWindow = static_cast<OBSBasic *>(mainWindow.get()); + + basicWindow->closeWindow(); } if (libobs_initialized) { applicationShutdown(); } }); +#endif mainWindow->OBSInit(); connect(OBSBasic::Get(), &OBSBasic::mainWindowClosed, crashHandler_.get(), &OBS::CrashHandler::applicationShutdownHandler); - connect(this, &QGuiApplication::applicationStateChanged, + connect(this, &QGuiApplication::applicationStateChanged, this, this(Qt::ApplicationState state) { ResetHotkeyState(state == Qt::ApplicationActive); }); ResetHotkeyState(applicationState() == Qt::ApplicationActive); @@ -1758,58 +1789,144 @@ } #ifndef _WIN32 -void OBSApp::SigIntSignalHandler(int s) +// Static signal handlers +void OBSApp::sigIntSignalHandler(int) { - /* Handles SIGINT and writes to a socket. Qt will read - * from the socket in the main thread event loop and trigger - * a call to the ProcessSigInt slot, where we can safely run - * shutdown code without signal safety issues. */ - UNUSED_PARAMETER(s); + char tmp = 1; + ::send(sigIntFileDescriptor0, &tmp, sizeof(tmp), 0); +} - char a = 1; - send(sigintFd0, &a, sizeof(a), 0); +void OBSApp::sigTermSignalHandler(int) +{ + char tmp = 1; + ::send(sigTermFileDescriptor0, &tmp, sizeof(tmp), 0); } -void OBSApp::SigTermSignalHandler(int s) +void OBSApp::sigAbrtSignalHandler(int) { - UNUSED_PARAMETER(s); + char tmp = 1; + ::send(sigAbrtFileDescriptor0, &tmp, sizeof(tmp), 0); +} - char a = 1; - send(sigtermFd0, &a, sizeof(a), 0); +void OBSApp::sigQuitSignalHandler(int) +{ + char tmp = 1; + ::send(sigQuitFileDescriptor0, &tmp, sizeof(tmp), 0); } -#endif -void OBSApp::ProcessSigInt(void) +// App instance signal processors +void OBSApp::processSigInt() { - /* This looks weird, but we can't ifdef a Qt slot function so - * the SIGINT handler simply does nothing on Windows. */ -#ifndef _WIN32 + if (!sigIntNotifier->isEnabled()) { + return; + } + + sigIntNotifier->setEnabled(false); + char tmp; - recv(sigintFd1, &tmp, sizeof(tmp), 0); + ::recv(sigIntFileDescriptor1, &tmp, sizeof(tmp), 0); + + sigIntNotifier->setEnabled(true); +#ifndef __APPLE__ OBSBasic *main = OBSBasic::Get(); if (main) { main->saveAll(); main->close(); } +#else + quit(); #endif } -void OBSApp::ProcessSigTerm(void) +void OBSApp::processSigTerm() { -#ifndef _WIN32 + if (!sigTermNotifier->isEnabled()) { + return; + } + + sigTermNotifier->setEnabled(false); + char tmp; - recv(sigtermFd1, &tmp, sizeof(tmp), 0); + ::recv(sigTermFileDescriptor1, &tmp, sizeof(tmp), 0); + sigTermNotifier->setEnabled(true); + +#ifndef __APPLE__ OBSBasic *main = OBSBasic::Get(); if (main) { main->saveAll(); } +#endif + quit(); +} + +void OBSApp::processSigAbrt() +{ + if (!sigAbrtNotifier->isEnabled()) { + return; + } + + sigAbrtNotifier->setEnabled(false); + + char tmp; + ::recv(sigAbrtFileDescriptor1, &tmp, sizeof(tmp), 0); + + sigAbrtNotifier->setEnabled(true); +#ifndef __APPLE__ + OBSBasic *main = OBSBasic::Get(); + if (main) { + main->saveAll(); + } +#endif quit(); +} + +void OBSApp::processSigQuit() +{ + if (!sigQuitNotifier->isEnabled()) { + return; + } + + sigQuitNotifier->setEnabled(false); + + char tmp; + ::recv(sigQuitFileDescriptor1, &tmp, sizeof(tmp), 0); + + sigQuitNotifier->setEnabled(true); + +#ifndef __APPLE__ + OBSBasic *main = OBSBasic::Get(); + if (main) { + main->saveAll(); + } #endif + quit(); +} +#else +// App instance signal processor stub methods used on Windows for OBSApp API compliance +void OBSApp::processSigInt() +{ + return; } +void OBSApp::processSigTerm() +{ + return; +} + +void OBSApp::processSigAbrt() +{ + return; +} + +void OBSApp::processSigQuit() +{ + return; +} +#endif + void OBSApp::commitData(QSessionManager &manager) { OBSBasic *main = OBSBasic::Get(); @@ -1829,13 +1946,19 @@ if (disableAudioDucking) DisableAudioDucking(false); #else - delete snInt; - close(sigintFd0); - close(sigintFd1); + auto disconnectSignal = this(std::array<int, 2> &fileDescriptor, + QPointer<QSocketNotifier> ¬ifier) -> void { + notifier->setEnabled(false); + + std::array<int, 2> tempFileDescriptor = std::exchange(fileDescriptor, {0, 0}); + ::close(tempFileDescriptor0); + ::close(tempFileDescriptor1); + }; - delete snTerm; - close(sigtermFd0); - close(sigtermFd1); + disconnectSignal(sigIntFileDescriptor, sigIntNotifier); + disconnectSignal(sigTermFileDescriptor, sigTermNotifier); + disconnectSignal(sigAbrtFileDescriptor, sigAbrtNotifier); + disconnectSignal(sigQuitFileDescriptor, sigQuitNotifier); #endif #ifdef __APPLE__
View file
obs-studio-32.0.4.tar.xz/frontend/OBSApp.hpp -> obs-studio-32.1.0.tar.xz/frontend/OBSApp.hpp
Changed
@@ -32,6 +32,7 @@ #include <QPointer> #include <QUuid> +#include <array> #include <deque> #include <functional> #include <string> @@ -119,11 +120,15 @@ bool notify(QObject *receiver, QEvent *e) override; #ifndef _WIN32 - static int sigintFd2; - QSocketNotifier *snInt = nullptr; - - static int sigtermFd2; - QSocketNotifier *snTerm = nullptr; + static std::array<int, 2> sigIntFileDescriptor; + static std::array<int, 2> sigTermFileDescriptor; + static std::array<int, 2> sigAbrtFileDescriptor; + static std::array<int, 2> sigQuitFileDescriptor; + + QPointer<QSocketNotifier> sigIntNotifier{}; + QPointer<QSocketNotifier> sigTermNotifier{}; + QPointer<QSocketNotifier> sigAbrtNotifier{}; + QPointer<QSocketNotifier> sigQuitNotifier{}; #endif private slots: @@ -216,8 +221,10 @@ inline void PopUITranslation() { translatorHooks.pop_front(); } #ifndef _WIN32 - static void SigIntSignalHandler(int); - static void SigTermSignalHandler(int); + static void sigIntSignalHandler(int); + static void sigTermSignalHandler(int); + static void sigAbrtSignalHandler(int); + static void sigQuitSignalHandler(int); #endif void loadAppModules(struct obs_module_failure_info &mfi); @@ -227,8 +234,10 @@ public slots: void Exec(VoidFunc func); - void ProcessSigInt(); - void ProcessSigTerm(); + void processSigInt(); + void processSigTerm(); + void processSigAbrt(); + void processSigQuit(); signals: void logLineAdded(int logLevel, const QString &message);
View file
obs-studio-32.0.4.tar.xz/frontend/OBSApp_Themes.cpp -> obs-studio-32.1.0.tar.xz/frontend/OBSApp_Themes.cpp
Changed
@@ -704,6 +704,7 @@ replace = EvalMath(vars, var, var.type); } else if (var.type == OBSThemeVariable::Size || var.type == OBSThemeVariable::Number) { double val = value.toDouble(); + bool isInteger = ceill(val) == val; replace = QString::number(val, 'f', isInteger ? 0 : -1); @@ -713,6 +714,15 @@ replace = value.toString(); } + // Round any values with a px suffix. Qt does this anyway for some properties, + // but then will flat out break with decimals for others. + if (replace.right(2) == "px") { + QString replaceValue = replace.sliced(0, replace.length() - 2); + int val = (int)std::roundf(replaceValue.toDouble()); + + replace = QString::number(val) + "px"; + } + stylesheet = stylesheet.replace(needle, replace); }
View file
obs-studio-32.0.4.tar.xz/frontend/OBSStudioAPI.cpp -> obs-studio-32.1.0.tar.xz/frontend/OBSStudioAPI.cpp
Changed
@@ -13,7 +13,7 @@ extern volatile bool virtualcam_active; template<typename T> -inline size_t GetCallbackIdx(vector<OBSStudioCallback<T>> &callbacks, T callback, void *private_data) +inline size_t GetCallbackIdx(std::vector<OBSStudioCallback<T>> &callbacks, T callback, void *private_data) { for (size_t i = 0; i < callbacks.size(); i++) { OBSStudioCallback<T> curCB = callbacksi; @@ -326,7 +326,7 @@ QAction *action = main->ui->menuTools->addAction(QT_UTF8(name)); action->setMenuRole(QAction::NoRole); - QObject::connect(action, &QAction::triggered, func); + QObject::connect(action, &QAction::triggered, action, func); } bool OBSStudioAPI::obs_frontend_add_dock_by_id(const char *id, const char *title, void *widget)
View file
obs-studio-32.0.4.tar.xz/frontend/OBSStudioAPI.hpp -> obs-studio-32.1.0.tar.xz/frontend/OBSStudioAPI.hpp
Changed
@@ -21,8 +21,6 @@ class OBSBasic; -using namespace std; - template<typename T> struct OBSStudioCallback { T callback; void *private_data; @@ -32,9 +30,9 @@ struct OBSStudioAPI : obs_frontend_callbacks { OBSBasic *main; - vector<OBSStudioCallback<obs_frontend_event_cb>> callbacks; - vector<OBSStudioCallback<obs_frontend_save_cb>> saveCallbacks; - vector<OBSStudioCallback<obs_frontend_save_cb>> preloadCallbacks; + std::vector<OBSStudioCallback<obs_frontend_event_cb>> callbacks; + std::vector<OBSStudioCallback<obs_frontend_save_cb>> saveCallbacks; + std::vector<OBSStudioCallback<obs_frontend_save_cb>> preloadCallbacks; inline OBSStudioAPI(OBSBasic *main_) : main(main_) {}
View file
obs-studio-32.0.4.tar.xz/frontend/cmake/linux/com.obsproject.Studio.desktop -> obs-studio-32.1.0.tar.xz/frontend/cmake/linux/com.obsproject.Studio.desktop
Changed
@@ -15,7 +15,7 @@ Commentaf_ZA=Gratis en oopbron stroom-/opnameprogrammatuur GenericNamean_ES=Programa de retransmisión/gravación Commentan_ES=Program de retransmisión/gravación libre y de codigo ubierto -GenericNamear_SA=برنامَج البث/التسجيل +GenericNamear_SA=برنامَج للبث/التسجيل Commentar_SA=برنامَج بث/تسجيل مجاني ومفتوح المصدر GenericNameaz_AZ=Yayım/Yazma Proqramı Commentaz_AZ=Ödənişsiz və Açıq Mənbəli Yayım/Yazma Proqramı @@ -77,6 +77,8 @@ Commentkmr_TR=Nermalava weşandin/tomarkirin-ê belaş û çavkaniya azad GenericNameko_KR=방송 및 녹화 프로그램 Commentko_KR=스트리밍 및 녹화용 자유 오픈소스 소프트웨어 +GenericNamelo_LA=ຊອບແວຖ່າຍທອດສົດ/ບັນທຶກ +Commentlo_LA=ຊອບແວຖ່າຍທອດສົດ/ບັນທຶກ ແບບຟຣີ ແລະ ໂອເພນຊອດ GenericNamelv_LV=Straumēšanas/Filmešanas programmatūra Commentlv_LV=Bezmaksas un ar atvērtu kodu Straumēšanas/Filmešanas programmatūra GenericNamemn_MN=Шууд дамжуулах/Бичих Програм @@ -107,12 +109,14 @@ Commentsr_SP=Бесплатан софтвер отвореног кода за стримовање/снимање GenericNamesv_SE=Programvara för strömning/inspelning Commentsv_SE=Fri programvara för strömning/inspelning med öppen källkod +GenericNameta_IN=ஒளிபரப்பு/பதிவு செய்யும் மென்பொருள் +Commentta_IN=இலவச மற்றும் திறந்த மூல ஒளிபரப்பு/பதிவு செய்யும் மென்பொருள் GenericNamete_IN=స్ట్రీమింగ్/రికార్డింగ్ సాఫ్ట్వేర్ Commentte_IN=ఉచిత మరియు ఓపెన్ సోర్స్ స్ట్రీమింగ్/రికార్డింగ్ సాఫ్ట్వేర్ GenericNameth_TH=ซอฟต์แวร์สตรีมมิ่ง/บันทึก Commentth_TH=ซอฟต์แวร์สตรีมมิ่ง/บันทึกฟรีและโอเพ่นซอร์ส -GenericNametl_PH=Software sa Pag-stream/Pag-record -Commenttl_PH=Libre at Open Source na Pag-stream/Pag-record na Software +GenericNametl_PH=Palatuntunan ng Pagsasahimpapawid/Pagtatala +Commenttl_PH=Walang Bayad at Bukas na Pinagmulang Palatuntunan ng Pagsasahimpapawid/Pagtatala GenericNametr_TR=Yayın/Kayıt Yazılımı Commenttr_TR=Ücretsiz ve Açık Kaynaklı Yayın/Kayıt Yazılımı GenericNameug_CN=ئېقىم تارقىتىش/خاتىرىلەش يۇمشاق دېتالى
View file
obs-studio-32.0.4.tar.xz/frontend/cmake/linux/com.obsproject.Studio.metainfo.xml.in -> obs-studio-32.1.0.tar.xz/frontend/cmake/linux/com.obsproject.Studio.metainfo.xml.in
Changed
@@ -32,6 +32,7 @@ <url type="bugtracker">https://github.com/obsproject/obs-studio/issues</url> <url type="donation">https://obsproject.com/contribute</url> <url type="translate">https://crowdin.com/project/obs-studio</url> + <url type="vcs-browser">https://github.com/obsproject/obs-studio</url> <recommends> <internet>always</internet>
View file
obs-studio-32.0.4.tar.xz/frontend/cmake/os-freebsd.cmake -> obs-studio-32.1.0.tar.xz/frontend/cmake/os-freebsd.cmake
Changed
@@ -7,7 +7,11 @@ utility/system-info-posix.cpp ) target_compile_definitions(obs-studio PRIVATE OBS_INSTALL_PREFIX="${OBS_INSTALL_PREFIX}") -target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate Qt::DBus procstat) +target_link_libraries(obs-studio PRIVATE Qt::DBus procstat) + +if(Qt6_VERSION AND Qt6_VERSION VERSION_LESS "6.9.0") + target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate) +endif() find_package(Libpci REQUIRED) target_link_libraries(obs-studio PRIVATE Libpci::pci)
View file
obs-studio-32.0.4.tar.xz/frontend/cmake/os-linux.cmake -> obs-studio-32.1.0.tar.xz/frontend/cmake/os-linux.cmake
Changed
@@ -10,7 +10,11 @@ obs-studio PRIVATE OBS_INSTALL_PREFIX="${OBS_INSTALL_PREFIX}" $<$<BOOL:${ENABLE_PORTABLE_CONFIG}>:ENABLE_PORTABLE_CONFIG> ) -target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate Qt::DBus) +target_link_libraries(obs-studio PRIVATE Qt::DBus) + +if(Qt6_VERSION AND Qt6_VERSION VERSION_LESS "6.9.0") + target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate) +endif() find_package(Libpci REQUIRED) target_link_libraries(obs-studio PRIVATE Libpci::pci)
View file
obs-studio-32.0.4.tar.xz/frontend/cmake/ui-components.cmake -> obs-studio-32.1.0.tar.xz/frontend/cmake/ui-components.cmake
Changed
@@ -12,6 +12,12 @@ PRIVATE components/AbsoluteSlider.cpp components/AbsoluteSlider.hpp + components/AccessibleAlignmentCell.cpp + components/AccessibleAlignmentCell.hpp + components/AccessibleAlignmentSelector.cpp + components/AccessibleAlignmentSelector.hpp + components/AlignmentSelector.cpp + components/AlignmentSelector.hpp components/ApplicationAudioCaptureToolbar.cpp components/ApplicationAudioCaptureToolbar.hpp components/AudioCaptureToolbar.cpp @@ -34,14 +40,14 @@ components/FocusList.hpp components/GameCaptureToolbar.cpp components/GameCaptureToolbar.hpp - components/HScrollArea.cpp - components/HScrollArea.hpp components/ImageSourceToolbar.cpp components/ImageSourceToolbar.hpp components/MediaControls.cpp components/MediaControls.hpp components/MenuButton.cpp components/MenuButton.hpp + components/MenuCheckBox.cpp + components/MenuCheckBox.hpp components/Multiview.cpp components/Multiview.hpp components/MuteCheckBox.hpp @@ -77,6 +83,14 @@ components/VisibilityItemDelegate.hpp components/VisibilityItemWidget.cpp components/VisibilityItemWidget.hpp + components/VolumeAccessibleInterface.cpp + components/VolumeAccessibleInterface.hpp + components/VolumeControl.cpp + components/VolumeControl.hpp + components/VolumeMeter.cpp + components/VolumeMeter.hpp + components/VolumeName.cpp + components/VolumeName.hpp components/VolumeSlider.cpp components/VolumeSlider.hpp components/WindowCaptureToolbar.cpp
View file
obs-studio-32.0.4.tar.xz/frontend/cmake/ui-qt.cmake -> obs-studio-32.1.0.tar.xz/frontend/cmake/ui-qt.cmake
Changed
@@ -18,6 +18,9 @@ PROPERTIES AUTOMOC TRUE AUTOUIC TRUE AUTORCC TRUE AUTOGEN_PARALLEL AUTO ) +# https://doc.qt.io/qt-6/qtglobal.html#QT_ENABLE_STRICT_MODE_UP_TO +target_compile_definitions(obs-studio PRIVATE QT_ENABLE_STRICT_MODE_UP_TO=0xFF0000) + set_property(TARGET obs-studio APPEND PROPERTY AUTOUIC_SEARCH_PATHS forms forms/source-toolbar) target_sources(
View file
obs-studio-32.0.4.tar.xz/frontend/cmake/ui-utility.cmake -> obs-studio-32.1.0.tar.xz/frontend/cmake/ui-utility.cmake
Changed
@@ -37,6 +37,8 @@ utility/OBSThemeVariable.hpp utility/OBSTranslator.cpp utility/OBSTranslator.hpp + utility/PreviewProgramSizeObserver.cpp + utility/PreviewProgramSizeObserver.hpp utility/QuickTransition.cpp utility/QuickTransition.hpp utility/RemoteTextThread.cpp @@ -57,8 +59,6 @@ utility/StartMultiTrackVideoStreamingGuard.hpp utility/SurfaceEventFilter.hpp utility/VCamConfig.hpp - utility/VolumeMeterTimer.cpp - utility/VolumeMeterTimer.hpp utility/audio-encoders.cpp utility/audio-encoders.hpp utility/display-helpers.hpp
View file
obs-studio-32.0.4.tar.xz/frontend/cmake/ui-widgets.cmake -> obs-studio-32.1.0.tar.xz/frontend/cmake/ui-widgets.cmake
Changed
@@ -10,6 +10,8 @@ target_sources( obs-studio PRIVATE + widgets/AudioMixer.cpp + widgets/AudioMixer.hpp widgets/ColorSelect.cpp widgets/ColorSelect.hpp widgets/OBSBasic.cpp @@ -41,7 +43,6 @@ widgets/OBSBasic_Transitions.cpp widgets/OBSBasic_Updater.cpp widgets/OBSBasic_VirtualCam.cpp - widgets/OBSBasic_VolControl.cpp widgets/OBSBasic_YouTube.cpp widgets/OBSBasicControls.cpp widgets/OBSBasicControls.hpp @@ -58,10 +59,4 @@ widgets/OBSQTDisplay.hpp widgets/StatusBarWidget.cpp widgets/StatusBarWidget.hpp - widgets/VolControl.cpp - widgets/VolControl.hpp - widgets/VolumeAccessibleInterface.cpp - widgets/VolumeAccessibleInterface.hpp - widgets/VolumeMeter.cpp - widgets/VolumeMeter.hpp )
View file
obs-studio-32.1.0.tar.xz/frontend/components/AccessibleAlignmentCell.cpp
Added
@@ -0,0 +1,71 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#include "AccessibleAlignmentCell.hpp" + +#include <OBSApp.hpp> + +using namespace std::string_view_literals; +constexpr std::array indexToStrings = { + "Basic.TransformWindow.Alignment.TopLeft"sv, "Basic.TransformWindow.Alignment.TopCenter"sv, + "Basic.TransformWindow.Alignment.TopRight"sv, "Basic.TransformWindow.Alignment.CenterLeft"sv, + "Basic.TransformWindow.Alignment.Center"sv, "Basic.TransformWindow.Alignment.CenterRight"sv, + "Basic.TransformWindow.Alignment.BottomLeft"sv, "Basic.TransformWindow.Alignment.BottomCenter"sv, + "Basic.TransformWindow.Alignment.BottomRight"sv}; + +AccessibleAlignmentCell::AccessibleAlignmentCell(QAccessibleInterface *parent, AlignmentSelector *widget, int index) + : parent_(parent), + widget(widget), + index_(index) +{ +} + +QRect AccessibleAlignmentCell::rect() const +{ + return widget->cellRect(index_); +} + +QString AccessibleAlignmentCell::text(QAccessible::Text text) const +{ + if (text == QAccessible::Name || text == QAccessible::Value) { + return QString(indexToStringsindex_.data()); + } + return QString(); +} + +QAccessible::State AccessibleAlignmentCell::state() const +{ + QAccessible::State state; + bool enabled = widget->isEnabled(); + + bool isSelectedCell = widget->currentIndex() == index_; + bool isFocusedCell = widget->focusedCell == index_; + + state.disabled = !enabled; + state.focusable = enabled; + state.focused = widget->hasFocus() && isFocusedCell; + state.checkable = true; + state.checked = isSelectedCell; + state.selected = isSelectedCell; + + return state; +} + +QAccessible::Role AccessibleAlignmentCell::role() const +{ + return QAccessible::CheckBox; +}
View file
obs-studio-32.1.0.tar.xz/frontend/components/AccessibleAlignmentCell.hpp
Added
@@ -0,0 +1,51 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#pragma once + +#include <components/AlignmentSelector.hpp> + +#include <QAccessibleInterface> +#include <QRect> + +class AlignmentSelector; + +class AccessibleAlignmentCell : public QAccessibleInterface { + QAccessibleInterface *parent_; + AlignmentSelector *widget; + int index_; + +public: + AccessibleAlignmentCell(QAccessibleInterface *parent, AlignmentSelector *widget, int index); + + int index() const { return index_; } + + QRect rect() const override; + QString text(QAccessible::Text t) const override; + QAccessible::State state() const override; + QAccessible::Role role() const override; + + QObject *object() const override { return nullptr; } + QAccessibleInterface *child(int) const override { return nullptr; } + QAccessibleInterface *childAt(int, int) const override { return nullptr; } + int childCount() const override { return 0; } + int indexOfChild(const QAccessibleInterface *) const override { return -1; } + QAccessibleInterface *parent() const override { return parent_; } + QAccessibleInterface *focusChild() const override { return nullptr; } + bool isValid() const override { return widget != nullptr; } + void setText(QAccessible::Text, const QString &) override {} +};
View file
obs-studio-32.1.0.tar.xz/frontend/components/AccessibleAlignmentSelector.cpp
Added
@@ -0,0 +1,126 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#include "AccessibleAlignmentSelector.hpp" + +#include <OBSApp.hpp> + +AccessibleAlignmentSelector::AccessibleAlignmentSelector(AlignmentSelector *widget_) + : QAccessibleWidget(widget_, QAccessible::Grouping) +{ + for (int i = 0; i < cellCount; ++i) { + AccessibleAlignmentCell *cell = new AccessibleAlignmentCell(this, widget_, i); + QAccessible::registerAccessibleInterface(cell); + cellInterfaces.insert(i, QAccessible::uniqueId(cell)); + } +} + +AccessibleAlignmentSelector::~AccessibleAlignmentSelector() +{ + for (QAccessible::Id id : std::as_const(cellInterfaces)) { + QAccessible::deleteAccessibleInterface(id); + } +} + +int AccessibleAlignmentSelector::childCount() const +{ + return cellCount; +} + +QAccessibleInterface *AccessibleAlignmentSelector::child(int index) const +{ + if (QAccessible::Id id = cellInterfaces.value(index)) { + return QAccessible::accessibleInterface(id); + } + + return nullptr; +} + +int AccessibleAlignmentSelector::indexOfChild(const QAccessibleInterface *child) const +{ + if (!child) { + return -1; + } + + QAccessible::Id id = QAccessible::uniqueId(const_cast<QAccessibleInterface *>(child)); + return cellInterfaces.key(id, -1); +} + +bool AccessibleAlignmentSelector::isValid() const +{ + return widget() != nullptr; +} + +QAccessibleInterface *AccessibleAlignmentSelector::focusChild() const +{ + for (int i = 0; i < childCount(); ++i) { + if (child(i)->state().focused) { + return child(i); + } + } + return nullptr; +} + +QRect AccessibleAlignmentSelector::rect() const +{ + return widget()->rect(); +} + +QString AccessibleAlignmentSelector::text(QAccessible::Text textType) const +{ + if (textType == QAccessible::Name) { + QString str = widget()->accessibleName(); + if (str.isEmpty()) { + str = QTStr("Accessible.Widget.Name.AlignmentSelector"); + } + return str; + } + + if (textType == QAccessible::Value) { + return value().toString(); + } + + return QAccessibleWidget::text(textType); +} + +QAccessible::Role AccessibleAlignmentSelector::role() const +{ + return QAccessible::Grouping; +} + +QAccessible::State AccessibleAlignmentSelector::state() const +{ + QAccessible::State state; + + state.focusable = true; + state.focused = widget()->hasFocus(); + state.disabled = !widget()->isEnabled(); + state.readOnly = false; + + return state; +} + +QVariant AccessibleAlignmentSelector::value() const +{ + for (int i = 0; i < childCount(); ++i) { + if (child(i)->state().checked) { + return child(i)->text(QAccessible::Name); + } + } + + return QTStr("None"); +}
View file
obs-studio-32.1.0.tar.xz/frontend/components/AccessibleAlignmentSelector.hpp
Added
@@ -0,0 +1,47 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#pragma once + +#include <components/AccessibleAlignmentCell.hpp> + +#include <QAccessible> +#include <QAccessibleInterface> +#include <QAccessibleWidget> + +class AlignmentSelector; + +class AccessibleAlignmentSelector : public QAccessibleWidget { + mutable QHash<int, QAccessible::Id> cellInterfaces{}; + static constexpr int cellCount = 9; + +public: + explicit AccessibleAlignmentSelector(AlignmentSelector *widget); + ~AccessibleAlignmentSelector(); + + QRect rect() const override; + QAccessible::Role role() const override; + QAccessible::State state() const override; + QString text(QAccessible::Text t) const override; + QAccessibleInterface *child(int index) const override; + int childCount() const override; + int indexOfChild(const QAccessibleInterface *child) const override; + bool isValid() const override; + QAccessibleInterface *focusChild() const override; + + QVariant value() const; +};
View file
obs-studio-32.1.0.tar.xz/frontend/components/AlignmentSelector.cpp
Added
@@ -0,0 +1,324 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#include "AlignmentSelector.hpp" + +#include <util/base.h> + +#include <QAccessible> +#include <QMouseEvent> +#include <QPainter> +#include <QStyleOptionButton> + +AlignmentSelector::AlignmentSelector(QWidget *parent) : QWidget(parent) +{ + setFocusPolicy(Qt::StrongFocus); + setMouseTracking(true); + setAttribute(Qt::WA_Hover); +} + +QSize AlignmentSelector::sizeHint() const +{ + int base = fontMetrics().height() * 2; + return QSize(base, base); +} + +QSize AlignmentSelector::minimumSizeHint() const +{ + return QSize(16, 16); +} + +Qt::Alignment AlignmentSelector::value() const +{ + return cellAlignment(selectedCell); +} + +int AlignmentSelector::currentIndex() const +{ + return selectedCell; +} + +void AlignmentSelector::setAlignment(Qt::Alignment value) +{ + alignment = value; +} + +void AlignmentSelector::setCurrentIndex(int index) +{ + selectCell(index); +} + +void AlignmentSelector::paintEvent(QPaintEvent *) +{ + QPainter painter(this); + QStyle *style = this->style(); + + int cellW = gridRect().width() / 3; + int cellH = gridRect().height() / 3; + + for (int i = 0; i < 9; ++i) { + QRect rect = cellRect(i); + rect = rect.adjusted(0, 0, -1, -1); + + QStyleOptionFrame frameOpt; + frameOpt.rect = rect; + frameOpt.state = isEnabled() ? QStyle::State_Enabled : QStyle::State_None; + frameOpt.lineWidth = 1; + frameOpt.midLineWidth = 0; + if (i == hoveredCell) { + frameOpt.state |= QStyle::State_MouseOver; + } + if (i == selectedCell) { + frameOpt.state |= QStyle::State_On; + } + if (i == focusedCell && hasFocus()) { + frameOpt.state |= QStyle::State_HasFocus; + } + + QStyleOptionButton radioOpt; + radioOpt.state = isEnabled() ? QStyle::State_Enabled : QStyle::State_None; + radioOpt.rect = rect.adjusted(cellW / 6, cellH / 6, -cellW / 6, -cellH / 6); + if (i == hoveredCell) { + radioOpt.state |= QStyle::State_MouseOver; + } + if (i == selectedCell) { + radioOpt.state |= QStyle::State_On; + } + + if (i == focusedCell && hasFocus()) { + radioOpt.state |= QStyle::State_HasFocus; + } + style->drawPrimitive(QStyle::PE_IndicatorRadioButton, &radioOpt, &painter, this); + + style->drawPrimitive(QStyle::PE_Frame, &frameOpt, &painter, this); + + if (i == focusedCell && hasFocus()) { + QStyleOptionFocusRect focusOpt; + focusOpt.initFrom(this); + focusOpt.rect = rect.adjusted(1, 1, -1, -1); + focusOpt.state = isEnabled() ? QStyle::State_Enabled : QStyle::State_None; + focusOpt.state |= QStyle::State_HasFocus; + style->drawPrimitive(QStyle::PE_FrameFocusRect, &focusOpt, &painter, this); + } + } +} + +QRect AlignmentSelector::cellRect(int index) const +{ + int col = index % 3; + int row = index / 3; + + QRect gridRect = this->gridRect(); + int cellW = gridRect.width() / 3; + int cellH = gridRect.height() / 3; + + return QRect(col * cellW + gridRect.left(), row * cellH + gridRect.top(), cellW, cellH); +} + +Qt::Alignment AlignmentSelector::cellAlignment(int index) const +{ + Qt::Alignment hAlign; + Qt::Alignment vAlign; + + switch (index % 3) { + case 0: + hAlign = Qt::AlignLeft; + break; + case 1: + hAlign = Qt::AlignHCenter; + break; + case 2: + hAlign = Qt::AlignRight; + break; + } + + switch (index / 3) { + case 0: + vAlign = Qt::AlignTop; + break; + case 1: + vAlign = Qt::AlignVCenter; + break; + case 2: + vAlign = Qt::AlignBottom; + break; + } + + return hAlign | vAlign; +} + +void AlignmentSelector::leaveEvent(QEvent *) +{ + hoveredCell = -1; + update(); +} + +void AlignmentSelector::mouseMoveEvent(QMouseEvent *event) +{ + QRect grid = gridRect(); + int cellW = grid.width() / 3; + int cellH = grid.height() / 3; + + QPoint pos = event->position().toPoint(); + if (!grid.contains(pos)) { + hoveredCell = -1; + return; + } + + int col = (pos.x() - grid.left()) / cellW; + int row = (pos.y() - grid.top()) / cellH; + int cell = row * 3 + col; + + if (hoveredCell != cell) { + hoveredCell = cell; + update(); + } +} + +void AlignmentSelector::mousePressEvent(QMouseEvent *event) +{ + QRect grid = gridRect(); + int cellW = grid.width() / 3; + int cellH = grid.height() / 3; + + QPoint pos = event->position().toPoint(); + if (!grid.contains(pos)) { + return; + } + + int col = (pos.x() - grid.left()) / cellW; + int row = (pos.y() - grid.top()) / cellH; + int cell = row * 3 + col; + + selectCell(cell); +} + +void AlignmentSelector::keyPressEvent(QKeyEvent *event) +{ + int moveX = 0; + int moveY = 0; + + switch (event->key()) { + case Qt::Key_Left: + moveX = -1; + break; + case Qt::Key_Right: + moveX = 1; + break; + case Qt::Key_Up: + moveY = -1; + break; + case Qt::Key_Down: + moveY = 1; + break; + case Qt::Key_Space: + case Qt::Key_Return: + case Qt::Key_Enter: + selectCell(focusedCell); + return; + default: + QWidget::keyPressEvent(event); + return; + } + + moveFocusedCell(moveX, moveY); +} + +QRect AlignmentSelector::gridRect() const +{ + int side = std::min(width(), height()); + int x = 0; + int y = 0; + + if (alignment & Qt::AlignHCenter) { + x = (width() - side) / 2; + } else if (alignment & Qt::AlignRight) { + x = width() - side; + } + + if (alignment & Qt::AlignVCenter) { + y = (height() - side) / 2; + } else if (alignment & Qt::AlignBottom) { + y = height() - side; + } + + return QRect(x, y, side, side); +} + +void AlignmentSelector::moveFocusedCell(int moveX, int moveY) +{ + int row = focusedCell / 3; + int col = focusedCell % 3; + + row = std::clamp(row + moveY, 0, 2); + col = std::clamp(col + moveX, 0, 2); + + int newCell = row * 3 + col; + setFocusedCell(newCell); +} + +void AlignmentSelector::setFocusedCell(int cell) +{ + if (cell != focusedCell) { + focusedCell = cell; + update(); + + if (AccessibleAlignmentSelector *interface = + dynamic_cast<AccessibleAlignmentSelector *>(QAccessible::queryAccessibleInterface(this))) { + if (QAccessibleInterface *child = interface->child(cell)) { + QAccessibleEvent event(child, QAccessible::Focus); + QAccessible::updateAccessibility(&event); + } + } + } +} + +void AlignmentSelector::selectCell(int cell) +{ + setFocusedCell(cell); + if (cell != selectedCell) { + selectedCell = cell; + + emit valueChanged(cellAlignment(cell)); + emit currentIndexChanged(cell); + } + update(); + + if (AccessibleAlignmentSelector *interface = + dynamic_cast<AccessibleAlignmentSelector *>(QAccessible::queryAccessibleInterface(this))) { + if (QAccessibleInterface *child = interface->child(cell)) { + QAccessible::State state; + state.checked = true; + + QAccessibleStateChangeEvent event(child, state); + QAccessible::updateAccessibility(&event); + } + } +} + +void AlignmentSelector::focusInEvent(QFocusEvent *) +{ + setFocusedCell(selectedCell); + update(); +} + +void AlignmentSelector::focusOutEvent(QFocusEvent *) +{ + hoveredCell = -1; + setFocusedCell(-1); + update(); +}
View file
obs-studio-32.1.0.tar.xz/frontend/components/AlignmentSelector.hpp
Added
@@ -0,0 +1,71 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#pragma once + +#include <components/AccessibleAlignmentSelector.hpp> + +#include <QFocusEvent> +#include <QKeyEvent> +#include <QWidget> + +class AlignmentSelector : public QWidget { + Q_OBJECT + + friend class AccessibleAlignmentSelector; + friend class AccessibleAlignmentCell; + +public: + explicit AlignmentSelector(QWidget *parent = nullptr); + + QSize sizeHint() const override; + QSize minimumSizeHint() const override; + Qt::Alignment value() const; + int currentIndex() const; + + void setAlignment(Qt::Alignment alignment); + void setCurrentIndex(int index); + +signals: + void valueChanged(Qt::Alignment value); + void currentIndexChanged(int value); + +protected: + QRect cellRect(int index) const; + + void paintEvent(QPaintEvent *event) override; + void leaveEvent(QEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + void keyPressEvent(QKeyEvent *event) override; + void focusInEvent(QFocusEvent *event) override; + void focusOutEvent(QFocusEvent *event) override; + +private: + Qt::Alignment alignment = Qt::AlignTop | Qt::AlignLeft; + + int hoveredCell = -1; + int focusedCell = 4; + int selectedCell = 4; + + QRect gridRect() const; + + void moveFocusedCell(int moveX, int moveY); + void setFocusedCell(int cell); + void selectCell(int cell); + Qt::Alignment cellAlignment(int index) const; +};
View file
obs-studio-32.0.4.tar.xz/frontend/components/MediaControls.cpp -> obs-studio-32.1.0.tar.xz/frontend/components/MediaControls.cpp
Changed
@@ -184,7 +184,7 @@ return; if (!mediaTimer.isActive()) - mediaTimer.start(1000); + mediaTimer.start(16); } void MediaControls::StopMediaTimer()
View file
obs-studio-32.1.0.tar.xz/frontend/components/MenuCheckBox.cpp
Added
@@ -0,0 +1,112 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#include "MenuCheckBox.hpp" + +#include <QMenu> +#include <QMouseEvent> +#include <QStyleOptionButton> +#include <QStylePainter> + +MenuCheckBox::MenuCheckBox(const QString &text, QWidget *parent) : QCheckBox(text, parent) +{ + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + setContentsMargins(0, 0, 0, 0); + + if (auto menu = qobject_cast<QMenu *>(parent)) { + connect(menu, &QMenu::hovered, this, this, menu(QAction *action) { + if (action != menuAction) { + setHovered(false); + update(); + } + }); + connect(menu, &QMenu::aboutToHide, this, this() { setHovered(false); }); + } +} + +void MenuCheckBox::setAction(QAction *action) +{ + menuAction = action; +} + +void MenuCheckBox::focusInEvent(QFocusEvent *) +{ + setHovered(true); +} + +void MenuCheckBox::mousePressEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) { + mousePressInside = true; + event->accept(); + } else { + QCheckBox::mousePressEvent(event); + } +} + +void MenuCheckBox::mouseMoveEvent(QMouseEvent *event) +{ + if (!rect().contains(event->pos())) { + mousePressInside = false; + } + event->accept(); +} + +void MenuCheckBox::mouseReleaseEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) { + if (mousePressInside && rect().contains(event->pos())) { + toggle(); + } + event->accept(); + } else { + QCheckBox::mouseReleaseEvent(event); + } + + mousePressInside = false; +} + +void MenuCheckBox::enterEvent(QEnterEvent *) +{ + setHovered(true); + update(); +} + +void MenuCheckBox::leaveEvent(QEvent *) +{ + setHovered(false); + update(); +} + +void MenuCheckBox::paintEvent(QPaintEvent *) +{ + QStylePainter p(this); + QStyleOptionButton opt; + initStyleOption(&opt); + + if (isHovered) { + opt.state |= QStyle::State_MouseOver; + opt.state |= QStyle::State_Selected; + } + + p.drawControl(QStyle::CE_CheckBox, opt); +} + +void MenuCheckBox::setHovered(bool hovered) +{ + isHovered = hovered; +}
View file
obs-studio-32.1.0.tar.xz/frontend/components/MenuCheckBox.hpp
Added
@@ -0,0 +1,50 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#pragma once + +#include <QCheckBox> +#include <QPointer> + +class QStyleOptionButton; +class QStylePainter; +class QMouseEvent; + +class MenuCheckBox : public QCheckBox { + Q_OBJECT + +public: + explicit MenuCheckBox(const QString &text, QWidget *parent = nullptr); + + void setAction(QAction *action); + +protected: + void focusInEvent(QFocusEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + void enterEvent(QEnterEvent *event) override; + void leaveEvent(QEvent *event) override; + void paintEvent(QPaintEvent *event) override; + +private: + QPointer<QAction> menuAction = nullptr; + bool mousePressInside = false; + + bool isHovered = false; + void setHovered(bool hovered); +};
View file
obs-studio-32.0.4.tar.xz/frontend/components/OBSAdvAudioCtrl.cpp -> obs-studio-32.1.0.tar.xz/frontend/components/OBSAdvAudioCtrl.cpp
Changed
@@ -6,6 +6,7 @@ #include <qt-wrappers.hpp> #include <QCheckBox> +#include <QStackedWidget> #include "moc_OBSAdvAudioCtrl.cpp" @@ -207,7 +208,8 @@ connect(monitoringType, &QComboBox::currentIndexChanged, this, &OBSAdvAudioCtrl::monitoringTypeChanged); auto connectMixer = this(QCheckBox *mixer, int num) { - connect(mixer, &QCheckBox::clicked, this, num(bool checked) { setMixer(source, num, checked); }); + connect(mixer, &QCheckBox::clicked, this, + this, num(bool checked) { setMixer(source, num, checked); }); }; connectMixer(mixer1, 0); connectMixer(mixer2, 1);
View file
obs-studio-32.0.4.tar.xz/frontend/components/OBSSourceLabel.cpp -> obs-studio-32.1.0.tar.xz/frontend/components/OBSSourceLabel.cpp
Changed
@@ -18,28 +18,43 @@ #include "OBSSourceLabel.hpp" #include "moc_OBSSourceLabel.cpp" -void OBSSourceLabel::SourceRenamed(void *data, calldata_t *params) +OBSSourceLabel::OBSSourceLabel(const obs_source_t *source, QWidget *parent, Qt::WindowFlags f) + : QLabel(obs_source_get_name(source), parent, f), + renamedSignal(obs_source_get_signal_handler(source), "rename", &OBSSourceLabel::obsSourceRenamed, this), + removedSignal(obs_source_get_signal_handler(source), "remove", &OBSSourceLabel::obsSourceRemoved, this), + destroyedSignal(obs_source_get_signal_handler(source), "destroy", &OBSSourceLabel::obsSourceDestroyed, this) +{ +} + +void OBSSourceLabel::obsSourceRenamed(void *data, calldata_t *params) { auto &label = *static_cast<OBSSourceLabel *>(data); const char *name = calldata_string(params, "new_name"); label.setText(name); - emit label.Renamed(name); + emit label.renamed(name); } -void OBSSourceLabel::SourceRemoved(void *data, calldata_t *) +void OBSSourceLabel::obsSourceRemoved(void *data, calldata_t *) { auto &label = *static_cast<OBSSourceLabel *>(data); - emit label.Removed(); + emit label.removed(); } -void OBSSourceLabel::SourceDestroyed(void *data, calldata_t *) +void OBSSourceLabel::obsSourceDestroyed(void *data, calldata_t *) { auto &label = *static_cast<OBSSourceLabel *>(data); - emit label.Destroyed(); + emit label.destroyed(); label.destroyedSignal.Disconnect(); label.removedSignal.Disconnect(); label.renamedSignal.Disconnect(); } + +void OBSSourceLabel::mousePressEvent(QMouseEvent *event) +{ + emit clicked(); + + QLabel::mousePressEvent(event); +}
View file
obs-studio-32.0.4.tar.xz/frontend/components/OBSSourceLabel.hpp -> obs-studio-32.1.0.tar.xz/frontend/components/OBSSourceLabel.hpp
Changed
@@ -29,22 +29,17 @@ OBSSignal removedSignal; OBSSignal destroyedSignal; - OBSSourceLabel(const obs_source_t *source, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()) - : QLabel(obs_source_get_name(source), parent, f), - renamedSignal(obs_source_get_signal_handler(source), "rename", &OBSSourceLabel::SourceRenamed, this), - removedSignal(obs_source_get_signal_handler(source), "remove", &OBSSourceLabel::SourceRemoved, this), - destroyedSignal(obs_source_get_signal_handler(source), "destroy", &OBSSourceLabel::SourceDestroyed, - this) - { - } + OBSSourceLabel(const obs_source_t *source, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); protected: - static void SourceRenamed(void *data, calldata_t *params); - static void SourceRemoved(void *data, calldata_t *params); - static void SourceDestroyed(void *data, calldata_t *params); + static void obsSourceRenamed(void *data, calldata_t *params); + static void obsSourceRemoved(void *data, calldata_t *params); + static void obsSourceDestroyed(void *data, calldata_t *params); + void mousePressEvent(QMouseEvent *event); signals: - void Renamed(const char *name); - void Removed(); - void Destroyed(); + void renamed(const char *name); + void removed(); + void destroyed(); + void clicked(); };
View file
obs-studio-32.0.4.tar.xz/frontend/components/SourceTreeItem.cpp -> obs-studio-32.1.0.tar.xz/frontend/components/SourceTreeItem.cpp
Changed
@@ -156,8 +156,8 @@ obs_sceneitem_set_locked(sceneitem, checked); }; - connect(vis, &QAbstractButton::clicked, setItemVisible); - connect(lock, &QAbstractButton::clicked, setItemLocked); + connect(vis, &QAbstractButton::clicked, this, setItemVisible); + connect(lock, &QAbstractButton::clicked, this, setItemLocked); } void SourceTreeItem::paintEvent(QPaintEvent *event)
View file
obs-studio-32.0.4.tar.xz/frontend/components/VisibilityItemWidget.cpp -> obs-studio-32.1.0.tar.xz/frontend/components/VisibilityItemWidget.cpp
Changed
@@ -28,7 +28,7 @@ setLayout(itemLayout); - connect(vis, &QCheckBox::clicked, this(bool visible) { obs_source_set_enabled(source, visible); }); + connect(vis, &QCheckBox::clicked, this, this(bool visible) { obs_source_set_enabled(source, visible); }); } void VisibilityItemWidget::OBSSourceEnabled(void *param, calldata_t *data)
View file
obs-studio-32.1.0.tar.xz/frontend/components/VolumeAccessibleInterface.cpp
Changed
(renamed from frontend/widgets/VolumeAccessibleInterface.cpp)
View file
obs-studio-32.1.0.tar.xz/frontend/components/VolumeAccessibleInterface.hpp
Changed
(renamed from frontend/widgets/VolumeAccessibleInterface.hpp)
View file
obs-studio-32.1.0.tar.xz/frontend/components/VolumeControl.cpp
Added
@@ -0,0 +1,991 @@ +#include "VolumeControl.hpp" + +#include <components/MuteCheckBox.hpp> +#include <components/VolumeMeter.hpp> +#include <components/VolumeName.hpp> +#include <components/VolumeSlider.hpp> +#include <dialogs/NameDialog.hpp> +#include <widgets/OBSBasic.hpp> + +#include <QMessageBox> +#include <QObjectCleanupHandler> + +#include "moc_VolumeControl.cpp" + +namespace { +bool isSourceUnassigned(obs_source_t *source) +{ + uint32_t mixes = (obs_source_get_audio_mixers(source) & ((1 << MAX_AUDIO_MIXES) - 1)); + obs_monitoring_type mt = obs_source_get_monitoring_type(source); + + return mixes == 0 && mt != OBS_MONITORING_TYPE_MONITOR_ONLY; +} + +void showUnassignedWarning(const char *name) +{ + auto msgBox = =() { + QMessageBox msgbox(App()->GetMainWindow()); + msgbox.setWindowTitle(QTStr("VolControl.UnassignedWarning.Title")); + msgbox.setText(QTStr("VolControl.UnassignedWarning.Text").arg(name)); + msgbox.setIcon(QMessageBox::Icon::Information); + msgbox.addButton(QMessageBox::Ok); + + QCheckBox *cb = new QCheckBox(QTStr("DoNotShowAgain")); + msgbox.setCheckBox(cb); + + msgbox.exec(); + + if (cb->isChecked()) { + config_set_bool(App()->GetUserConfig(), "General", "WarnedAboutUnassignedSources", true); + config_save_safe(App()->GetUserConfig(), "tmp", nullptr); + } + }; + + QMetaObject::invokeMethod(App(), "Exec", Qt::QueuedConnection, Q_ARG(VoidFunc, msgBox)); +} +} // namespace + +VolumeControl::VolumeControl(obs_source_t *source, QWidget *parent, bool vertical) + : weakSource_(OBSGetWeakRef(source)), + obs_fader(obs_fader_create(OBS_FADER_LOG)), + vertical(vertical), + contextMenu(nullptr), + QFrame(parent) +{ + utils = std::make_unique<idian::Utils>(this); + + uuid = obs_source_get_uuid(source); + + mainLayout = new QBoxLayout(QBoxLayout::LeftToRight, this); + mainLayout->setContentsMargins(0, 0, 0, 0); + mainLayout->setSpacing(0); + setLayout(mainLayout); + + categoryLabel = new QLabel("Active"); + categoryLabel->setAlignment(Qt::AlignCenter); + utils->addClass(categoryLabel, "mixer-category"); + utils->addClass(categoryLabel, "text-tiny"); + + nameButton = new VolumeName(source, this); + nameButton->setMaximumWidth(140); + utils->addClass(nameButton, "text-small"); + utils->addClass(nameButton, "mixer-name"); + + muteButton = new QPushButton(this); + muteButton->setCheckable(true); + utils->addClass(muteButton, "btn-mute"); + + monitorButton = new QPushButton(this); + monitorButton->setCheckable(true); + utils->addClass(monitorButton, "btn-monitor"); + + volumeLabel = new QLabel(this); + volumeLabel->setObjectName("volLabel"); + + slider = new VolumeSlider(obs_fader, Qt::Horizontal, this); + slider->setMinimum(0); + slider->setMaximum(int(FADER_PRECISION)); + + sourceName = obs_source_get_name(source); + setObjectName(sourceName); + + utils->applyStateStylingEventFilter(muteButton); + utils->applyStateStylingEventFilter(monitorButton); + + volumeMeter = new VolumeMeter(this, source); + + bool muted = obs_source_muted(source); + bool unassigned = isSourceUnassigned(source); + + volumeMeter->setMuted(muted || unassigned); + + setLayoutVertical(vertical); + setName(sourceName); + + obs_fader_add_callback(obs_fader, obsVolumeChanged, this); + + obsSignals.reserve(9); + obsSignals.emplace_back(obs_source_get_signal_handler(source), "mute", obsVolumeMuted, this); + obsSignals.emplace_back(obs_source_get_signal_handler(source), "audio_mixers", obsMixersOrMonitoringChanged, + this); + obsSignals.emplace_back(obs_source_get_signal_handler(source), "audio_monitoring", obsMixersOrMonitoringChanged, + this); + obsSignals.emplace_back(obs_source_get_signal_handler(source), "activate", VolumeControl::obsSourceActivated, + this); + obsSignals.emplace_back(obs_source_get_signal_handler(source), "deactivate", + VolumeControl::obsSourceDeactivated, this); + obsSignals.emplace_back(obs_source_get_signal_handler(source), "audio_activate", + VolumeControl::obsSourceActivated, this); + obsSignals.emplace_back(obs_source_get_signal_handler(source), "audio_deactivate", + VolumeControl::obsSourceDeactivated, this); + + obsSignals.emplace_back(obs_source_get_signal_handler(source), "remove", VolumeControl::obsSourceDestroy, this); + obsSignals.emplace_back(obs_source_get_signal_handler(source), "destroy", VolumeControl::obsSourceDestroy, + this); + + setContextMenuPolicy(Qt::CustomContextMenu); + connect(this, &QWidget::customContextMenuRequested, this, &VolumeControl::showVolumeControlMenu); + + connect(nameButton, &VolumeName::renamed, this, &VolumeControl::setName); + connect(nameButton, &VolumeName::clicked, this, &() { showVolumeControlMenu(); }); + + connect(slider, &VolumeSlider::valueChanged, this, &VolumeControl::sliderChanged); + connect(muteButton, &QPushButton::clicked, this, &VolumeControl::handleMuteButton); + connect(monitorButton, &QPushButton::clicked, this, &VolumeControl::handleMonitorButton); + + OBSBasic *main = OBSBasic::Get(); + if (main) { + connect(main, &OBSBasic::profileSettingChanged, this, + this(const std::string &category, const std::string &name) { + if (category == "Audio" && name == "MeterDecayRate") { + updateDecayRate(); + } else if (category == "Audio" && name == "PeakMeterType") { + updatePeakMeterType(); + } + }); + } + + obs_fader_attach_source(obs_fader, source); + + // Call volume changed once to init the slider position and label + changeVolume(); + + updateMixerState(); +} + +VolumeControl::~VolumeControl() +{ + obs_fader_remove_callback(obs_fader, obsVolumeChanged, this); + + obsSignals.clear(); + + if (contextMenu) { + contextMenu->close(); + } +} + +void VolumeControl::obsVolumeChanged(void *data, float) +{ + VolumeControl *volControl = static_cast<VolumeControl *>(data); + + QMetaObject::invokeMethod(volControl, "changeVolume", Qt::QueuedConnection); +} + +void VolumeControl::obsVolumeMuted(void *data, calldata_t *) +{ + VolumeControl *volControl = static_cast<VolumeControl *>(data); + + QMetaObject::invokeMethod(volControl, "updateMixerState", Qt::QueuedConnection); +} + +void VolumeControl::obsMixersOrMonitoringChanged(void *data, calldata_t *) +{ + VolumeControl *volControl = static_cast<VolumeControl *>(data); + QMetaObject::invokeMethod(volControl, "updateMixerState", Qt::QueuedConnection); +} + +void VolumeControl::obsSourceActivated(void *data, calldata_t *) +{ + QMetaObject::invokeMethod(static_cast<VolumeControl *>(data), "sourceActiveChanged", Qt::QueuedConnection, + Q_ARG(bool, true)); +} + +void VolumeControl::obsSourceDeactivated(void *data, calldata_t *) +{ + QMetaObject::invokeMethod(static_cast<VolumeControl *>(data), "sourceActiveChanged", Qt::QueuedConnection, + Q_ARG(bool, false)); +} + +void VolumeControl::obsSourceDestroy(void *data, calldata_t *) +{ + QMetaObject::invokeMethod(static_cast<VolumeControl *>(data), "handleSourceDestroyed", Qt::QueuedConnection); +} + +void VolumeControl::setLayoutVertical(bool vertical) +{ + QBoxLayout *newLayout = new QBoxLayout(vertical ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight); + newLayout->setContentsMargins(0, 0, 0, 0); + newLayout->setSpacing(0); + + if (vertical) { + setMaximumWidth(110); + setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + + QHBoxLayout *categoryLayout = new QHBoxLayout; + QHBoxLayout *nameLayout = new QHBoxLayout; + QHBoxLayout *controlLayout = new QHBoxLayout; + QHBoxLayout *volLayout = new QHBoxLayout; + QFrame *meterFrame = new QFrame; + QHBoxLayout *meterLayout = new QHBoxLayout; + + volumeMeter->setVertical(true); + volumeMeter->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); + + slider->setOrientation(Qt::Vertical); + slider->setLayoutDirection(Qt::LeftToRight); + slider->setDisplayTicks(true); + + nameButton->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); + categoryLabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); + volumeLabel->setAlignment(Qt::AlignLeft); + + categoryLayout->setAlignment(Qt::AlignCenter); + nameLayout->setAlignment(Qt::AlignCenter); + meterLayout->setAlignment(Qt::AlignCenter); + controlLayout->setAlignment(Qt::AlignCenter); + volLayout->setAlignment(Qt::AlignCenter); + + meterFrame->setObjectName("volMeterFrame"); + + categoryLayout->setContentsMargins(0, 0, 0, 0); + categoryLayout->setSpacing(0); + categoryLayout->addWidget(categoryLabel); + + nameLayout->setContentsMargins(0, 0, 0, 0); + nameLayout->setSpacing(0); + nameLayout->addWidget(nameButton); + + controlLayout->setContentsMargins(0, 0, 0, 0); + controlLayout->setSpacing(0); + + // Add Headphone (audio monitoring) widget here + controlLayout->addWidget(muteButton); + controlLayout->addWidget(monitorButton); + + meterLayout->setContentsMargins(0, 0, 0, 0); + meterLayout->setSpacing(0); + meterLayout->addWidget(slider); + meterLayout->addWidget(volumeMeter); + + meterFrame->setLayout(meterLayout); + + volLayout->setContentsMargins(0, 0, 0, 0); + volLayout->setSpacing(0); + volLayout->addWidget(volumeLabel); + volLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, QSizePolicy::Maximum)); + + newLayout->addItem(categoryLayout); + newLayout->addItem(nameLayout); + newLayout->addItem(volLayout); + newLayout->addWidget(meterFrame); + newLayout->addItem(controlLayout); + + newLayout->setStretch(0, 0); + newLayout->setStretch(1, 0); + newLayout->setStretch(2, 0); + newLayout->setStretch(3, 1); + newLayout->setStretch(4, 0); + + volumeMeter->setFocusProxy(slider); + } else { + setMaximumWidth(QWIDGETSIZE_MAX); + setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); + + QVBoxLayout *textLayout = new QVBoxLayout; + QHBoxLayout *controlLayout = new QHBoxLayout; + QFrame *meterFrame = new QFrame; + QVBoxLayout *meterLayout = new QVBoxLayout; + QVBoxLayout *buttonLayout = new QVBoxLayout; + + volumeMeter->setVertical(false); + volumeMeter->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); + + slider->setOrientation(Qt::Horizontal); + slider->setLayoutDirection(Qt::LeftToRight); + slider->setDisplayTicks(true); + + nameButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + categoryLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + volumeLabel->setAlignment(Qt::AlignRight); + + QHBoxLayout *textTopLayout = new QHBoxLayout; + textTopLayout->setContentsMargins(0, 0, 0, 0); + textTopLayout->addWidget(categoryLabel); + textTopLayout->addWidget(volumeLabel); + + textLayout->setContentsMargins(0, 0, 0, 0); + textLayout->addItem(textTopLayout); + textLayout->addWidget(nameButton); + + meterFrame->setObjectName("volMeterFrame"); + meterFrame->setLayout(meterLayout); + + meterLayout->setContentsMargins(0, 0, 0, 0); + meterLayout->setSpacing(0); + + meterLayout->addWidget(slider); + meterLayout->addWidget(volumeMeter); + meterLayout->setStretch(0, 2); + meterLayout->setStretch(1, 2); + + buttonLayout->setContentsMargins(0, 0, 0, 0); + buttonLayout->setSpacing(0); + + buttonLayout->addWidget(muteButton); + buttonLayout->addWidget(monitorButton); + + controlLayout->addItem(buttonLayout); + controlLayout->addWidget(meterFrame); + + newLayout->addItem(textLayout); + newLayout->addItem(controlLayout); + newLayout->setStretch(0, 3); + newLayout->setStretch(1, 6); + + volumeMeter->setFocusProxy(slider); + } + + QWidget().setLayout(mainLayout); + + setLayout(newLayout); + mainLayout = newLayout; + updateTabOrder(); + + adjustSize(); +} + +void VolumeControl::showVolumeControlMenu(QPoint pos) +{ + OBSSource source = OBSGetStrongRef(weakSource()); + if (!source) { + return; + } + + QMenu *popup = new QMenu(this); + + // Create menu QActions + QAction *lockAction = new QAction(QTStr("LockVolume"), popup); + lockAction->setCheckable(true); + lockAction->setChecked(mixerStatus().has(VolumeControl::MixerStatus::Locked)); + + bool isGlobal = mixerStatus().has(VolumeControl::MixerStatus::Global); + + QAction *pinAction = new QAction(QTStr("Basic.AudioMixer.Pin"), popup); + bool isPinned = mixerStatus().has(VolumeControl::MixerStatus::Pinned); + if (isPinned) { + pinAction->setText(QTStr("Basic.AudioMixer.Unpin")); + } + + QAction *hideAction = new QAction(QTStr("Basic.AudioMixer.Hide"), popup); + bool isHidden = mixerStatus().has(VolumeControl::MixerStatus::Hidden); + if (isHidden && !isGlobal) { + hideAction->setText(QTStr("Basic.AudioMixer.Unhide")); + } + + QAction *unhideAllAction = new QAction(QTStr("UnhideAll"), popup); + QAction *mixerRenameAction = new QAction(QTStr("Rename"), popup); + + QAction *copyFiltersAction = new QAction(QTStr("Copy.Filters"), popup); + QAction *pasteFiltersAction = new QAction(QTStr("Paste.Filters"), popup); + + QAction *filtersAction = new QAction(QTStr("Filters"), popup); + QAction *propertiesAction = new QAction(QTStr("Properties"), popup); + + // Set properties on actions that require source reference + hideAction->setProperty("source", QVariant::fromValue<OBSSource>(source)); + pinAction->setProperty("source", QVariant::fromValue<OBSSource>(source)); + + mixerRenameAction->setProperty("source", QVariant::fromValue<OBSSource>(source)); + + copyFiltersAction->setProperty("source", QVariant::fromValue<OBSSource>(source)); + pasteFiltersAction->setProperty("source", QVariant::fromValue<OBSSource>(source)); + + filtersAction->setProperty("source", QVariant::fromValue<OBSSource>(source)); + propertiesAction->setProperty("source", QVariant::fromValue<OBSSource>(source)); + + // Connect actions to signals + OBSBasic *main = OBSBasic::Get(); + + connect(unhideAllAction, &QAction::triggered, this, this() { emit unhideAll(); }); + + connect(hideAction, &QAction::triggered, this, this, isHidden() { setHiddenInMixer(!isHidden); }); + connect( + pinAction, &QAction::triggered, this, this, isPinned() { setPinnedInMixer(!isPinned); }, + Qt::DirectConnection); + connect(lockAction, &QAction::toggled, this, &VolumeControl::setLocked); + + connect(copyFiltersAction, &QAction::triggered, main, &OBSBasic::actionCopyFilters); + connect(pasteFiltersAction, &QAction::triggered, main, &OBSBasic::actionPasteFilters); + + connect(mixerRenameAction, &QAction::triggered, this, &VolumeControl::renameSource); + + connect(filtersAction, &QAction::triggered, main, &OBSBasic::actionOpenSourceFilters); + connect(propertiesAction, &QAction::triggered, main, &OBSBasic::actionOpenSourceProperties); + + // Enable/disable actions + copyFiltersAction->setEnabled(obs_source_filter_count(source) > 0); + pasteFiltersAction->setEnabled(!obs_weak_source_expired(main->copyFiltersSource())); + + if (isGlobal) { + pinAction->setDisabled(true); + hideAction->setDisabled(true); + } + + if (isPinned) { + hideAction->setDisabled(true); + } + + // Build menu + popup->addAction(unhideAllAction); + popup->addSeparator(); + popup->addAction(pinAction); + popup->addAction(hideAction); + popup->addAction(lockAction); + + popup->addSeparator(); + popup->addAction(copyFiltersAction); + popup->addAction(pasteFiltersAction); + popup->addSeparator(); + popup->addAction(mixerRenameAction); + popup->addSeparator(); + popup->addAction(filtersAction); + popup->addAction(propertiesAction); + + // Calculate menu position + QPoint popupPos = mapToGlobal(pos); + + if (pos.isNull()) { + QPoint menuPos = nameButton->mapToGlobal(nameButton->rect().bottomLeft()); + QSize menuSize = popup->sizeHint(); + + QRect available = QGuiApplication::screenAt(menuPos)->availableGeometry(); + int spaceBelow = available.bottom() - menuPos.y(); + int spaceAbove = menuPos.y() - available.top(); + + if (menuSize.height() > spaceBelow && spaceAbove > spaceBelow) { + menuPos = nameButton->mapToGlobal(nameButton->rect().topLeft()); + menuPos.ry() -= menuSize.height(); + } + + if (menuPos.x() + menuSize.width() > available.right()) { + menuPos.rx() = available.right() - menuSize.width(); + } + + popupPos = menuPos; + } + + popup->popup(popupPos); + + connect(popup, &QMenu::aboutToHide, popup, &QMenu::deleteLater); +} + +void VolumeControl::renameSource() +{ + QAction *action = reinterpret_cast<QAction *>(sender()); + OBSSource source = action->property("source").value<OBSSource>(); + + std::string uuid = obs_source_get_uuid(source); + + OBSBasic *main = OBSBasic::Get(); + + // Defer the rename dialog to avoid blocking the UI thread while the context menu is closing, which can cause issues on some platforms + QTimer::singleShot(0, main, main, uuid() { + if (!main) { + return; + } + + OBSSourceAutoRelease source = obs_get_source_by_uuid(uuid.c_str()); + if (!source) { + return; + } + + const char *prevName = obs_source_get_name(source); + + for (;;) { + std::string name; + bool accepted = NameDialog::AskForName(main, QTStr("Basic.Main.MixerRename.Title"), + QTStr("Basic.Main.MixerRename.Text"), name, + QT_UTF8(prevName)); + if (!accepted) { + return; + } + + if (name.empty()) { + OBSMessageBox::warning(main, QTStr("NoNameEntered.Title"), QTStr("NoNameEntered.Text")); + continue; + } + + if (name == prevName) { + return; + } + + OBSSourceAutoRelease sourceTest = obs_get_source_by_name(name.c_str()); + + if (sourceTest) { + OBSMessageBox::warning(main, QTStr("NameExists.Title"), QTStr("NameExists.Text")); + continue; + } + + std::string prevName(obs_source_get_name(source)); + auto undo = prevName(const std::string &data) { + OBSSourceAutoRelease source = obs_get_source_by_uuid(data.c_str()); + obs_source_set_name(source, prevName.c_str()); + }; + + std::string editedName = name; + auto redo = editedName(const std::string &data) { + OBSSourceAutoRelease source = obs_get_source_by_uuid(data.c_str()); + obs_source_set_name(source, editedName.c_str()); + }; + + main->undo_s.add_action(QTStr("Undo.Rename").arg(name.c_str()), undo, redo, uuid, uuid); + + obs_source_set_name(source, name.c_str()); + break; + } + }); +} + +void VolumeControl::changeVolume() +{ + QSignalBlocker blocker(slider); + slider->setValue((int)(obs_fader_get_deflection(obs_fader) * FADER_PRECISION)); + + updateText(); +} + +void VolumeControl::setLocked(bool locked) +{ + OBSSource source = OBSGetStrongRef(weakSource()); + if (!source) { + return; + } + OBSDataAutoRelease priv_settings = obs_source_get_private_settings(source); + obs_data_set_bool(priv_settings, "volume_locked", locked); + + enableSlider(!locked); + mixerStatus().set(VolumeControl::MixerStatus::Locked, locked); + + OBSBasic *main = OBSBasic::Get(); + emit main->mixerStatusChanged(uuid); +} + +void VolumeControl::updateCategoryLabel() +{ + QString labelText = QTStr("Basic.AudioMixer.Category.Active"); + + if (mixerStatus().has(VolumeControl::MixerStatus::Unassigned)) { + labelText = QTStr("Basic.AudioMixer.Category.Unassigned"); + } else if (mixerStatus().has(VolumeControl::MixerStatus::Global)) { + labelText = QTStr("Basic.AudioMixer.Category.Global"); + } else if (mixerStatus().has(VolumeControl::MixerStatus::Pinned)) { + labelText = QTStr("Basic.AudioMixer.Category.Pinned"); + } else if (mixerStatus().has(VolumeControl::MixerStatus::Hidden)) { + labelText = QTStr("Basic.AudioMixer.Category.Hidden"); + } else if (!mixerStatus().has(VolumeControl::MixerStatus::Active)) { + labelText = QTStr("Basic.AudioMixer.Category.Inactive"); + + if (mixerStatus().has(VolumeControl::MixerStatus::Preview)) { + labelText = QTStr("Basic.AudioMixer.Category.Preview"); + } + } + + bool stylePinned = mixerStatus().has(VolumeControl::MixerStatus::Global) || + mixerStatus().has(VolumeControl::MixerStatus::Pinned); + bool styleInactive = mixerStatus().has(VolumeControl::MixerStatus::Active) != true; + bool styleHidden = mixerStatus().has(VolumeControl::MixerStatus::Hidden); + bool styleUnassigned = mixerStatus().has(VolumeControl::MixerStatus::Unassigned); + bool stylePreviewed = mixerStatus().has(VolumeControl::MixerStatus::Preview); + + utils->toggleClass("volume-pinned", stylePinned); + utils->toggleClass("volume-inactive", styleInactive); + utils->toggleClass("volume-preview", styleInactive && stylePreviewed); + utils->toggleClass("volume-hidden", styleHidden && !stylePinned); + utils->toggleClass("volume-unassigned", styleUnassigned); + + categoryLabel->setText(labelText); + + utils->polishChildren(); + + bool forceUpdate = true; + volumeMeter->updateBackgroundCache(forceUpdate); +} + +void VolumeControl::updateDecayRate() +{ + OBSBasic *main = OBSBasic::Get(); + double meterDecayRate = config_get_double(main->Config(), "Audio", "MeterDecayRate"); + + setMeterDecayRate(meterDecayRate); +} + +void VolumeControl::updatePeakMeterType() +{ + OBSBasic *main = OBSBasic::Get(); + uint32_t peakMeterTypeIdx = config_get_uint(main->Config(), "Audio", "PeakMeterType"); + + enum obs_peak_meter_type peakMeterType; + switch (peakMeterTypeIdx) { + case 0: + peakMeterType = SAMPLE_PEAK_METER; + break; + case 1: + peakMeterType = TRUE_PEAK_METER; + break; + default: + peakMeterType = SAMPLE_PEAK_METER; + break; + } + + setPeakMeterType(peakMeterType); +} + +void VolumeControl::setMuted(bool mute) +{ + OBSSource source = OBSGetStrongRef(weakSource()); + if (!source) { + return; + } + + bool prev = obs_source_muted(source); + bool unassigned = isSourceUnassigned(source); + + obs_source_set_muted(source, mute); + + if (!mute && unassigned) { + // Show notice about the source no being assigned to any tracks + bool has_shown_warning = + config_get_bool(App()->GetUserConfig(), "General", "WarnedAboutUnassignedSources"); + if (!has_shown_warning) { + showUnassignedWarning(obs_source_get_name(source)); + } + } + + auto undo_redo = (const std::string &uuid, bool val) { + OBSSourceAutoRelease source = obs_get_source_by_uuid(uuid.c_str()); + obs_source_set_muted(source, val); + }; + + QString text = QTStr(mute ? "Undo.Volume.Mute" : "Undo.Volume.Unmute"); + + const char *name = obs_source_get_name(source); + OBSBasic::Get()->undo_s.add_action(text.arg(name), std::bind(undo_redo, std::placeholders::_1, prev), + std::bind(undo_redo, std::placeholders::_1, mute), uuid, uuid); +} + +void VolumeControl::setMonitoring(obs_monitoring_type type) +{ + OBSSource source = OBSGetStrongRef(weakSource()); + if (!source) { + return; + } + + obs_monitoring_type prevMonitoringType = obs_source_get_monitoring_type(source); + obs_source_set_monitoring_type(source, type); + + auto undo_redo = (const std::string &uuid, obs_monitoring_type val) { + OBSSourceAutoRelease source = obs_get_source_by_uuid(uuid.c_str()); + obs_source_set_monitoring_type(source, val); + }; + + QString text = QTStr("Undo.MonitoringType.Change"); + + const char *name = obs_source_get_name(source); + OBSBasic::Get()->undo_s.add_action(text.arg(name), + std::bind(undo_redo, std::placeholders::_1, prevMonitoringType), + std::bind(undo_redo, std::placeholders::_1, type), uuid, uuid); +} + +void VolumeControl::sourceActiveChanged(bool active) +{ + setUseDisabledColors(!active); + mixerStatus().set(VolumeControl::MixerStatus::Active, active); + + OBSBasic *main = OBSBasic::Get(); + emit main->mixerStatusChanged(uuid); +} + +void VolumeControl::updateMixerState() +{ + OBSSource source = OBSGetStrongRef(weakSource()); + if (!source) { + deleteLater(); + return; + } + + bool muted = obs_source_muted(source); + bool unassigned = isSourceUnassigned(source); + obs_monitoring_type monitoringType = obs_source_get_monitoring_type(source); + + bool isActive = obs_source_active(source) && obs_source_audio_active(source); + + mixerStatus().set(VolumeControl::MixerStatus::Active, isActive); + mixerStatus().set(VolumeControl::MixerStatus::Unassigned, unassigned); + + QSignalBlocker blockMute(muteButton); + QSignalBlocker blockMonitor(monitorButton); + + bool showAsMuted = muted || monitoringType == OBS_MONITORING_TYPE_MONITOR_ONLY; + bool showAsMonitored = !muted && monitoringType != OBS_MONITORING_TYPE_NONE; + bool showAsUnassigned = !muted && unassigned; + + volumeMeter->setMuted((showAsMuted || showAsUnassigned) && !showAsMonitored); + setUseDisabledColors(showAsMuted); + + // Qt doesn't support overriding the QPushButton icon using pseudo state selectors like :checked + // in QSS so we set a checked class selector on the button to be used instead. + utils->toggleClass(muteButton, "checked", showAsMuted); + utils->toggleClass(monitorButton, "checked", showAsMonitored); + + utils->toggleClass(muteButton, "mute-unassigned", showAsUnassigned); + + muteButton->setChecked(showAsMuted); + monitorButton->setChecked(showAsMonitored); + + if (showAsUnassigned) { + QIcon unassignedIcon; + unassignedIcon.addFile(QString::fromUtf8(":/res/images/unassigned.svg"), QSize(16, 16), + QIcon::Mode::Normal, QIcon::State::Off); + muteButton->setIcon(unassignedIcon); + } else if (showAsMuted) { + QIcon mutedIcon; + mutedIcon.addFile(QString::fromUtf8(":/res/images/mute.svg"), QSize(16, 16), QIcon::Mode::Normal, + QIcon::State::Off); + muteButton->setIcon(mutedIcon); + } else { + QIcon unmutedIcon; + unmutedIcon.addFile(QString::fromUtf8(":/settings/images/settings/audio.svg"), QSize(16, 16), + QIcon::Mode::Normal, QIcon::State::Off); + muteButton->setIcon(unmutedIcon); + } + + if (showAsMonitored) { + QIcon monitorOnIcon; + monitorOnIcon.addFile(QString::fromUtf8(":/res/images/headphones.svg"), QSize(16, 16), + QIcon::Mode::Normal, QIcon::State::Off); + monitorButton->setIcon(monitorOnIcon); + } else { + QIcon monitorOffIcon; + monitorOffIcon.addFile(QString::fromUtf8(":/res/images/headphones-off.svg"), QSize(16, 16), + QIcon::Mode::Normal, QIcon::State::Off); + monitorButton->setIcon(monitorOffIcon); + } + + utils->repolish(muteButton); + utils->repolish(monitorButton); + + updateCategoryLabel(); +} + +void VolumeControl::handleMuteButton(bool mute) +{ + OBSSource source = OBSGetStrongRef(weakSource()); + if (!source) { + return; + } + + // The Mute and Monitor buttons in the volume mixer work as a pseudo quad-state toggle. + // Both buttons must be in their "off" state in order to actually process it as a mute. + // Otherwise, clicking "Mute" with monitoring enabled will toggle the monitoring type. + obs_monitoring_type monitoringType = obs_source_get_monitoring_type(source); + + if (mute && monitoringType == OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT) { + setMonitoring(OBS_MONITORING_TYPE_MONITOR_ONLY); + } else if (!mute && monitoringType == OBS_MONITORING_TYPE_MONITOR_ONLY) { + setMonitoring(OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT); + } else { + setMuted(mute); + } +} + +void VolumeControl::handleMonitorButton(bool enableMonitoring) +{ + OBSSource source = OBSGetStrongRef(weakSource()); + if (!source) { + return; + } + + // The Mute and Monitor buttons in the volume mixer work as a pseudo quad-state toggle. + // The source is only ever actually "Muted" if Monitoring is set to None. + obs_monitoring_type monitoringType = obs_source_get_monitoring_type(source); + + bool muted = obs_source_muted(source); + + if (!enableMonitoring) { + setMonitoring(OBS_MONITORING_TYPE_NONE); + if (monitoringType == OBS_MONITORING_TYPE_MONITOR_ONLY) { + setMuted(true); + } + } else if (enableMonitoring && muted) { + setMonitoring(OBS_MONITORING_TYPE_MONITOR_ONLY); + setMuted(false); + } else if (enableMonitoring && !muted) { + setMonitoring(OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT); + } +} + +void VolumeControl::sliderChanged(int vol) +{ + OBSSource source = OBSGetStrongRef(weakSource()); + if (!source) { + return; + } + + float prev = obs_source_get_volume(source); + + obs_fader_set_deflection(obs_fader, float(vol) / FADER_PRECISION); + updateText(); + + auto undo_redo = (const std::string &uuid, float val) { + OBSSourceAutoRelease source = obs_get_source_by_uuid(uuid.c_str()); + obs_source_set_volume(source, val); + }; + + float val = obs_source_get_volume(source); + const char *name = obs_source_get_name(source); + OBSBasic::Get()->undo_s.add_action(QTStr("Undo.Volume.Change").arg(name), + std::bind(undo_redo, std::placeholders::_1, prev), + std::bind(undo_redo, std::placeholders::_1, val), uuid, uuid, true); +} + +void VolumeControl::updateText() +{ + QString text; + float db = obs_fader_get_db(obs_fader); + + if (db < -96.0f) { + text = "-inf dB"; + } else { + text = QString::number(db, 'f', 1).append(" dB"); + } + + volumeLabel->setText(text); + + OBSSource source = OBSGetStrongRef(weakSource()); + if (!source) { + return; + } + + bool muted = obs_source_muted(source); + const char *accTextLookup = muted ? "VolControl.SliderMuted" : "VolControl.SliderUnmuted"; + + QString sourceName = obs_source_get_name(source); + QString accText = QTStr(accTextLookup).arg(sourceName); + + slider->setAccessibleName(accText); +} + +void VolumeControl::setVertical(bool vertical_) +{ + if (vertical == vertical_) { + return; + } + + vertical = vertical_; + + setLayoutVertical(vertical); +} + +void VolumeControl::updateTabOrder() +{ + QWidget *prevFocus = firstWidget()->previousInFocusChain(); + QWidget *lastFocus = lastWidget()->nextInFocusChain(); + + if (vertical) { + setTabOrder(prevFocus, nameButton); + setTabOrder(nameButton, slider); + setTabOrder(slider, muteButton); + setTabOrder(muteButton, monitorButton); + setTabOrder(monitorButton, lastFocus); + } else { + setTabOrder(prevFocus, nameButton); + setTabOrder(nameButton, muteButton); + setTabOrder(muteButton, monitorButton); + setTabOrder(monitorButton, slider); + setTabOrder(slider, lastFocus); + } +} + +void VolumeControl::updateName() +{ + setName(sourceName); +} + +void VolumeControl::setName(QString name) +{ + sourceName = name; + + muteButton->setAccessibleName(QTStr("VolControl.Mute").arg(name)); +} + +void VolumeControl::setMeterDecayRate(qreal q) +{ + volumeMeter->setPeakDecayRate(q); +} + +void VolumeControl::setPeakMeterType(enum obs_peak_meter_type peakMeterType) +{ + volumeMeter->setPeakMeterType(peakMeterType); +} + +void VolumeControl::enableSlider(bool enable) +{ + slider->setEnabled(enable); +} + +void VolumeControl::setUseDisabledColors(bool greyscale) +{ + volumeMeter->setUseDisabledColors(greyscale); +} + +void VolumeControl::setGlobalInMixer(bool global) +{ + if (mixerStatus().has(VolumeControl::MixerStatus::Global) != global) { + mixerStatus().set(VolumeControl::MixerStatus::Global, global); + + OBSBasic *main = OBSBasic::Get(); + emit main->mixerStatusChanged(uuid); + } +} + +void VolumeControl::setPinnedInMixer(bool pinned) +{ + if (mixerStatus().has(VolumeControl::MixerStatus::Pinned) != pinned) { + OBSSource source = OBSGetStrongRef(weakSource()); + if (!source) { + return; + } + OBSDataAutoRelease priv_settings = obs_source_get_private_settings(source); + obs_data_set_bool(priv_settings, "mixer_pinned", pinned); + + mixerStatus().set(VolumeControl::MixerStatus::Pinned, pinned); + + if (pinned) { + // Unset hidden state when pinning controls + setHiddenInMixer(false); + } + + OBSBasic *main = OBSBasic::Get(); + emit main->mixerStatusChanged(uuid); + } +} + +void VolumeControl::setHiddenInMixer(bool hidden) +{ + if (mixerStatus().has(VolumeControl::MixerStatus::Hidden) != hidden) { + OBSSource source = OBSGetStrongRef(weakSource()); + if (!source) { + return; + } + OBSDataAutoRelease priv_settings = obs_source_get_private_settings(source); + obs_data_set_bool(priv_settings, "mixer_hidden", hidden); + + mixerStatus().set(VolumeControl::MixerStatus::Hidden, hidden); + + OBSBasic *main = OBSBasic::Get(); + emit main->mixerStatusChanged(uuid); + } +} + +void VolumeControl::refreshColors() +{ + volumeMeter->refreshColors(); +} + +void VolumeControl::setLevels(const float magnitudeMAX_AUDIO_CHANNELS, const float peakMAX_AUDIO_CHANNELS, + const float inputPeakMAX_AUDIO_CHANNELS) +{ + if (volumeMeter) { + volumeMeter->setLevels(magnitude, peak, inputPeak); + } +}
View file
obs-studio-32.1.0.tar.xz/frontend/components/VolumeControl.hpp
Added
@@ -0,0 +1,162 @@ +#pragma once + +#include <obs.hpp> + +#include <components/VolumeName.hpp> +#include <components/VolumeSlider.hpp> + +#include <Idian/Utils.hpp> +#include <QFrame> +#include <QPushButton> +#include <QWidget> + +class MuteCheckBox; +class QBoxLayout; +class QLabel; +class VolumeMeter; + +class VolumeControl : public QFrame { + Q_OBJECT + +public: + struct MixerStatus { + enum Value : uint32_t { + None = 0, + Active = 1 << 0, + Locked = 1 << 1, + Global = 1 << 2, + Pinned = 1 << 3, + Hidden = 1 << 4, + Unassigned = 1 << 5, + Preview = 1 << 6, + }; + + MixerStatus() = default; + MixerStatus(Value v) : bits(v) {} + + bool has(Value v) const { return (bits & v) != 0; } + void set(Value v, bool enable) + { + if (enable) { + bits |= v; + } else { + bits &= ~v; + } + } + + MixerStatus operator|(Value v) const { return MixerStatus(bits | v); } + MixerStatus &operator|=(Value v) + { + bits |= v; + return *this; + } + + MixerStatus operator&(Value v) const { return MixerStatus(bits & v); } + MixerStatus &operator&=(Value v) + { + bits &= v; + return *this; + } + + MixerStatus operator~() const { return MixerStatus(~bits); } + + private: + uint32_t bits = None; + explicit MixerStatus(uint32_t v) : bits(v) {} + }; + +private: + std::unique_ptr<idian::Utils> utils; + + OBSWeakSource weakSource_; + const char *uuid; + std::vector<OBSSignal> obsSignals; + + QBoxLayout *mainLayout; + QLabel *categoryLabel; + VolumeName *nameButton; + QLabel *volumeLabel; + VolumeMeter *volumeMeter; + VolumeSlider *slider; + QPushButton *muteButton; + QPushButton *monitorButton; + + OBSFader obs_fader; + + QString sourceName; + bool vertical; + + MixerStatus mixerStatus_; + + QMenu *contextMenu; + + static void obsVolumeChanged(void *param, float db); + static void obsVolumeMuted(void *data, calldata_t *calldata); + static void obsMixersOrMonitoringChanged(void *data, calldata_t *); + static void obsSourceActivated(void *data, calldata_t *params); + static void obsSourceDeactivated(void *data, calldata_t *params); + static void obsSourceDestroy(void *data, calldata_t *params); + + void setLayoutVertical(bool vertical); + void showVolumeControlMenu(QPoint pos = QPoint(0, 0)); + void updateCategoryLabel(); + void updateDecayRate(); + void updatePeakMeterType(); + + void setMuted(bool mute); + void setMonitoring(obs_monitoring_type type); + +public slots: + void sourceActiveChanged(bool active); + void setUseDisabledColors(bool greyscale); + void setLocked(bool locked); + void updateMixerState(); + +private slots: + void renameSource(); + void changeVolume(); + + void handleMuteButton(bool checked); + void handleMonitorButton(bool checked); + void sliderChanged(int vol); + void updateText(); + void setName(QString name); + + void handleSourceDestroyed() { deleteLater(); } + +signals: + void unhideAll(); + +public: + explicit VolumeControl(obs_source_t *source, QWidget *parent, bool vertical); + explicit VolumeControl(obs_source_t *source, QWidget *parent) : VolumeControl(source, parent, false) {} + ~VolumeControl(); + + inline OBSWeakSource weakSource() const { return weakSource_; } + QString const &getCachedName() const { return sourceName; } + + void setMeterDecayRate(qreal q); + void setPeakMeterType(enum obs_peak_meter_type peakMeterType); + + void enableSlider(bool enable); + MixerStatus &mixerStatus() { return mixerStatus_; } + void setGlobalInMixer(bool global); + void setPinnedInMixer(bool pinned); + void setHiddenInMixer(bool hidden); + void setContextMenu(QMenu *cm) { contextMenu = cm; } + + bool isVertical() const { return vertical; } + void setVertical(bool vertical); + + void updateTabOrder(); + QWidget *firstWidget() const { return qobject_cast<QWidget *>(nameButton); } + QWidget *lastWidget() const + { + return vertical ? qobject_cast<QWidget *>(monitorButton) : qobject_cast<QWidget *>(slider); + } + + void updateName(); + void refreshColors(); + void setLevels(const float magnitudeMAX_AUDIO_CHANNELS, const float peakMAX_AUDIO_CHANNELS, + const float inputPeakMAX_AUDIO_CHANNELS); +};
View file
obs-studio-32.1.0.tar.xz/frontend/components/VolumeMeter.cpp
Added
@@ -0,0 +1,900 @@ +#include "VolumeMeter.hpp" + +#include <OBSApp.hpp> +#include <QEvent> +#include <QMouseEvent> +#include <QPainter> +#include <QStyleOption> +#include <QTimer> + +#include "moc_VolumeMeter.cpp" + +QPointer<QTimer> VolumeMeter::updateTimer = nullptr; + +namespace { +constexpr int INDICATOR_THICKNESS = 3; +constexpr int CLIP_FLASH_DURATION_MS = 1000; +constexpr int TICK_SIZE = 2; +constexpr int TICK_DB_INTERVAL = 6; +} // namespace + +static inline QColor color_from_int(long long val) +{ + QColor color(val & 0xff, (val >> 8) & 0xff, (val >> 16) & 0xff, (val >> 24) & 0xff); + color.setAlpha(255); + + return color; +} + +QColor VolumeMeter::getBackgroundNominalColor() const +{ + return p_backgroundNominalColor; +} + +QColor VolumeMeter::getBackgroundNominalColorDisabled() const +{ + return backgroundNominalColorDisabled; +} + +void VolumeMeter::setBackgroundNominalColor(QColor c) +{ + p_backgroundNominalColor = std::move(c); + + if (config_get_bool(App()->GetUserConfig(), "Accessibility", "OverrideColors")) { + backgroundNominalColor = + color_from_int(config_get_int(App()->GetUserConfig(), "Accessibility", "MixerGreen")); + } else { + backgroundNominalColor = p_backgroundNominalColor; + } +} + +void VolumeMeter::setBackgroundNominalColorDisabled(QColor c) +{ + backgroundNominalColorDisabled = std::move(c); +} + +QColor VolumeMeter::getBackgroundWarningColor() const +{ + return p_backgroundWarningColor; +} + +QColor VolumeMeter::getBackgroundWarningColorDisabled() const +{ + return backgroundWarningColorDisabled; +} + +void VolumeMeter::setBackgroundWarningColor(QColor c) +{ + p_backgroundWarningColor = std::move(c); + + if (config_get_bool(App()->GetUserConfig(), "Accessibility", "OverrideColors")) { + backgroundWarningColor = + color_from_int(config_get_int(App()->GetUserConfig(), "Accessibility", "MixerYellow")); + } else { + backgroundWarningColor = p_backgroundWarningColor; + } +} + +void VolumeMeter::setBackgroundWarningColorDisabled(QColor c) +{ + backgroundWarningColorDisabled = std::move(c); +} + +QColor VolumeMeter::getBackgroundErrorColor() const +{ + return p_backgroundErrorColor; +} + +QColor VolumeMeter::getBackgroundErrorColorDisabled() const +{ + return backgroundErrorColorDisabled; +} + +void VolumeMeter::setBackgroundErrorColor(QColor c) +{ + p_backgroundErrorColor = std::move(c); + + if (config_get_bool(App()->GetUserConfig(), "Accessibility", "OverrideColors")) { + backgroundErrorColor = + color_from_int(config_get_int(App()->GetUserConfig(), "Accessibility", "MixerRed")); + } else { + backgroundErrorColor = p_backgroundErrorColor; + } +} + +void VolumeMeter::setBackgroundErrorColorDisabled(QColor c) +{ + backgroundErrorColorDisabled = std::move(c); +} + +QColor VolumeMeter::getForegroundNominalColor() const +{ + return p_foregroundNominalColor; +} + +QColor VolumeMeter::getForegroundNominalColorDisabled() const +{ + return foregroundNominalColorDisabled; +} + +void VolumeMeter::setForegroundNominalColor(QColor c) +{ + p_foregroundNominalColor = std::move(c); + + if (config_get_bool(App()->GetUserConfig(), "Accessibility", "OverrideColors")) { + foregroundNominalColor = + color_from_int(config_get_int(App()->GetUserConfig(), "Accessibility", "MixerGreenActive")); + } else { + foregroundNominalColor = p_foregroundNominalColor; + } +} + +void VolumeMeter::setForegroundNominalColorDisabled(QColor c) +{ + foregroundNominalColorDisabled = std::move(c); +} + +QColor VolumeMeter::getForegroundWarningColor() const +{ + return p_foregroundWarningColor; +} + +QColor VolumeMeter::getForegroundWarningColorDisabled() const +{ + return foregroundWarningColorDisabled; +} + +void VolumeMeter::setForegroundWarningColor(QColor c) +{ + p_foregroundWarningColor = std::move(c); + + if (config_get_bool(App()->GetUserConfig(), "Accessibility", "OverrideColors")) { + foregroundWarningColor = + color_from_int(config_get_int(App()->GetUserConfig(), "Accessibility", "MixerYellowActive")); + } else { + foregroundWarningColor = p_foregroundWarningColor; + } +} + +void VolumeMeter::setForegroundWarningColorDisabled(QColor c) +{ + foregroundWarningColorDisabled = std::move(c); +} + +QColor VolumeMeter::getForegroundErrorColor() const +{ + return p_foregroundErrorColor; +} + +QColor VolumeMeter::getForegroundErrorColorDisabled() const +{ + return foregroundErrorColorDisabled; +} + +void VolumeMeter::setForegroundErrorColor(QColor c) +{ + p_foregroundErrorColor = std::move(c); + + if (config_get_bool(App()->GetUserConfig(), "Accessibility", "OverrideColors")) { + foregroundErrorColor = + color_from_int(config_get_int(App()->GetUserConfig(), "Accessibility", "MixerRedActive")); + } else { + foregroundErrorColor = p_foregroundErrorColor; + } +} + +void VolumeMeter::setForegroundErrorColorDisabled(QColor c) +{ + foregroundErrorColorDisabled = std::move(c); +} + +QColor VolumeMeter::getMagnitudeColor() const +{ + return magnitudeColor; +} + +void VolumeMeter::setMagnitudeColor(QColor c) +{ + magnitudeColor = std::move(c); +} + +QColor VolumeMeter::getMajorTickColor() const +{ + return majorTickColor; +} + +void VolumeMeter::setMajorTickColor(QColor c) +{ + majorTickColor = std::move(c); +} + +QColor VolumeMeter::getMinorTickColor() const +{ + return minorTickColor; +} + +void VolumeMeter::setMinorTickColor(QColor c) +{ + minorTickColor = std::move(c); +} + +qreal VolumeMeter::getWarningLevel() const +{ + return warningLevel; +} + +void VolumeMeter::setWarningLevel(qreal v) +{ + warningLevel = v; +} + +qreal VolumeMeter::getErrorLevel() const +{ + return errorLevel; +} + +void VolumeMeter::setErrorLevel(qreal v) +{ + errorLevel = v; +} + +void VolumeMeter::setPeakDecayRate(qreal decayRate) +{ + peakDecayRate = decayRate; +} + +void VolumeMeter::setPeakMeterType(enum obs_peak_meter_type peakMeterType) +{ + obs_volmeter_set_peak_meter_type(obsVolumeMeter, peakMeterType); + switch (peakMeterType) { + case TRUE_PEAK_METER: + // For true-peak meters EBU has defined the Permitted Maximum, + // taking into account the accuracy of the meter and further + // processing required by lossy audio compression. + // + // The alignment level was not specified, but I've adjusted + // it compared to a sample-peak meter. Incidentally Youtube + // uses this new Alignment Level as the maximum integrated + // loudness of a video. + // + // * Permitted Maximum Level (PML) = -2.0 dBTP + // * Alignment Level (AL) = -13 dBTP + setErrorLevel(-2.0); + setWarningLevel(-13.0); + break; + + case SAMPLE_PEAK_METER: + default: + // For a sample Peak Meter EBU has the following level + // definitions, taking into account inaccuracies of this meter: + // + // * Permitted Maximum Level (PML) = -9.0 dBFS + // * Alignment Level (AL) = -20.0 dBFS + setErrorLevel(-9.0); + setWarningLevel(-20.0); + break; + } + + bool forceUpdate = true; + updateBackgroundCache(forceUpdate); +} + +VolumeMeter::VolumeMeter(QWidget *parent, obs_source_t *source) + : QWidget(parent), + weakSource(OBSGetWeakRef(source)), + obsVolumeMeter(obs_volmeter_create(OBS_FADER_LOG)) +{ + setAttribute(Qt::WA_OpaquePaintEvent, true); + setAttribute(Qt::WA_TransparentForMouseEvents); + setFocusPolicy(Qt::NoFocus); + + // Default meter settings, they only show if + // there is no stylesheet, do not remove. + backgroundNominalColor.setRgb(0x26, 0x7f, 0x26); // Dark green + backgroundWarningColor.setRgb(0x7f, 0x7f, 0x26); // Dark yellow + backgroundErrorColor.setRgb(0x7f, 0x26, 0x26); // Dark red + foregroundNominalColor.setRgb(0x4c, 0xff, 0x4c); // Bright green + foregroundWarningColor.setRgb(0xff, 0xff, 0x4c); // Bright yellow + foregroundErrorColor.setRgb(0xff, 0x4c, 0x4c); // Bright red + + backgroundNominalColorDisabled.setRgb(90, 90, 90); + backgroundWarningColorDisabled.setRgb(117, 117, 117); + backgroundErrorColorDisabled.setRgb(65, 65, 65); + foregroundNominalColorDisabled.setRgb(163, 163, 163); + foregroundWarningColorDisabled.setRgb(217, 217, 217); + foregroundErrorColorDisabled.setRgb(113, 113, 113); + + clipColor.setRgb(0xff, 0xff, 0xff); // Bright white + magnitudeColor.setRgb(0x00, 0x00, 0x00); // Black + majorTickColor.setRgb(0x00, 0x00, 0x00); // Black + minorTickColor.setRgb(0x32, 0x32, 0x32); // Dark gray + minimumLevel = -60.0; // -60 dB + warningLevel = -20.0; // -20 dB + errorLevel = -9.0; // -9 dB + clipLevel = 0.0; // 0 dB + minimumInputLevel = -50.0; // -50 dB + peakDecayRate = 11.76; // 20 dB / 1.7 sec + magnitudeIntegrationTime = 0.3; // 99% in 300 ms + peakHoldDuration = 20.0; // 20 seconds + inputPeakHoldDuration = 1.0; // 1 second + meterThickness = 3; // Bar thickness in pixels + meterFontScaling = 0.8; // Font size for numbers is 80% of Widget's font size + channels = (int)audio_output_get_channels(obs_get_audio()); + + obs_volmeter_add_callback(obsVolumeMeter, obsVolMeterChanged, this); + obs_volmeter_attach_source(obsVolumeMeter, source); + + destroyedSignal = + OBSSignal(obs_source_get_signal_handler(source), "destroy", &VolumeMeter::obsSourceDestroyed, this); + + doLayout(); + + if (!updateTimer) { + updateTimer = new QTimer(qApp); + updateTimer->setTimerType(Qt::PreciseTimer); + updateTimer->start(16); + } + + connect(updateTimer, &QTimer::timeout, this, this() { + if (needLayoutChange()) { + doLayout(); + update(); + } else { + update(getBarRect()); + } + }); + + connect(App(), &OBSApp::StyleChanged, this, &VolumeMeter::doLayout); +} + +VolumeMeter::~VolumeMeter() +{ + obs_volmeter_remove_callback(obsVolumeMeter, obsVolMeterChanged, this); + obs_volmeter_detach_source(obsVolumeMeter); +} + +void VolumeMeter::obsSourceDestroyed(void *data, calldata_t *) +{ + VolumeMeter *self = static_cast<VolumeMeter *>(data); + QMetaObject::invokeMethod(self, "handleSourceDestroyed", Qt::QueuedConnection); +} + +void VolumeMeter::setLevels(const float magnitudeMAX_AUDIO_CHANNELS, const float peakMAX_AUDIO_CHANNELS, + const float inputPeakMAX_AUDIO_CHANNELS) +{ + uint64_t ts = os_gettime_ns(); + QMutexLocker locker(&dataMutex); + + currentLastUpdateTime = ts; + for (int channelNr = 0; channelNr < MAX_AUDIO_CHANNELS; channelNr++) { + currentMagnitudechannelNr = magnitudechannelNr; + currentPeakchannelNr = peakchannelNr; + currentInputPeakchannelNr = inputPeakchannelNr; + } + + // In case there are more updates then redraws we must make sure + // that the ballistics of peak and hold are recalculated. + locker.unlock(); + calculateBallistics(ts); +} + +void VolumeMeter::obsVolMeterChanged(void *data, const float magnitudeMAX_AUDIO_CHANNELS, + const float peakMAX_AUDIO_CHANNELS, const float inputPeakMAX_AUDIO_CHANNELS) +{ + VolumeMeter *meter = static_cast<VolumeMeter *>(data); + + meter->setLevels(magnitude, peak, inputPeak); +} + +inline void VolumeMeter::resetLevels() +{ + currentLastUpdateTime = 0; + for (int channelNr = 0; channelNr < MAX_AUDIO_CHANNELS; channelNr++) { + currentMagnitudechannelNr = -M_INFINITE; + currentPeakchannelNr = -M_INFINITE; + currentInputPeakchannelNr = -M_INFINITE; + + displayMagnitudechannelNr = -M_INFINITE; + displayPeakchannelNr = -M_INFINITE; + displayPeakHoldchannelNr = -M_INFINITE; + displayPeakHoldLastUpdateTimechannelNr = 0; + displayInputPeakHoldchannelNr = -M_INFINITE; + displayInputPeakHoldLastUpdateTimechannelNr = 0; + } +} + +bool VolumeMeter::needLayoutChange() +{ + int currentNrAudioChannels = obs_volmeter_get_nr_channels(obsVolumeMeter); + + if (!currentNrAudioChannels) { + struct obs_audio_info oai; + obs_get_audio_info(&oai); + currentNrAudioChannels = (oai.speakers == SPEAKERS_MONO) ? 1 : 2; + } + + if (displayNrAudioChannels != currentNrAudioChannels) { + displayNrAudioChannels = currentNrAudioChannels; + return true; + } + + return false; +} + +void VolumeMeter::setVertical(bool vertical_) +{ + if (vertical == vertical_) { + return; + } + + vertical = vertical_; + doLayout(); +} + +void VolumeMeter::setUseDisabledColors(bool enable) +{ + if (useDisabledColors == enable) { + return; + } + + useDisabledColors = enable; + + bool forceUpdate = true; + updateBackgroundCache(forceUpdate); +} + +void VolumeMeter::setMuted(bool mute) +{ + if (muted == mute) { + return; + } + + muted = mute; +} + +void VolumeMeter::refreshColors() +{ + setBackgroundNominalColor(getBackgroundNominalColor()); + setBackgroundWarningColor(getBackgroundWarningColor()); + setBackgroundErrorColor(getBackgroundErrorColor()); + setForegroundNominalColor(getForegroundNominalColor()); + setForegroundWarningColor(getForegroundWarningColor()); + setForegroundErrorColor(getForegroundErrorColor()); + + bool forceUpdate = true; + updateBackgroundCache(forceUpdate); +} + +QRect VolumeMeter::getBarRect() const +{ + QRect barRect = rect(); + if (vertical) { + barRect.setWidth(displayNrAudioChannels * (meterThickness + 1) - 1); + } else { + barRect.setHeight(displayNrAudioChannels * (meterThickness + 1) - 1); + } + + return barRect; +} + +// When this is called from the constructor, obs_volmeter_get_nr_channels has not +// yet been called and Q_PROPERTY settings have not yet been read from the +// stylesheet. +inline void VolumeMeter::doLayout() +{ + QMutexLocker locker(&dataMutex); + + if (displayNrAudioChannels) { + int meterSize = std::floor(22 / displayNrAudioChannels); + meterThickness = std::clamp(meterSize, 3, 6); + } + + tickFont = font(); + QFontInfo info(tickFont); + tickFont.setPointSizeF(info.pointSizeF() * meterFontScaling); + + QFontMetrics metrics(tickFont); + // This is a quick and naive assumption for widest potential tick label. + tickTextTokenRect = metrics.boundingRect(" -88 "); + + updateBackgroundCache(); + resetLevels(); + + updateGeometry(); +} + +inline bool VolumeMeter::detectIdle(uint64_t ts) +{ + double secondsSinceLastUpdate = (ts - currentLastUpdateTime) * 0.000000001; + if (secondsSinceLastUpdate > 0.5) { + resetLevels(); + return true; + } else { + return false; + } +} + +inline void VolumeMeter::calculateBallisticsForChannel(int channelNr, uint64_t ts, qreal timeSinceLastRedraw) +{ + if (currentPeakchannelNr >= displayPeakchannelNr || isnan(displayPeakchannelNr)) { + // Attack of peak is immediate. + displayPeakchannelNr = currentPeakchannelNr; + } else { + // Decay of peak is 40 dB / 1.7 seconds for Fast Profile + // 20 dB / 1.7 seconds for Medium Profile (Type I PPM) + // 24 dB / 2.8 seconds for Slow Profile (Type II PPM) + float decay = float(peakDecayRate * timeSinceLastRedraw); + displayPeakchannelNr = + std::clamp(displayPeakchannelNr - decay, std::min(currentPeakchannelNr, 0.f), 0.f); + } + + if (currentPeakchannelNr >= displayPeakHoldchannelNr || !isfinite(displayPeakHoldchannelNr)) { + // Attack of peak-hold is immediate, but keep track + // when it was last updated. + displayPeakHoldchannelNr = currentPeakchannelNr; + displayPeakHoldLastUpdateTimechannelNr = ts; + } else { + // The peak and hold falls back to peak + // after 20 seconds. + qreal timeSinceLastPeak = (uint64_t)(ts - displayPeakHoldLastUpdateTimechannelNr) * 0.000000001; + if (timeSinceLastPeak > peakHoldDuration) { + displayPeakHoldchannelNr = currentPeakchannelNr; + displayPeakHoldLastUpdateTimechannelNr = ts; + } + } + + if (currentInputPeakchannelNr >= displayInputPeakHoldchannelNr || + !isfinite(displayInputPeakHoldchannelNr)) { + // Attack of peak-hold is immediate, but keep track + // when it was last updated. + displayInputPeakHoldchannelNr = currentInputPeakchannelNr; + displayInputPeakHoldLastUpdateTimechannelNr = ts; + } else { + // The peak and hold falls back to peak after 1 second. + qreal timeSinceLastPeak = (uint64_t)(ts - displayInputPeakHoldLastUpdateTimechannelNr) * 0.000000001; + if (timeSinceLastPeak > inputPeakHoldDuration) { + displayInputPeakHoldchannelNr = currentInputPeakchannelNr; + displayInputPeakHoldLastUpdateTimechannelNr = ts; + } + } + + if (!isfinite(displayMagnitudechannelNr)) { + // The statements in the else-leg do not work with + // NaN and infinite displayMagnitude. + displayMagnitudechannelNr = currentMagnitudechannelNr; + } else { + // A VU meter will integrate to the new value to 99% in 300 ms. + // The calculation here is very simplified and is more accurate + // with higher frame-rate. + float attack = float((currentMagnitudechannelNr - displayMagnitudechannelNr) * + (timeSinceLastRedraw / magnitudeIntegrationTime) * 0.99); + displayMagnitudechannelNr = + std::clamp(displayMagnitudechannelNr + attack, (float)minimumLevel, 0.f); + } +} + +inline void VolumeMeter::calculateBallistics(uint64_t ts, qreal timeSinceLastRedraw) +{ + QMutexLocker locker(&dataMutex); + + for (int channelNr = 0; channelNr < MAX_AUDIO_CHANNELS; channelNr++) { + calculateBallisticsForChannel(channelNr, ts, timeSinceLastRedraw); + } +} + +QColor VolumeMeter::getPeakColor(float peakHold) +{ + QColor color; + + if (peakHold < minimumInputLevel) { + color = backgroundNominalColor; + } else if (peakHold < warningLevel) { + color = foregroundNominalColor; + } else if (peakHold < errorLevel) { + color = foregroundWarningColor; + } else if (peakHold < clipLevel) { + color = foregroundErrorColor; + } else { + color = clipColor; + } + + return color; +} + +void VolumeMeter::paintHTicks(QPainter &painter, int x, int y, int width) +{ + qreal scale = width / minimumLevel; + + painter.setFont(tickFont); + QFontMetrics metrics(tickFont); + painter.setPen(majorTickColor); + + // Draw major tick lines and numeric indicators. + for (int i = 0; i >= minimumLevel; i -= TICK_DB_INTERVAL) { + int position = int(x + width - (i * scale) - 1); + QString str = QString::number(i); + + // Center the number on the tick, but don't overflow + QRect textBounds = metrics.boundingRect(str); + int pos; + if (i == 0) { + pos = position - textBounds.width(); + } else { + pos = position - (textBounds.width() / 2); + if (pos < 0) { + pos = 0; + } + } + painter.drawText(pos, y + 4 + metrics.capHeight(), str); + + painter.drawLine(position, y, position, y + TICK_SIZE); + } +} + +void VolumeMeter::paintVTicks(QPainter &painter, int x, int y, int height) +{ + qreal scale = height / minimumLevel; + + painter.setFont(tickFont); + QFontMetrics metrics(tickFont); + painter.setPen(majorTickColor); + + // Draw major tick lines and numeric indicators. + for (int i = 0; i >= minimumLevel; i -= TICK_DB_INTERVAL) { + int position = y + int(i * scale); + QString str = QString::number(i); + + // Center the number on the tick, but don't overflow + if (i == 0) { + painter.drawText(x + 10, position + metrics.capHeight(), str); + } else { + painter.drawText(x + 8, position + (metrics.capHeight() / 2), str); + } + + painter.drawLine(x, position, x + TICK_SIZE, position); + } +} + +void VolumeMeter::updateBackgroundCache(bool force) +{ + if (!force && size().isEmpty()) { + return; + } + + if (!force && backgroundCache.size() == size() && !backgroundCache.isNull()) { + return; + } + + if (!force && displayNrAudioChannels <= 0) { + return; + } + + QColor backgroundColor = palette().color(QPalette::Window); + + backgroundCache = QPixmap(size() * devicePixelRatioF()); + backgroundCache.setDevicePixelRatio(devicePixelRatioF()); + backgroundCache.fill(backgroundColor); + + QPainter bg{&backgroundCache}; + QRect widgetRect = rect(); + + // Draw ticks + if (vertical) { + paintVTicks(bg, displayNrAudioChannels * (meterThickness + 1) - 1, 0, + widgetRect.height() - (INDICATOR_THICKNESS + 3)); + } else { + paintHTicks(bg, INDICATOR_THICKNESS + 3, displayNrAudioChannels * (meterThickness + 1) - 1, + widgetRect.width() - (INDICATOR_THICKNESS + 3)); + } + + // Draw meter backgrounds + bool disabledColors = muted || useDisabledColors; + QColor nominal = disabledColors ? backgroundNominalColorDisabled : backgroundNominalColor; + QColor warning = disabledColors ? backgroundWarningColorDisabled : backgroundWarningColor; + QColor error = disabledColors ? backgroundErrorColorDisabled : backgroundErrorColor; + + int meterStart = INDICATOR_THICKNESS + 2; + int meterLength = vertical ? rect().height() - (INDICATOR_THICKNESS + 2) + : rect().width() - (INDICATOR_THICKNESS + 2); + + qreal scale = meterLength / minimumLevel; + + int warningPosition = meterLength - convertToInt(warningLevel * scale); + int errorPosition = meterLength - convertToInt(errorLevel * scale); + + int nominalLength = warningPosition; + int warningLength = nominalLength + (errorPosition - warningPosition); + + for (int channelNr = 0; channelNr < displayNrAudioChannels; channelNr++) { + int channelOffset = channelNr * (meterThickness + 1); + + if (vertical) { + bg.fillRect(channelOffset, meterLength, meterThickness, -meterLength, error); + bg.fillRect(channelOffset, meterLength, meterThickness, -warningLength, warning); + bg.fillRect(channelOffset, meterLength, meterThickness, -nominalLength, nominal); + } else { + bg.fillRect(meterStart, channelOffset, meterLength, meterThickness, error); + bg.fillRect(meterStart, channelOffset, warningLength, meterThickness, warning); + bg.fillRect(meterStart, channelOffset, nominalLength, meterThickness, nominal); + } + } +} + +inline int VolumeMeter::convertToInt(float number) +{ + constexpr int min = std::numeric_limits<int>::min(); + constexpr int max = std::numeric_limits<int>::max(); + + // NOTE: Conversion from 'const int' to 'float' changes max value from 2147483647 to 2147483648 + if (number >= (float)max) { + return max; + } else if (number < min) { + return min; + } else { + return int(number); + } +} + +void VolumeMeter::paintEvent(QPaintEvent *) +{ + uint64_t ts = os_gettime_ns(); + qreal timeSinceLastRedraw = (ts - lastRedrawTime) * 0.000000001; + calculateBallistics(ts, timeSinceLastRedraw); + bool idle = detectIdle(ts); + + QPainter painter(this); + + bool disabledColors = muted || useDisabledColors; + QColor nominal = disabledColors ? foregroundNominalColorDisabled : foregroundNominalColor; + QColor warning = disabledColors ? foregroundWarningColorDisabled : foregroundWarningColor; + QColor error = disabledColors ? foregroundErrorColorDisabled : foregroundErrorColor; + + int meterStart = INDICATOR_THICKNESS + 2; + int meterLength = vertical ? rect().height() - (INDICATOR_THICKNESS + 2) + : rect().width() - (INDICATOR_THICKNESS + 2); + + const qreal scale = meterLength / minimumLevel; + + // Paint cached background pixmap + painter.drawPixmap(0, 0, backgroundCache); + + // Draw dynamic audio meter bars + int warningPosition = meterLength - convertToInt(warningLevel * scale); + int errorPosition = meterLength - convertToInt(errorLevel * scale); + int clipPosition = meterLength - convertToInt(clipLevel * scale); + + int nominalLength = warningPosition; + int warningLength = nominalLength + (errorPosition - warningPosition); + + for (int channelNr = 0; channelNr < displayNrAudioChannels; channelNr++) { + int channelNrFixed = (displayNrAudioChannels == 1 && channels > 2) ? 2 : channelNr; + + QMutexLocker locker(&dataMutex); + float peak = displayPeakchannelNrFixed; + float peakHold = displayPeakHoldchannelNrFixed; + float magnitude = displayMagnitudechannelNrFixed; + + int peakPosition = meterLength - convertToInt(peak * scale); + int peakHoldPosition = meterLength - convertToInt(peakHold * scale); + int magnitudePosition = meterLength - convertToInt(magnitude * scale); + locker.unlock(); + + if (clipping) { + peakPosition = meterLength; + } + + auto fill = &(int pos, int length, const QColor &color) { + if (vertical) { + painter.fillRect(pos, meterLength, meterThickness, -length, color); + } else { + painter.fillRect(meterStart, pos, length, meterThickness, color); + } + }; + + int channelOffset = channelNr * (meterThickness + 1); + + // Draw audio meter peak bars + if (peakPosition >= clipPosition) { + if (!clipping) { + QTimer::singleShot(CLIP_FLASH_DURATION_MS, this, &() { clipping = false; }); + clipping = true; + } + + fill(channelOffset, meterLength, error); + } else { + if (peakPosition > errorPosition) { + fill(channelOffset, std::min(peakPosition, meterLength), error); + } + if (peakPosition > warningPosition) { + fill(channelOffset, std::min(peakPosition, warningLength), warning); + } + if (peakPosition > meterStart) { + fill(channelOffset, std::min(peakPosition, nominalLength), nominal); + } + } + + // Draw peak hold indicators + QColor peakHoldColor = nominal; + if (peakHoldPosition >= errorPosition) { + peakHoldColor = error; + } else if (peakHoldPosition >= warningPosition) { + peakHoldColor = warning; + } + + if (peakHoldPosition - 3 > 0) { + if (vertical) { + painter.fillRect(channelOffset, meterLength - peakHoldPosition - 3, meterThickness, 3, + peakHoldColor); + } else { + painter.fillRect(meterStart + peakHoldPosition - 3, channelOffset, 3, meterThickness, + peakHoldColor); + } + } + + // Draw magnitude indicator + if (magnitudePosition - 3 >= 0) { + if (vertical) { + painter.fillRect(channelOffset, meterLength - magnitudePosition - 3, meterThickness, 3, + magnitudeColor); + } else { + painter.fillRect(meterStart + magnitudePosition - 3, channelOffset, 3, meterThickness, + magnitudeColor); + } + } + + if (idle) { + continue; + } + + // Draw audio input indicator + if (vertical) { + painter.fillRect(channelOffset, rect().height(), meterThickness, -INDICATOR_THICKNESS, + getPeakColor(displayInputPeakHoldchannelNrFixed)); + } else { + painter.fillRect(0, channelOffset, INDICATOR_THICKNESS, meterThickness, + getPeakColor(displayInputPeakHoldchannelNrFixed)); + } + } + + lastRedrawTime = ts; +} + +void VolumeMeter::resizeEvent(QResizeEvent *event) +{ + updateBackgroundCache(); + return QWidget::resizeEvent(event); +} + +void VolumeMeter::mousePressEvent(QMouseEvent *event) +{ + setFocus(Qt::MouseFocusReason); + event->accept(); +} + +void VolumeMeter::wheelEvent(QWheelEvent *event) +{ + QApplication::sendEvent(focusProxy(), event); +} + +QSize VolumeMeter::minimumSizeHint() const +{ + return sizeHint(); +} + +QSize VolumeMeter::sizeHint() const +{ + QRect meterRect = getBarRect(); + int labelTotal = std::abs(minimumLevel / TICK_DB_INTERVAL) + 1; + + if (vertical) { + int width = meterRect.width() + tickTextTokenRect.width() + TICK_SIZE + 10; + int height = (labelTotal * tickTextTokenRect.height()) + INDICATOR_THICKNESS; + + return QSize(width, height * 1.1); + } else { + int width = (labelTotal * tickTextTokenRect.width()) + INDICATOR_THICKNESS; + int height = meterRect.height() + tickTextTokenRect.height(); + + return QSize(width * 1.1, height); + } +}
View file
obs-studio-32.1.0.tar.xz/frontend/components/VolumeMeter.hpp
Added
@@ -0,0 +1,206 @@ +#pragma once + +#include <obs.hpp> + +#include <QMutex> +#include <QPixmap> +#include <QWidget> + +#define FADER_PRECISION 4096.0 + +class VolumeMeter : public QWidget { + Q_OBJECT + + Q_PROPERTY(QColor backgroundNominalColor READ getBackgroundNominalColor WRITE setBackgroundNominalColor + DESIGNABLE true) + Q_PROPERTY(QColor backgroundWarningColor READ getBackgroundWarningColor WRITE setBackgroundWarningColor + DESIGNABLE true) + Q_PROPERTY( + QColor backgroundErrorColor READ getBackgroundErrorColor WRITE setBackgroundErrorColor DESIGNABLE true) + Q_PROPERTY(QColor foregroundNominalColor READ getForegroundNominalColor WRITE setForegroundNominalColor + DESIGNABLE true) + Q_PROPERTY(QColor foregroundWarningColor READ getForegroundWarningColor WRITE setForegroundWarningColor + DESIGNABLE true) + Q_PROPERTY( + QColor foregroundErrorColor READ getForegroundErrorColor WRITE setForegroundErrorColor DESIGNABLE true) + + Q_PROPERTY(QColor backgroundNominalColorDisabled READ getBackgroundNominalColorDisabled WRITE + setBackgroundNominalColorDisabled DESIGNABLE true) + Q_PROPERTY(QColor backgroundWarningColorDisabled READ getBackgroundWarningColorDisabled WRITE + setBackgroundWarningColorDisabled DESIGNABLE true) + Q_PROPERTY(QColor backgroundErrorColorDisabled READ getBackgroundErrorColorDisabled WRITE + setBackgroundErrorColorDisabled DESIGNABLE true) + Q_PROPERTY(QColor foregroundNominalColorDisabled READ getForegroundNominalColorDisabled WRITE + setForegroundNominalColorDisabled DESIGNABLE true) + Q_PROPERTY(QColor foregroundWarningColorDisabled READ getForegroundWarningColorDisabled WRITE + setForegroundWarningColorDisabled DESIGNABLE true) + Q_PROPERTY(QColor foregroundErrorColorDisabled READ getForegroundErrorColorDisabled WRITE + setForegroundErrorColorDisabled DESIGNABLE true) + + Q_PROPERTY(QColor magnitudeColor READ getMagnitudeColor WRITE setMagnitudeColor DESIGNABLE true) + Q_PROPERTY(QColor majorTickColor READ getMajorTickColor WRITE setMajorTickColor DESIGNABLE true) + Q_PROPERTY(QColor minorTickColor READ getMinorTickColor WRITE setMinorTickColor DESIGNABLE true) + + friend class VolumeControl; + +private: + OBSWeakSource weakSource; + OBSVolMeter obsVolumeMeter; + + static QPointer<QTimer> updateTimer; + + static void obsVolMeterChanged(void *data, const float magnitudeMAX_AUDIO_CHANNELS, + const float peakMAX_AUDIO_CHANNELS, const float inputPeakMAX_AUDIO_CHANNELS); + + OBSSignal destroyedSignal; + static void obsSourceDestroyed(void *data, calldata_t *); + + inline void resetLevels(); + inline void doLayout(); + inline bool detectIdle(uint64_t ts); + inline void calculateBallistics(uint64_t ts, qreal timeSinceLastRedraw = 0.0); + inline void calculateBallisticsForChannel(int channelNr, uint64_t ts, qreal timeSinceLastRedraw); + + inline int convertToInt(float number); + QColor getPeakColor(float peakHold); + + void paintHTicks(QPainter &painter, int x, int y, int width); + void paintVTicks(QPainter &painter, int x, int y, int height); + + QMutex dataMutex; + + uint64_t currentLastUpdateTime{0}; + float currentMagnitudeMAX_AUDIO_CHANNELS; + float currentPeakMAX_AUDIO_CHANNELS; + float currentInputPeakMAX_AUDIO_CHANNELS; + + int displayNrAudioChannels{0}; + float displayMagnitudeMAX_AUDIO_CHANNELS; + float displayPeakMAX_AUDIO_CHANNELS; + float displayPeakHoldMAX_AUDIO_CHANNELS; + uint64_t displayPeakHoldLastUpdateTimeMAX_AUDIO_CHANNELS; + float displayInputPeakHoldMAX_AUDIO_CHANNELS; + uint64_t displayInputPeakHoldLastUpdateTimeMAX_AUDIO_CHANNELS; + + QPixmap backgroundCache; + void updateBackgroundCache(bool force = false); + + QFont tickFont; + QRect tickTextTokenRect; + + QColor backgroundNominalColor; + QColor backgroundWarningColor; + QColor backgroundErrorColor; + QColor foregroundNominalColor; + QColor foregroundWarningColor; + QColor foregroundErrorColor; + + QColor backgroundNominalColorDisabled; + QColor backgroundWarningColorDisabled; + QColor backgroundErrorColorDisabled; + QColor foregroundNominalColorDisabled; + QColor foregroundWarningColorDisabled; + QColor foregroundErrorColorDisabled; + + QColor clipColor; + QColor magnitudeColor; + QColor majorTickColor; + QColor minorTickColor; + + int meterThickness; + qreal meterFontScaling; + + qreal minimumLevel; + qreal warningLevel; + qreal errorLevel; + qreal clipLevel; + qreal minimumInputLevel; + qreal peakDecayRate; + qreal magnitudeIntegrationTime; + qreal peakHoldDuration; + qreal inputPeakHoldDuration; + + QColor p_backgroundNominalColor; + QColor p_backgroundWarningColor; + QColor p_backgroundErrorColor; + QColor p_foregroundNominalColor; + QColor p_foregroundWarningColor; + QColor p_foregroundErrorColor; + + uint64_t lastRedrawTime{0}; + int channels{0}; + bool clipping{false}; + bool vertical{false}; + bool hidden{false}; + bool muted{false}; + bool useDisabledColors{false}; + +public: + explicit VolumeMeter(QWidget *parent = nullptr, obs_source_t *source = nullptr); + ~VolumeMeter(); + + void setLevels(const float magnitudeMAX_AUDIO_CHANNELS, const float peakMAX_AUDIO_CHANNELS, + const float inputPeakMAX_AUDIO_CHANNELS); + bool needLayoutChange(); + + void setVertical(bool vertical = true); + void setUseDisabledColors(bool enable); + void setMuted(bool mute); + + void refreshColors(); + QRect getBarRect() const; + + QColor getBackgroundNominalColor() const; + void setBackgroundNominalColor(QColor c); + QColor getBackgroundWarningColor() const; + void setBackgroundWarningColor(QColor c); + QColor getBackgroundErrorColor() const; + void setBackgroundErrorColor(QColor c); + QColor getForegroundNominalColor() const; + void setForegroundNominalColor(QColor c); + QColor getForegroundWarningColor() const; + void setForegroundWarningColor(QColor c); + QColor getForegroundErrorColor() const; + void setForegroundErrorColor(QColor c); + + QColor getBackgroundNominalColorDisabled() const; + void setBackgroundNominalColorDisabled(QColor c); + QColor getBackgroundWarningColorDisabled() const; + void setBackgroundWarningColorDisabled(QColor c); + QColor getBackgroundErrorColorDisabled() const; + void setBackgroundErrorColorDisabled(QColor c); + QColor getForegroundNominalColorDisabled() const; + void setForegroundNominalColorDisabled(QColor c); + QColor getForegroundWarningColorDisabled() const; + void setForegroundWarningColorDisabled(QColor c); + QColor getForegroundErrorColorDisabled() const; + void setForegroundErrorColorDisabled(QColor c); + + QColor getMagnitudeColor() const; + void setMagnitudeColor(QColor c); + QColor getMajorTickColor() const; + void setMajorTickColor(QColor c); + QColor getMinorTickColor() const; + void setMinorTickColor(QColor c); + + qreal getWarningLevel() const; + void setWarningLevel(qreal v); + qreal getErrorLevel() const; + void setErrorLevel(qreal v); + + void setPeakDecayRate(qreal v); + void setPeakMeterType(enum obs_peak_meter_type peakMeterType); + + virtual void resizeEvent(QResizeEvent *event) override; + virtual void mousePressEvent(QMouseEvent *event) override; + virtual void wheelEvent(QWheelEvent *event) override; + + QSize minimumSizeHint() const override; + QSize sizeHint() const override; + +protected: + void paintEvent(QPaintEvent *event) override; + +private slots: + void handleSourceDestroyed() { deleteLater(); } +};
View file
obs-studio-32.1.0.tar.xz/frontend/components/VolumeName.cpp
Added
@@ -0,0 +1,173 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#include "VolumeName.hpp" + +#include <QHBoxLayout> +#include <QLabel> +#include <QResizeEvent> +#include <QStyle> +#include <QStyleOptionButton> +#include <QStylePainter> + +#include "moc_VolumeName.cpp" + +VolumeName::VolumeName(obs_source_t *source, QWidget *parent) + : QAbstractButton(parent), + indicatorWidth(style()->pixelMetric(QStyle::PM_MenuButtonIndicator, nullptr, this)) +{ + renamedSignal = OBSSignal(obs_source_get_signal_handler(source), "rename", &VolumeName::obsSourceRenamed, this); + removedSignal = OBSSignal(obs_source_get_signal_handler(source), "remove", &VolumeName::obsSourceRemoved, this); + destroyedSignal = + OBSSignal(obs_source_get_signal_handler(source), "destroy", &VolumeName::obsSourceDestroyed, this); + + QHBoxLayout *layout = new QHBoxLayout(); + setLayout(layout); + + label = new QLabel(this); + layout->addWidget(label); + + layout->setContentsMargins(0, 0, indicatorWidth, 0); + + QString name = obs_source_get_name(source); + setText(name); +} + +VolumeName::~VolumeName() {} + +void VolumeName::setAlignment(Qt::Alignment alignment_) +{ + if (textAlignment != alignment_) { + textAlignment = alignment_; + update(); + } +} + +QSize VolumeName::sizeHint() const +{ + QStyleOptionButton opt; + opt.initFrom(this); + + const QFontMetrics metrics(font()); + QSize textSize = metrics.size(Qt::TextSingleLine, text()); + + int width = textSize.width(); + int height = textSize.height(); + + if (!opt.icon.isNull()) { + height = std::max(height, indicatorWidth); + } + + const int spacing = style()->pixelMetric(QStyle::PM_ButtonMargin, &opt, this) / 2; + width += indicatorWidth + spacing; + + QSize contentsSize = style()->sizeFromContents(QStyle::CT_PushButton, &opt, QSize(width, height), this); + return contentsSize; +} + +void VolumeName::obsSourceRenamed(void *data, calldata_t *params) +{ + VolumeName *widget = static_cast<VolumeName *>(data); + const char *name = calldata_string(params, "new_name"); + + QMetaObject::invokeMethod(widget, "onRenamed", Qt::QueuedConnection, Q_ARG(QString, name)); +} + +void VolumeName::obsSourceRemoved(void *data, calldata_t *) +{ + VolumeName *widget = static_cast<VolumeName *>(data); + + QMetaObject::invokeMethod(widget, "onRemoved", Qt::QueuedConnection); +} + +void VolumeName::obsSourceDestroyed(void *data, calldata_t *) +{ + VolumeName *widget = static_cast<VolumeName *>(data); + + QMetaObject::invokeMethod(widget, "onDestroyed", Qt::QueuedConnection); +} + +void VolumeName::resizeEvent(QResizeEvent *event) +{ + updateLabelText(text()); + QAbstractButton::resizeEvent(event); +} + +void VolumeName::paintEvent(QPaintEvent *) +{ + QStylePainter painter(this); + QStyleOptionButton opt; + opt.initFrom(this); + + painter.drawControl(QStyle::CE_PushButtonBevel, opt); + + QRect contentRect = style()->subElementRect(QStyle::SE_PushButtonContents, &opt, this); + int paddingRight = opt.rect.right() - contentRect.right(); + + int indicatorWidth = style()->pixelMetric(QStyle::PM_MenuButtonIndicator, &opt, this); + + QStyleOption arrowOpt = opt; + QRect arrowRect(opt.rect.right() - indicatorWidth - paddingRight / 2, + opt.rect.center().y() - indicatorWidth / 2, indicatorWidth, indicatorWidth); + arrowOpt.rect = arrowRect; + + painter.drawPrimitive(QStyle::PE_IndicatorArrowDown, arrowOpt); +} + +void VolumeName::onRenamed(QString name) +{ + setText(name); + + std::string nameStr = name.toStdString(); + emit renamed(nameStr.c_str()); +} + +void VolumeName::setText(const QString &text) +{ + QAbstractButton::setText(text); + updateLabelText(text); +} + +void VolumeName::updateLabelText(const QString &name) +{ + QString plainText = name; + // Handle source names that use rich text. + if (name.contains("<") && name.contains(">")) { + QTextDocument doc; + doc.setHtml(name); + + plainText = doc.toPlainText(); + } + + QFontMetrics metrics(label->font()); + QString elidedText = metrics.elidedText(plainText, Qt::ElideMiddle, width() - indicatorWidth * 2); + + bool useElidedText = metrics.boundingRect(plainText).width() > width() - indicatorWidth; + + bool isRichText = name != plainText; + label->setText(useElidedText && !isRichText ? elidedText : name); +} + +void VolumeName::onRemoved() +{ + emit removed(); +} + +void VolumeName::onDestroyed() +{ + emit destroyed(); +}
View file
obs-studio-32.1.0.tar.xz/frontend/components/VolumeName.hpp
Added
@@ -0,0 +1,68 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#pragma once + +#include <obs.hpp> + +#include <QAbstractButton> +#include <QLabel> +#include <QPointer> + +class VolumeName : public QAbstractButton { + Q_OBJECT; + Q_PROPERTY(Qt::Alignment textAlignment READ alignment WRITE setAlignment) + + QPointer<QLabel> label{}; + int indicatorWidth; + +public: + VolumeName(obs_source_t *source, QWidget *parent = nullptr); + ~VolumeName(); + + void setAlignment(Qt::Alignment alignment); + Qt::Alignment alignment() const { return textAlignment; } + + QSize sizeHint() const override; + + void updateLabelText(const QString &name); + void setText(const QString &text); + +protected: + OBSSignal renamedSignal; + OBSSignal removedSignal; + OBSSignal destroyedSignal; + + Qt::Alignment textAlignment = Qt::AlignLeft; + + static void obsSourceRenamed(void *data, calldata_t *params); + static void obsSourceRemoved(void *data, calldata_t *params); + static void obsSourceDestroyed(void *data, calldata_t *params); + + void resizeEvent(QResizeEvent *event) override; + void paintEvent(QPaintEvent *event) override; + +private slots: + void onRenamed(QString name); + void onRemoved(); + void onDestroyed(); + +signals: + void renamed(const char *name); + void removed(); + void destroyed(); +};
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale.ini
Changed
@@ -4,6 +4,9 @@ ar-SA Name=العربية +az-AZ +Name=Azərbaycanca + be-BY Name=Беларуская @@ -97,6 +100,9 @@ ko-KR Name=한국어 +lo-LA +Name=ພາສາລາວ + ms-MY Name=Bahasa Melayu
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/af-ZA.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/af-ZA.ini
Changed
@@ -22,6 +22,17 @@ Mixer="OudioMenger" Browse="Blaai" DroppedFrames="Geval rame %1 (%2%)" +Projector.Open.Program="Maak Programprojektor oop" +Projector.Open.Preview="Maak voorskouprojektor oop" +Projector.Open.Scene="Oop toneelprojektor" +Projector.Open.Source="Oopbronprojektor" +Projector.Open.Multiview="Maak Multiview oop" +Projector.Display="Vertoon: %1" +Projector.Window="Nuwe venster" +Projector.Title="Projektor" +Projector.Title.Scene="Toneel: %1" +Projector.Title.Source="Bron: %1" +Projector.ResizeWindowToContent="Pas venster by inhoud" Clear="Vee Uit" Revert="Keur Terug" Show="Wys" @@ -78,6 +89,7 @@ LockVolume="Vergrendel volume" ShowOnStartup="Wys tydens opstart" OpenFile="Open lêer" +AddScene="Voeg toneel by" AddSource="Voeg bron toe" RemoveScene="Verwyder gekose toneel" RemoveSource="erwyder gekose bron(ne)" @@ -91,11 +103,21 @@ SceneFilters="Open toneelfilters" List="Lys" Grid="Rooster" +Automatic="Outomatiese" +ComingSoon="Binnekort" PluginsFailedToLoad.Title="Inprop laai Fout" PluginsFailedToLoad.Text="Die volgende OBS-inprop kon nie laai nie:\n\n%1\nWerk dit by of verwyder hierdie inproppe." AlreadyRunning.Title="OBS loop reeds" AlreadyRunning.Text="OBS loop reeds! Tensy die bedoeling was om dit te doen, moet u asb. enige bestaande instansies van OBS sluit voor u ’n nuwe instansie wil laat loop. Indien OBS in die stelsellaai verklein is, kyk asb. om te sien of dit nog daar loop." AlreadyRunning.LaunchAnyway="Laat in elk geval loop" +CrashHandling.Dialog.Title="OBS Studio-ongeluk opgespoor" +CrashHandling.Labels.Text="OBS Studio het nie behoorlik afgeskakel nie.\n\nLoop in Veilige Modus (derdeparty-inproppe, skripsie en WebSockets gedeaktiveer)?" +CrashHandling.Labels.PrivacyNotice="Jy kan ook kies om die mees onlangse ongelukverslag outomaties na die OBSProject op te laai.<br /><br />Lees asseblief die <a href='https://obsproject.com/privacy-policy'>Privaatheidsbeleid</a> voordat jy enige lêers oplaai en gee spesiale aandag aan die dele rakende lêeroplaaie." +CrashHandling.Checkbox.SendReport="Ek het die privaatheidsbeleid gelees en stem in tot die oplaai." +CrashHandling.Buttons.LaunchSafe="Hardloop in veilige modus" +CrashHandling.Buttons.LaunchNormal="Hardloop in normale modus" +CrashHandling.Errors.UploadJSONError="'n Fout het voorgekom tydens die oplaai van die mees onlangse ongeluklog. Probeer asseblief later weer." +CrashHandling.Errors.Title="Omvallog-oplaaifout" SafeMode.Restart="Wil u OBS in veilige modus herbegin (derdeparty-inproppe, skripte en WebSockets gedeaktiveer)?" SafeMode.RestartNormal="Wil u OBS in normale modus herbegin?" ChromeOS.Title="Onondersteunde platform" @@ -127,16 +149,22 @@ RestreamAuth.Channels="Herstroom kanale" Copy.Filters="Kopieer filters" Paste.Filters="Plak filters" +BrowserPanelInit.Title="Inisialiseer tans blaaier …" +BrowserPanelInit.Text="Inisialiseer blaaier, wag asseblief..." BandwidthTest.Region="Streek" BandwidthTest.Region.US="Verenigde State" BandwidthTest.Region.EU="Europa" BandwidthTest.Region.Asia="Asië" BandwidthTest.Region.Other="Ander" +Basic.AutoConfig="Outomatiese Konfigurasie-towenaar" Basic.AutoConfig.ApplySettings="Pas instellings toe" Basic.AutoConfig.StartPage="Gebruik inligting" Basic.AutoConfig.StartPage.SubTitle="Spesifiseer waarvoor u die program wil gebruik" +Basic.AutoConfig.StartPage.PrioritizeStreaming="Optimaliseer vir stroomdienste, opname is sekondêr" +Basic.AutoConfig.StartPage.PrioritizeRecording="Optimaliseer net vir opname, ek sal nie stroom nie" Basic.AutoConfig.StartPage.PrioritizeVirtualCam="Ek gaan slegs die virtuele kamera gebruik" Basic.AutoConfig.VideoPage="Video-instellings" +Basic.AutoConfig.VideoPage.SubTitle="Spesifiseer die video-instellings wat jy wil gebruik" Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="Gebruik huidige (%1x%2)" Basic.AutoConfig.VideoPage.BaseResolution.Display="Beeldskerm %1 (%2x%3)" Basic.AutoConfig.VideoPage.FPS.UseCurrent="Gebruik huidige (%1)" @@ -144,25 +172,46 @@ Basic.AutoConfig.VideoPage.FPS.PreferHighRes="60 of 30, maar gee voorkeur aan hoër beeldskerpte" Basic.AutoConfig.VideoPage.CanvasExplanation="Nota: die basisbeeldskerpte (doek) hoef nie gelyk te wees aan die beeldskerpte waarmee u stroom of opneem nie. U stroom/opnamebeeldskerpte kan afgeskaal word vanaf die basisbeeldskerpte om die belasting op die rekenaar of die benodigde bistempo te verlaag." Basic.AutoConfig.StreamPage="Stroominligting" +Basic.AutoConfig.StreamPage.SubTitle="Voer asseblief jou stroominligting in" Basic.AutoConfig.StreamPage.ConnectAccount="Koppel rekening (aanbeveel)" Basic.AutoConfig.StreamPage.DisconnectAccount="Ontkoppel rekening" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Ontkoppel rekening?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Hierdie verandering sal onmiddellik van toepassing wees. Is u seker u wil u rekening ontkoppel?" +Basic.AutoConfig.StreamPage.GetStreamKey="Kry stroomsleutel" Basic.AutoConfig.StreamPage.MoreInfo="Meer inligting" +Basic.AutoConfig.StreamPage.UseStreamKey="Gebruik stroomsleutel" +Basic.AutoConfig.StreamPage.UseStreamKeyAdvanced="Gebruik Stroomsleutel (gevorderd)" Basic.AutoConfig.StreamPage.Service="Diens" Basic.AutoConfig.StreamPage.Service.ShowAll="Toon alles…" Basic.AutoConfig.StreamPage.Service.Custom="Pasgemaak..." Basic.AutoConfig.StreamPage.Server="Bediener" +Basic.AutoConfig.StreamPage.StreamKey="Stroomsleutel" +Basic.AutoConfig.StreamPage.StreamKey.ToolTip="RIST: voer die enkripsiewagwoordfrase in.\nRTMP: voer die sleutel in wat deur die diens verskaf word.\nSRT: voer die stroom-ID in as die diens een gebruik." Basic.AutoConfig.StreamPage.EncoderKey="Enkodeerdersleutel" +Basic.AutoConfig.StreamPage.BearerToken="Draer Token" Basic.AutoConfig.StreamPage.ConnectedAccount="Gekoppelde rekening" +Basic.AutoConfig.StreamPage.PerformBandwidthTest="Skat die bitsnelheid met bandwydtetoets (dit kan 'n paar minute neem)" Basic.AutoConfig.StreamPage.PreferHardwareEncoding="Verkies apparatuurenkodering" Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="Apparatuurenkodering elimineer die meeste SVE-gebruik, maar kan meer bistempo vereis om dieselfde kwaliteitsvlak te handhaaf." +Basic.AutoConfig.StreamPage.StreamWarning.Title="Stroomwaarskuwing" +Basic.AutoConfig.StreamPage.StreamWarning.Text="Die bandwydtetoets gaan nou ewekansige videodata sonder klank na jou kanaal stroom. Indien moontlik, word dit aanbeveel om die stoor van video's van strome tydelik af te skakel en die stroom op privaat te stel totdat die toets voltooi is. Gaan voort?" +Basic.AutoConfig.StreamPage.UseMultitrackVideo="Toets %1" +Basic.AutoConfig.TestPage="Finale resultate" Basic.AutoConfig.TestPage.SubTitle.Testing="Die program voer nou ’n stel toetse uit om die ideale instellings te raam." Basic.AutoConfig.TestPage.SubTitle.Complete="Toetse is afgehandel" Basic.AutoConfig.TestPage.TestingBandwidth="Bandwydtetoets word uitgevoer, dit kan enkele minute duur…" Basic.AutoConfig.TestPage.TestingBandwidth.NoOutput="Geen afvoer vir die protokol van hierdie diens gevind" +Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="Verbind met: %1..." +Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="Kon nie aan enige bedieners koppel nie. Kontroleer asseblief jou internetverbinding en probeer weer." Basic.AutoConfig.TestPage.TestingBandwidth.Server="Toets tans bandwydte vir: %1" +Basic.AutoConfig.TestPage.TestingStreamEncoder="Toets stroomkodeerder, dit mag dalk 'n minuut neem..." +Basic.AutoConfig.TestPage.TestingRecordingEncoder="Toets opname-enkodeerder, dit mag dalk 'n minuut neem..." +Basic.AutoConfig.TestPage.TestingRes.Fail="Kon nie die kodeerder begin nie" Basic.AutoConfig.TestPage.TestingRes.Resolution="Toets tans %1x%2 %3 RPS…" +Basic.AutoConfig.TestPage.Result.StreamingEncoder="Stroomkodeerder" +Basic.AutoConfig.TestPage.Result.RecordingEncoder="Opname-enkodeerder" +Basic.AutoConfig.TestPage.Result.Header="Die program het bepaal dat hierdie beraamde instellings ideaal vir jou is:" +Basic.AutoConfig.TestPage.Result.Footer="Om hierdie instellings te gebruik, klik Pas instellings toe. Om die towenaar te herkonfigureer en weer te probeer, klik Terug. Om instellings self handmatig te konfigureer, klik Kanselleer en maak Instellings oop." Basic.Stats="Statistieke" Basic.Stats.CPUUsage="SVE-gebruik" Basic.Stats.HDDSpaceAvailable="Beskikbare skyfspasie"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/an-ES.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/an-ES.ini
Changed
@@ -270,8 +270,6 @@ ConfirmStopRecord.Text="Yes seguro que deseyas aturar la gravación?" ConfirmBWTest.Title="Encomenzar la preba d'amplaria de banda?" ConfirmBWTest.Text="Tiens OBS configurau en modo de preba d'amplo de banda. Este modo permite prebas de ret sin que la tuya canal sía en vivo. Una vegada que haigas rematau de prebar, te caldrá desactivar-lo pa que los espectadors puedan veyer lo tuyo stream.\n\nQuiers continar?" -ConfirmExit.Title="Salir de l'OBS?" -ConfirmExit.Text="OBS esta estando usau. Totas las transmisions/gravacions serán aturadas. Yes seguro que quiers salir?" ConfirmRemove.Title="Confirmar borrau" ConfirmRemove.TextMultiple="Seguro que quiers borrar %1 elementos?" Output.StartStreamFailed="No s'ha puesto iniciar la emisión"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/ar-SA.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/ar-SA.ini
Changed
@@ -48,10 +48,10 @@ Enable="تفعيل" DisableOSXVSync="تعطيل خاصية macOS V-Sync" ResetOSXVSyncOnExit="اعادة تعيين خاصية macOS V-sync عند الخروج" -HighResourceUsage="زيادة الحِمل في غملية ترميز الفيديو! خذ بعين الاعتبار تخفيض اعدادات الفيديو, او استخدم اعدادات ترميز اسرع." +HighResourceUsage="زيادة الحِمل في عمليه ترميز الفيديو! خذ بعين الاعتبار تخفيض اعدادات الفيديو, او استخدم اعدادات ترميز اسرع." Transition="تبديل المشهد" QuickTransitions="تبديل سريع" -FadeToBlack="إختفاء الى الأسود" +FadeToBlack="تلاشى إلى الأسود" Left="يسار" Right="يمين" Top="أعلى" @@ -111,11 +111,20 @@ List="قائمة" Grid="شبكة" Automatic="تلقائي" +ComingSoon="قريباً" PluginsFailedToLoad.Title="خطأ في تحميل الإضافات" PluginsFailedToLoad.Text="فشل تحميل إضافات OBS التالية:\n\n%1\nالرجاء تحديث أو إزالة هذه الإضافات." AlreadyRunning.Title="OBS قيد التشغيل بالفعل" AlreadyRunning.Text="OBS قيد التشغيل بالفعل! إلاّ إذا كنت تتعمد هذا, الرجاء إغلاق أي نسخة أخرى قيد التشغيل من OBS قبل محاولة تشغيل واحدة جديدة. إذا كان OBS لديك في وضعية التصغير إلى جانب الساعة, الرجاء التأكد إذا كان لازال يعمل هناك." AlreadyRunning.LaunchAnyway="إطلاق على أي حال" +CrashHandling.Dialog.Title="تم الكشف عن تعطل في OBS Studio" +CrashHandling.Labels.Text="لم يتم إغلاق OBS بطريقة صحيحة.\n\nقم بالتشغيل في الوضع الأمن؟" +CrashHandling.Labels.PrivacyNotice="يمكنك أيضًا اختيار تحميل أحدث تقرير عن الأعطال تلقائيًا إلى OBSProject.<br /><br />يرجى قراءة <a href=’https://obsproject.com/privacy-policy‘>سياسة الخصوصية</a> قبل رفع أي ملفات، مع الإهتمام خاصاً بالأجزاء المتعلقة بتحميل الملفات." +CrashHandling.Checkbox.SendReport="لقد قرأت سياسة الخصوصية وأوافق على الرفع." +CrashHandling.Buttons.LaunchSafe="تشغيل في الوضع الأمن" +CrashHandling.Buttons.LaunchNormal="تشغيل في الوضع العادي" +CrashHandling.Errors.UploadJSONError="لقد حدث حطأ اثناء محاولة رفع احدث سجل للأعطال. يرجي المحاولة لاحقاً." +CrashHandling.Errors.Title="خطأ في رفع سجل الأعطال" SafeMode.Restart="هل تريد إعادة تشغيل OBS في الوضع الآمن (سيتم تعطيل المكونات الإضافية والبرمجة النصية و WebSockets)؟" SafeMode.RestartNormal="هل ترغب في إعادة تشغيل OBS في الوضع العادي؟" ChromeOS.Title="منصة غير مدعومة" @@ -158,7 +167,7 @@ Basic.AutoConfig.ApplySettings="تطبيق الإعدادات" Basic.AutoConfig.StartPage="معلومات الاستخدام" Basic.AutoConfig.StartPage.SubTitle="حدد ما تريد استخدامه للبرنامج" -Basic.AutoConfig.StartPage.PrioritizeStreaming="تحسين لبث افيديو ، والتسجيل ثانياً" +Basic.AutoConfig.StartPage.PrioritizeStreaming="تحسين لبث افيديو، والتسجيل ثانياً" Basic.AutoConfig.StartPage.PrioritizeRecording="تحسين فقط للتسجيل، وأنا لن أبث الفيديو" Basic.AutoConfig.StartPage.PrioritizeVirtualCam="سأقوم فقط باستخدام الكاميرا الافتراضية" Basic.AutoConfig.VideoPage="إعدادات الفيديو" @@ -191,7 +200,7 @@ Basic.AutoConfig.StreamPage.PreferHardwareEncoding="تفضيل استخدام الترميز بواسطة الهاردوير" Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="استخدام الترميز بالهاردوير يلغي الحاجة الى معظم موارد المعالج, لكن قد يحتاج الى معدل بث أعلى للحفاظ على نفس مستوى الجودة." Basic.AutoConfig.StreamPage.StreamWarning.Title="تحذير يتعلق بالبث" -Basic.AutoConfig.StreamPage.StreamWarning.Text="اختبار مستوى التدفق على وشك بدأ عرض مباشر لبيانات من فيديو عشوائي بدون صوت للقناة الخاصة بك. إذا أمكنك، يوصى بإيقاف حفظ فيديو للعرض المباشر مؤقتا وتعيين خصوصية العرض المباشر ل خاص إلى أن بكتمل الاختبار. هل تريد المتابعة؟" +Basic.AutoConfig.StreamPage.StreamWarning.Text="اختبار مستوى التدفق على وشك بدأ عرض مباشر لبيانات من فيديو عشوائي بدون صوت للقناة الخاصة بك. إذا أمكنك، يوصى بإيقاف حفظ فيديو للعرض المباشر مؤقتا وتعيين خصوصية العرض المباشر ل خاص إلى أن يكتمل الاختبار. هل تريد المتابعة؟" Basic.AutoConfig.StreamPage.UseMultitrackVideo="اختبار%1" Basic.AutoConfig.TestPage="النتيجة النهائية" Basic.AutoConfig.TestPage.SubTitle.Testing="يقوم البرنامج الآن بتنفيذ مجموعة من الإختبارات لتقدير الإعدادات الأكثر مثالية" @@ -227,14 +236,14 @@ Basic.Stats.Status.Reconnecting="جاري إعادة الاتصال" Basic.Stats.Status.Inactive="غير نشط" Basic.Stats.Status.Active="مفعّل" -Basic.Stats.DroppedFrames="الاطارات المفقودة (بسبب الشبكة)" +Basic.Stats.DroppedFrames="الإطارات المفقودة (بسبب الشبكة)" Basic.Stats.MegabytesSent="إجمالي البيانات الصادرة" Basic.Stats.Bitrate="معدل النقل" Basic.Stats.DiskFullIn="سيمتلىء القرص خلال (تقريباً)" Basic.Stats.DiskFullIn.Text="%1 ساعات، %2 دقائق" Basic.Stats.ResetStats="إعادة تعيين الإحصاءات" ResetUIWarning.Title="هل أنت متأكد أنك تريد إعادة تعيين واجهة المستخدم ؟" -ResetUIWarning.Text="إعادة تعيين واجهة المستخدم سيخفي المربعات الاضافية. سيتوجب عليك إظهارها من قائمة \"عرض\" اذا اردت ذلك.\n\nهل أنت متأكد انك تريد إعادة تعيين واجهة المستخدم ؟" +ResetUIWarning.Text="إعادة تعيين واجهة المستخدم سيخفي المربعات الاضافية. سيتوجب عليك إظهارها من قائمة \"عرض\" إذا اردت ذلك.\n\nهل أنت متأكد انك تريد إعادة تعيين واجهة المستخدم ؟" Updater.Title="تحديث جديد متوفر" Updater.Text="هناك إصدار جديد متوفر:" Updater.UpdateNow="حدث الآن" @@ -249,7 +258,7 @@ Updater.RepairConfirm.Title="تأكيد فحص السلامة" Updater.RepairConfirm.Text="بدأ فحص السلامة سوف يقوم بمسح تثبيت OBS الخاص بك للفساد وإعادة تحميل الملفات المعطلة أو المعدلة. قد يستغرق هذا لحظات.\n\n هل ترغب في المتابعة؟" Updater.FailedToLaunch="فشل في تشغيل التحديث" -QuickTransitions.SwapScenes="التبديل بين مشهدي المعاينة و الاخراج بعد عملية الانتقال" +QuickTransitions.SwapScenes="التبديل بين مشهدي المعاينة و الإخراج بعد عملية الانتقال" QuickTransitions.SwapScenesTT="مقايضة المعاينة ومشاهد البرنامج بعد الانتقال (إذا كان المشهد الأصلي للبرنامج لا يزال موجوداً).\nهذا لن يلغي أي تغييرات قد تكون أجريت على المشهد الأصلي للبرنامج." QuickTransitions.DuplicateScene="استنساخ المشهد" QuickTransitions.DuplicateSceneTT="عند تحرير نفس المشهد، يسمح بتحرير تحول/رؤية المصادر دون تعديل ناتج البرنامج.\nلتحرير خصائص المصادر دون تعديل إخراج البرنامج، قم بتفعيل 'تكرار المصادر'.\nسيؤدي تغيير هذه القيمة إلى إعادة تعيين مشهد البرنامج الحالي (إذا كان لا يزال موجودا)." @@ -273,7 +282,7 @@ Undo.Item.Undo="تراجع %1" Undo.Item.Redo="إعادة %1" Undo.Sources.Multi="حذف %1 من المصادر" -Undo.Filters="تغییرات الفیلتر فی '%1'" +Undo.Filters="تغییرات الفلتر فی '%1'" Undo.Filters.Paste.Single="لصق الفلتر '%1' إلى '%2'" Undo.Filters.Paste.Multiple="نسخ الفلاتر من '%1' إلى '%2'" Undo.Transform="تحويل المصدر (المصادر) في '%1'" @@ -286,8 +295,8 @@ Undo.Transform.StretchToScreen="مد لمناسبة الشاشة في '%1'" Undo.Transform.Center="مَركِز في الشاشة في '%1'" Undo.Transform.VCenter="مَركِز في الشاشة عموديًا في '%1'" -Undo.Transform.HCenter="مَركِز في الشاشة افقيًا في '%1'" -Undo.Volume.Change="تغیير مستوي الصوت فی '%1'" +Undo.Transform.HCenter="مَركِز في الشاشة أفقيًا في '%1'" +Undo.Volume.Change="تغيير مستوي الصوت فی '%1'" Undo.Volume.Mute="كتم صوت '%1'" Undo.Volume.Unmute="إلغاء كتم صوت '%1'" Undo.Balance.Change="تغيير موازنة الصوت لـ '%1'" @@ -310,7 +319,7 @@ Undo.PasteSource="لصق المصدر/المصادر في '%1'" Undo.PasteSourceRef="لصق مرجع/مراجع المصدر في '%1'" Undo.GroupItems="تجميع العناصر في '%1'" -TransitionNameDlg.Text="Text" +TransitionNameDlg.Text="يرجي إدخال اسم تأثير الإنتقال Text" TransitionNameDlg.Title="اسم تأثير الإنتقال" TitleBar.SafeMode="الوضع الآمن" TitleBar.PortableMode="الوضع المحمول" @@ -323,13 +332,11 @@ ConfirmStart.Title="بدء البث ؟" ConfirmStart.Text="هل انت متأكد انك تريد بدء البث ؟" ConfirmStop.Title="ايقاف البث؟" -ConfirmStop.Text="هل أنت متأكد انك تريد ايقاف البث؟" +ConfirmStop.Text="هل أنت متأكد انك تريد إيقاف البث؟" ConfirmStopRecord.Title="إيقاف التسجيل؟" ConfirmStopRecord.Text="هل أنت متيقِّن انك تريد إيقاف التسجيل؟" ConfirmBWTest.Title="بدء فحص سرعة التدفق؟" ConfirmBWTest.Text="OBS لديك معد في وضع فحص تدفق السرعة. هذا الوضع يسمح لك بفحص الشبكة بدون ان تظهر في بث مباشر على قناتك. بمجرد انتهاء الفحص يجب عليك تعطيله لكي يستطيع مشاهدوك من رؤية البث.\n\nهل تريد الاستمرار ؟" -ConfirmExit.Title="الخروج من OBS ؟" -ConfirmExit.Text="OBS حالياً نشط، كافة عمليات البث/التسجيلات سيتم إيقافها، هل أنت متأكد من رغبتك في الخروج ؟" ConfirmRemove.Title="تأكيد الإزالة" ConfirmRemove.Text="هل أنت متأكد من رغبتك في إزالة '%1'؟" ConfirmRemove.TextMultiple="هل أنت متاكد انك تريد حذف هذه ال%1 عناصر؟" @@ -366,6 +373,17 @@ Output.NoBroadcast.Text="تحتاج إلى إعداد بث قبل أن تتمكن من بدء البث." Output.BroadcastStartFailed="فشل في بدء البث" Output.BroadcastStopFailed="فشل في إيقاف البث" +LogUploadDialog.Title="تم رفع ملف سجل OBS Studio" +LogUploadDialog.Labels.PrivacyNotice="يرجى قراءة <a href=’https://obsproject.com/privacy-policy‘>سياسة الخصوصية</a> والقسم المتعلق برفع الملفات قبل رفع أي ملفات." +LogUploadDialog.Labels.Progress="جاري رفع السجل. إنتظر من فضلك..." +LogUploadDialog.Labels.Description.AppLog="تم تحميل تقرير الأعطال الخاص بك. يمكنك الآن مشاركة عنوان URL لأغراض المساعدة او تصحيح الأخطاء." +LogUploadDialog.Labels.Description.CrashLog="تم تحميل تقرير الأعطال الخاص بك. يمكنك الآن مشاركة عنوان URL لأغراض تصحيح الأخطاء." +LogUploadDialog.Buttons.ConfirmUpload="رفع" +LogUploadDialog.Buttons.CopyURL="نسخ عنوان URL للسجل" +LogUploadDialog.Buttons.AnalyzeURL="حلل ملف السجل" +LogUploadDialog.Buttons.RetryButton="إعادة المحاولة" +LogUploadDialog.Errors.Template="\حدث خطأ أثناء محاولة رفع الملف:\n\n%1" +LogUploadDialog.Errors.NoLogFile="لم يتم العثور على ملف للتحميل أو كان الملف فارغًا." Remux.SourceFile="تسجيل OBS" Remux.TargetFile="الملف الهدف" Remux.Remux="تحويل الصيغة" @@ -382,7 +400,7 @@ Remux.FileExists="الملفات التالية موجودة فعليا. هل ترغب في استبدالها؟" Remux.ExitUnfinishedTitle="تقدم عملية التحويل" Remux.ExitUnfinished="إيقاف عميلة التحويل الآن قد تجعل الملف غير قابل للاستخدام.\n هل أنت متأكد أنك تريد إيقاف عملية التحويل؟" -Remux.HelpText="إسقط الملفات في هذه النافذة للremux، أو حدد خلية \"تسجيل OBS\" فارغة للتصفح من اجل ملف." +Remux.HelpText="أسفط الملفات في هذه النافذة ل remux، أو حدد خلية \"تسجيل OBS\" فارغة للتصفح من اجل ملف." Remux.NoFilesAddedTitle="لم يتم إضافة ملف remuxing" Remux.NoFilesAdded="لم يتم إضافة ملف إلى remux. قم بإسقاط مجلد يحتوي على ملف فيديو واحد أو أكثر." MissingFiles="الملفات المفقودة" @@ -440,7 +458,7 @@ BlendingMode="وضع المزج" BlendingMode.Normal="عادي" BlendingMode.Additive="أضف" -BlendingMode.Subtract="خصم" +BlendingMode.Subtract="طرح" BlendingMode.Screen="الشاشة" BlendingMode.Multiply="اضرب" BlendingMode.Lighten="تفتيح" @@ -460,7 +478,7 @@ Basic.Main.DefaultSceneName.Text="المشهد %1" Basic.Main.AddSceneCollection.Title="إضافة مجموعة مشاهد" Basic.Main.AddSceneCollection.Text="الرجاء إدخال اسم لمجموعة مشهد" -Basic.Main.RenameSceneCollection.Title="اعادة تسمية مجموعة مشاهد" +Basic.Main.RenameSceneCollection.Title="إعادة تسمية مجموعة مشاهد" Basic.Main.RemigrateSceneCollection.Title="تحديث دِقَّة مجموعة المشاهد" Basic.Main.RemigrateSceneCollection.Text="هل تريد تحديث دِقَّة مجموعة المشاهد \"%1\" لمطابقة دِقَّة اللوحة لملف التعريف الحالي البالغة %2x%3؟" Basic.Main.RemigrateSceneCollection.CannotMigrate.Active="لا يمكن تحديث دِقَّة مجموعة المشاهد بينما المخرجات مفعلة." @@ -475,7 +493,7 @@ Basic.Main.MixerRename.Text="الرجاء إدخال اسم للمصدر الصوتي" Basic.Main.PreviewDisabled="المعاينة تم تعطيلها" Basic.SourceSelect="إنشاء/تحديد المصدر" -Basic.SourceSelect.CreateNew="انشاء جديد" +Basic.SourceSelect.CreateNew="إنشاء جديد" Basic.SourceSelect.AddExisting="إضافة عنصر موجود" Basic.SourceSelect.AddVisible="جعل المصدر ظاهراً" Basic.Main.Sources.Visibility="الرؤية" @@ -500,7 +518,7 @@ Basic.PropertiesView.FPS.Simple="صيغ مبسطة لعدد الإطارات/ث" Basic.PropertiesView.FPS.Rational="قيمة FPS كسرية" Basic.PropertiesView.FPS.ValidFPSRanges="مقاييس FPS صحيحة:" -Basic.PropertiesView.UrlButton.Text="فتح هذا الرابط في متصفحك الافتراضي ؟" +Basic.PropertiesView.UrlButton.Text="فتح هذا الرابط في متصفحك الافتراضي؟" Basic.PropertiesView.UrlButton.Text.Url="الرابط: %1" Basic.PropertiesView.UrlButton.OpenUrl="فتح الرابط" Basic.InteractionWindow="التفاعل مع '%1'" @@ -536,7 +554,7 @@ Basic.TransformWindow.Bounds="حجم المربع المحيط" Basic.TransformWindow.BoundsWidth="عرض المربع المحيط" Basic.TransformWindow.BoundsHeight="طول المربع المحيط" -Basic.TransformWindow.CropToBounds="قرطف إلى الصندوق المحيط" +Basic.TransformWindow.CropToBounds="قص إلى المربع المحيط" Basic.TransformWindow.Crop="قطع" Basic.TransformWindow.CropLeft="قطع لليسار" Basic.TransformWindow.CropRight="قطع لليمين" @@ -578,11 +596,12 @@ Basic.Main.PauseRecording="إيقاف التسجيل مؤقتا" Basic.Main.UnpauseRecording="إكمال التسجيل" Basic.Main.SplitFile="تقسيم ملف التسجيل" +Basic.Main.AddChapterMarker="إضافة مؤشر للفصل يدعم فقط صيغ MP4/MOV الهجينة" Basic.Main.StoppingRecording="إيقاف التسجيل..." Basic.Main.StopReplayBuffer="إيقاف الخزن المؤقت لإعادة العرض" Basic.Main.StoppingReplayBuffer="يتم ايقاف الخزن المؤقت..." Basic.Main.SetupBroadcast="إدارة البث" -Basic.Main.StopStreaming="ايقاف البث" +Basic.Main.StopStreaming="إيقاف البث" Basic.Main.StopBroadcast="إنهاء البث" Basic.Main.AutoStopEnabled="(إيقاف تلقائي)" Basic.Main.StoppingStreaming="إيقاف البث..." @@ -666,7 +685,7 @@ Basic.MainMenu.Profile="الملف الشخصي (&P)" Basic.MainMenu.Profile.Import="استيراد ملف تعريف" Basic.MainMenu.Profile.Export="تصدير الملف الشخصي" -Basic.MainMenu.SceneCollection.Import="أِضافة مجموعة مَشاهد" +Basic.MainMenu.SceneCollection.Import="إضافة مجموعة مَشاهد" Basic.MainMenu.SceneCollection.Export="تصدير مجموعة ألمَشاهد" Basic.MainMenu.SceneCollection.Remigrate="إعادة الضبط الدِّقَّة الأساسية" Basic.MainMenu.SceneCollection.Migrate="تعيين الدِّقَّة الأساسية" @@ -675,7 +694,7 @@ Basic.MainMenu.Help="مساعدة (&H)" Basic.MainMenu.Help.HelpPortal="بوابة &المساعدة" Basic.MainMenu.Help.Website="زيارة الموقع" -Basic.MainMenu.Help.Discord="انضم إلى خادم الديسكورد" +Basic.MainMenu.Help.Discord="انضم إلى سيرفر الديسكورد" Basic.MainMenu.Help.WhatsNew="ما الجديد" Basic.MainMenu.Help.Logs="ملفات السجل (&L)" Basic.MainMenu.Help.Logs.ShowLogs="&عرض السجلات" @@ -685,11 +704,11 @@ Basic.MainMenu.Help.ReleaseNotes="ملاحظات الإصدار" Basic.MainMenu.Help.CheckForUpdates="التحقق من وجود تحديثات" Basic.MainMenu.Help.Repair="التحقق من سلامة الملفات" -Basic.MainMenu.Help.RestartSafeMode="اعادة تشغيل في الوضع الامن" -Basic.MainMenu.Help.RestartNormal="اعادة تشغيل في الوضع الامن" +Basic.MainMenu.Help.RestartSafeMode="إعادة تشغيل في الوضع الأمن" +Basic.MainMenu.Help.RestartNormal="إعادة تشغيل في الوضع العادي" Basic.MainMenu.Help.CrashLogs="تقارير &الأعطال" Basic.MainMenu.Help.CrashLogs.ShowLogs="&عرض تقارير الأعطال" -Basic.MainMenu.Help.CrashLogs.UploadLastLog="رفع &تقرير الكراش السابق" +Basic.MainMenu.Help.CrashLogs.UploadLastLog="رفع تقرير العطل السابق" Basic.MainMenu.Help.About="&حول" Basic.Settings.ProgramRestart="يجب إعادة تشغيل البرنامج حتى تصبح الإعدادات نافذة المفعول." Basic.Settings.ConfirmTitle="تأكيد التغييرات" @@ -729,8 +748,8 @@ Basic.Settings.General.CloseExistingProjectors="الحد من عرض ملء الشاشة لكل شاشة" Basic.Settings.General.Preview="المعاينة" Basic.Settings.General.OverflowHidden="إخفاء خلفية المعاينة" -Basic.Settings.General.OverflowAlwaysVisible="اظهار خلفية المعاينة دائماََ" -Basic.Settings.General.OverflowSelectionHidden="اظهار خلفية المعاينة حتى عندما يكون المصدر ظاهراََ" +Basic.Settings.General.OverflowAlwaysVisible="إظهار خلفية المعاينة دائماََ" +Basic.Settings.General.OverflowSelectionHidden="إظهار خلفية المعاينة حتى عندما يكون المصدر ظاهراََ" Basic.Settings.General.Importers="الموارد" Basic.Settings.General.AutomaticCollectionSearch="البحث عن المواقع المعروفة لمجموعات المشاهد عند الاستيراد" Basic.Settings.General.SwitchOnDoubleClick="الانتقال إلى المشهد عند النقر المزدوج" @@ -753,7 +772,7 @@ Basic.Settings.General.MultiviewLayout.25Scene="المشاهد فقط (25 مشاهد)" Basic.Settings.General.ChannelName.stable="مستقر" Basic.Settings.General.ChannelDescription.stable="أحدث إصدار مستقر" -Basic.Settings.General.ChannelName.beta="بيتاس / ترك المرشحين" +Basic.Settings.General.ChannelName.beta="الإصدارات التجريبية / الإصدارات المرشحة" Basic.Settings.General.ChannelDescription.beta="إصدارات ما قبل الإصدار غير مستقرة" Basic.Settings.Appearance="المظهر" Basic.Settings.Appearance.General="الإعدادات العامة" @@ -766,6 +785,7 @@ Basic.Settings.Appearance.Compact="مضغوط" Basic.Settings.Appearance.Normal="عادي" Basic.Settings.Appearance.Comfortable="مريح" +Basic.Settings.Appearance.OptionsWarning="بعض تخصيصات المظهر غير متوفرة لهذا النمط" Basic.Settings.Stream="بث" Basic.Settings.Stream.Destination="وجهة" Basic.Settings.Stream.Custom.UseAuthentication="استخدام المصادقة" @@ -785,8 +805,8 @@ Basic.Settings.Stream.IgnoreRecommended="تجاهل توصيات إعداد خدمات البث" Basic.Settings.Stream.IgnoreRecommended.Warn.Title="تجاوز الإعدادات الموصى بها" Basic.Settings.Stream.IgnoreRecommended.Warn.Text="تحذير: تجاهل قيود الخدمة قد يؤدي إلى تدهور جودة البث أو منعك من البث.\n\nالمتابعة؟" -Basic.Settings.Stream.Recommended.MaxVideoBitrate="الحد الأقصى للفيديو: %1 كيلو بايت" -Basic.Settings.Stream.Recommended.MaxAudioBitrate="أقصى معدل للصوت: %1 كيلو بايت" +Basic.Settings.Stream.Recommended.MaxVideoBitrate="الحد الأقصى للفيديو: %1 كيلوبايت" +Basic.Settings.Stream.Recommended.MaxAudioBitrate="أقصى معدل للصوت: %1 كيلوبايت" Basic.Settings.Stream.Recommended.MaxResolution="أقصى دقة : %1" Basic.Settings.Stream.Recommended.MaxFPS="الحد الأقصى من FPS: %1" Basic.Settings.Stream.SpecifyCustomServer="حدد خادما مخصصا..." @@ -800,12 +820,14 @@ Basic.Settings.Stream.MultitrackVideoConfigOverride="تجاوز التكوين (JSON)" Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="تمكين تجاوز التكوين" Basic.Settings.Stream.MultitrackVideoLabel="فيديو متعدد المسارات" +Basic.Settings.Stream.MultitrackVideoExtraCanvas="لوحات إضافية" Basic.Settings.Stream.AdvancedOptions="خيارات متقدمة" Basic.Settings.Output="المخرج" Basic.Settings.Output.Format="صيغة التسجيل" Basic.Settings.Output.Format.MKV="فيديو ماتروسكا (.mkv)" Basic.Settings.Output.Format.MP4="MPEG-4 (mp4)" -Basic.Settings.Output.Format.hMP4="MP4 الهجين BETA (.mp4)" +Basic.Settings.Output.Format.hMP4="MP4 الهجين (.mp4)" +Basic.Settings.Output.Format.hMOV="MOV الهجين (.mov)" Basic.Settings.Output.Format.fMP4="MP4 مجزأ (.mp4)" Basic.Settings.Output.Format.fMOV="MOV مجزأ (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="MOV المجزأ يكتب التسجيل في أجزاء ولا يتطلب نفس الصيغة النهائية لملفات MOV التقليدية.\nيضمن هذا بقاء الملف قابلاً للتشغيل حتى في حالة مقاطعة الكتابة على القرص ، على سبيل المثال ، نتيجة الموت الزرقاء أو فقدان الطاقة.\n\nقد لا يكون هذا متوافقًا مع كافة المشغلات والمحررين. استخدم File → Remux Recordings لتحويل الملف إلى تنسيق أكثر توافقًا إذا لزم الأمر." @@ -856,12 +878,12 @@ Basic.Settings.Output.Simple.Encoder.Hardware.Apple.HEVC="عتاد (أبل، H.)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="البرنامج (x264 منخفض استخدام المعالج مسبقاً، يزيد حجم الملف)" Basic.Settings.Output.Simple.Codec.AAC.Default="AAC(الافتراضي)" -Basic.Settings.Output.Simple.TwitchVodTrack="تويتر مسار VOD (استخدم المسار 2)" +Basic.Settings.Output.Simple.TwitchVodTrack="تويتش مسار VOD (استخدم المسار 2)" Basic.Settings.Output.Simple.RecAudioTrack="المسار الصوتي" Basic.Settings.Output.Warn.EnforceResolutionFPS.Title="دقة / معدل إطار غير متوافق" Basic.Settings.Output.Warn.EnforceResolutionFPS.Msg="خدمة البث هذه لا تدعم الدِّقَّة الحالية أو عدد الإطار. سيتم التغيير إلى أقرب قيمة متوافقة:\n\n%1\n\nهل تريد المتابعة؟" Basic.Settings.Output.Warn.EnforceResolutionFPS.Resolution="الدقة: %1" -Basic.Settings.Output.Warn.EnforceResolutionFPS.FPS="الاطارات لكل ثانية: %1" +Basic.Settings.Output.Warn.EnforceResolutionFPS.FPS="إلاطارات لكل ثانية: %1" Basic.Settings.Output.Warn.ServiceCodecCompatibility.Title="برنامَج التشفير غير متوافق" Basic.Settings.Output.Warn.ServiceCodecCompatibility.Msg="خدمة البث \"%1\" لا تدعم برنامَج التشفير \"%2\". سوف يتم تغيير برنامَج التشفير إلى \"%3\".\n\nهل ترغب في المتابعة؟" Basic.Settings.Output.Warn.ServiceCodecCompatibility.Msg2="خدمة البث \"%1\" لا تدعم برنامَج التشفير \"%2\" و \"%3\". سوف يتم تغيير برنامَج التشفير إلى \"%4\" و \"%5\".\n\nهل ترغب في المتابعة؟" @@ -872,13 +894,13 @@ Basic.Settings.Output.MaxRetries="أقصى عدد للمحاولات" Basic.Settings.Output.Advanced="تمكين إعدادات الترميز المخصصة (متقدم)" Basic.Settings.Output.EncoderPreset="وضع الترميز" -Basic.Settings.Output.EncoderPreset.ultrafast="%1 (استخدام منخفض للمعالجة، أدنى جودة)" +Basic.Settings.Output.EncoderPreset.ultrafast="%1 (استخدام منخفض للمعالج، أدنى جودة)" Basic.Settings.Output.EncoderPreset.veryfast="%1 (افتراضي) (متوسط استخدام وحدة المعالجة المركزية، الجودة القياسية)" Basic.Settings.Output.EncoderPreset.fast="%1 (استخدام عالي المعالجة، جودة عالية)" -Basic.Settings.Output.CustomEncoderSettings="اعدادات الترميز المخصصه" -Basic.Settings.Output.CustomMuxerSettings="اعدادات المكسر المخصصة" -Basic.Settings.Output.NoSpaceFileName="انشاء اسم الملف بدون مسافة" -Basic.Settings.Output.Adv.Rescale="اعادة ضبط القياسات المخرجه" +Basic.Settings.Output.CustomEncoderSettings="إعدادات الترميز المخصصة" +Basic.Settings.Output.CustomMuxerSettings="إعدادات المكسر المخصصة" +Basic.Settings.Output.NoSpaceFileName="إنشاء اسم الملف بدون مسافة" +Basic.Settings.Output.Adv.Rescale="إعادة ضبط قياسات المخرج" Basic.Settings.Output.Adv.Rescale.Disabled="معطل" Basic.Settings.Output.Adv.AudioTrack="مقطع صوتي" Basic.Settings.Output.Adv.Streaming="البث" @@ -938,7 +960,7 @@ FilenameFormatting.TT.CCYY="السنة, اربع خانات" FilenameFormatting.TT.YY="السنة, أخر خانتين(00-99)" FilenameFormatting.TT.MM="الشهر كرقم (01-12)" -FilenameFormatting.TT.DD="يوم من الشهر، بدون مبطن (01-31)" +FilenameFormatting.TT.DD="يوم من الشهر، دون مبطن (01-31)" FilenameFormatting.TT.hh="ضبط الوقت في صيغة 24 ساعة (00-23)" FilenameFormatting.TT.mm="الدقيقة(00-59)" FilenameFormatting.TT.ss="الثانية(00-59)" @@ -975,7 +997,8 @@ Basic.Settings.Video.Numerator="البسط" Basic.Settings.Video.Denominator="قاسم" Basic.Settings.Video.Renderer="العارض" -Basic.Settings.Video.InvalidResolution="قيمة الأبعاد غير صالحة. يجب أن يكون العرض x الطول (مثال. 1920 × 1080)" +Basic.Settings.Video.Renderer.Experimental="%1 (تجريبي)" +Basic.Settings.Video.InvalidResolution="قيمة الأبعاد غير صالحة. يجب أن يكون العرضxالطول (مثال.1920x1080)" Basic.Settings.Video.CurrentlyActive="إخراج الفيديو نشط حاليا. الرجاء إيقاف كل الإخراجات لتغيير إعدادات الفيديو." Basic.Settings.Video.DownscaleFilter.Bilinear="ثنائي الخط (الأسرع، ولكن ضبابية إذا تم التحجيم)" Basic.Settings.Video.DownscaleFilter.Bicubic="ثنائي المكعب (التحجيم الشفقي، 16 عينة)" @@ -1099,7 +1122,7 @@ Basic.Settings.Hotkeys.PleaseWait="جاري تحميل اختصارات المفاتيح الرجاء الانتظار..." Basic.Hotkeys.SelectScene="التبديل إلى المشهد" Basic.SystemTray.Show="إظهار" -Basic.SystemTray.Hide="اخفاء" +Basic.SystemTray.Hide="إخفاء" Basic.SystemTray.Message.Reconnecting="تم قطع الاتصال. جاري إعادة الاتصال..." Hotkeys.Insert="إدراج" Hotkeys.Delete="حذف" @@ -1148,7 +1171,7 @@ OutputWarnings.MP4Recording="تحذير: التسجيلات المحفوظة في MP4/MOV سوف تكون غير قابلة للاسترداد إذا لم يكن من الممكن الانتهاء من الملف (على سبيل المثال نتيجة ل BSOD، فقدان الطاقة، إلخ). إذا كنت ترغب في تسجيل مسارات صوتية متعددة تفكر في استخدام MKV وإعادة تعديل التسجيل إلى MP4/MOV بعد الانتهاء (الملف → Remux التسجيلات)" OutputWarnings.CannotPause="تحذير: لا يمكن إيقاف التسجيلات مؤقتاً إذا تم تعيين مشفر التسجيل إلى \"(استخدام مشفر البث)\"" OutputWarnings.CodecIncompatible="تمت إعادة تعيين اختيار برنامج ترميز الصوت أو الفيديو بسبب عدم التوافق. الرجاء تحديد برنامج تشفير متوافق من القائمة." -CodecCompat.Incompatible="(غير متوافق مع٪ 1)" +CodecCompat.Incompatible="(غير متوافق مع%1)" CodecCompat.CodecPlaceholder="حدد المُرمِّز..." CodecCompat.ContainerPlaceholder="أختيار الصيغة..." CodecCompat.CodecMissingOnExit.Title="لم يتم تحديد مُرمِّز" @@ -1160,7 +1183,7 @@ NoSources.Title="لا يوجد مصدر" NoSources.Text="يبدو أنك لم تضف أي مصادر فيديو حتى الآن، لذلك ستبث شاشة سوداء فقط. هل أنت متأكد من أنك تريد القيام بهذا؟" NoSources.Text.AddSource="يمكنك إضافة مصادر بالنقر على الرمز + تحت مربع المصادر في النافذة الرئيسية في أي وقت." -NoSources.Label="لا يوجد لديك اي مصادر.\nاضغط على اشارة الـ+ في الأسفل,\nأو انقر هنا بالزر الأيمن للفأرة لإضافة واحد." +NoSources.Label="لا يوجد لديك اي مصادر.\nاضغط على إشارة الـ+ في الأسفل,\nأو انقر هنا بالزر الأيمن للفأرة لإضافة واحد." ChangeBG="تعيين لون" CustomColor="لون مخصص" BrowserSource.EnableHardwareAcceleration="تمكين تسارع الجهاز المصدر للمتصفح" @@ -1276,6 +1299,7 @@ FailedToStartStream.MissingConfigURL="لا يوجد عنوان URL للتكوين متاح للخدمة الحالية" FailedToStartStream.NoCustomRTMPURLInSettings="لم يتم تحديد عنوان URL RTMP المخصص" FailedToStartStream.InvalidCustomConfig="تكوين مخصص غير صالح" +FailedToStartStream.MissingCanvas="لا يوجد لوحة إضافية مهيئة" FailedToStartStream.FailedToCreateMultitrackVideoService="أخفق إنشاء خدمة فيديو متعددة المسارات" FailedToStartStream.FailedToCreateMultitrackVideoOutput="فشل إنشاء مُخرَج RTMP لفيديو متعدد المسارات" FailedToStartStream.EncoderNotAvailable="NVENC غير متوفر.\n\nفشل في العثور على نوع المُرمِّز '%1'" @@ -1289,9 +1313,10 @@ FailedToStartStream.WarningRetryNonMultitrackVideo="\N<br><br>\nهل تريد مواصلة البث بدون %1؟" FailedToStartStream.WarningRetry="\N<br><br>\nهل تريد مواصلة البث؟" FailedToStartStream.MissingEncoderConfigs="لم يتضمن تكوين الذهاب المباشر تكوينات المُرمِّز" +FailedToStartStream.InvalidEncoderConfig="تضمنت التهيئة الحية تهيئة مشفّر غير صالحة" FailedToStartStream.StatusMissingHTML="أعاد طلب الذهاب المباشر خطأ غير محدد" FailedToStartStream.NoConfigSupplied="التكوين مفقود" -MultitrackVideo.Info="يقوم %1 تلقائيا بتحسين إعداداتك لترميز وإرسال صفات فيديو متعددة. سيؤدي تحديد هذا الخيار إلى إرسال 2٪ من المعلومات حول إعداد جهاز الكمبيوتر والبرامج." +MultitrackVideo.Info="يقوم %1 تلقائيا بتحسين إعداداتك لترميز وإرسال صفات فيديو متعددة. سيؤدي تحديد هذا الخيار إلى إرسال %2 من المعلومات حول إعداد جهاز الكمبيوتر والبرامج." MultitrackVideo.IncompatibleSettings.Title="إعدادات غير متوافقة" MultitrackVideo.IncompatibleSettings.Text="%1 غير متوافق حاليا مع:\n\n%2\nلمواصلة البث مع %1، تعطيل الإعدادات غير المتوافقة:\n\n%3\nوبدء البث مرة أخرى." MultitrackVideo.IncompatibleSettings.DisableAndStartStreaming="قم بتعطيل هذا البث وابدأ البث" @@ -1299,3 +1324,11 @@ MultitrackVideo.IncompatibleSettings.AudioChannels="ليس %1 متوافق حاليا مع كون الصوت ← عام ← القنوات مضبوطا إلى ’%2‘، ’%3‘" MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="من الضروري ضبط الصوت ← عام ← القنوات إلى ’%1‘" MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="يحتاج %1 إعدادات مختلفة متعددة لـ الصوت ← عام ← القنوات" +Basic.OpenPluginManager="مدير المكونات الإضافية" +PluginManager="مدير المكونات الإضافية" +PluginManager.Restart="يجب إعادة تشغيل OBS Studio لتطبيق تغييرات المكون الإضافي" +PluginManager.MissingPlugin="لم يتم العثور على المكون الإضافي" +PluginManager.Section.Discover="تصفُح" +PluginManager.Section.Manage="مُثبت" +PluginManager.Section.Updates="التحديثات" +PluginManager.Section.Manage.Title="إدارة المكونات الإضافية المُفعلة"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/az-AZ.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/az-AZ.ini
Changed
@@ -1,721 +1,1297 @@ Language="Azərbaycanca" OK="Oldu" Apply="Tətbiq et" -Cancel="İmtina" +Cancel="Ləğv et" Close="Bağla" Save="Saxla" -Discard="Ləğv et" -Disable="Sıradan çıxart" -Yes="Hə" +Discard="İmtina et" +Disable="Deaktiv et" +Yes="Bəli" No="Xeyr" Add="Əlavə et" -Remove="Çıxart" -Rename="Yenidən adlandır" -Interact="Qarşılıqlı təsir" +Remove="Sil" +Rename="Adını Dəyiş..." +Interact="Qarşılıqlı Əlaqə" Filters="Filtrlər" Properties="Xüsusiyyətlər" -MoveUp="Yuxarı Köçür" -MoveDown="Aşağı Köçür" -Settings="Tənzimləmələr" +MoveUp="Yuxarı Keçir" +MoveDown="Aşağı Keçir" +Settings="Parametrlər" Display="Ekran" Name="Ad" Exit="Çıxış" -Mixer="Səs mikseri" +Mixer="Səs Mikseri" Browse="Gözdən keçir" -DroppedFrames="Buraxılan Kadrlar %1 (%2%)" +DroppedFrames="Buraxılmış Kadrlar %1 (%2%)" +Projector.Open.Program="Proqram Proyektorunu Aç" +Projector.Open.Preview="Ön Baxış Proyektorunu Aç" +Projector.Open.Scene="Səhnə Proyektorunu Aç" +Projector.Open.Source="Mənbə Proyektorunu Aç" +Projector.Open.Multiview="Çoxlu Görünüşü Aç" +Projector.Display="Ekran: %1" +Projector.Window="Yeni ayrıca pəncərə" +Projector.Title="Proyektor" +Projector.Title.Scene="Səhnə: %1" +Projector.Title.Source="Mənbə: %1" +Projector.Title.Multiview="Çoxlu Görünüş" +Projector.ResizeWindowToContent="Pəncərəni məzmuna sığdır" Clear="Təmizlə" -Revert="Geri qaytar" +Revert="Geri Qaytar" Show="Göstər" Hide="Gizlət" UnhideAll="Hamısını Göstər" Untitled="Adsız" -New="Yeni" -Duplicate="Çoxalt" -Enable="Fəallaşdır" -DisableOSXVSync="macOS V-Sync-i sıradan çıxart" -ResetOSXVSyncOnExit="macOS V-Sync-i Çıxışda Sıfırla" -HighResourceUsage="Kodlama həddindən artıq yükləndi! Video tənzimləmələrini azaltmağı və ya daha sürətli kodlama ön tənzimini istifadə etməyi düşünün." +New="Yeni..." +Duplicate="Çoxalt..." +Enable="Aktiv et" +DisableOSXVSync="macOS V-Sync-i Deaktiv et" +ResetOSXVSyncOnExit="Çıxışda macOS V-Sync-i Sıfırla" +HighResourceUsage="Kodlaşdırma həddindən artıq yükləndi! Video parametrlərini azaltmağı və ya daha sürətli kodlaşdırma ilkin sazlamasından istifadə etməyi düşünün." Transition="Keçid" QuickTransitions="Cəld Keçidlər" -FadeToBlack="Qara rəngə solma" +FadeToBlack="Qaraya Tədrici Dəyiş" Left="Sol" -Right="Sa" +Right="Sağ" Top="Üst" Bottom="Alt" Reset="Sıfırla" Hours="Saat" Minutes="Dəqiqə" Seconds="Saniyə" -Deprecated="Tükəndi" -ReplayBuffer="Təkrar Oynatma Buferi" +Deprecated="Köhnəlmiş" +ReplayBuffer="Təkrar Oxutma Buferi" Import="İdxal et" Export="İxrac et" Copy="Kopyala" Paste="Yapışdır" PasteReference="Yapışdır (İstinad)" PasteDuplicate="Yapışdır (Çoxalt)" -RemuxRecordings="Qeydləri remux et" +RemuxRecordings="Qeydə Alınmışları Yenidən Birləşdir" Next="Növbəti" Back="Geri" -Defaults="İlkin" -RestoreDefaults="İlkin" -HideMixer="Mikserdə gizlət" -TransitionOverride="Keçidə əhəmiyyət vermə" -ShowTransition="Keçidi göstər" -HideTransition="Keçidi gizlət" +Defaults="İlkin təyin olunanlar" +RestoreDefaults="İlkin təyin olunanlar" +HideMixer="Mikserdə Gizlət" +TransitionOverride="Keçid Əvəzetməsi" +ShowTransition="Keçidi Göstər" +HideTransition="Keçidi Gizlət" None="Heç biri" -StudioMode.Preview="Önbaxış" +StudioMode.Preview="Ön Baxış" StudioMode.Program="Proqram" -StudioMode.PreviewSceneName="Önbaxış: Səhnə" +StudioMode.PreviewSceneName="Ön Baxış: %1" StudioMode.ProgramSceneName="Proqram: %1" -ShowInMultiview="Çoxlu Ekranda Göstər" -VerticalLayout="Şaquli Düzüm" +ShowInMultiview="Çoxlu Görünüşdə Göstər" +VerticalLayout="Şaquli Tərtibat" Group="Qrup" -DoNotShowAgain="Təkrar göstərmə" -Default="(İlkin)" +DoNotShowAgain="Bir daha göstərmə" +Default="(İlkin təyin olunan)" Calculating="Hesablanır..." -Fullscreen="Tam ekran" +Fullscreen="Tam Ekran" Windowed="Pəncərəli" RefreshBrowser="Təzələ" -AspectRatio="Əmsal nisbəti <b>%1:%2</b>" -LockVolume="Səs həcmini kilidlə" -LogViewer="Jurnal bax" +AspectRatio="Tərəf Nisbəti <b>%1:%2</b>" +LockVolume="Səs Ucalığını Kilidlə" +LogViewer="Jurnal Görüntüləyicisi" ShowOnStartup="Başlanğıcda göstər" OpenFile="Faylı aç" +AddScene="Səhnə Əlavə et" AddSource="Mənbə Əlavə et" -RemoveScene="Seçilən səhnəni sil" -RemoveSource="Seçilən səhnələri sil" -MoveSceneUp="Səhnəni yuxari köçür" -MoveSceneDown="Səhnəni aşağı köçür" -MoveSourceUp="Mənbələri yuxarı köçür" -MoveSourceDown="Mənbələri aşağı köçür" -SourceProperties="Mənbə özəlliklərini aç" -SourceFilters="Mənbə filtirlərini aç" -MixerToolbarMenu="Səs Düzənləyici" -SceneFilters="Səhnə Süzgəclərini Aç" +RemoveScene="Seçilmiş Səhnəni Sil" +RemoveSource="Seçilmiş Mənbə(lər)i Sil" +MoveSceneUp="Səhnəni Yuxarı Keçir" +MoveSceneDown="Səhnəni Aşağı Keçir" +MoveSourceUp="Mənbə(lər)i Yuxarı Keçir" +MoveSourceDown="Mənbə(lər)i Aşağı Keçir" +SourceProperties="Mənbə Xüsusiyyətlərini Aç" +SourceFilters="Mənbə Filtrlərini Aç" +MixerToolbarMenu="Səs Mikseri Menysu" +SceneFilters="Səhnə Filtrlərini Aç" List="Siyahı" Grid="Tor" Automatic="Avtomatik" -PluginsFailedToLoad.Title="Qoşmanı Yükləmə Səhvi" -PluginsFailedToLoad.Text="Aşağıdakı OBS qoşmaları yüklənə bilmədi:\n\n%1\nLütfən, bu qoşmaları yeniləyin ya da silin." +ComingSoon="Tezliklə " +PluginsFailedToLoad.Title="Plagin Yükləmə Xətası" +PluginsFailedToLoad.Text="Aşağıdakı OBS plaginlərini yükləmək mümkün olmadı:\n\n%1\nZəhmət olmasa, bu plaginləri güncəlləyin və ya silin." AlreadyRunning.Title="OBS artıq işləyir" -AlreadyRunning.Text="OBS artıq işləyir! Bunu etmək istəmirsinizsə, zəhmət olmasa, yeni bir nümunəni işlətməyi sınamazdan əvvəl bütün mövcud OBS nümunələrini söndürün. OBS-i sistem sinisinə kiçilməsi üçün tənzimləmisinizsə, zəhmət olmasa işlədiyini görmək üçün yoxlayın." -AlreadyRunning.LaunchAnyway="Yenə də başlat" -SafeMode.Restart="OBS-i, Təhlükəsiz Rejimdə (üçüncü tərəf qoşmaları, skriptlər və \"WebSocket\"lər qeyri-aktiv olacaqlar) yenidən başlatmaq istəyirsinizmi?" -SafeMode.RestartNormal="OBS-i, Normal Rejimdə yenidən başlatmaq istəyirsinizmi?" -ChromeOS.Title="Dəstəklənməyən platform" -ChromeOS.Text="OBS, görünür, ChromeOS konteynerində işləyir. Bu platforma dəstəklənmir." +AlreadyRunning.Text="OBS artıq işləyir! Əgər bunu məqsədli şəkildə etməmisinizsə, zəhmət olmasa, yeni bir nüsxəni işə salmağa çalışmazdan əvvəl mövcud olan bütün OBS nüsxələrini bağlayın. Əgər OBS-i bildiriş sahəsinə kiçiltmək üçün ayarlamısınızsa, zəhmət olmasa, onun hələ də orada işlədiyini yoxlayın." +AlreadyRunning.LaunchAnyway="Hər halda Başlat" +CrashHandling.Dialog.Title="OBS Studio Çökməsi Aşkarlandı" +CrashHandling.Labels.Text="OBS Studio düzgün bağlanmadı.\n\nTəhlükəsiz Rejimdə işə salınsın (üçüncü tərəf plaginləri, skriptlər və WebSocketlər deaktivdir)?" +CrashHandling.Labels.PrivacyNotice="Siz həmçinin ən son çökmə hesabatını avtomatik olaraq OBSProject-ə yükləməyi seçə bilərsiniz.<br /><br />Zəhmət olmasa, hər hansı bir faylı yükləmədən əvvəl <a href='https://obsproject.com/privacy-policy'>Məxfilik Siyasətini</a> oxuyun və fayl yükləmələri ilə bağlı hissələrə xüsusi diqqət yetirin." +CrashHandling.Checkbox.SendReport="Məxfilik siyasətini oxudum və yüklənməsinə razılıq verirəm." +CrashHandling.Buttons.LaunchSafe="Təhlükəsiz Rejimdə İşə Sal" +CrashHandling.Buttons.LaunchNormal="Normal Rejimdə İşə Sal" +CrashHandling.Errors.UploadJSONError="Ən son çökmə jurnalını yükləməyə çalışarkən xəta baş verdi. Zəhmət olmasa, daha sonra yenidən cəhd edin." +CrashHandling.Errors.Title="Çökmə Jurnalı Yükləmə Xətası" +SafeMode.Restart="OBS-i Təhlükəsiz Rejimdə (üçüncü tərəf plaginləri, skriptlər və WebSocketlər deaktivdir) yenidən başlatmaq istəyirsiniz?" +SafeMode.RestartNormal="OBS-i Normal Rejimdə yenidən başlatmaq istəyirsiniz?" +ChromeOS.Title="Dəstəklənməyən Platforma" +ChromeOS.Text="Görünür, OBS ChromeOS konteyneri daxilində işləyir. Bu platforma dəstəklənmir." Wine.Title="Wine aşkarlandı" -Wine.Text="OBS-i, \"Wine\"da icra etmə dəstəklənmir və yazma ya da qurğu mənbələri kimi bir çox xüsusiyyətlər işləməyəcək ya da yalnız məhdud rejimdə işləyəcək.<br><br>Bunun yerinə OBS-in doğma versiyasını icra etmək tövsiyə olunur, örnək üçün <a href='https://flathub.org/apps/details/com.obsproject.Studio'>bizim Flatpak versiyamızı</a> ya da sizin əməliyyat sisteminizin paketlərini. " -DockCloseWarning.Title="Qoşulan pəncərəni bağla" -DockCloseWarning.Text="İndicə qoşulan pəncərəni bağladınız. Əgər yenidən göstərmək istəyirsinizsə, Menyu sətrindəki Bax → Yuvalar bölməsinə gedin." -ExtraBrowsers="Özəl Səyyah Yuvaları" -ExtraBrowsers.Info="Onlara ad və URL verərək dok əlavə edin,sonra dokları açmaq üçün Tətbiq et və ya Bağlaya vurun.İstədiyiniz zaman dok əlavə edə və ya silə bilərsiniz." -ExtraBrowsers.DockName="Dok adı" -Auth.Authing.Title="Kimlik təsdiqlənir..." -Auth.Authing.Text="%1 ilə təsdiqlənir, zəhmət olmasa,gözləyin..." -Auth.AuthFailure.Title="Kimlik Təsdiqləməsi Uğursuz Oldu" -Auth.AuthFailure.Text="%1 ilə təsdiqlənmədi:\n\n%2: %3" -Auth.InvalidScope.Title="Kimlik Təsdiqləməsi Lazımdır" -Auth.InvalidScope.Text="%1 üçün kimlik təsdiqləməsi tələbləri dəyişdirildi. Bəzi özəlliklər əlçatmaz ola bilər." +Wine.Text="OBS-i Wine-da işlətmək dəstəklənmir və yaxalama və ya qurğu mənbələri kimi bir çox funksiya işləməyəcək və ya yalnız məhdud imkanlarla işləyəcək.<br><br>Bunun əvəzinə OBS-in yerli versiyasını, məsələn, <a href='https://flathub.org/apps/details/com.obsproject.Studio'>bizim Flatpak versiyamızı</a> və ya əməliyyat sisteminizin paketlərini işə salmağınız tövsiyə olunur." +DockCloseWarning.Title="Sabitlənə Bilən Pəncərəni Bağla" +DockCloseWarning.Text="Siz indicə sabitlənilə bilən bir pəncərəni bağladınız. Əgər onu yenidən göstərmək istəsəniz, menyu zolağındakı Pəncərələr menyusundan istifadə edin." +ExtraBrowsers="Fərdi Brauzer Pəncərələri" +ExtraBrowsers.Info="Onlara ad və URL verərək pəncərələr əlavə edin, sonra pəncərələri açmaq üçün Tətbiq Et və ya Bağla düyməsini klikləyin. Pəncərələri istədiyiniz zaman əlavə edə və ya silə bilərsiniz." +ExtraBrowsers.DockName="Pəncərə Adı" +Auth.Authing.Title="Autentifikasiya edilir..." +Auth.Authing.Text="%1 ilə autentifikasiya edilir, zəhmət olmasa gözləyin..." +Auth.AuthFailure.Title="Autentifikasiya Xətası" +Auth.AuthFailure.Text="%1 ilə autentifikasiya uğursuz oldu:\n\n%2: %3" +Auth.InvalidScope.Title="Autentifikasiya Tələb Olunur" +Auth.InvalidScope.Text="%1 üçün autentifikasiya tələbləri dəyişib. Bəzi funksiyalar mövcud olmaya bilər." Auth.LoadingChannel.Title="Kanal məlumatları yüklənir..." Auth.LoadingChannel.Text="%1 üçün kanal məlumatları yüklənir, zəhmət olmasa gözləyin..." -Auth.LoadingChannel.Error="Kanal məlumatları əldə edilə bilmir." -Auth.ChannelFailure.Title="Kanal yüklənmədi" -Auth.ChannelFailure.Text="%1 üçün kanal məlumatı yüklənmədi\n\n%2: %3" +Auth.LoadingChannel.Error="Kanal məlumatını əldə etmək mümkün olmadı." +Auth.ChannelFailure.Title="Kanalı yükləmək mümkün olmadı" +Auth.ChannelFailure.Text="%1 üçün kanal məlumatını yükləmək mümkün olmadı\n\n%2: %3" Auth.Chat="Söhbət" -Auth.StreamInfo="Yayım məlumatı" +Auth.StreamInfo="Yayım Məlumatı" TwitchAuth.Stats="Twitch Statistikaları" TwitchAuth.Feed="Twitch Fəaliyyət Axını" -TwitchAuth.TwoFactorFail.Title="Yayım açarı sorğulana bilmədi" -TwitchAuth.TwoFactorFail.Text="OBS,Twitch hesabınıza qoşula bilmədi.Zəhmət olmasa,hesaba qoşulmaq üçün <a href='https://www.twitch.tv/settings/security'> Twitch təhlükəsizlik parametrlərində </a> iki faktorlu identifikasiyanın qurulduğundan əmin olun." +TwitchAuth.TwoFactorFail.Title="Yayım açarını sorğulamaq mümkün olmadı" +TwitchAuth.TwoFactorFail.Text="OBS, Twitch hesabınıza qoşula bilmədi. Zəhmət olmasa, yayıma başlamaq üçün tələb olunan iki faktorlu autentifikasiyanın <a href='https://www.twitch.tv/settings/security'>Twitch təhlükəsizlik parametrlərində</a> qurulduğundan əmin olun." RestreamAuth.Channels="Restream Kanalları" Copy.Filters="Filtrləri Kopyala" Paste.Filters="Filtrləri Yapışdır" -BrowserPanelInit.Title="Səyyah Başladılır..." -BrowserPanelInit.Text="Səyyah başladılır, zəhmət olmasa gözləyin..." +BrowserPanelInit.Title="Brauzer Başladılır..." +BrowserPanelInit.Text="Brauzer başladılır, zəhmət olmasa gözləyin..." BandwidthTest.Region="Bölgə" BandwidthTest.Region.US="ABŞ" BandwidthTest.Region.EU="Avropa" BandwidthTest.Region.Asia="Asiya" BandwidthTest.Region.Other="Digər" -Basic.AutoConfig="Avto Konfiqurasiya Sehrbazı" -Basic.AutoConfig.ApplySettings="Tənzimləmələri Tətbiq et" +Basic.AutoConfig="Avtomatik Konfiqurasiya Sehrbazı" +Basic.AutoConfig.ApplySettings="Parametrləri Tətbiq et" Basic.AutoConfig.StartPage="İstifadə Məlumatı" -Basic.AutoConfig.StartPage.SubTitle="Proqramı nə üçün istifadə edəcəyinizi seçin" -Basic.AutoConfig.StartPage.PrioritizeStreaming="Canlı yayım üçün optimallaşdır,ekran qeydi ikincidir" -Basic.AutoConfig.StartPage.PrioritizeRecording="Sadəcə ekran qeydi və video üçün optimallaşdır,yayım etməyəcəyəm" -Basic.AutoConfig.StartPage.PrioritizeVirtualCam="Mən yalnız virtual kamera işlədəcəyəm" -Basic.AutoConfig.VideoPage="Video Tənzimləmələri" -Basic.AutoConfig.VideoPage.SubTitle="İstifadə etmək istədiyiniz video parametrlərini göstərin" -Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="İndikini İstifadə et (%1x%2)" -Basic.AutoConfig.VideoPage.BaseResolution.Display="Göstər %1 (%2x%3)" -Basic.AutoConfig.VideoPage.FPS.UseCurrent="İndikini İşlət (%1)" -Basic.AutoConfig.VideoPage.FPS.PreferHighFPS="60 vəya 30,amma mümkün olan hallarda 60" -Basic.AutoConfig.VideoPage.FPS.PreferHighRes="60 vəya 30,amma yüksək görüntü keyfiyyətinə üstünlük verin" -Basic.AutoConfig.VideoPage.CanvasExplanation="Qeyd: Çərçivənin (əsas) görüntü ölçüsü,sizin ekran qeydinin vəya yayımın ölçüsü ilə bərabər olmaya bilər.Ekran qeydi/yayımın ölçüsü,resurs istifadəsi vəya bit istifadəsi tələblərini azaltmaq üçün,çərçivə ölçüsündən azaldıla bilər." -Basic.AutoConfig.StreamPage="Yayım məlumatı" -Basic.AutoConfig.StreamPage.SubTitle="Zəhmət olmasa yayım məlumatlarınızı daxil edin" -Basic.AutoConfig.StreamPage.ConnectAccount="Hesaba qoşul (Tövsiyə olunan)" -Basic.AutoConfig.StreamPage.DisconnectAccount="Hesabdan çıx" -Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Hesabdan çıxılsın?" -Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Bu dəyişiklik dərhal tətbiq olunacaq.Siz hesabdan çıxmaq istədiyinizə əminsiniz ?" -Basic.AutoConfig.StreamPage.GetStreamKey="Yayım kodunu əldə et" -Basic.AutoConfig.StreamPage.MoreInfo="Daha çox məlumat" -Basic.AutoConfig.StreamPage.UseStreamKey="Yayım kodundan istifadə et" -Basic.AutoConfig.StreamPage.UseStreamKeyAdvanced="Yayım kodundan istifadə et (qabaqcıl)" -Basic.AutoConfig.StreamPage.Service="Xidmət" +Basic.AutoConfig.StartPage.SubTitle="Proqramı nə üçün istifadə etmək istədiyinizi təyin edin" +Basic.AutoConfig.StartPage.PrioritizeStreaming="Yayım üçün optimallaşdır, qeydə alma ikinci dərəcəlidir" +Basic.AutoConfig.StartPage.PrioritizeRecording="Yalnız qeydə alma üçün optimallaşdır, yayım etməyəcəm" +Basic.AutoConfig.StartPage.PrioritizeVirtualCam="Yalnız virtual kameradan istifadə edəcəyəm" +Basic.AutoConfig.VideoPage="Video Parametrləri" +Basic.AutoConfig.VideoPage.SubTitle="İstifadə etmək istədiyiniz video parametrlərini təyin edin" +Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="Cari İstifadədə Olanı İşlət (%1x%2)" +Basic.AutoConfig.VideoPage.BaseResolution.Display="Ekran %1 (%2x%3)" +Basic.AutoConfig.VideoPage.FPS.UseCurrent="Cari İstifadədə Olanı İşlət (%1)" +Basic.AutoConfig.VideoPage.FPS.PreferHighFPS="Ya 60, ya da 30, lakin mümkün olduqda 60-a üstünlük ver" +Basic.AutoConfig.VideoPage.FPS.PreferHighRes="Ya 60, ya da 30, lakin yüksək rezolyusiyaya üstünlük ver" +Basic.AutoConfig.VideoPage.CanvasExplanation="Qeyd: Canvas (əsas) rezolyusiyası yayımladığınız və ya qeydə aldığınız rezolyusiya ilə eyni olmaq məcburiyyətində deyil. Resurs istifadəsini və ya bitreyt tələblərini azaltmaq üçün faktiki yayım/qeyd rezolyusiyanız canvas rezolyusiyasından aşağı miqyaslandırıla bilər." +Basic.AutoConfig.StreamPage="Yayım Məlumatı" +Basic.AutoConfig.StreamPage.SubTitle="Zəhmət olmasa, yayım məlumatınızı daxil edin" +Basic.AutoConfig.StreamPage.ConnectAccount="Hesaba Qoşul (tövsiyə olunur)" +Basic.AutoConfig.StreamPage.DisconnectAccount="Hesabdan Ayrıl" +Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Hesabdan Ayrılsın?" +Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Bu dəyişiklik dərhal tətbiq olunacaq. Hesabınızdan ayrılmaq istədiyinizə əminsiniz?" +Basic.AutoConfig.StreamPage.GetStreamKey="Yayım Açarı Al" +Basic.AutoConfig.StreamPage.MoreInfo="Daha Çox Məlumat" +Basic.AutoConfig.StreamPage.UseStreamKey="Yayım Açarı İstifadə et" +Basic.AutoConfig.StreamPage.UseStreamKeyAdvanced="Yayım Açarından İstifadə et (qabaqcıl)" +Basic.AutoConfig.StreamPage.Service="Servis" Basic.AutoConfig.StreamPage.Service.ShowAll="Hamısını Göstər..." Basic.AutoConfig.StreamPage.Service.Custom="Fərdi..." Basic.AutoConfig.StreamPage.StreamKey="Yayım Açarı" -Basic.AutoConfig.StreamPage.StreamKey.ToolTip="RIST: şifrləmə parolunu daxil edin.\nRTMP: xidmət tərəfindən verilən açarı daxil edin.\nSRT: xidmət, streamid (yayım identifikatoru) istifadə edirsə, onu daxil edin." -Basic.AutoConfig.StreamPage.EncoderKey="Kodlayıcı açar kodu" -Basic.AutoConfig.StreamPage.BearerToken="Bearer Token (əslliyi yoxlama tokeni)" -Basic.AutoConfig.StreamPage.ConnectedAccount="Hesaba qoşuldu" -Basic.AutoConfig.StreamPage.PerformBandwidthTest="Bant genişliyi ilə bit sürətini təxmin et (Bir neçə dəqiqə çəkə bilər)" -Basic.AutoConfig.StreamPage.PreferHardwareEncoding="Donanım kodlamasına üstünlük ver" -Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="Donanım kodlaması artıq CPU istifadəsini aradan qaldırır,lakin eyni keyfiyyət səviyyəsini əldə etmək üçün daha çox bit sürəti tələb oluna bilər." +Basic.AutoConfig.StreamPage.StreamKey.ToolTip="RIST: şifrələmə parolasını daxil edin.\nRTMP: xidmət tərəfindən təqdim edilən açarı daxil edin.\nSRT: əgər xidmət istifadə edirsə, streamid daxil edin." +Basic.AutoConfig.StreamPage.EncoderKey="Kodlayıcı Açar" +Basic.AutoConfig.StreamPage.BearerToken="Daşıyıcı Token" +Basic.AutoConfig.StreamPage.ConnectedAccount="Qoşulmuş hesab" +Basic.AutoConfig.StreamPage.PerformBandwidthTest="Bağlantı sürəti testi ilə bitreyti təxmin et (bir neçə dəqiqə çəkə bilər)" +Basic.AutoConfig.StreamPage.PreferHardwareEncoding="Aparat kodlaşdırmasına üstünlük ver" +Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="Aparat kodlaşdırması CPU istifadəsinin əksər hissəsini aradan qaldırır, lakin eyni keyfiyyət səviyyəsini əldə etmək üçün daha çox bitreyt tələb edə bilər." Basic.AutoConfig.StreamPage.StreamWarning.Title="Yayım xəbərdarlığı" -Basic.AutoConfig.StreamPage.StreamWarning.Text="Bant genişliyi testi kanalınızda səssiz təsadüfi video məlumatlarını yayımlamaq üzrədir.Mümkünsə,yayım qeydini müvəqqəti olaraq söndürməyiniz və test bitənə qədər yayını xüsusi vəziyyətə gətirməyiniz tövsiyə olunur.Davam edilsin?" -Basic.AutoConfig.StreamPage.UseMultitrackVideo="Yoxlama%1" -Basic.AutoConfig.TestPage="Final Nəticələri" -Basic.AutoConfig.TestPage.SubTitle.Testing="Proqram ən uyğun parametrləri təxmin etmək üçün bir neçə test edir" +Basic.AutoConfig.StreamPage.StreamWarning.Text="Bağlantı sürəti testi kanalınıza səssiz, təsadüfi video məlumatları yayımlamaq üzrədir. Əgər mümkünsə, test tamamlanana qədər yayımların videolarını saxlamağı müvəqqəti olaraq deaktiv etmək və yayımı məxfi olaraq təyin etmək tövsiyə olunur. Davam edilsin?" +Basic.AutoConfig.StreamPage.UseMultitrackVideo="%1-i Test et" +Basic.AutoConfig.TestPage="Yekun Nəticələr" +Basic.AutoConfig.TestPage.SubTitle.Testing="Proqram hazırda ideal parametrləri təxmin etmək üçün bir sıra testlər yerinə yetirir" Basic.AutoConfig.TestPage.SubTitle.Complete="Test tamamlandı" -Basic.AutoConfig.TestPage.TestingBandwidth="Bant genişliyi testi aparılır,bu bir neçə dəqiqə ala bilər..." -Basic.AutoConfig.TestPage.TestingBandwidth.NoOutput="Bu xidmətin protokolu üçün çıxış tapılmadı" -Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="Bağlantı qurulur: %1..." -Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="Serverə qoşulmaq mümkün olmadı,zəhmət olmasa internet bağlantınızı yoxlayın və yenidən cəhd edin." -Basic.AutoConfig.TestPage.TestingBandwidth.Server="Bant genişliyi testi aparılır: %1" -Basic.AutoConfig.TestPage.TestingStreamEncoder="Yayım kodlayıcı test edilir,bir neçə dəqiqə çəkə bilər..." -Basic.AutoConfig.TestPage.TestingRecordingEncoder="Yayım kodlayıcı test edilir,bir neçə dəqiqə çəkə bilər..." -Basic.AutoConfig.TestPage.TestingRes.Fail="Kodlayıcı işə salına bilmədi" -Basic.AutoConfig.TestPage.TestingRes.Resolution="%1x%2%3 FPS test edilir..." -Basic.AutoConfig.TestPage.Result.StreamingEncoder="Yayım Kodlayıcı" -Basic.AutoConfig.TestPage.Result.RecordingEncoder="Ekran Qeydi Kodlayıcı" -Basic.AutoConfig.TestPage.Result.Header="Proqram bu parametrlərin sizə uyğun olduğunu müəyyənləşdirdi:" -Basic.AutoConfig.TestPage.Result.Footer="Bu parametrləri istifadə etmək üçün,Parametrləri Tətbiq et klikləyin.Sehirbazı yenidən konfiqurasiya etmək və yenidən cəhd etmək üçün Geri klikləyin." -Basic.AutoConfig.Info="Avtomatik konfiqurasiya sehirbazı,kompüter xüsusiyyətlərinizə və internet sürətinizə uyğun ən yaxşı qərarı verəcək." -Basic.AutoConfig.RunAnytime="Bu alətlər menyusuna gedilərək,hər zaman işə salına bilər." -Basic.AutoConfig.TestPage.Result.StreamingResolution="Yayın (Ölçüləndirilmiş) Çözünürlüğü" +Basic.AutoConfig.TestPage.TestingBandwidth="Bağlantı sürəti testi yerinə yetirilir, bu bir neçə dəqiqə çəkə bilər..." +Basic.AutoConfig.TestPage.TestingBandwidth.NoOutput="Bu xidmətin protokolu üçün heç bir çıxış tapılmadı" +Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="Qoşulur: %1..." +Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="Heç bir serverə qoşulmaq mümkün olmadı, zəhmət olmasa internet bağlantınızı yoxlayın və yenidən cəhd edin." +Basic.AutoConfig.TestPage.TestingBandwidth.Server="Bağlantı sürəti yoxlanılır: %1" +Basic.AutoConfig.TestPage.TestingStreamEncoder="Yayım kodlayıcısı test edilir, bu bir dəqiqə çəkə bilər..." +Basic.AutoConfig.TestPage.TestingRecordingEncoder="Qeydə alma kodlayıcısı test edilir, bu bir dəqiqə çəkə bilər..." +Basic.AutoConfig.TestPage.TestingRes.Fail="Kodlayıcını başlatmaq mümkün olmadı" +Basic.AutoConfig.TestPage.TestingRes.Resolution="Test edilir: %1x%2 %3 FPS..." +Basic.AutoConfig.TestPage.Result.StreamingEncoder="Yayım Kodlayıcısı" +Basic.AutoConfig.TestPage.Result.RecordingEncoder="Qeyd Kodlayıcısı" +Basic.AutoConfig.TestPage.Result.Header="Proqram bu təxmini parametrlərin sizin üçün ideal olduğunu müəyyən etdi:" +Basic.AutoConfig.TestPage.Result.Footer="Bu parametrləri istifadə etmək üçün Parametrləri Tətbiq et düyməsinə klikləyin. Sehrbazı yenidən konfiqurasiya etmək və təkrar cəhd etmək üçün Geri düyməsinə klikləyin. Parametrləri əl ilə konfiqurasiya etmək üçün Ləğv Et düyməsinə klikləyin və Parametrləri açın." +Basic.AutoConfig.Info="Avtomatik konfiqurasiya sehrbazı kompüterinizin xüsusiyyətlərinə və internet sürətinizə əsasən ən yaxşı parametrləri müəyyən edəcək." +Basic.AutoConfig.RunAnytime="Bunu istənilən vaxt Alətlər menyusuna daxil olaraq işə salmaq olar." +Basic.AutoConfig.TestPage.Result.StreamingResolution="Yayım (Miqyaslandırılmış) Rezolyusiyası" Basic.Stats="Statistikalar" -Basic.Stats.CPUUsage="CPU istifadəsi" +Basic.Stats.CPUUsage="CPU İstifadəsi" Basic.Stats.HDDSpaceAvailable="Mövcud disk sahəsi" Basic.Stats.MemoryUsage="Yaddaş İstifadəsi" -Basic.Stats.AverageTimeToRender="Çərçivə yaratmaq üçün orta müddət" -Basic.Stats.SkippedFrames="Kodlama gecikməsi səbəbilə atlanan çərçivələr" -Basic.Stats.MissedFrames="Gecikmə səbəbilə buraxılmış çərçivələr" +Basic.Stats.AverageTimeToRender="Kadrı render etmək üçün orta vaxt" +Basic.Stats.SkippedFrames="Kodlaşdırma gecikməsi səbəbindən ötürülmüş kadrlar" +Basic.Stats.MissedFrames="Render gecikməsi səbəbindən buraxılmış kadrlar" Basic.Stats.Output.Stream="Yayım" -Basic.Stats.Output.Recording="Səsyazma" +Basic.Stats.Output.Recording="Qeydə Alma" Basic.Stats.Status="Vəziyyət" -Basic.Stats.Status.Recording="Səs yazılır" +Basic.Stats.Status.Recording="Qeydə Alma" Basic.Stats.Status.Live="CANLI" -Basic.Stats.Status.Reconnecting="Bağlantı yenidən qurulur" -Basic.Stats.Status.Inactive="Aktiv deyil" +Basic.Stats.Status.Reconnecting="Yenidən qoşulur" +Basic.Stats.Status.Inactive="Qeyri-aktiv" Basic.Stats.Status.Active="Aktiv" Basic.Stats.DroppedFrames="Buraxılmış Kadrlar (Şəbəkə)" -Basic.Stats.MegabytesSent="Yekun Verilənlər Çıxışı" +Basic.Stats.MegabytesSent="Ümumi Verilənlər Çıxışı" Basic.Stats.Bitrate="Bit sürəti" -Basic.Stats.DiskFullIn="Disk dolur (təxmini)" -Basic.Stats.ResetStats="Statistikaları sıfırla" +Basic.Stats.DiskFullIn="Disk (təxminən) bu müddətə dolacaq" +Basic.Stats.DiskFullIn.Text="%1 Saat, %2 Dəqiqə" +Basic.Stats.ResetStats="Statistikanı Sıfırla" ResetUIWarning.Title="İstifadəçi interfeysini sıfırlamaq istədiyinizə əminsiniz?" -ResetUIWarning.Text="İstifadəçi interfeysinin ilkin vəziyyətinə bərpa edilməsi, əlavə bəndləri gizlədəcək. Onların görünməsini istəyirsinizsə, Bəndlər menyusundan çıxarmalısınız.\n\nİstifadəçi interfeysini ilkin vəziyyətinə bərpa etmək istədiyinizə əminsinizmi?" -Updater.Title="Yeniləmə mövcuddur" -Updater.Text="Yeniləmə mövcuddur:" -Updater.UpdateNow="İndi Yenilə" -Updater.RemindMeLater="Daha sonra xatırlat" +ResetUIWarning.Text="İstifadəçi interfeysini sıfırlamaq əlavə pəncərələri gizlədəcək. Onların görünməsini istəyirsinizsə, bu pəncərələri Pəncərələr menyusundan yenidən görünən etməlisiniz.\n\nİstifadəçi interfeysini sıfırlamaq istədiyinizə əminsiniz?" +Updater.Title="Yeni güncəlləmə mövcuddur" +Updater.Text="Yeni güncəlləmə mövcuddur:" +Updater.UpdateNow="İndi Güncəllə" +Updater.RemindMeLater="Daha Sonra Xatırlat" Updater.Skip="Versiyanı Ötür" -Updater.NoUpdatesAvailable.Title="Yeniləmə yoxdur" -Updater.NoUpdatesAvailable.Text="Hazırda son yeniləmələr yoxdur" -Updater.BranchNotFound.Title="Yeniləmə Kanalı, Silindi" -Updater.BranchNotFound.Text="Seçdiyiniz yeniləmə kanalı artıq əlçatan deyil, OBS, ilkin vəziyyətinə bərpa edilmişdir." -Updater.RepairButUpdatesAvailable.Title="Tamlıq yoxlaması qeyri-mümkündür" -Updater.RepairButUpdatesAvailable.Text="Fayl tamlığının yoxlanılması ancaq əlçatan ən son versiya üçün mümkündür. OBS quraşdırmanızı yoxlamaq və yeniləmək üçün Kömək → Yeniləmələri Yoxla seçimindən istifadə edin." -Updater.RepairConfirm.Title="Tamlıq Yoxlamasını Təsdiq Et" -Updater.RepairConfirm.Text="Tamlıq yoxlamasının başladılması, OBS quraşdırmanızın zədəli olub-olmadığını skanlayacaq və zədələnmiş/dəyişdirilmiş faylları yenidən endirəcək. Bu bir müddət çəkə bilər.\n\nDavam etmək istəyirsinizmi?" -Updater.FailedToLaunch="Yeniləyici başladılmadı" -QuickTransitions.SwapScenes="Keçiddən Sonra Önbaxış/Proqram Səhnələrini Dəyişdir" -QuickTransitions.SwapScenesTT="Keçiddən sonra önbaxış və proqram səhnələrini dəyişdirir (proqramın orijinal səhnəsi hələ mövcuddursa).\nBu, proqramın orijinal səhnəsində edilmiş hər hansı bir dəyişikliyi qaytarmayacaq." +Updater.NoUpdatesAvailable.Title="Heç bir güncəlləmə mövcud deyil" +Updater.NoUpdatesAvailable.Text="Hazırda heç bir güncəlləmə mövcud deyil" +Updater.BranchNotFound.Title="Güncəlləmə Kanalı Silindi" +Updater.BranchNotFound.Text="Seçdiyiniz güncəlləmə kanalı artıq mövcud deyil, OBS ilkin təyin olunan kanala sıfırlandı." +Updater.RepairButUpdatesAvailable.Title="Bütövlük Yoxlanışı Mövcud Deyil" +Updater.RepairButUpdatesAvailable.Text="Fayl bütövlüyünü yoxlamaq yalnız mövcud olan ən son versiya üçün mümkündür. OBS quraşdırmanızı yoxlamaq və güncəlləmək üçün Kömək → Güncəlləmələri Yoxla menyusundan istifadə edin." +Updater.RepairConfirm.Title="Bütövlük Yoxlanışını Təsdiqlə" +Updater.RepairConfirm.Text="Bütövlük yoxlanışına başlamaq OBS quraşdırmanızı zədələnmə üçün skan edəcək və pozulmuş/dəyişdirilmiş faylları yenidən endirəcək. Bu, bir az vaxt apara bilər.\n\nDavam etmək istəyirsiniz?" +Updater.FailedToLaunch="Güncəlləyicini başlatmaq mümkün olmadı" +QuickTransitions.SwapScenes="Keçiddən Sonra Ön Baxış/Proqram Səhnələrinin Yerini Dəyiş" +QuickTransitions.SwapScenesTT="Keçiddən sonra ön baxış və proqram səhnələrinin yerini dəyişir (əgər proqramın orijinal səhnəsi hələ də mövcuddursa).\nBu, proqramın orijinal səhnəsində edilmiş hər hansı bir dəyişikliyi ləğv etməyəcək." QuickTransitions.DuplicateScene="Səhnəni Çoxalt" -QuickTransitions.DuplicateSceneTT="Eyni səhnəni redaktə edərkən, proqram çıxışını dəyişdirmədən mənbələrin çevrilməsini/görünməsini redaktə etməyə imkan verir.\nProqram çıxışını dəyişdirmədən mənbələrin xüsusiyyətlərini redaktə etmək üçün \"Mənbələri Çoxalt\" seçimini aktivləşdirin.\nBu parametrin dəyişdirilməsi, cari proqram səhnəsini ilkin vəziyyətinə bərpa edəcək (hələ varsa)." -QuickTransitions.EditProperties="Mənbələri kopyala" -QuickTransitions.EditPropertiesTT="Eyni səhnəni redaktə edərkən, proqram çıxışını dəyişdirmədən mənbələrin xüsusiyyətlərini redaktə etməyə imkan verir.\nBu, yalnız \"Səhnəni Çoxalt\" aktivləşdirilibsə, istifadə oluna bilər.\nBəzi mənbələr (yazma ya da media mənbələri kimi), bunu dəstəkləmir və ayrıca redaktə oluna bilməz.\nBu parametrin dəyişdirilməsi, cari proqram səhnəsini ilkin vəziyyətinə bərpa edəcək (hələ varsa).\n\nXəbərdarlıq: Mənbələr çoxaldılacağından, bu, əlavə sistem ya da video resursları tələb edə bilər." -QuickTransitions.HotkeyName="Qısa Keçid: %1" -Basic.AddTransition="Konfiqurasiya Oluna Bilən Keçid Əlavə Et" -Basic.RemoveTransition="Konfiqurasiya Oluna Bilən Keçidi Sil" +QuickTransitions.DuplicateSceneTT="Eyni səhnəni redaktə edərkən, proqram çıxışını dəyişdirmədən mənbələrin çevrilməsini/görünməsini redaktə etməyə imkan verir.\nProqram çıxışını dəyişdirmədən mənbələrin xüsusiyyətlərini redaktə etmək üçün 'Mənbələri Çoxalt' seçimini aktiv edin.\nBu dəyəri dəyişdirmək cari proqram səhnəsini sıfırlayacaq (əgər hələ də mövcuddursa)." +QuickTransitions.EditProperties="Mənbələri Çoxalt" +QuickTransitions.EditPropertiesTT="Eyni səhnəni redaktə edərkən, proqram çıxışını dəyişdirmədən mənbələrin xüsusiyyətlərini redaktə etməyə imkan verir.\nBu, yalnız 'Səhnəni Çoxalt' aktiv olduqda istifadə edilə bilər.\nMüəyyən mənbələr (məsələn, yaxalama və ya media mənbələri) bunu dəstəkləmir və ayrıca redaktə edilə bilməz.\nBu dəyəri dəyişdirmək cari proqram səhnəsini sıfırlayacaq (əgər hələ də mövcuddursa).\n\nXəbərdarlıq: Mənbələr çoxaldılacağı üçün bu, əlavə sistem və ya video resursları tələb edə bilər." +QuickTransitions.HotkeyName="Cəld Keçid: %1" +Basic.AddTransition="Konfiqurasiya Edilə Bilən Keçid Əlavə et" +Basic.RemoveTransition="Konfiqurasiya Edilə Bilən Keçidi Sil" Basic.TransitionProperties="Keçid Xüsusiyyətləri" -Basic.SceneTransitions="Səhnə keçidi" +Basic.SceneTransitions="Səhnə Keçidləri" Basic.TransitionDuration="Müddət" Basic.TogglePreviewProgramMode="Studiya Rejimi" Basic.EnablePreviewProgramMode="Studiya Rejimini Aktivləşdir" -Basic.DisablePreviewProgramMode="Studiya Rejimini Qeyri-Aktiv Et" -Undo.Undo="Geri" -Undo.Redo="İreli" -Undo.Add="%1 əlavə et'" -Undo.Delete="Sil" -Undo.Rename="\"%1\" adını dəyişdir" -Undo.SceneCollection.Switch="Bura keç: \"%1\"" -Undo.Item.Undo="Qaytar: %1" -Undo.Item.Redo="Təkrar %1" +Basic.DisablePreviewProgramMode="Studiya Rejimini Deaktivləşdir" +Undo.Undo="Geri Al" +Undo.Redo="Təkrarla" +Undo.Add="'%1' Əlavə et" +Undo.Delete="'%1'-i Sil" +Undo.Rename="'%1'-in Adını Dəyiş" +Undo.SceneCollection.Switch="'%1'-ə Keçid Et" +Undo.Item.Undo="%1 əməliyyatını geri al" +Undo.Item.Redo="%1 əməliyyatını təkrarla" Undo.Sources.Multi="%1 Mənbəni Sil" -Undo.Filters="\"%1\" üzərindəki Süzgəc Dəyişiklikləri" -Undo.Filters.Paste.Single="\"%1\" süzgəcini bura əlavə et: \"%2\"" -Undo.Filters.Paste.Multiple="Süzgəcləri, \"%1\" mövqeyindən \"%2\" mövqeyinə köçür" -Undo.Transform="\"%1\" üzərindəki mənbə dəyişimi" -Undo.Transform.Paste="'%1' Üzerində Keçişi Yapışdır " -Undo.Transform.Rotate="'%1' Üzərində Döndərmə" -Undo.Transform.Reset="Keçişi '%1'-də Sıfırla" -Undo.Transform.HFlip="'%1'-də Üfüqi Tərsinə Çevir " -Undo.Transform.VFlip="'%1' Üzərində Şaquli Tərsinə Çevir " -Undo.Transform.FitToScreen="'%1'- Üzərində Ekrana Dart " -Undo.Transform.StretchToScreen="'%1' Üzərində Ekrana Sığdır " -Undo.Transform.Center="'%1' Üzərində Ekrana Ortala" -Undo.Transform.VCenter="'%1' Üzərində Ekranın Şaquli Ortasına Yerləşdir " -Undo.Transform.HCenter="'%1' Üzərində Ekranın ÜfüqiOrtasına Yerləşdir " -Undo.Volume.Change="'%1' Üzərində Səs Səviyyəsinin Dəyişimi" -Undo.Volume.Mute="%1'-i Səsini Kəs" -Undo.Volume.Unmute="%1'-i Səsini Aç" -Undo.Balance.Change="'%1'-də Səs Balansını Dəyişdir" -Undo.SyncOffset.Change="%1'-də Səs Sinxronizasiya Dəyişikliyi" -Undo.MonitoringType.Change="%1'də ses izləməsini dəyişdir" -Undo.Mixers.Change="'%1'-də səs qarışımını dəyişdir" -Undo.ForceMono.On="%1'də Force Mono'yu aç" -Undo.ForceMono.Off="%1'də Force Mono'yu deaktiv et" -Undo.Properties="`%1` Üzərindəki Özəllik Dəyişimi" -Undo.Scene.Duplicate="Səhnəni Çoxalt '%1'" -Undo.ShowTransition="'%1' Keçişini Göstər" -Undo.HideTransition="'%1' Keçişini Gizlə" -Undo.ShowSceneItem="'%2' içində '%1' Göstər" -Undo.HideSceneItem="%2 içində %1 gizlət" -Undo.ReorderSources="%1 içində resursları yenidən sırala" -Undo.MoveUp="%2 içindəki %1 yuxarı daşı" -Undo.MoveDown="%2 içindəki %1 aşağı daşı" -Undo.MoveToTop="%2 içindəki %1 ən yuxarı daşı" -Undo.MoveToBottom="%2 içindəki %1 ən alta daşı" -Undo.PasteSource="%1 içindəki resursları yapışdırmaq" -Undo.PasteSourceRef="Mənbə İstinadlarını %1 içərisinə yapışdırın" -Undo.GroupItems="maddələri %1 içinə qrupla" -TransitionNameDlg.Text="Zəhmət olmasa keçid adını qeyd edin" -TransitionNameDlg.Title="Keçid adı" +Undo.Filters="'%1'-də Filtr Dəyişiklikləri" +Undo.Filters.Paste.Single="'%1' Filtrini '%2'-ə Yapışdır" +Undo.Filters.Paste.Multiple="Filtrləri '%1'-dən '%2'-ə Kopyala" +Undo.Transform="'%1' Səhnəsində Mənbə(lər)i Çevir" +Undo.Transform.Paste="Çevrilməni '%1'-ə Yapışdır" +Undo.Transform.Rotate="'%1'-də Fırlanma" +Undo.Transform.Reset="'%1'-də Çevrilməni Sıfırla" +Undo.Transform.HFlip="'%1'-də Üfüqi Çevir" +Undo.Transform.VFlip="'%1'-də Şaquli Çevir" +Undo.Transform.FitToScreen="'%1'-də Ekrana Sığdır" +Undo.Transform.StretchToScreen="'%1'-də Ekrana Dart" +Undo.Transform.Center="'%1'-də Ekranda Mərkəzləşdir" +Undo.Transform.VCenter="'%1'-də Ekranda Şaquli Mərkəzləşdir" +Undo.Transform.HCenter="'%1'-də Ekranda Üfüqi Mərkəzləşdir" +Undo.Volume.Change="'%1'-də Səs Ucalığı Dəyişikliyi" +Undo.Volume.Mute="'%1'-i Səssizə Al" +Undo.Volume.Unmute="'%1'-in Səsini Aç" +Undo.Balance.Change="'%1'-də Səs Balansı Dəyişikliyi" +Undo.SyncOffset.Change="'%1'-də Səs Sinxronizasiyası Sürüşməsi Dəyişikliyi" +Undo.MonitoringType.Change="'%1'-də Səs İzləməsini Dəyiş" +Undo.Mixers.Change="'%1'-də Səs Mikserlərini Dəyiş" +Undo.ForceMono.On="'%1'-də Monoya Məcbur Etməni Aktivləşdir" +Undo.ForceMono.Off="'%1'-də Monoya Məcbur Etməni Deaktivləşdir" +Undo.Properties="'%1'-də Xüsusiyyət Dəyişikliyi" +Undo.Scene.Duplicate="'%1' Səhnəsini Çoxalt" +Undo.ShowTransition="'%1'-də Keçidi Göstər" +Undo.HideTransition="'%1'-də Keçidi Gizlət" +Undo.ShowSceneItem="'%2' Səhnəsində '%1'-i Göstər" +Undo.HideSceneItem="'%2' Səhnəsində '%1'-i Gizlət" +Undo.ReorderSources="'%1'-də mənbələri yenidən sırala" +Undo.MoveUp="'%2' səhnəsində '%1'-i yuxarı keçir" +Undo.MoveDown="'%2' səhnəsində '%1'-i aşağı keçir" +Undo.MoveToTop="'%2' səhnəsində '%1'-i ən yuxarıya keçir" +Undo.MoveToBottom="'%2' səhnəsində '%1'-i ən aşağıya keçir" +Undo.PasteSource="'%1' Səhnəsinə Mənbə(lər)i Yapışdır" +Undo.PasteSourceRef="'%1' Səhnəsinə Mənbə Referans(lar)ını Yapışdır" +Undo.GroupItems="Elementləri '%1' Qrupuna Daxil et" +TransitionNameDlg.Text="Zəhmət olmasa, keçidin adını daxil edin" +TransitionNameDlg.Title="Keçid Adı" TitleBar.SafeMode="TƏHLÜKƏSİZ REJİM" -TitleBar.PortableMode="Daşınılabilən Rejim" +TitleBar.PortableMode="Portativ Rejim" TitleBar.Profile="Profil" TitleBar.Scenes="Səhnələr" -NameExists.Title="Ad artıq var" +NameExists.Title="Ad artıq mövcuddur" NameExists.Text="Ad artıq istifadədədir." -NoNameEntered.Title="Zəhmət olmasa etibarlı bir ad daxil edin" +NoNameEntered.Title="Zəhmət olmasa, keçərli bir ad daxil edin" NoNameEntered.Text="Ad boş ola bilməz." ConfirmStart.Title="Yayım Başladılsın?" ConfirmStart.Text="Yayımı başlatmaq istədiyinizə əminsiniz?" ConfirmStop.Title="Yayım Dayandırılsın?" ConfirmStop.Text="Yayımı dayandırmaq istədiyinizə əminsiniz?" -ConfirmStopRecord.Title="Səsyazma Dayandırılsın?" -ConfirmStopRecord.Text="Səsyazmanı dayandırmaq istədiyinizə əminsiniz?" -ConfirmBWTest.Title="Bant genişliyi testi başlasın?" -ConfirmBWTest.Text="OBS-i bant genişliyi test rejimində konfiqurasiya etdiniz.Bu rejim kanalınız yayımlanmadan şəbəkə testinə imkan verir.Testi bitirdikdən sonra izləyicilərin yayımı görə bilməsi üçün onu deaktiv etməlisiniz.\n\nDavam etmək istəyirsiniz?" -ConfirmExit.Title="OBS-dən çıxılsın?" -ConfirmExit.Text="OBS hal-hazırda işlək vəziyyətdədir.Bütün yayımlar və qeydlər dayandırılacaq.Çıxmaq istədiyinizdən əminsiniz?" -ConfirmRemove.Title="Çıxarılmanı Təsdiqlə" -ConfirmRemove.Text="'%1' elementini silməyə əminsiniz ?" -ConfirmRemove.TextMultiple="%1 silmək istədiyinizdən əminsiniz?" -ConfirmReset.Title="Xüssiyyətləri Sıfırla" -ConfirmReset.Text="Mövcud xüsusiyyətləri ilkin vəziyyətinə sıfırlamağa əminsiniz?" -Output.StartStreamFailed="Yayın başlatılmadı" -Output.StartRecordingFailed="Çəkim başlatılmadı" -Output.StartReplayFailed="Təkrar Yaddaşı Başlatmaq Uğursuz Olduj" -Output.StartVirtualCamFailed="Virtual kameranı başlatmaq uğursuz oldu" -Output.StartFailedGeneric="Çıxışı başlatmaq uğursuz oldu. Detallar üçün lütfən günlüyə baxın: \n\nNVENC və ya AMD kodlayıcılarını istifadə edirsinizsə, video cihaz sürücülərini güncəl olduğundan əmin olun." -Output.ReplayBuffer.PauseWarning.Title="Dayandırıldığında təkrarlar dayandırıla bilməz" -Output.ReplayBuffer.PauseWarning.Text="Diqqət: Qeyd dayandırılanda təkrarlar yadda saxlanıla bilməz." -Output.ConnectFail.Title="Əlaqə qurmaq uğursuz oldu" -Output.ConnectFail.BadPath="Keçərsiz Yol və ya Bağlantı URL-si. Zəhmət olmasa bunların keçərli olduğunu təsdiqləmək üçün Parametrlərinizi yoxlayın" -Output.ConnectFail.ConnectFailed="Server ilə əlaqə qurmaq uğursuz oldu" -Output.ConnectFail.InvalidStream="Xüsusi kanal və ya yayın açarına əldə edilə bilmədi, zəhmət olmasa yayın açarınızı diqqətlə nəzərdən keçirin" -Output.ConnectFail.HdrDisabled="HDR çıxışı hazırda bu çıxış üçün deaktiv edilib" -Output.ConnectFail.Error="Server ilə əlaqə qurma cəhdi zamanı gözlənilməyən bir xəta baş verdi.Detallar günlük fayılında." -Output.ConnectFail.Disconnected="Serverdən əlaqə kəsildi" -Output.StreamEncodeError.Title="Kodlama xətası" -Output.StreamEncodeError.Msg="Yayın zamanı bir kodlayıcı xətası baş verdi" -Output.StreamEncodeError.Msg.LastError="Yayın zamanı bir kodlayıcı xətası baş verdi:<br><br>%1" -Output.RecordFail.Title="Çəkim başlatılmadı" -Output.RecordFail.Unsupported="Çıxış növü ya dəstəklənmir, ya da birdən çox səs çox səsi dəstəkləmir. Zəhmət olmasa, parametrləri yoxlayın və yenidən cəhd edin." -Output.RecordNoSpace.Title="Yetərsiz disk yeri" -Output.RecordNoSpace.Msg="Çəkimi davam etdirmək üçün yetərli disk yeri yoxdur." -Output.RecordError.Title="Çəkim xətası" -Output.RecordError.Msg="Çəkim zamanı bir qeyri-müəyyən xəta baş verdi." -Output.RecordError.EncodeErrorMsg="Çəkim zamanı bir kodlayıcı xətası baş verdi." -Output.RecordError.EncodeErrorMsg.LastError="Çəkim zamanı bir kodlayıcı xətası baş verdi:<br><br>%1" -Output.BadPath.Title="Dosya yolu keçərsiz" -Output.BadPath.Text="Təyin edilmiş Qeydiyyat Yolu açılmadı. Zəhmət olmasa, Qeydiyyat Yolunu Parametrlər→ Çıxış → Çəkim bölməsindən yoxlayın" -Output.NoBroadcast.Title="Heç bir Yayım Konfiqurasiyası edilməyib" -Output.NoBroadcast.Text="Yayını başlatmadan öncə bir yayım yaratmağınız lazımdır." -Output.BroadcastStartFailed="Yayımın başladılması uğursuz oldu" -Output.BroadcastStopFailed="Yayımın dayandırılması uğursuz oldu" -Remux.SourceFile="OBS Çəkimi" +ConfirmStopRecord.Title="Qeydə Alma Dayandırılsın?" +ConfirmStopRecord.Text="Qeydə almanı dayandırmaq istədiyinizə əminsiniz?" +ConfirmBWTest.Title="Bağlantı Sürəti Testinə Başlansın?" +ConfirmBWTest.Text="Siz OBS-i bağlantı sürəti testi rejimində konfiqurasiya etmisiniz. Bu rejim, kanalınız canlı yayıma çıxmadan şəbəkə testi etməyə imkan verir. Testi bitirdikdən sonra, izləyicilərin yayımınızı görə bilməsi üçün bu rejimi deaktiv etməlisiniz.\n\nDavam etmək istəyirsiniz?" +ConfirmExit.Title="Aktiv Çıxışlar" +ConfirmExit.Text="OBS hələ də aktivdir. Bütün yayımlar/qeydlər dayandırılacaq." +ConfirmRemove.Title="Silməni Təsdiqlə" +ConfirmRemove.Text="'%1'-i silmək istədiyinizə əminsiniz?" +ConfirmRemove.TextMultiple="%1 elementi silmək istədiyinizə əminsiniz?" +ConfirmReset.Title="Xüsusiyyətləri Sıfırla" +ConfirmReset.Text="Cari xüsusiyyətləri ilkin təyin olunan dəyərlərinə sıfırlamaq istədiyinizə əminsiniz?" +Output.StartStreamFailed="Yayımı başlatmaq mümkün olmadı" +Output.StartRecordingFailed="Qeydə almanı başlatmaq mümkün olmadı" +Output.StartReplayFailed="Təkrar buferini başlatmaq mümkün olmadı" +Output.StartVirtualCamFailed="Virtual kameranı başlatmaq mümkün olmadı" +Output.StartFailedGeneric="Çıxışı başlatmaq mümkün olmadı. Zəhmət olmasa, təfərrüatlar üçün jurnala baxın.\n\nQeyd: Əgər NVENC və ya AMD kodlayıcılarından istifadə edirsinizsə, video drayverlərinizin güncəl olduğundan əmin olun.." +Output.ReplayBuffer.PauseWarning.Title="Fasilə zamanı təkrarları saxlamaq mümkün deyil" +Output.ReplayBuffer.PauseWarning.Text="Xəbərdarlıq: Qeydə almağa fasilə verildikdə təkrarları saxlamaq mümkün deyil." +Output.ConnectFail.Title="Qoşulma uğursuz oldu" +Output.ConnectFail.BadPath="Yanlış Yol və ya Qoşulma URL-i. Zəhmət olmasa, onların düzgün olduğunu yoxlamaq üçün parametrlərinizi yoxlayın." +Output.ConnectFail.ConnectFailed="Serverə qoşulma uğursuz oldu" +Output.ConnectFail.InvalidStream="Təyin edilmiş kanala və ya yayım açarına daxil olmaq mümkün olmadı, zəhmət olmasa yayım açarınızı bir daha yoxlayın. Əgər düzgündürsə, serverə qoşulmada problem ola bilər." +Output.ConnectFail.HdrDisabled="Bu çıxış üçün HDR çıxışı hazırda deaktivdir." +Output.ConnectFail.Error="Serverə qoşulmağa cəhd edərkən gözlənilməz xəta baş verdi. Daha çox məlumat jurnal faylındadır." +Output.ConnectFail.Disconnected="Serverdən ayrıldı." +Output.StreamEncodeError.Title="Kodlaşdırma xətası" +Output.StreamEncodeError.Msg="Yayım zamanı kodlayıcı xətası baş verdi." +Output.StreamEncodeError.Msg.LastError="Yayım zamanı kodlayıcı xətası baş verdi:<br><br>%1" +Output.RecordFail.Title="Qeydə almanı başlatmaq mümkün olmadı" +Output.RecordFail.Unsupported="Çıxış formatı ya dəstəklənmir, ya da birdən çox səs trekini dəstəkləmir. Zəhmət olmasa, parametrlərinizi yoxlayın və yenidən cəhd edin." +Output.RecordNoSpace.Title="Kifayət qədər disk sahəsi yoxdur" +Output.RecordNoSpace.Msg="Qeydə almanı davam etdirmək üçün kifayət qədər disk sahəsi yoxdur." +Output.RecordError.Title="Qeydə alma xətası" +Output.RecordError.Msg="Qeydə alma zamanı naməlum xəta baş verdi." +Output.RecordError.EncodeErrorMsg="Qeydə alma zamanı kodlayıcı xətası baş verdi." +Output.RecordError.EncodeErrorMsg.LastError="Qeydə alma zamanı kodlayıcı xətası baş verdi:<br><br>%1" +Output.BadPath.Title="Keçərsiz Fayl Yolu" +Output.BadPath.Text="Konfiqurasiya edilmiş Qeyd Yolunu açmaq mümkün olmadı. Zəhmət olmasa, Parametrlər → Çıxış → Qeydə alma bölməsindəki Qeyd Yolunuzu yoxlayın." +Output.NoBroadcast.Title="Heç bir Yayım Konfiqurasiya Edilməyib" +Output.NoBroadcast.Text="Yayımı başlatmazdan əvvəl bir yayım konfiqurasiya etməlisiniz." +Output.BroadcastStartFailed="Yayımı başlatmaq mümkün olmadı" +Output.BroadcastStopFailed="Yayımı dayandırmaq mümkün olmadı" +LogUploadDialog.Title="OBS Studio Jurnal Faylı Yüklənməsi" +LogUploadDialog.Labels.PrivacyNotice="Zəhmət olmasa, hər hansı bir faylı yükləmədən əvvəl <a href='https://obsproject.com/privacy-policy'>Məxfilik Siyasətini</a> və onun fayl yükləmələri ilə bağlı bölməsini oxuyun." +LogUploadDialog.Labels.Progress="Jurnal yüklənir. Zəhmət olmasa gözləyin..." +LogUploadDialog.Labels.Description.AppLog="Jurnal faylınız yükləndi. İndi siz URL-i sazlama və ya dəstək məqsədləri üçün paylaşa bilərsiniz." +LogUploadDialog.Labels.Description.CrashLog="Çökmə hesabatınız yükləndi. İndi siz URL-i sazlama məqsədləri üçün paylaşa bilərsiniz." +LogUploadDialog.Buttons.ConfirmUpload="Yüklə" +LogUploadDialog.Buttons.CopyURL="Jurnal URL-ni Kopyala" +LogUploadDialog.Buttons.AnalyzeURL="Jurnal Faylını Təhlil et" +LogUploadDialog.Buttons.RetryButton="Yenidən cəhd et" +LogUploadDialog.Errors.Template="Faylı yükləməyə çalışarkən xəta baş verdi:\n\n%1" +LogUploadDialog.Errors.NoLogFile="Yükləmək üçün heçbir bir fayl tapılmadı və ya fayl boş idi." +Remux.SourceFile="OBS Qeydi" Remux.TargetFile="Hədəf Fayl" -Remux.Stop="Remuxu dayandır" -Remux.ClearFinished="Bitmiş elementləri təmizlə" +Remux.Remux="Yenidən Birləşdir" +Remux.Stop="Yenidən Birləşdirməni Dayandır" +Remux.ClearFinished="Tamamlanmış Elementləri Təmizlə" Remux.ClearAll="Bütün Elementləri Təmizlə" -Remux.OBSRecording="OBS Çəkimi" -Remux.FinishedTitle="Remux tamamlandı" -Remux.Finished="Çəkim remux edildi" -Remux.FinishedError="Çəkim remux edildi, amma fayl tamamlanmamış ola bilər" -Remux.SelectRecording="OBS Çəkimini Seç..." +Remux.OBSRecording="OBS Qeydi" +Remux.FinishedTitle="Yenidən birləşdirmə tamamlandı" +Remux.Finished="Qeyd yenidən birləşdirildi" +Remux.FinishedError="Qeyd yenidən birləşdirildi, lakin fayl natamam ola bilər" +Remux.SelectRecording="OBS Qeydini Seç..." Remux.SelectTarget="Hədəf faylı seç..." -Remux.FileExistsTitle="Hədəf fayllar var" -Remux.FileExists="Aşağıdakı hədəf fayılları artıq mövcuddur. Onları əvəz etmək istəyirsiniz?" -Remux.ExitUnfinishedTitle="Halhazırda Remuxing prosesi gedir" -Remux.ExitUnfinished="Dönüşdürmə bitməyib, Halhazırda prosesi dayandırmaq hədəf faylını yararsız hala gətirə bilər.\nDönüşdürməni dayandırmaq istədiyinizə əminsiniz?" -Remux.HelpText="Dönüşdürmək üçün faylları bu pəncərəyə atın, və ya bir fayl seçmək üçün boş bir \"OBS Çəkim\" xanasını seçin." -Remux.NoFilesAddedTitle="Dönüşdürmə faylı əlavə edilməyib" -Remux.NoFilesAdded="Dönüşdürmək üçün fayl əlavə olunmayıb. Bir və ya daha çox video faylından ibarə bir qovluq atın." +Remux.FileExistsTitle="Hədəf fayllar mövcuddur" +Remux.FileExists="Aşağıdakı hədəf fayllar artıq mövcuddur. Onları əvəz etmək istəyirsiniz?" +Remux.ExitUnfinishedTitle="Yenidən birləşdirmə gedir" +Remux.ExitUnfinished="Yenidən birləşdirmə tamamlanmayıb, indi dayandırmaq hədəf faylı yararsız hala gətirə bilər.\nYenidən birləşdirməni dayandırmaq istədiyinizə əminsiniz?" +Remux.HelpText="Yenidən birləşdirmək üçün faylları bu pəncərəyə sürüşdürün, və ya fayl axtarmaq üçün boş \"OBS Qeydi\" xanasını seçin." +Remux.NoFilesAddedTitle="Heç bir yenidən birləşdirmə faylı əlavə edilməyib" +Remux.NoFilesAdded="Yenidən birləşdirmək üçün heç bir fayl əlavə edilməyib. Tərkibində bir və ya daha çox video faylı olan qovluğu əlavə edin." MissingFiles="Çatışmayan Fayllar" MissingFiles.MissingFile="Çatışmayan Fayl" MissingFiles.NewFile="Yeni Fayl" MissingFiles.HelpText="Son OBS istifadənizdən bəri bəzi fayllar çatışmır" -MissingFiles.Clear="<təmizləndi>" -MissingFiles.NumFound="%2-dən %1-i tapıldı" -MissingFiles.Search="Qovluğu Axtar..." +MissingFiles.NumFound="%2-dən %1 ədədi tapıldı" +MissingFiles.Search="Qovluqda Axtar..." MissingFiles.SelectFile="Fayl seç..." -MissingFiles.SelectDir="Axtarmaq üçün Qovluğu seçin" +MissingFiles.SelectDir="Axtarmaq üçün Qovluq Seçin" MissingFiles.State="Vəziyyət" -MissingFiles.Missing="Əskik" -MissingFiles.Replaced="Əvəz edildi" +MissingFiles.Missing="Çatışmır" +MissingFiles.Replaced="Əvəz Edildi" MissingFiles.Cleared="Təmizləndi" MissingFiles.Found="Tapıldı" -MissingFiles.AutoSearch="Əlavə uyğun fayllar tapıld" -MissingFiles.AutoSearchText="OBS həmin qovluqda itkin fayllar üçün əlavə uyğunluqlar tapdı. Onları əlavə etmək istəyirsiniz?" -MissingFiles.NoMissing.Title="Əskik Faylların Yoxlanışı" -MissingFiles.NoMissing.Text="Heç bir faylın əskik olmadığı görünür." -MacPermissions.MenuAction="Proqramın icazələrini yoxlayın..." -MacPermissions.Title="Proqramın icazələrini yoxlayın" -MacPermissions.Description="OBS Studio müəyyən funksiyaları təmin etmək üçün icazənizi tələb edir. Bu icazələrin aktivləşdirilməsi tövsiyə olunur, lakin tətbiqdən istifadə etmək üçün zəruri deyil. Onları istənilən vaxt sonra da aktivləşdirə bilərsiniz." +MissingFiles.AutoSearch="Əlavə uyğun fayllar tapıldı" +MissingFiles.AutoSearchText="OBS bu qovluqda çatışmayan fayllar üçün əlavə uyğunluqlar tapdı. Onları əlavə etmək istəyirsiniz?" +MissingFiles.NoMissing.Title="Çatışmayan Faylların Yoxlanması" +MissingFiles.NoMissing.Text="Görünür, çatışmayan fayl yoxdur." +MacPermissions.MenuAction="Tətbiq İcazələrini Nəzərdən Keçir..." +MacPermissions.Title="Tətbiq İcazələrini Nəzərdən Keçir" +MacPermissions.Description="OBS Studio müəyyən funksiyaları təmin etmək üçün sizin icazənizi tələb edir. Bu icazələri aktiv etmək tövsiyə olunur, lakin onlar tətbiqi istifadə etmək üçün məcburi deyil. Onları hər zaman sonradan aktiv edə bilərsiniz." MacPermissions.Description.OpenDialog="Bu dialoqu OBS Studio menyusu vasitəsilə yenidən aça bilərsiniz." -MacPermissions.AccessGranted="Giriş icazəsi verildi" -MacPermissions.RequestAccess="İcazə tələb et" -MacPermissions.OpenPreferences="%1 Parametrlərini Aç" -MacPermissions.Item.ScreenRecording="Ekran Çəkimi" -MacPermissions.Item.ScreenRecording.Details="OBS-in ekranı çəkə bilməsi üçün bu icazə tələb olunur." +MacPermissions.AccessGranted="Giriş İcazəsi Verildi" +MacPermissions.RequestAccess="Giriş Tələb Et" +MacPermissions.OpenPreferences="%1 Seçimlərini Aç" +MacPermissions.Item.ScreenRecording="Ekran Qeydi" +MacPermissions.Item.ScreenRecording.Details="OBS ekranınızı yaxalaya bilmək üçün bu icazəni tələb edir." MacPermissions.Item.Camera="Kamera" -MacPermissions.Item.Camera.Details="Bu icazə, veb kamera və ya çəkim kartdan məzmunu çəkə bilmək üçün lazımdır." +MacPermissions.Item.Camera.Details="Bu icazə veb-kamera və ya yaxalama kartından məzmun yaxalamaq üçün tələb olunur." MacPermissions.Item.Microphone="Mİkrofon" -MacPermissions.Item.Microphone.Details="OBS, mikrofonunuzu və ya xarici səs cihazını çəkmək istəyirsinizsə, bu icazəni tələb edir." +MacPermissions.Item.Microphone.Details="Əgər mikrofonunuzu və ya xarici səs qurğusunu yaxalamaq istəyirsinizsə, OBS bu icazəni tələb edir." +MacPermissions.Item.InputMonitoring="Giriş İzləməsi" +MacPermissions.Item.InputMonitoring.Details="OBS arxa fonda olarkən qısayol düymələrinin işləməsi üçün bu icazə tələb olunur." MacPermissions.Item.Accessibility="Əlçatanlıq" +MacPermissions.Item.Accessibility.Details="Köhnə quraşdırmalarda OBS \"Giriş İzləməsi\" əvəzinə \"Əlçatanlıq\" bölməsində göstərilə bilər." MacPermissions.Continue="Davam et" -SourceLeak.Title="Mənbənin Təmizlənməsi Xətası" -SourceLeak.Text="Səhnə kolleksiyalarını dəyişdirərkən bir problem yarandı və bəzi mənbələr çıxarıla bilmədi. Bu problem adətən resursları düzgün sərbəst buraxmayan plaginlər səbəbindən baş verir. İstifadə etdiyiniz plaginlərin güncəl olduğuna əmin olun. Mümkün məlumat itkisinin qarşısını almaq üçün OBS Studio indi bağlanacaq." -Basic.DesktopDevice1="Masaüstü Səs" -Basic.DesktopDevice2="Masaüstü Səs 2" +SourceLeak.Title="Mənbə Təmizləmə Xətası" +SourceLeak.Text="Səhnə kolleksiyalarını dəyişdirərkən problem yarandı və bəzi mənbələri yaddaşdan çıxarmaq mümkün olmadı. Bu problem adətən resursları düzgün azad etməyən plaginlər tərəfindən yaranır. Zəhmət olmasa, istifadə etdiyiniz bütün plaginlərin güncəl olduğundan əmin olun.\n\nMümkün məlumat zədələnməsinin qarşısını almaq üçün OBS Studio indi bağlanacaq." +Basic.DesktopDevice1="Masaüstü Səsi" +Basic.DesktopDevice2="Masaüstü Səsi 2" Basic.Scene="Səhnə" -Basic.DisplayCapture="Ekran Çəkimi" -Basic.Main.PreviewConextMenu.Enable="Önbaxışı Fəallaşdır" -Basic.Main.Preview.Disable="Önbaxışı Sıradan Çıxart" -ScaleFiltering="Ölçüləndirmə Süzgəci" +Basic.DisplayCapture="Ekran Yaxalama" +Basic.Main.PreviewConextMenu.Enable="Ön Baxışı Aktiv et" +Basic.Main.Preview.Disable="Ön Baxışı Deaktiv Et" +ScaleFiltering="Miqyas Filtrləməsi" ScaleFiltering.Point="Nöqtə" ScaleFiltering.Bicubic="Bikubik" ScaleFiltering.Area="Sahə" -BlendingMethod="Qarışdırma rejimi" -BlendingMethod.Default="Susmaya görə" -BlendingMethod.SrgbOff="SRGB Söndürülüb" -BlendingMode="Qarışdırma rejimi" +BlendingMethod="Qarışdırma Metodu" +BlendingMethod.Default="İlkin təyin olunan" +BlendingMethod.SrgbOff="SRGB Deaktiv" +BlendingMode="Qarışdırma Rejimi" BlendingMode.Additive="Əlavə et" -BlendingMode.Subtract="Çıxarmaq" +BlendingMode.Subtract="Çıxma" BlendingMode.Screen="Ekran" -BlendingMode.Multiply="Çoxaltmaq" -BlendingMode.Lighten="Aydınlatma" -BlendingMode.Darken="Qaraltma" +BlendingMode.Multiply="Vurma" +BlendingMode.Lighten="Açıqlaşdır" +BlendingMode.Darken="Tündləşdir" +Deinterlacing="Sətirlərarasını Ləğv Etmə" Deinterlacing.Discard="Ləğv et" Deinterlacing.TopFieldFirst="Əvvəlcə Üst Sahə" Deinterlacing.BottomFieldFirst="Əvvəlcə Alt Sahə" -VolControl.SliderUnmuted="'%1' üçün səs sürüşdürmə:" -VolControl.SliderMuted="'%1' üçün səs sürüşdürmə: (hazırda susturuldu)" -VolControl.Mute=" '%1'-i Susdur" -VolControl.Properties="'%1' üçün Özəlliklər" -VolControl.UnassignedWarning.Title="Təyin olunmamış Səs Mənbəsi" -VolControl.UnassignedWarning.Text="\"%1\" hərhansı bir səs parçasına təyin edilməyib, axınlar və ya qeydlər eşidilə bilməz.\n\nSəs mənbəsini Axın xəttinə təyin etmək üçün Geniş Səs Özəllikləri sağ düymə menyusu və ya qarıştırıcı yuvası alət çubuğundakı çarx düməsi ilə aç." +VolControl.SliderUnmuted="'%1' üçün səs ucalığı sürgüsü:" +VolControl.SliderMuted="'%1' üçün səs ucalığı sürgüsü: (hazırda səssizdir)" +VolControl.Mute=" '%1'-i Səssizləşdir" +VolControl.Properties="'%1' üçün Xüsusiyyətlər" +VolControl.UnassignedWarning.Title="Təyin Edilməmiş Səs Mənbəyi" +VolControl.UnassignedWarning.Text="\"%1\" heç bir səs trekinə təyin edilməyib və yayımlarda və ya qeydə almalarda eşidilən olmayacaq.\n\nSəs mənbəyini bir trekə təyin etmək üçün, mikser pəncərəsi alətlər panelindəki sağ klik menyusu və ya dişli çarx düyməsi vasitəsilə Qabaqcıl Səs Xüsusiyyətlərini açın." Basic.Main.AddSceneDlg.Title="Səhnə Əlavə et" Basic.Main.AddSceneDlg.Text="Zəhmət olmasa, səhnənin adını daxil edin" Basic.Main.DefaultSceneName.Text="Səhnə %1" Basic.Main.AddSceneCollection.Title="Səhnə Kolleksiyası Əlavə et" Basic.Main.AddSceneCollection.Text="Zəhmət olmasa, səhnə kolleksiyasının adını daxil edin" -Basic.Main.RenameSceneCollection.Title="Səhnə kolleksiyasını yenidən adlandırın" -Basic.Main.RemigrateSceneCollection.Title="Səhnə Kolleksiyası Həllini Güncəllə" -Basic.Main.RemigrateSceneCollection.Text="\"%1\" səhnə kolleksiyası qətiyətini, keçərli profilin %2x%3 çərçivə qətiyyəti ilə uyğunlaşacaq şəkildə güncəlləmək istəyirsiniz?" -Basic.Main.RemigrateSceneCollection.CannotMigrate.Active="Çıxışlar aktiv olarkən səhnə kolleksiyası qətiyyəti güncəllənə bilmir." -Basic.Main.RemigrateSceneCollection.CannotMigrate.UnknownBaseResolution="Səhnə kolleksiyası qətiyyətini güncəlləmək uğursuz oldu. Orginal qətiyyət bilinmir." -Basic.Main.RemigrateSceneCollection.CannotMigrate.FailedVideoReset="Sıfırlamaq mümkün deyil: OBS qətiyyətini dəyişmək uğursuz oldu." -Basic.Main.RemigrateSceneCollection.CannotMigrate.BaseResolutionMatches="Sıfırlamaq mümkün deyil: Cari qətiyyət artıq səhnə kolleksiyasının əsas qətiyyətidir." +Basic.Main.RenameSceneCollection.Title="Səhnə Kolleksiyasını Yenidən Adlandır" +Basic.Main.RemigrateSceneCollection.Title="Səhnə Kolleksiyasının Rezolyusiyasını Yenilə" +Basic.Main.RemigrateSceneCollection.Text="\"%1\" səhnə kolleksiyasının rezolyusiyasını cari profilin canvas rezolyusiyası olan %2x%3 ilə uyğunlaşdırmaq üçün yeniləmək istəyirsiniz?" +Basic.Main.RemigrateSceneCollection.CannotMigrate.Active="Çıxışlar aktiv olduqda səhnə kolleksiyasının rezolyusiyasını yeniləmək mümkün deyil." +Basic.Main.RemigrateSceneCollection.CannotMigrate.UnknownBaseResolution="Səhnə kolleksiyasının rezolyusiyasını yeniləmək mümkün olmadı. Orijinal rezolyusiya məlum deyil." +Basic.Main.RemigrateSceneCollection.CannotMigrate.FailedVideoReset="Sıfırlama mümkün deyil: OBS rezolyusiyasını dəyişmək mümkün olmadı." +Basic.Main.RemigrateSceneCollection.CannotMigrate.BaseResolutionMatches="Sıfırlama mümkün deyil: Cari rezolyusiya artıq səhnə kolleksiyasının əsas rezolyusiyasıdır." AddProfile.Title="Profil Əlavə et" AddProfile.Text="Zəhmət olmasa, profilin adını daxil edin" -AddProfile.WizardCheckbox="Avto-konfiqurasiya sehirbazını göstər" -RenameProfile.Title="Profili yenidən adlandır" -Basic.Main.MixerRename.Title="Səs mənbəsini yenidən adlandır" +AddProfile.WizardCheckbox="Avtomatik konfiqurasiya sehrbazını göstər" +RenameProfile.Title="Profili Yenidən Adlandır" +Basic.Main.MixerRename.Title="Səs Mənbəsini Yenidən Adlandır" Basic.Main.MixerRename.Text="Zəhmət olmasa, səs mənbəsinin adını daxil edin" -Basic.Main.PreviewDisabled="Önbaxış hazırda deaktivdir" -Basic.SourceSelect="Mənbəni Yarat/Seç " +Basic.Main.PreviewDisabled="Ön baxış hazırda deaktivdir" +Basic.SourceSelect="Mənbə Yarat/Seç " Basic.SourceSelect.CreateNew="Yenisini yarat" -Basic.SourceSelect.AddExisting="Varolanı əlavə et" -Basic.SourceSelect.AddVisible="Mənbəni görülə bilən et" -Basic.Main.Sources.Visibility="Görünürlük" -Basic.Main.Sources.VisibilityDescription="'%1' 'in görünə bilirliyini təyin edir" +Basic.SourceSelect.AddExisting="Mövcud Olanı Əlavə et" +Basic.SourceSelect.AddVisible="Mənbəni görünən et" +Basic.Main.Sources.Visibility="Görünmə" +Basic.Main.Sources.VisibilityDescription="Canvas-da '%1'-in görünməsini idarə edir" Basic.Main.Sources.Lock="Kilidlə" -Basic.Main.Sources.LockDescription="'%1' obyektinin yerini və ölçüsünü çərçivədə kilidləyir" -Basic.PropertiesWindow="'%1' üçün Özəlliklər" +Basic.Main.Sources.LockDescription="Canvas-da '%1'-in mövqeyini və miqyasını kilidləyir" +Basic.PropertiesWindow="'%1' üçün Xüsusiyyətlər" Basic.PropertiesWindow.AutoSelectFormat="%1 (avtoseçim:%2)" Basic.PropertiesWindow.SelectColor="Rəng seç" -Basic.PropertiesWindow.SelectFont="Font seç" -Basic.PropertiesWindow.SelectFont.WindowTitle="Bir font göür" +Basic.PropertiesWindow.SelectFont="Şirft seç" +Basic.PropertiesWindow.SelectFont.WindowTitle="Bir Şrift Seç" Basic.PropertiesWindow.ConfirmTitle="Parametrlər Dəyişdi" Basic.PropertiesWindow.Confirm="Yadda saxlanılmayan dəyişikliklər var. Onları saxlamaq istəyirsiniz?" -Basic.PropertiesWindow.NoProperties="Xüsusiyyətlər mövcud deyil" -Basic.PropertiesWindow.AddFiles="Fayllar əlavə et" -Basic.PropertiesWindow.AddDir="Qovluq əlavə et" -Basic.PropertiesWindow.AddURL="Yol/Bağlantı Adresi Əlavə Et" -Basic.PropertiesWindow.AddEditableListDir="'%1'-ə qovluq əlavə et" -Basic.PropertiesWindow.AddEditableListFiles="'%1'-ə fayllar əlavə et" -Basic.PropertiesWindow.AddEditableListEntry="'%1'-ə qeyd əlavə et" -Basic.PropertiesWindow.EditEditableListEntry="'%1'-dən qeyd əlavə et" -Basic.PropertiesView.FPS.Simple="Sadə FPS qiymətləri" -Basic.PropertiesView.FPS.Rational="Rasional FPS Qiymətləri" +Basic.PropertiesWindow.NoProperties="Heç bir xüsusiyyət mövcud deyil" +Basic.PropertiesWindow.AddFiles="Fayllar Əlavə et" +Basic.PropertiesWindow.AddDir="Qovluq Əlavə et" +Basic.PropertiesWindow.AddURL="Yol/URL Əlavə et" +Basic.PropertiesWindow.AddEditableListDir="'%1'-ə qovluq əlavə et" +Basic.PropertiesWindow.AddEditableListFiles="'%1'-ə fayllar əlavə et" +Basic.PropertiesWindow.AddEditableListEntry="'%1' siyahısına qeyd əlavə et" +Basic.PropertiesWindow.EditEditableListEntry="'%1' siyahısındakı qeydə düzəliş et" +Basic.PropertiesView.FPS.Simple="Sadə FPS Dəyərləri" +Basic.PropertiesView.FPS.Rational="Rasional FPS Dəyərləri" Basic.PropertiesView.FPS.ValidFPSRanges="Keçərli FPS Aralıqları:" -Basic.PropertiesView.UrlButton.Text="Bu link varsayılan veb brauzerinizdə açılsın?" -Basic.PropertiesView.UrlButton.OpenUrl="Bağlantı Adresi Aç" -Basic.InteractionWindow="'%1' ilə əlaqə" -Basic.StatusBar.Reconnecting="Bağlantı kəsildi,%2 saniyədə yenidən bağlanır (cəhd %1)" -Basic.StatusBar.AttemptingReconnect="Yenidən bağlanma cəhdi... (cəhd %1)" -Basic.StatusBar.ReconnectSuccessful="Yenidən bağlanma uğurlu" +Basic.PropertiesView.UrlButton.Text="Bu link standart veb brauzerinizdə açılsın?" +Basic.PropertiesView.UrlButton.OpenUrl="URL-ni aç" +Basic.InteractionWindow="'%1' ilə Qarşılıqlı Əlaqə" +Basic.StatusBar.Reconnecting="Bağlantı kəsildi, %2 saniyə sonra yenidən qoşulur (cəhd %1)" +Basic.StatusBar.AttemptingReconnect="Yenidən qoşulmağa cəhd edilir... (cəhd %1)" +Basic.StatusBar.ReconnectSuccessful="Yenidən qoşulma uğurlu oldu" Basic.StatusBar.Delay="Gecikmə (%1 san)" Basic.StatusBar.DelayStartingIn="Gecikmə (%1 saniyədə başlayır)" Basic.StatusBar.DelayStoppingIn="Gecikmə (%1 saniyədə dayanır)" Basic.StatusBar.DelayStartingStoppingIn="Gecikmə (%1 saniyədə dayanır,%2 saniyədə başlayır)" -Basic.StatusBar.RecordingSavedTo="Çəkim '%1'-də yadda saxlandı" -Basic.StatusBar.ReplayBufferSavedTo="Yenidən oynatma buferi '%1'-də yadda saxlandı" -Basic.StatusBar.ScreenshotSavedTo="Ekran görüntüsü '%1'-də yadda saxlandı" -Basic.StatusBar.AutoRemuxedTo="Çəkim '%1'-ə avto çevrildi" -Basic.Filters="Süzgəclər" -Basic.Filters.AsyncFilters="Səs/Video Süzgəcləri" -Basic.Filters.AudioFilters="Səs Süzgəcləri" -Basic.Filters.EffectFilters="Effekt Süzgəcləri" -Basic.Filters.Title=" '%1' üçün Süzgəclər" -Basic.Filters.AddFilter.Title="Süzgəclər adı" -Basic.Filters.AddFilter.Text="Zəhmət olmasa, süzgəcin adını müəyyən edin" -Basic.TransformWindow="Səhnə Elementinin Transformasiyası" -Basic.TransformWindow.Position="Yer" -Basic.TransformWindow.PositionX="X-da Yeri" -Basic.TransformWindow.PositionY="Y-da Yeri" +Basic.StatusBar.RecordingSavedTo="Qeyd Alma '%1' ünvanında saxlandı" +Basic.StatusBar.ReplayBufferSavedTo="Təkrar oxutma buferi '%1' ünvanında saxlandı" +Basic.StatusBar.ScreenshotSavedTo="Ekran görüntüsü '%1' ünvanında saxlandı" +Basic.StatusBar.AutoRemuxedTo="Qeyd Alma avtomatik olaraq '%1' ünvanında yenidən birləşdirildi" +Basic.Filters="Filtrlər" +Basic.Filters.AsyncFilters="Səs/Video Filtrləri" +Basic.Filters.AudioFilters="Səs Filtrləri" +Basic.Filters.EffectFilters="Effekt Filtrləri" +Basic.Filters.Title="'%1' üçün Filtrlər" +Basic.Filters.AddFilter.Title="Filtr adı" +Basic.Filters.AddFilter.Text="Zəhmət olmasa, filtrin adını daxil edin" +Basic.TransformWindow="Səhnə Elementinin Çevrilməsi" +Basic.TransformWindow.Position="Mövqe" +Basic.TransformWindow.PositionX="X Mövqeyi" +Basic.TransformWindow.PositionY="Y Mövqeyi" Basic.TransformWindow.Rotation="Fırlanma" Basic.TransformWindow.Size="Ölçü" -Basic.TransformWindow.Width="Eni" -Basic.TransformWindow.Height="Hündürlüyü" -Basic.TransformWindow.Alignment="Yerə Görə Hizalanma" -Basic.TransformWindow.Crop="Qırp" -Basic.TransformWindow.CropLeft="Soldan Qırp" -Basic.TransformWindow.CropRight="Sağdan Qırp" -Basic.TransformWindow.CropTop="Üstdən Qırp" -Basic.TransformWindow.CropBottom="Altdan Qırp" -Basic.TransformWindow.Alignment.TopLeft="Sol Üst" -Basic.TransformWindow.Alignment.TopCenter="Yuxarı Orta" +Basic.TransformWindow.Width="En" +Basic.TransformWindow.Height="Hündürlük" +Basic.TransformWindow.Alignment="Mövqeyə görə Düzlənmə" +Basic.TransformWindow.BoundsType="Məhdudlaşdırıcı Qutu Növü" +Basic.TransformWindow.BoundsAlignment="Məhdudlaşdırıcı Qutuda Düzlənmə" +Basic.TransformWindow.Bounds="Məhdudlaşdırıcı Qutu Ölçüsü" +Basic.TransformWindow.BoundsWidth="Məhdudlaşdırıcı Qutu Eni" +Basic.TransformWindow.BoundsHeight="Məhdudlaşdırıcı Qutu Hündürlüyü" +Basic.TransformWindow.CropToBounds="Məhdudlaşdırıcı Qutuya Görə Kəs" +Basic.TransformWindow.Crop="Kəs" +Basic.TransformWindow.CropLeft="Soldan Kəs" +Basic.TransformWindow.CropRight="Sağdan Kəs" +Basic.TransformWindow.CropTop="Üstdən Kəs" +Basic.TransformWindow.CropBottom="Altdan Kəs" +Basic.TransformWindow.Alignment.TopLeft="Yuxarı Sol" +Basic.TransformWindow.Alignment.TopCenter="Yuxarı Mərkəz" Basic.TransformWindow.Alignment.TopRight="Yuxarı Sağ" -Basic.TransformWindow.Alignment.CenterLeft="Sol Orta" -Basic.TransformWindow.Alignment.Center="Orta" -Basic.TransformWindow.Alignment.CenterRight="Orta sağ" -Basic.TransformWindow.Alignment.BottomLeft="Aşağı sol" -Basic.TransformWindow.Alignment.BottomCenter="Aşağı orta" -Basic.TransformWindow.Alignment.BottomRight="Aşağı sağ" -Basic.TransformWindow.BoundsType.None="Sonsuz" -Basic.TransformWindow.BoundsType.MaxOnly="Sadəcə maksimum ölçü" -Basic.TransformWindow.BoundsType.ScaleInner="İç sərhədləri ölçüləndir" -Basic.TransformWindow.BoundsType.ScaleOuter="Çöl sərhədləri ölçüləndir" -Basic.TransformWindow.BoundsType.ScaleToWidth="Sərhəd genişliyini ölçüləndir" -Basic.TransformWindow.BoundsType.ScaleToHeight="Sərhəd yüksəkliyini ölçüləndir" -Basic.TransformWindow.BoundsType.Stretch="Sərhədləri genişləndir" -Basic.TransformWindow.Title="'%1' üçün Transformasiyanı Redaktə Et" -Basic.TransformWindow.NoSelectedSource="Mənbə seçilməyib" -Basic.Main.AddSourceHelp.Title="Mənbə əlavə edilə bilmir" -Basic.Main.AddSourceHelp.Text="Bir mənbə əlavə etmək üçün sizə ən azı 1 səhnə lazımdır." +Basic.TransformWindow.Alignment.CenterLeft="Mərkəz Sol" +Basic.TransformWindow.Alignment.Center="Mərkəz" +Basic.TransformWindow.Alignment.CenterRight="Mərkəz Sağ" +Basic.TransformWindow.Alignment.BottomLeft="Aşağı Sol" +Basic.TransformWindow.Alignment.BottomCenter="Aşağı Mərkəz" +Basic.TransformWindow.Alignment.BottomRight="Aşağı Sağ" +Basic.TransformWindow.BoundsType.None="Sərhəd yoxdur" +Basic.TransformWindow.BoundsType.MaxOnly="Yalnız maksimum ölçü" +Basic.TransformWindow.BoundsType.ScaleInner="Daxili sərhədlərə görə miqyaslandır" +Basic.TransformWindow.BoundsType.ScaleOuter="Xarici sərhədlərə görə miqyaslandır" +Basic.TransformWindow.BoundsType.ScaleToWidth="Sərhədlərin eninə görə miqyaslandır" +Basic.TransformWindow.BoundsType.ScaleToHeight="Sərhədlərin hündürlüyünə görə miqyaslandır" +Basic.TransformWindow.BoundsType.Stretch="Sərhədlərə dart" +Basic.TransformWindow.Title="'%1' üçün Çevirməni Redaktə et" +Basic.TransformWindow.NoSelectedSource="Heç bir mənbə seçilməyib" +Basic.Main.AddSourceHelp.Title="Mənbə Əlavə Etmək Mümkün Deyil" +Basic.Main.AddSourceHelp.Text="Mənbə əlavə etmək üçün ən azı 1 səhnəniz olmalıdır." Basic.Main.Scenes="Səhnələr" Basic.Main.Sources="Mənbələr" Basic.Main.Source="Mənbə" -Basic.Main.Controls="Nəzarətlər" +Basic.Main.Controls="Nəzarət Paneli" Basic.Main.PreparingStream="Hazırlanır..." Basic.Main.Connecting="Qoşulur..." -Basic.Main.StartRecording="Çəkimi başlat" -Basic.Main.StartReplayBuffer="Yenidən Oynatma Buferini Başlat" -Basic.Main.SaveReplay="Yeniden Oynatmanı Saxla" -Basic.Main.StartStreaming="Yayıma başla" -Basic.Main.StartBroadcast="Canlı Yayına Keç" +Basic.Main.StartRecording="Qeydə Almanı Başlat" +Basic.Main.StartReplayBuffer="Təkrar Oxutma Buferini Başlat" +Basic.Main.SaveReplay="Təkrar Oxutmanı Saxla" +Basic.Main.StartStreaming="Yayımı Başlat" +Basic.Main.StartBroadcast="Canlı Yayıma Keç" Basic.Main.StartVirtualCam="Virtual Kameranı Başlat" -Basic.Main.StopRecording="Çəkimi dayandır" -Basic.Main.PauseRecording="Çəkimə fasilə ver" -Basic.Main.UnpauseRecording="Çəkimə davam et" +Basic.Main.StopRecording="Qeydə Almanı Dayandır" +Basic.Main.PauseRecording="Qeydə Almağa Fasilə ver" +Basic.Main.UnpauseRecording="Qeydə Almağa Davam et" Basic.Main.SplitFile="Qeyd Faylını Böl" -Basic.Main.StoppingRecording="Çəkim dayandırılır..." -Basic.Main.StopReplayBuffer="Yenidən Oynatma Buferini Dayandır" -Basic.Main.StoppingReplayBuffer="Yenidən Oynatma Buferi Dayandırılır..." -Basic.Main.SetupBroadcast="Yayını idarə et" +Basic.Main.AddChapterMarker="Fəsil İşarəsi Əlavə et (yalnız Hibrid MP4/MOV)" +Basic.Main.StoppingRecording="Qeydə Alma Dayandırılır..." +Basic.Main.StopReplayBuffer="Təkrar Oxutma Buferini Dayandır" +Basic.Main.StoppingReplayBuffer="Təkrar Oxutma Buferi Dayandırılır..." +Basic.Main.SetupBroadcast="Yayımı İdarə et" Basic.Main.StopStreaming="Yayımı Dayandır" Basic.Main.StopBroadcast="Yayımı Bitir" Basic.Main.AutoStopEnabled="(Avto Dayandırma)" -Basic.Main.StoppingStreaming="Canlı Yayın Dayandırılır..." -Basic.Main.ForceStopStreaming="Yayımı dayandır(gecikməni ləğv et)" -Basic.Main.ShowContextBar="Mənbə menyusunu göstər" -Basic.Main.HideContextBar="Mənbə menyusunu gizlət" +Basic.Main.StoppingStreaming="Yayım Dayandırılır..." +Basic.Main.ForceStopStreaming="Yayımı Dayandır (gecikməni ləğv et)" +Basic.Main.ShowContextBar="Mənbə Alətlər Panelini Göstər" +Basic.Main.HideContextBar="Mənbə Alətlər Panelini Gizlət" Basic.Main.StopVirtualCam="Virtual Kameranı Dayandır" Basic.Main.Group="Qrup %1" -Basic.Main.GroupItems="Seçilmiş elementləri qruplaşdır" -Basic.Main.Ungroup="Qruplaşdırmayın" +Basic.Main.GroupItems="Seçilmiş Elementləri Qruplaşdır" +Basic.Main.Ungroup="Qrupu Ləğv Et" +Basic.Main.GridMode="Tor Rejimi" +Basic.Main.ListMode="Siyahı Rejimi" +Basic.Main.VirtualCamConfig="Virtual Kameranı Konfiqurasiya et" Basic.VCam.VirtualCamera="Virtual Kamera" -Basic.VCam.OutputType="Çıxış tipi" -Basic.VCam.OutputSelection="Çıxış seçimi" -Basic.VCam.OutputType.Program="Program (İlkin)" -Basic.VCam.OutputSelection.NoSelection="Bu çıxış tipi üçün seçim yoxdur" -Basic.VCam.RestartWarning="Bu dəyişikliyi tətbiq etmək üçün virtual kamera yenidən başladılacaq." +Basic.VCam.OutputType="Çıxış Növü" +Basic.VCam.OutputSelection="Çıxış Seçimi" +Basic.VCam.OutputType.Program="Proqram (İlkin Təyin olunan)" +Basic.VCam.OutputSelection.NoSelection="Bu çıxış növü üçün seçim yoxdur" +Basic.VCam.RestartWarning="Bu dəyişikliyi tətbiq etmək üçün virtual kamera yenidən başladılacaq" Basic.MainMenu.File="&Fayl" Basic.MainMenu.File.Export="&İxrac et" Basic.MainMenu.File.Import="&İdxal et" -Basic.MainMenu.File.ShowRecordings="&Çəkilişləri Göstər" -Basic.MainMenu.File.Remux="Qeydləri Re&mux et" -Basic.MainMenu.File.Settings="Parametrlər" +Basic.MainMenu.File.ShowRecordings="&Qeydə alınmışları Göstər" +Basic.MainMenu.File.Remux="&Qeydə Alınmışları Yenidən Birləşdir" +Basic.MainMenu.File.Settings="&Parametrlər" Basic.MainMenu.File.ShowSettingsFolder="Parametrlər Qovluğunu Göstər" Basic.MainMenu.File.ShowProfileFolder="Profil Qovluğunu Göstər" Basic.MainMenu.File.ShowMissingFiles="İtmiş Faylları Yoxla" -Basic.MainMenu.File.Exit="Çı&xış" -Basic.MainMenu.Edit="&Redaktə" +Basic.MainMenu.File.Exit="Çı&x" +Basic.MainMenu.Edit="&Redaktə et" Basic.MainMenu.Edit.LockPreview="&Önizləməni Kilidlə" -Basic.MainMenu.Edit.Scale="Önizləmə &Ölçüləndirmə" -Basic.MainMenu.Edit.Scale.Window="Pəncərəyə Ölçüləndir" +Basic.MainMenu.Edit.Scale="Önizləmə &Miqyası" +Basic.MainMenu.Edit.Scale.Window="Pəncərəyə Uyğun Miqyaslandır" Basic.MainMenu.Edit.Scale.Output="Çıxış (%1x%2)" -Basic.MainMenu.Edit.Scale.Manual="Ölçüləndirilmiş (%1x%2)" -Basic.MainMenu.Edit.Transform="Dəyişdir" -Basic.MainMenu.Edit.Transform.EditTransform="&Çevrilməni redaktə et..." -Basic.MainMenu.Edit.Transform.CopyTransform="Çevrilməni kppyala" -Basic.MainMenu.Edit.Transform.PasteTransform="Çevrilməni yapışdır" -Basic.MainMenu.Edit.Transform.ResetTransform="&Çevrilməni sıfırla" -Basic.MainMenu.Edit.Transform.Rotate90CW="90 dərəcə saat istiqamətində çevir" -Basic.MainMenu.Edit.Transform.Rotate90CCW="90 dərəcə saat istiqamətinin əksinə çevir" -Basic.MainMenu.Edit.Transform.Rotate180="180 dərəcə çevir" -Basic.MainMenu.Edit.Transform.FlipHorizontal="&Horizontal çevir" -Basic.MainMenu.Edit.Transform.FlipVertical="&Vertical çevir" -Basic.MainMenu.Edit.Transform.FitToScreen="Ekrana &Sığışdır" -Basic.MainMenu.Edit.Transform.StretchToScreen="Ekrana &Uzat" -Basic.MainMenu.Edit.Transform.CenterToScreen="Ekrana &Mərkəzlə" -Basic.MainMenu.Edit.Transform.VerticalCenter="Vertikal olaraq mərkəzlə" -Basic.MainMenu.Edit.Transform.HorizontalCenter="Horizontal olaraq mərkəzlə" -Basic.MainMenu.Edit.Order="&Sırala" -Basic.MainMenu.Edit.Order.MoveUp="&Yuxarıya Köçür" -Basic.MainMenu.Edit.Order.MoveDown="&Aşağıya Köçür" -Basic.MainMenu.Edit.Order.MoveToTop="Ən &Üstə Köçür" -Basic.MainMenu.Edit.Order.MoveToBottom="Ən &Alta Köçür" -Basic.MainMenu.Edit.AdvAudio="&Geniş Səs Xüsusiyyətləri" -Basic.MainMenu.View="Bax (&V)" -Basic.MainMenu.View.Toolbars="&Alətlər Panelləri" -Basic.MainMenu.View.ListboxToolbars="Yuva Alət Panelləri" -Basic.MainMenu.View.ContextBar="Mənbə Alət Paneli" -Basic.MainMenu.View.SourceIcons="Mənbə &Nişanlar" -Basic.MainMenu.View.StatusBar="&Vəziyyət Paneli" -Basic.MainMenu.View.Fullscreen.Interface="Tamekran interfeysi" -Basic.MainMenu.View.ResetUI="UI &Sıfırla" -Basic.MainMenu.View.AlwaysOnTop="Həmişə Ən &Üstə" -Basic.MainMenu.View.SceneListMode="Səhnə List Rejimi" -Basic.MainMenu.Docks="&Panellər" -Basic.MainMenu.Docks.ResetDocks="Panelləri &Sıfırla" -Basic.MainMenu.Docks.LockDocks="Panelləri &Kilidlə" -Basic.MainMenu.Docks.SideDocks="&Tam-Hündürlüklü Panellər" -Basic.MainMenu.Docks.CustomBrowserDocks="&Özəl Veb Brauzer Dock-ları..." -Basic.MainMenu.SceneCollection="&Səhnə kolleksiyası" +Basic.MainMenu.Edit.Scale.Manual="Miqyaslandırılıb (%1x%2)" +Basic.MainMenu.Edit.Scale.ZoomIn="Yaxınlaşdır" +Basic.MainMenu.Edit.Scale.ZoomOut="Uzaqlaşdır" +Basic.MainMenu.Edit.Scale.ResetZoom="Miqyası Sıfırla" +Basic.MainMenu.Edit.Transform="&Çevir" +Basic.MainMenu.Edit.Transform.EditTransform="&Çevirməni Redaktə et" +Basic.MainMenu.Edit.Transform.CopyTransform="Çevrilməni Kopyala" +Basic.MainMenu.Edit.Transform.PasteTransform="Çevrilməni Yapışdır" +Basic.MainMenu.Edit.Transform.ResetTransform="&Çevrilməni Sıfırla" +Basic.MainMenu.Edit.Transform.Rotate90CW="90 dərəcə saat əqrəbi istiqamətində fırlat" +Basic.MainMenu.Edit.Transform.Rotate90CCW="90 dərəcə saat əqrəbinin əksinə fırlat" +Basic.MainMenu.Edit.Transform.Rotate180="180 dərəcə fırlat" +Basic.MainMenu.Edit.Transform.FlipHorizontal="&Üfüqi Çevir" +Basic.MainMenu.Edit.Transform.FlipVertical="&Şaquli Çevir" +Basic.MainMenu.Edit.Transform.FitToScreen="&Ekrana Sığdır" +Basic.MainMenu.Edit.Transform.StretchToScreen="&Ekrana Dart" +Basic.MainMenu.Edit.Transform.CenterToScreen="&Ekranda Mərkəzləşdir" +Basic.MainMenu.Edit.Transform.VerticalCenter="Şaquli Mərkəzləşdir" +Basic.MainMenu.Edit.Transform.HorizontalCenter="Üfiqi Mərkəzləşdir" +Basic.MainMenu.Edit.Order="&Sıralama" +Basic.MainMenu.Edit.Order.MoveUp="&Yuxarı Keçir" +Basic.MainMenu.Edit.Order.MoveDown="&Aşağı Keçir" +Basic.MainMenu.Edit.Order.MoveToTop="&Ən Yuxarıya Keçir" +Basic.MainMenu.Edit.Order.MoveToBottom="&Ən Alta Keçir" +Basic.MainMenu.Edit.AdvAudio="&Qabaqcıl Səs Xüsusiyyətləri" +Basic.MainMenu.View="&Görünüş" +Basic.MainMenu.View.Toolbars="&Alətlər Paneli" +Basic.MainMenu.View.ListboxToolbars="Pəncərə Alətlər Panelləri" +Basic.MainMenu.View.ContextBar="Mənbə Alətlər Paneli" +Basic.MainMenu.View.SourceIcons="Mənbə &İkonları" +Basic.MainMenu.View.Fullscreen.Interface="Tamekran İnterfeys" +Basic.MainMenu.View.ResetUI="UI-ı &Sıfırla" +Basic.MainMenu.View.AlwaysOnTop="&Həmişə Üstə" +Basic.MainMenu.View.SceneListMode="Səhnə Siyahısı Rejimi" +Basic.MainMenu.Docks="&Pəncərələr" +Basic.MainMenu.Docks.ResetDocks="&Pəncərələri Sıfırla" +Basic.MainMenu.Docks.LockDocks="&Pəncərələri Kilidlə" +Basic.MainMenu.Docks.SideDocks="&Tam Hündürlüklü Pəncərələr" +Basic.MainMenu.Docks.CustomBrowserDocks="&Fərdi Brauzer Pəncərələri" +Basic.MainMenu.Import="İdxal et..." +Basic.MainMenu.Export="İxrac et..." +Basic.MainMenu.SceneCollection="&Səhnə Kolleksiyası" Basic.MainMenu.Profile="&Profil" -Basic.MainMenu.Profile.Import="Profil daxil et" -Basic.MainMenu.Profile.Export="Profili çıxar" -Basic.MainMenu.SceneCollection.Import="Səhnə kolleksiyası daxil et" -Basic.MainMenu.SceneCollection.Export="Səhnə kolleksiyasını çıxar" -Basic.MainMenu.SceneCollection.Remigrate="Əsas təsvir ölçüsünü sıfırla" -Basic.MainMenu.SceneCollection.Migrate="Əsas təsvir ölçüsünü təyin et" -Basic.MainMenu.Profile.Exists="Bu profil artıq mövcuddur" +Basic.MainMenu.Profile.Import="Profili İdxal Et" +Basic.MainMenu.Profile.Export="Profili İxrac Et" +Basic.MainMenu.SceneCollection.Import="Səhnə Kolleksiyası İdxal et" +Basic.MainMenu.SceneCollection.Export="Səhnə Kolleksiyasını İxrac et" +Basic.MainMenu.SceneCollection.Remigrate="Əsas Rezolyusiyanı Sıfırla" +Basic.MainMenu.SceneCollection.Migrate="Əsas Rezolyusiyanı Təyin et" +Basic.MainMenu.Profile.Exists="Profil artıq mövcuddur" Basic.MainMenu.Tools="&Alətlər" Basic.MainMenu.Help="&Kömək" -Basic.MainMenu.Help.HelpPortal="Kömək &Portal" -Basic.MainMenu.Help.Website="&Vebsaytı ziyarət et" +Basic.MainMenu.Help.HelpPortal="Kömək &Portalı" +Basic.MainMenu.Help.Website="&Vebsayta Keçid et" Basic.MainMenu.Help.Discord="&Discord Serverinə Qoşul" -Basic.MainMenu.Help.WhatsNew="Yeni nə var" -Basic.MainMenu.Help.Logs.ViewCurrentLog="Hazırki jurnala bax (&V)" -Basic.Settings.ProgramRestart="Bu parametrlərin qüvvəyə minməsi üçün proqramı yenidən başlatmalısınız." +Basic.MainMenu.Help.WhatsNew="Yeniliklər" +Basic.MainMenu.Help.Logs="&Jurnal Faylları" +Basic.MainMenu.Help.Logs.ShowLogs="&Jurnal Fayllarını Göstər" +Basic.MainMenu.Help.Logs.UploadCurrentLog="&Cari Jurnal Faylını Yüklə" +Basic.MainMenu.Help.Logs.UploadLastLog="&Əvvəlki Jurnal Faylını Yüklə" +Basic.MainMenu.Help.Logs.ViewCurrentLog="&Cari Jurnala Bax" +Basic.MainMenu.Help.ReleaseNotes="Buraxılış Qeydləri" +Basic.MainMenu.Help.CheckForUpdates="Güncəlləmələri Yoxla" +Basic.MainMenu.Help.Repair="Fayl Bütövlüyünü Yoxla" +Basic.MainMenu.Help.RestartSafeMode="Təhlükəsiz Rejimdə Yenidən Başlat" +Basic.MainMenu.Help.RestartNormal="Normal Rejimdə Yenidən Başlat" +Basic.MainMenu.Help.CrashLogs="&Çökmə Hesabatları" +Basic.MainMenu.Help.CrashLogs.ShowLogs="&Çökmə Hesabatlarını Göstər" +Basic.MainMenu.Help.CrashLogs.UploadLastLog="&Əvvəlki Çökmə Hesabatını Yüklə" +Basic.MainMenu.Help.About="&Haqqında" +Basic.Settings.ProgramRestart="Bu parametrlərin qüvvəyə minməsi üçün proqram yenidən başladılmalıdır." +Basic.Settings.ConfirmTitle="Dəyişiklikləri Təsdiqlə" +Basic.Settings.Confirm="Yaddaşa verilməmiş dəyişiklikləriniz var. Dəyişikliklər saxlanılsın?" +Basic.Settings.MultitrackVideoDisabledSettings="%1 %2 bəzi yayım parametrlərinizə nəzarət edir" +Basic.Settings.General="Ümumi" +Basic.Settings.General.Language="Dil" +Basic.Settings.General.Updater="Güncəlləmələr" +Basic.Settings.General.UpdateChannel="Güncəlləmə Kanalı" +Basic.Settings.General.UpdateChannelDisabled="(Deaktiv)" +Basic.Settings.General.UpdateChannelDefault="(İlkin təyin olunan)" +Basic.Settings.General.EnableAutoUpdates="Başlanğıcda güncəlləmələri avtomatik yoxla" +Basic.Settings.General.OpenStatsOnStartup="Başlanğıcda statistika dialoqunu aç" +Basic.Settings.General.HideOBSWindowsFromCapture="OBS pəncərələrini ekran yaxalamasından gizlət" +Basic.Settings.General.HideOBSWindowsFromCapture.Tooltip="Bu parametr bütün proyektor olmayan OBS Studio pəncərələrinin OBS tərəfindən yaxalanmasını gizlədəcək və konfrans, \nekran paylaşımı, uzaqdan dəstək, ekran görüntüləri və digər yaxalama proqramları kimi digər tətbiqlərə təsir edəcək." +Basic.Settings.General.HideOBSWindowsFromCapture.Message="Bu seçimi aktiv etmək bütün proyektor olmayan OBS Studio pəncərələrinin OBS tərəfindən yaxalanmasını gizlədir və konfrans, ekran paylaşımı, uzaqdan dəstək, ekran görüntüləri və digər yaxalama proqramları kimi digər tətbiqlərə təsir edir." +Basic.Settings.General.WarnBeforeStartingStream="Yayımları başlatdıqda təsdiq dialoqunu göstər" +Basic.Settings.General.WarnBeforeStoppingStream="Yayımları dayandırdıqda təsdiq dialoqunu göstərin" +Basic.Settings.General.WarnBeforeStoppingRecord="Qeydə almanı dayandırdıqda təsdiq dialoqunu göstər" +Basic.Settings.General.Projectors="Proyektorlar" +Basic.Settings.General.HideProjectorCursor="Kursoru proyektorlar üzərində gizlət" +Basic.Settings.General.ProjectorAlwaysOnTop="Proyektorları həmişə üstə tut" +Basic.Settings.General.Snapping="Mənbə Düzlənmə Yapışması" +Basic.Settings.General.ScreenSnapping="Mənbələri ekranın kənarına yapışdır" +Basic.Settings.General.CenterSnapping="Mənbələri üfüqi və şaquli mərkəzə yapışdır" +Basic.Settings.General.SourceSnapping="Mənbələri digər mənbələrə yapışdır" +Basic.Settings.General.SnapDistance="Yapışma Həssaslığı" +Basic.Settings.General.SpacingHelpers="Piksel düzlənmə bələdçilərini göstər" +Basic.Settings.General.RecordWhenStreaming="Yayım zamanı avtomatik qeydə al" +Basic.Settings.General.KeepRecordingWhenStreamStops="Yayım dayandıqda qeydə almanı davam etdir" Basic.Settings.General.ReplayBufferWhileStreaming="Yayım zamanı təkrar buferini avtomatik başlat" -Basic.Settings.General.KeepReplayBufferStreamStops="Yayım dayandıqdan sonra təkrar buferini aktiv saxla" -Basic.Settings.General.SysTray="Sistem Treyi" -Basic.Settings.General.SysTrayWhenStarted="Başlandıqda sistem treyinə kiçild" +Basic.Settings.General.KeepReplayBufferStreamStops="Yayım dayandıqda təkrar buferini aktiv saxla" +Basic.Settings.General.SysTray="Sistem Bildiriş Sahəsi" +Basic.Settings.General.SysTrayWhenStarted="Başladıqda bildiriş sahəsinə kiçilt" +Basic.Settings.General.SystemTrayHideMinimize="Həmişə tapşırıqlar zolağı əvəzinə bildiriş sahəsinə kiçilt" +Basic.Settings.General.SaveProjectors="Çıxışda proyektorları saxla" +Basic.Settings.General.CloseExistingProjectors="Hər ekranda yalnız bir tam ekranlı proyektora məhdudlaşdır" Basic.Settings.General.Preview="Önbaxış" +Basic.Settings.General.OverflowHidden="Daşmanı Gizlət" +Basic.Settings.General.OverflowAlwaysVisible="Daşma həmişə görünür" +Basic.Settings.General.OverflowSelectionHidden="Mənbə görünməz olduqda belə daşmanı göstər" +Basic.Settings.General.Importers="İdxalçılar" +Basic.Settings.General.AutomaticCollectionSearch="İdxal edərkən səhnə kolleksiyaları üçün məlum yerlərdə axtar" +Basic.Settings.General.SwitchOnDoubleClick="İki dəfə kliklədikdə səhnəyə keçid et" +Basic.Settings.General.StudioPortraitLayout="Portret/şaquli tərtibatı aktiv et" +Basic.Settings.General.TogglePreviewProgramLabels="Ön baxış/proqram etiketlərini göstər" +Basic.Settings.General.Multiview="Çoxlu Görünüş" +Basic.Settings.General.Multiview.MouseSwitch="Səhnələr arasında keçid etmək üçün klikləyin" +Basic.Settings.General.Multiview.DrawSourceNames="Səhnə adlarını göstər" +Basic.Settings.General.Multiview.DrawSafeAreas="Təhlükəsiz sahələri çək (EBU R 95)" +Basic.Settings.General.MultiviewLayout="Çoxlu Görünüş Tərtibatı" +Basic.Settings.General.MultiviewLayout.Horizontal.Top="Üfüqi, Yuxarı (8 Səhnə)" +Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Üfüqi, Aşağı (8 Səhnə)" +Basic.Settings.General.MultiviewLayout.Vertical.Left="Şaquli, Sol (8 Səhnə)" +Basic.Settings.General.MultiviewLayout.Vertical.Right="Şaquli, Sağ (8 Sәhnә)" +Basic.Settings.General.MultiviewLayout.Horizontal.18Scene.Top="Üfüqi, Yuxarı (18 Səhnə)" +Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Üfüqi, Yuxarı (24 Səhnə)" +Basic.Settings.General.MultiviewLayout.4Scene="Yalnız Səhnələr (4 Səhnə)" +Basic.Settings.General.MultiviewLayout.9Scene="Yalnız Səhnələr (9 Səhnə)" +Basic.Settings.General.MultiviewLayout.16Scene="Yalnız Səhnələr (16 Səhnə)" +Basic.Settings.General.MultiviewLayout.25Scene="Yalnız Səhnələr (25 Səhnə)" +Basic.Settings.General.ChannelName.stable="Stabil" +Basic.Settings.General.ChannelDescription.stable="Ən son stabil buraxılış" +Basic.Settings.General.ChannelName.beta="Betalar / Buraxılış Namizədləri" +Basic.Settings.General.ChannelDescription.beta="Potensial olaraq qeyri-sabit ilkin buraxılış versiyaları" +Basic.Settings.Appearance="Görünüş" +Basic.Settings.Appearance.General="Ümumi" +Basic.Settings.Appearance.General.Theme="Mövzu" +Basic.Settings.Appearance.General.Variant="Stil" +Basic.Settings.Appearance.General.NoVariant="Heç Bir Stil Mövcud Deyil" +Basic.Settings.Appearance.FontScale="Şrift Ölçüsü" +Basic.Settings.Appearance.Density="Sıxlıq" +Basic.Settings.Appearance.Classic="Klassik" +Basic.Settings.Appearance.Compact="Kompakt" +Basic.Settings.Appearance.Comfortable="Rahat " +Basic.Settings.Appearance.OptionsWarning="Bəzi görünüş seçimləri bu stil üçün mövcud deyil." +Basic.Settings.Stream="Yayım" +Basic.Settings.Stream.Destination="Təyinat Yeri" +Basic.Settings.Stream.Custom.UseAuthentication="Autentifikasiya istifadə et" +Basic.Settings.Stream.Custom.Username="İstifadəçi Adı" +Basic.Settings.Stream.Custom.Password="Şifrə" +Basic.Settings.Stream.Custom.Username.ToolTip="RIST: srp_username daxil edin.\nRTMP: istifadəçi adını daxil edin.\nSRT: istifadə edilmir." +Basic.Settings.Stream.Custom.Password.ToolTip="RIST: srp_password daxil edin.\nRTMP: şifrəni daxil edin.\nSRT: şifrələmə parolasını daxil edin." +Basic.Settings.Stream.BandwidthTestMode="Bağlantı Sürəti Test Rejimini Aktiv et" +Basic.Settings.Stream.TTVAddon="Twitch Söhbət Əlavələri" Basic.Settings.Stream.TTVAddon.None="Heç biri" -Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="Normaldan Üstün" -Basic.Settings.Advanced.General.ProcessPriority.BelowNormal="Normaldan Aşağı" -Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Əsas pəncərə fokusda olan zaman qısayol düymələrini sıradan çıxart" -Basic.Settings.Advanced.Hotkeys.DisableHotkeysOutOfFocus="Əsas pəncərə fokusda olmayan zaman qısayol düymələrini sıradan çıxart" -Basic.Settings.Advanced.AutoRemux.MP4="(mkv kimi yaz)" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV və FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Çatışmayan Yayım Quraşdırması" +Basic.Settings.Stream.StreamSettingsWarning="Parametrləri Açın" +Basic.Settings.Stream.MissingUrlAndApiKey="URL və Yayım Açarınız çatışmır.\n\n'Yayım' tab-ında URL və Yayım Açarını daxil etmək üçün parametrləri açın." +Basic.Settings.Stream.MissingUrl="Yayım URL-i çatışmır.\n\n'Yayım' tab-ında URL-i daxil etmək üçün parametrləri açın." +Basic.Settings.Stream.MissingStreamKey="Yayım açarı çatışmır.\n\n'Yayım' tab-ında yayım açarını daxil etmək üçün parametrləri açın." +Basic.Settings.Stream.IgnoreRecommended="Yayım xidməti parametr tövsiyələrinə məhəl qoyma" +Basic.Settings.Stream.IgnoreRecommended.Warn.Title="Tövsiyə Olunan Parametrləri Ləğv et" +Basic.Settings.Stream.IgnoreRecommended.Warn.Text="Xəbərdarlıq: Xidmətin məhdudiyyətlərinə məhəl qoymamaq yayım keyfiyyətinin pisləşməsinə və ya yayımlamağınıza mane ola bilər.\n\nDavam edilsin?" +Basic.Settings.Stream.Recommended.MaxVideoBitrate="Maksimum Video Bit Sürəti: %1 kbps" +Basic.Settings.Stream.Recommended.MaxAudioBitrate="Maksimum Səs Bit Sürəti: %1 kbps" +Basic.Settings.Stream.Recommended.MaxResolution="Maksimum Rezolyusiya: %1" +Basic.Settings.Stream.Recommended.MaxFPS="Maksimum FPS: %1" +Basic.Settings.Stream.SpecifyCustomServer="Fərdi Server Təyin et..." +Basic.Settings.Stream.ServiceCustomServer="Fərdi Server" +Basic.Settings.Stream.EnableMultitrackVideo="%1-i Aktiv Et" +Basic.Settings.Stream.MultitrackVideoMaximumAggregateBitrate="Maksimum Yayım Bağlantı Sürəti" +Basic.Settings.Stream.MultitrackVideoMaximumAggregateBitrateAuto="Avto" +Basic.Settings.Stream.MultitrackVideoMaximumVideoTracks="Maksimum Video Trekləri" +Basic.Settings.Stream.MultitrackVideoMaximumVideoTracksAuto="Avto" +Basic.Settings.Stream.MultitrackVideoStreamDumpEnable="Yayımın FLV-yə yazılmasını aktiv et (sadə qeyd faylı parametrlərindən istifadə edir)" +Basic.Settings.Stream.MultitrackVideoConfigOverride="Konfiqurasiya Ləğvi (JSON)" +Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Konfiqurasiya Ləğvini Aktiv et" +Basic.Settings.Stream.MultitrackVideoLabel="Çoxtrekli Video" +Basic.Settings.Stream.MultitrackVideoExtraCanvas="Əlavə Canvas" +Basic.Settings.Stream.WHIPSimulcastLabel="Sinxron Yayım" +Basic.Settings.Stream.WHIPSimulcastInfo="Sinxron yayım bir neçə video keyfiyyətini kodlaşdırmağa və göndərməyə imkan verir. <a href='https://obsproject.com/kb/whip-streaming-guide'>Ətraflı</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Ümumi Qatlar" +Basic.Settings.Stream.AdvancedOptions="Qabaqcıl Seçimlər" +Basic.Settings.Output="Çıxış" +Basic.Settings.Output.Format="Qeyd Alma Formatı" +Basic.Settings.Output.Format.hMP4="Hibrid MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="Hibrid MOV (.mov)" +Basic.Settings.Output.Format.fMP4="Fraqmentli MP4 (.mp4)" +Basic.Settings.Output.Format.fMOV="Fraqmentli MOV (.mov)" +Basic.Settings.Output.Format.TT.fragmented_mov="Fraqmentli MOV qeydi hissə-hissə yazır və ənənəvi MOV faylları kimi yekunlaşdırma tələb etmir.\nBu, diskin yazılması kəsilsə belə, məsələn, BSOD və ya elektrik enerjisinin kəsilməsi nəticəsində faylın oxunaqlı qalmasını təmin edir.\n\nBu, bütün pleyerlər və redaktorlarla uyğun olmaya bilər. Lazım gələrsə, faylı daha uyğun bir formata çevirmək üçün Fayl → Qeydləri Yenidən Birləşdir menyusundan istifadə edin." +Basic.Settings.Output.Format.TT.fragmented_mp4="Fraqmentli MP4 qeydi hissə-hissə yazır və ənənəvi MP4 faylları kimi yekunlaşdırma tələb etmir.\nBu, diskin yazılması kəsilsə belə, məsələn, BSOD və ya elektrik enerjisinin kəsilməsi nəticəsində faylın oxunaqlı qalmasını təmin edir.\n\nBu, bütün pleyerlər və redaktorlarla uyğun olmaya bilər. Lazım gələrsə, faylı daha uyğun bir formata çevirmək üçün Fayl → Qeydləri Yenidən Birləşdir menyusundan istifadə edin." +Basic.Settings.Output.Encoder.Video="Video Kodlayıcı" +Basic.Settings.Output.Encoder.Audio="Səs Kodlayıcı" +Basic.Settings.Output.SelectDirectory="Qeyd Qovluğunu Seç" +Basic.Settings.Output.DynamicBitrate="Tıxacları idarə etmək üçün bitreyti dinamik olaraq dəyişdirin" +Basic.Settings.Output.DynamicBitrate.Beta="Tıxacları idarə etmək üçün bitreyti dinamik olaraq dəyişdirin (Beta)" +Basic.Settings.Output.DynamicBitrate.TT="Tıxacları azaltmaq üçün kadrları buraxmaq əvəzinə, bitreyti anında dinamik olaraq dəyişdirir.\n\nNəzərə alın ki, əhəmiyyətli dərəcədə ani tıxac yaranarsa, bu, izləyicilər üçün gecikməni artıra bilər.\nBitreyt aşağı düşdükdə, onun bərpası bir neçə dəqiqə çəkə bilər.\n\nHazırda yalnız RTMP üçün dəstəklənir." +Basic.Settings.Output.Mode="Çıxış Rejimi" +Basic.Settings.Output.Mode.Simple="Sadə" +Basic.Settings.Output.Mode.Adv="Qabaqcıl" +Basic.Settings.Output.Mode.FFmpeg="FFmpeg Çıxışı" +Basic.Settings.Output.UseReplayBuffer="Təkrar Oxutma Buferini Aktiv et" +Basic.Settings.Output.ReplayBuffer.SecondsMax="Maksimum Təkrar Vaxtı" +Basic.Settings.Output.ReplayBuffer.MegabytesMax="Maksimum Yaddaş" +Basic.Settings.Output.ReplayBuffer.Estimate="Təxmini yaddaş istifadəsi: %1 MB" +Basic.Settings.Output.ReplayBuffer.EstimateTooLarge="Xəbərdarlıq: Təxmini yaddaş istifadəsi olan %1 MiB, tövsiyə olunan maksimum %2 MiB-dən çoxdur" +Basic.Settings.Output.ReplayBuffer.EstimateUnknown="Yaddaş istifadəsini təxmin etmək mümkün deyil. Zəhmət olmasa, maksimum yaddaş limitini təyin edin." +Basic.Settings.Output.ReplayBuffer.Prefix="Təkrar Oxutma Buferi Fayl Adı Prefiksi" +Basic.Settings.Output.ReplayBuffer.Suffix="Suffiks" +Basic.Settings.Output.ReplayBuffer.UnavailableCustomFFmpeg="Qeydə Alma növü Xüsusi Çıxış (FFmpeg) olaraq təyin edildikdə Təkrar Oxutma Buferindən istifadə etmək mümkün deyil." +Basic.Settings.Output.Simple.SavePath="Qeyd Yolu" +Basic.Settings.Output.Simple.RecordingQuality="Qeyd Alma Keyfiyyəti" +Basic.Settings.Output.Simple.RecordingQuality.Stream="Yayımla eyni" +Basic.Settings.Output.Simple.RecordingQuality.Small="Yüksək Keyfiyyət, Orta Fayl Ölçüsü" +Basic.Settings.Output.Simple.RecordingQuality.HQ="Fərqləndirilməz Keyfiyyət, Böyük Fayl Ölçüsü" +Basic.Settings.Output.Simple.RecordingQuality.Lossless="İtkisiz Keyfiyyət, Çox Böyük Fayl Ölçüsü" +Basic.Settings.Output.Simple.Warn.VideoBitrate="Xəbərdarlıq: Yayım video bit sürəti %1 olaraq təyin ediləcək ki, bu da cari yayım xidməti üçün yuxarı limitdir." +Basic.Settings.Output.Simple.Warn.AudioBitrate="Xəbərdarlıq: Yayım səs bit sürəti %1 olaraq təyin ediləcək ki, bu da cari yayım xidməti üçün yuxarı limitdir." +Basic.Settings.Output.Simple.Warn.CannotPause="Xəbərdarlıq: Əgər qeyd keyfiyyəti \"Yayımla eyni\" olaraq təyin edilibsə, qeydlərə fasilə vermək mümkün deyil." +Basic.Settings.Output.Simple.Warn.IncompatibleContainer="Xəbərdarlıq: Hazırda seçilmiş qeyd formatı seçilmiş yayım kodlayıcı(lar)ı ilə uyğun deyil." +Basic.Settings.Output.Simple.Warn.Encoder="Xəbərdarlıq: Proqram kodlayıcısı ilə yayımdan fərqli keyfiyyətdə qeydə almaq, eyni anda həm yayımlayıb həm də qeydə alırsınızsa, əlavə CPU istifadəsi tələb edəcək." +Basic.Settings.Output.Simple.Warn.Lossless="Xəbərdarlıq: İtkisiz keyfiyyət çox böyük fayl ölçüləri yaradır! İtkisiz keyfiyyət yüksək rezolyusiya və kadr tezliklərində dəqiqədə 7 giqabaytdan çox disk sahəsi istifadə edə bilər. Əgər çox böyük miqdarda disk sahəniz yoxdursa, itkisiz keyfiyyət uzun qeydlər üçün tövsiyə edilmir. İtkisiz keyfiyyət istifadə edildikdə təkrar oxutma buferi əlçatan deyil." +Basic.Settings.Output.Simple.Warn.Lossless.Msg="İtkisiz keyfiyyət istifadə etmək istədiyinizə əminsiniz?" +Basic.Settings.Output.Simple.Warn.Lossless.Title="İtkisiz keyfiyyət xəbərdarlığı!" +Basic.Settings.Output.Simple.Encoder.Software="Proqram təminatı (x264)" +Basic.Settings.Output.Simple.Encoder.Hardware.QSV.H264="Aparat təminatı (QSV, H.264)" +Basic.Settings.Output.Simple.Encoder.Hardware.QSV.AV1="Aparat təminatı (QSV, AV1)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD.H264="Aparat təminatı (AMD, H.264)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD.HEVC="Aparat təminatı (AMD, HEVC)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD.AV1="Aparat təminatı (AMD, AV1)" +Basic.Settings.Output.Simple.Encoder.Hardware.NVENC.H264="Aparat təminatı (NVENC, H.264)" +Basic.Settings.Output.Simple.Encoder.Hardware.NVENC.AV1="Aparat təminatı (NVENC, AV1)" +Basic.Settings.Output.Simple.Encoder.Hardware.NVENC.HEVC="Aparat təminatı (NVENC, HEVC)" +Basic.Settings.Output.Simple.Encoder.Hardware.Apple.H264="Aparat təminatı (Apple, H.264)" +Basic.Settings.Output.Simple.Encoder.Hardware.Apple.HEVC="Aparat təminatı (Apple, HEVC)" +Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Proqram təminatı (x264 aşağı CPU istifadəli ilkin sazlama, fayl ölçüsünü artırır)" +Basic.Settings.Output.Simple.Codec.AAC.Default="AAC (İlkin təyin olunan)" +Basic.Settings.Output.Simple.TwitchVodTrack="Twitch VOD Treki (Trek 2-ni istifadə edir)" +Basic.Settings.Output.Simple.RecAudioTrack="Səs Treki" +Basic.Settings.Output.Warn.EnforceResolutionFPS.Title="Uyğunsuz Rezolyusiya/Kadr Tezliyi" +Basic.Settings.Output.Warn.EnforceResolutionFPS.Msg="Bu yayım xidməti cari çıxış rezolyusiyanızı və/və ya kadr tezliyinizi dəstəkləmir. Onlar ən yaxın uyğun dəyərə dəyişdiriləcək:\n\n%1\n\nDavam etmək istəyirsiniz?" +Basic.Settings.Output.Warn.EnforceResolutionFPS.Resolution="Rezolyusiya: %1" +Basic.Settings.Output.Warn.ServiceCodecCompatibility.Title="Uyğunsuz Kodlayıcı" +Basic.Settings.Output.Warn.ServiceCodecCompatibility.Msg="\"%1\" yayım xidməti \"%2\" kodlayıcısını dəstəkləmir. Kodlayıcı \"%3\"-ə dəyişdiriləcək.\n\nDavam etmək istəyirsiniz?" +Basic.Settings.Output.Warn.ServiceCodecCompatibility.Msg2="\"%1\" yayım xidməti \"%2\" və \"%3\" kodlayıcılarını dəstəkləmir. Bu kodlayıcılar \"%4\" və \"%5\"-ə dəyişdiriləcək.\n\nDavam etmək istəyirsiniz?" +Basic.Settings.Output.VideoBitrate="Video Bit Sürəti" +Basic.Settings.Output.AudioBitrate="Səs Bit Sürəti" +Basic.Settings.Output.Reconnect="Avtomatik Yenidən Qoşul" +Basic.Settings.Output.RetryDelay="Yenidən Cəhd Gecikməsi" +Basic.Settings.Output.MaxRetries="Maksimum Yenidən Cəhdlər" +Basic.Settings.Output.Advanced="Xüsusi Kodlayıcı Parametrlərini Aktiv Et (Qabaqcıl)" +Basic.Settings.Output.EncoderPreset="Kodlayıcı İlkin Sazlaması" +Basic.Settings.Output.EncoderPreset.ultrafast="%1 (aşağı CPU istifadəsi, ən aşağı keyfiyyət)" +Basic.Settings.Output.EncoderPreset.veryfast="%1 (ilkin təyin olunan) (orta CPU istifadəsi, standart keyfiyyət)" +Basic.Settings.Output.EncoderPreset.fast="%1 (yüksək CPU istifadəsi, yüksək keyfiyyət)" +Basic.Settings.Output.CustomEncoderSettings="Fərdi Kodlayıcı Parametrləri" +Basic.Settings.Output.CustomMuxerSettings="Fərdi Birləşdirici Parametrləri" +Basic.Settings.Output.NoSpaceFileName="Boşluq Olmadan Fayl Adı Yarat" +Basic.Settings.Output.Adv.Rescale="Çıxışı Yenidən Miqyaslandır" +Basic.Settings.Output.Adv.Rescale.Disabled="Deaktiv" +Basic.Settings.Output.Adv.AudioTrack="Səs Treki" +Basic.Settings.Output.Adv.Streaming="Yayım" +Basic.Settings.Output.Adv.Streaming.Settings="Yayım Parametrləri" +Basic.Settings.Output.Adv.Audio.Track1="Trek 1" +Basic.Settings.Output.Adv.Audio.Track2="Trek 2" +Basic.Settings.Output.Adv.Audio.Track3="Trek 3" +Basic.Settings.Output.Adv.Audio.Track4="Trek 4" +Basic.Settings.Output.Adv.Audio.Track5="Trek 5" +Basic.Settings.Output.Adv.Audio.Track6="Trek 6" +Basic.Settings.Output.Adv.TwitchVodTrack="Twitch VOD Treki" +Basic.Settings.Output.Adv.Encoder="Kodlayıcı Parametrləri" +Basic.Settings.Output.Adv.Recording="Qeydə Alma" +Basic.Settings.Output.Adv.Recording.Settings="Qeydə Alma Parametrləri" +Basic.Settings.Output.Adv.Recording.RecType="Qeydə Alma Növü" +Basic.Settings.Output.Adv.Recording.Type="Növ" +Basic.Settings.Output.Adv.Recording.Type.Standard="Standart" +Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Fərdi Çıxış (FFmpeg)" +Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Yayım kodlayıcısından istifadə et)" +Basic.Settings.Output.Adv.Recording.Filename="Fayl Adı Formatlaşdırması" +Basic.Settings.Output.Adv.Recording.OverwriteIfExists="Fayl mövcuddursa, üzərinə yaz" +Basic.Settings.Output.Adv.FFmpeg.CustomModeWarning="Fərdi Çıxış (FFmpeg) heç bir qorunma tədbiri olmadan təmin edilir.\n\"Standart\" qeydə alma növündən istifadə etməyi düşünün." +Basic.Settings.Output.Adv.FFmpeg.Type="FFmpeg Çıxış Növü" +Basic.Settings.Output.Adv.FFmpeg.Type.URL="URL-ə Çıxış" +Basic.Settings.Output.Adv.FFmpeg.Type.RecordToFile="Fayla Çıxış" +Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Geniş yayılmış qeydə alma formatları" +Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Bütün Fayllar" +Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Fayl yolu və ya URL" +Basic.Settings.Output.Adv.FFmpeg.Format="Konteyner Formatı" +Basic.Settings.Output.Adv.FFmpeg.FormatAudio="Səs" +Basic.Settings.Output.Adv.FFmpeg.FormatDefault="İlkin Təyin Olunan Format" +Basic.Settings.Output.Adv.FFmpeg.FormatDesc="Konteyner Formatının Təsviri" +Basic.Settings.Output.Adv.FFmpeg.FormatDescDef="Fayl yolu və ya URL-dən təxmin edilən Audio/Video Kodeki" +Basic.Settings.Output.Adv.FFmpeg.AVEncoderDefault="İlkin Təyin Olunan Kodlayıcı " +Basic.Settings.Output.Adv.FFmpeg.AVEncoderDisable="Kodlayıcını Deaktiv et" +Basic.Settings.Output.Adv.FFmpeg.VEncoder="Video Kodlayıcı" +Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Video Kodlayıcı Parametrləri (əgər varsa)" +Basic.Settings.Output.Adv.FFmpeg.AEncoder="Səs Kodlayıcı" +Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Səs Kodlayıcı Parametrləri (əgər varsa)" +Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Birləşdirici Parametrləri (əgər varsa)" +Basic.Settings.Output.Adv.FFmpeg.GOPSize="Açar Kadr intervalı (kadrlar)" +Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Bütün kodekləri göstər (potensial olaraq uyğunsuz olsalar belə)" +Basic.Settings.Output.Adv.FFmpeg.Settings="FFmpeg Parametrləri" +Basic.Settings.Output.EnableSplitFile="Avtomatik Fayl Bölünməsi" +Basic.Settings.Output.SplitFile.TypeTime="Vaxta görə böl" +Basic.Settings.Output.SplitFile.TypeSize="Ölçüyə görə böl" +Basic.Settings.Output.SplitFile.TypeManual="Yalnız əl ilə böl" +Basic.Settings.Output.SplitFile.Time="Bölmə Vaxtı" +Basic.Settings.Output.SplitFile.Size="Bölmə Ölçüsü" +Screenshot="Ekran Görüntüsü Çıxışı" +Screenshot.SourceHotkey="Seçilmiş Mənbənin Ekran Görüntüsü" +Screenshot.StudioProgram="Proqramın Ekran Görüntüsünü Saxla" +Screenshot.Preview="Ön Baxışın Ekran Görüntüsünü Saxla" +Screenshot.Scene="Səhnənin Ekran Görüntüsünü Saxla" +Screenshot.Source="Mənbənin Ekran Görüntüsünü Saxla" +FilenameFormatting.TT.CCYY="İl, dörd rəqəm" +FilenameFormatting.TT.YY="İl, son iki rəqəm (00-99)" +FilenameFormatting.TT.MM="Ay onluq rəqəm kimi (01-12)" +FilenameFormatting.TT.DD="Ayın günü, sıfırla doldurulmuş (01-31)" +FilenameFormatting.TT.hh="Saat 24 saat formatında (00-23)" +FilenameFormatting.TT.mm="Dəqiqə (00-59)" +FilenameFormatting.TT.ss="Saniyə (00-59)" +FilenameFormatting.TT.Percent="% işarəsi" +FilenameFormatting.TT.a="Həftə gününün qısaldılmış adı" +FilenameFormatting.TT.A="Həftə gününün tam adı" +FilenameFormatting.TT.b="Ayın qısaldılmış adı" +FilenameFormatting.TT.B="Ayın tam adı" +FilenameFormatting.TT.d="Ayın günü, sıfırla doldurulmuş (01-31)" +FilenameFormatting.TT.H="Saat 24 saat formatında (00-23)" +FilenameFormatting.TT.I="Saat 12 saat formatında (01-12)" +FilenameFormatting.TT.m="Ay onluq rəqəm kimi (01-12)" +FilenameFormatting.TT.M="Dəqiqə (00-59)" +FilenameFormatting.TT.p="AM və ya PM təyinatı" +FilenameFormatting.TT.s="UNIX epoxundan bəri saniyə ilə vaxt" +FilenameFormatting.TT.S="Saniyə (00-59)" +FilenameFormatting.TT.y="İl, son iki rəqəm (00-99)" +FilenameFormatting.TT.Y="İl" +FilenameFormatting.TT.z="Saat qurşağında UTC-dən ISO 8601 ofseti" +FilenameFormatting.TT.Z="Saat qurşağının adı və ya qısaltması" +FilenameFormatting.TT.FPS="Saniyədəki kadr sayı" +FilenameFormatting.TT.CRES="Əsas (canvas) rezolyusiya" +FilenameFormatting.TT.ORES="Çıxış (miqyaslandırılmış) rezolyusiyası" +FilenameFormatting.TT.VF="Video formatı" +Basic.Settings.Video.Adapter="Video Adapteri" +Basic.Settings.Video.BaseResolution="Əsas (Canvas) Rezolyusiya" +Basic.Settings.Video.ScaledResolution="Çıxış (Miqyaslandırılmış) Rezolyusiyası" +Basic.Settings.Video.DownscaleFilter="Aşağı Miqyas Filtrləməsi" +Basic.Settings.Video.DownscaleFilter.Unavailable="Rezolyusiyalar uyğun gəlir, aşağı miqyaslandırma tələb olunmur" +Basic.Settings.Video.FPSCommon="Geniş Yayılmış FPS Dəyərləri" +Basic.Settings.Video.FPSInteger="Tam Ədəd FPS Dəyəri" +Basic.Settings.Video.FPSFraction="Kəsrli FPS Dəyəri" +Basic.Settings.Video.Numerator="Surət" +Basic.Settings.Video.Denominator="Məxrəc" +Basic.Settings.Video.Renderer.Experimental="%1 (Eksperimental)" +Basic.Settings.Video.InvalidResolution="Yanlış rezolyusiya dəyəri. enxhündürlük formatında olmalıdır (məsələn, 1920x1080)" +Basic.Settings.Video.CurrentlyActive="Video çıxışı hazırda aktivdir. Video parametrlərini dəyişmək üçün zəhmət olmasa, bütün çıxışları söndürün." +Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (Ən sürətli, lakin miqyaslandırdıqda bulanıq)" +Basic.Settings.Video.DownscaleFilter.Bicubic="Bikubik (Kəskinləşdirilmiş miqyaslandırma, 16 nümunə)" +Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Kəskinləşdirilmiş miqyaslandırma, 36 nümunə)" +Basic.Settings.Video.DownscaleFilter.Area="Sahə (Çəkili cəm, 4/6/9 nümunə)" +Basic.Settings.Audio="Səs" +Basic.Settings.Audio.SampleRate="Nümunə Tezliyi" +Basic.Settings.Audio.Channels="Kanallar" +Basic.Settings.Audio.Meters="Metr" +Basic.Settings.Audio.MeterDecayRate="Sönmə Dərəcəsi" +Basic.Settings.Audio.MeterDecayRate.Fast="Sürətli" +Basic.Settings.Audio.MeterDecayRate.Medium="Orta (Tip I PPM)" +Basic.Settings.Audio.MeterDecayRate.Slow="Yavaş (Tip II PPM)" +Basic.Settings.Audio.PeakMeterType="Pikmetr Növü" +Basic.Settings.Audio.PeakMeterType.SamplePeak="Nümunə Piki" +Basic.Settings.Audio.PeakMeterType.TruePeak="Həqiqi Pik (Daha yüksək CPU istifadəsi)" +Basic.Settings.Audio.MultichannelWarning.Enabled="XƏBƏRDARLIQ: Həcmli səs (surround) aktivdir." +Basic.Settings.Audio.MultichannelWarning="Əgər yayımlayırsınızsa, yayım xidmətinizin həm həcmli səs qəbulunu, həm də həcmli səs oxutmasını dəstəklədiyini yoxlayın. Məsələn, Facebook 360 Live həcmli səsi tam dəstəkləyir; YouTube Live 5.1 səs qəbulunu (və televizorlarda oxutmanı) dəstəkləyir.\n\nOBS səs filtrləri həcmli səslə uyğundur, lakin VST plagin dəstəyinə zəmanət verilmir." +Basic.Settings.Audio.MultichannelWarning.Title="Həcmli səsi aktiv etmək istəyirsiniz?" +Basic.Settings.Audio.MultichannelWarning.Confirm="Həcmli səsi aktiv etmək istədiyinizə əminsiniz?" +Basic.Settings.Audio.Devices="Qlobal Səs Qurğuları" +Basic.Settings.Audio.DesktopDevice="Masaüstü Səsi" +Basic.Settings.Audio.DesktopDevice2="Masaüstü Səsi 2" +Basic.Settings.Audio.AuxDevice="Mikrofon/Köməkçi Səs" +Basic.Settings.Audio.AuxDevice2="Mikrofon/Köməkçi Səs 2" +Basic.Settings.Audio.AuxDevice3="Mikrofon/Köməkçi Səs 3" +Basic.Settings.Audio.AuxDevice4="Mikrofon/Köməkçi Səs 4" +Basic.Settings.Audio.EnablePushToMute="Səssizə almaq üçün basmağı aktiv et" +Basic.Settings.Audio.PushToMuteDelay="Səssizə almaq üçün basma gecikməsi" +Basic.Settings.Audio.EnablePushToTalk="Danışmaq üçün basmağı aktiv et" +Basic.Settings.Audio.PushToTalkDelay="Danışmaq üçün basma gecikməsi" +Basic.Settings.Audio.UnknownAudioDevice="Qurğu qoşulmayıb və ya mövcud deyil" +Basic.Settings.Audio.Disabled="Deaktiv" +Basic.Settings.Audio.LowLatencyBufferingMode="Aşağı Gecikməli Səs Buferləşdirmə Rejimi (Decklink/NDI çıxışları üçün)" +Basic.Settings.Audio.LowLatencyBufferingWarning.Enabled="XƏBƏRDARLIQ: Aşağı gecikməli səs buferləşdirməsi aktivdir." +Basic.Settings.Audio.LowLatencyBufferingWarning="Aşağı gecikməli səs buferləşdirmə rejimi bəzi mənbələrdən gələn səsin pozulmasına və ya dayanmasına səbəb ola bilər." +Basic.Settings.Audio.LowLatencyBufferingWarning.Title="Aşağı gecikməli səs buferləşdirmə rejimini aktiv etmək istəyirsiniz?" +Basic.Settings.Audio.LowLatencyBufferingWarning.Confirm="Aşağı gecikməli səs buferləşdirmə rejimini aktiv etmək istədiyinizə əminsiniz?" +Basic.Settings.Accessibility="Əlçatanlıq" +Basic.Settings.Accessibility.ColorOverrides="Fərqli Rənglərdən İstifadə et" +Basic.Settings.Accessibility.ColorOverrides.SelectRed="Mənbə Sərhədi (Seçim)" +Basic.Settings.Accessibility.ColorOverrides.SelectGreen="Mənbə Sərhədi (Kəsmə)" +Basic.Settings.Accessibility.ColorOverrides.SelectBlue="Mənbə Sərhədi (Üzərinə Gəldikdə)" +Basic.Settings.Accessibility.ColorOverrides.MixerGreen="Mikser Səs Zolağı (-60-dan -20dB-ə qədər)" +Basic.Settings.Accessibility.ColorOverrides.MixerYellow="Mikser Səs Zolağı (-20-dan -9dB-ə qədər)" +Basic.Settings.Accessibility.ColorOverrides.MixerRed="Mikser Səs Zolağı (-9-dan 0dB-ə qədər)" +Basic.Settings.Accessibility.ColorOverrides.MixerGreenActive="Mikser Səs Zolağı (-60-dan -20dB-ə qədər) (aktiv)" +Basic.Settings.Accessibility.ColorOverrides.MixerYellowActive="Mikser Səs Zolağı (-20-dan -9dB-ə qədər) (aktiv)" +Basic.Settings.Accessibility.ColorOverrides.MixerRedActive="Mikser Səs Zolağı (-9-dan 0dB-ə qədər) (aktiv)" +Basic.Settings.Accessibility.ColorOverrides.Preset="Rəng İlkin Sazlaması" +Basic.Settings.Accessibility.ColorOverrides.Preset.Default="İlkin təyin olunan" +Basic.Settings.Accessibility.ColorOverrides.Preset.Custom="Fərdi" +Basic.Settings.Accessibility.ColorOverrides.Preset.ColorBlind1="Rəng Korluğu Alternativi" +Basic.Settings.Advanced="Qabaqcıl" +Basic.Settings.Advanced.General.ConfirmOnExit="Çıxışda(exit) aktiv çıxışlar(outputs) haqqında xəbərdarlığı göstər" +Basic.Settings.Advanced.General.ProcessPriority="Proses Prioriteti" +Basic.Settings.Advanced.General.ProcessPriority.High="Yüksək" +Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="Normadan Yuxarı" +Basic.Settings.Advanced.General.ProcessPriority.BelowNormal="Normadan Aşağı" +Basic.Settings.Advanced.General.ProcessPriority.Idle="Boşda" +Basic.Settings.Advanced.FormatWarning="Xəbərdarlıq: NV12/P010-dan başqa rəng formatları əsasən qeydə almaq üçün nəzərdə tutulub və yayım zamanı tövsiyə edilmir. Yayım, rəng formatının çevrilməsi səbəbindən artan CPU istifadəsinə səbəb ola bilər." +Basic.Settings.Advanced.FormatWarningPreciseSdr="Xəbərdarlıq: Yüksək dəqiqlikli formatlar daha çox HDR rəng fəzaları ilə istifadə olunur." +Basic.Settings.Advanced.FormatWarning2100="Xəbərdarlıq: Rec. 2100 daha çox dəqiqliyə malik bir format istifadə etməlidir." +Basic.Settings.Advanced.Video.ColorFormat="Rəng Formatı" +Basic.Settings.Advanced.Video.ColorFormat.NV12="NV12 (8-bit, 4:2:0, 2 müstəvi)" +Basic.Settings.Advanced.Video.ColorFormat.I420="I420 (8-bit, 4:2:0, 3 müstəvi)" +Basic.Settings.Advanced.Video.ColorFormat.I444="I444 (8-bit, 4:4:4, 3 müstəvi)" +Basic.Settings.Advanced.Video.ColorFormat.P010="P010 (10-bit, 4:2:0, 2 müstəvi)" +Basic.Settings.Advanced.Video.ColorFormat.I010="I010 (10-bit, 4:2:0, 3 müstəvi)" +Basic.Settings.Advanced.Video.ColorFormat.P216="P216 (16-bit, 4:2:2, 2 müstəvi)" +Basic.Settings.Advanced.Video.ColorFormat.P416="P416 (16-bit, 4:4:4, 2 müstəvi)" +Basic.Settings.Advanced.Video.ColorSpace="Rəng Fəzası" +Basic.Settings.Advanced.Video.ColorRange="Rəng Aralığı" +Basic.Settings.Advanced.Video.ColorRange.Partial="Məhdud" +Basic.Settings.Advanced.Video.ColorRange.Full="Tam" +Basic.Settings.Advanced.Video.SdrWhiteLevel="SDR Ağ Səviyyəsi" +Basic.Settings.Advanced.Video.HdrNominalPeakLevel="HDR Nominal Pik Səviyyəsi" +Basic.Settings.Advanced.Audio.MonitoringDevice="İzləmə Qurğusu" +Basic.Settings.Advanced.Audio.MonitoringDevice.Default="İlkin təyin olunan" +Basic.Settings.Advanced.Audio.DisableAudioDucking="Windows səs boğulmasını deaktiv et" +Basic.Settings.Advanced.StreamDelay="Yayım Gecikməsi" +Basic.Settings.Advanced.StreamDelay.Duration="Müddət" +Basic.Settings.Advanced.StreamDelay.Preserve="Yenidən qoşulduqda kəsmə nöqtəsini qoru (gecikməni artır)" +Basic.Settings.Advanced.StreamDelay.MemoryUsage="Təxmini Yaddaş İstifadəsi: %1 MB" +Basic.Settings.Advanced.Network="Şəbəkə" +Basic.Settings.Advanced.Network.Disabled="Hazırda seçilmiş yayım protokolu şəbəkə parametrlərinin dəyişdirilməsini dəstəkləmir." +Basic.Settings.Advanced.Network.BindToIP="IP-yə Bağla" +Basic.Settings.Advanced.Network.IPFamily="IP Ailəsi" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Şəbəkə optimallaşdırmalarını aktiv et" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="TCP templəməsini aktiv et" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Transmissiya sürətini tənzimləyərək RTMP çıxışını şəbəkədəki digər gecikməyə həssas tətbiqlər üçün daha əlverişli etməyə çalışır.\nQeyri-sabit bağlantılarda buraxılmış kadr riskini artıra bilər." +Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Qısayol Düyməsi Fokus Davranışı" +Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Qısayol düymələrini heç vaxt deaktiv etmə" +Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Əsas pəncərə fokusda olduqda qısayol düymələrini deaktiv et" +Basic.Settings.Advanced.Hotkeys.DisableHotkeysOutOfFocus="Əsas pəncərə fokusda olmadıqda qısayol düymələrini deaktiv et" +Basic.Settings.Advanced.AutoRemux="Avtomatik olaraq %1-ə yenidən birləşdir" +Basic.Settings.Advanced.AutoRemux.MP4="(mkv kimi qeydə al)" Basic.AdvAudio="Qabaqcıl Səs Xüsusiyyətləri" Basic.AdvAudio.ActiveOnly="Yalnız Aktiv Mənbələr" Basic.AdvAudio.Name="Ad" Basic.AdvAudio.Volume="Səs səviyyəsi" +Basic.AdvAudio.VolumeSource="'%1' üçün səs ucalığı" +Basic.AdvAudio.MonoSource="'%1' üçün Mononu Stereoya Çevir" Basic.AdvAudio.Balance="Balans" +Basic.AdvAudio.BalanceSource="'%1' üçün Balans" +Basic.AdvAudio.SyncOffset="Sinxronizasiya Sürüşməsi" +Basic.AdvAudio.SyncOffsetSource="'%1' üçün Sinxronizasiya Sürüşməsi" Basic.AdvAudio.Monitoring="Səs İzləmə" -Basic.AdvAudio.Monitoring.None="Ekran bağlıdır" -Basic.AdvAudio.Monitoring.MonitorOnly="Yalnız ekran (səssiz çıxış)" -Basic.AdvAudio.Monitoring.Both="Ekran və çıxış" +Basic.AdvAudio.Monitoring.None="İzləmə Deaktivdir" +Basic.AdvAudio.Monitoring.MonitorOnly="Yalnız İzləmə (çıxışı səssizə al)" +Basic.AdvAudio.Monitoring.Both="İzləmə və Çıxış" +Basic.AdvAudio.MonitoringSource="'%1' üçün Səs İzləməsi" Basic.AdvAudio.AudioTracks="Treklər" -Basic.Settings.Hotkeys="Qısayollar" +Basic.Settings.Hotkeys="Qısayol Düymələri" +Basic.Settings.Hotkeys.Pair="'%1' ilə paylaşılan düymə kombinasiyaları dəyişdirici kimi fəaliyyət göstərir" Basic.Settings.Hotkeys.Filter="Filtr" +Basic.Settings.Hotkeys.FilterByHotkey="Qısayol Düyməsinə Görə Filtrlə" +Basic.Settings.Hotkeys.DuplicateWarning="Bu qısayol düyməsi bir və ya daha çox başqa hərəkət tərəfindən paylaşılır, toqquşmaları göstərmək üçün klikləyin" +Basic.Settings.Hotkeys.PleaseWait="Qısayol düymələri yüklənir, zəhmət olmasa gözləyin." Basic.Hotkeys.SelectScene="Səhnəyə keç" Basic.SystemTray.Show="Göstər" Basic.SystemTray.Hide="Gizlət" -Basic.SystemTray.Message.Reconnecting="Bağlantı kəsildi. Yenidən bağlantı qurulur..." +Basic.SystemTray.Message.Reconnecting="Bağlantı kəsildi. Yenidən bağlanılır..." Hotkeys.Insert="Daxil et" Hotkeys.Delete="Sil" -Hotkeys.Home="Əsas səhifə" +Hotkeys.Home="Əsas Səhifə" Hotkeys.Left="Sol" Hotkeys.Right="Sağ" Hotkeys.Up="Yuxarı" Hotkeys.Down="Aşağı" Hotkeys.Menu="Menyu" Hotkeys.Space="Boşluq" -Hotkeys.MouseButton="%1 Siçan" +Hotkeys.NumpadMultiply="Numpad Vurma" +Hotkeys.NumpadDivide="Numpad Bölmə" +Hotkeys.NumpadAdd="Numpad Əlavə et" +Hotkeys.NumpadSubtract="Numpad Çıxma" +Hotkeys.NumpadDecimal="Numpad Onluq" +Hotkeys.MouseButton="Siçan %1" Mute="Səsi kəs" Unmute="Səsi aç" -Push-to-mute="Basanda səsi kəs" -Push-to-talk="Bas, danış" -SceneItemShow="'%1' göstər" -SceneItemHide="'%1' gizlət" +Push-to-mute="Səssizə almaq üçün bas" +Push-to-talk="Danışmaq üçün bas" +SceneItemShow="'%1'-i göstər" +SceneItemHide="'%1'-i gizlət" OutputWarnings.NoTracksSelected="Ən azı bir trek seçməlisiniz" -FinalScene.Title="Səhnəni sil" +OutputWarnings.NoTracksSelectedOnExit.Title="Çıxış Parametrləri Xətası" +OutputWarnings.NoTracksSelectedOnExit.Text="Bütün çıxışlarda ən azı bir səs treki seçilməlidir." +OutputWarnings.MP4Recording="Xəbərdarlıq: MP4/MOV formatında saxlanılan qeydlər, fayl yekunlaşdırıla bilməzsə (məsələn, BSOD, elektrik enerjisinin kəsilməsi və s. nəticəsində) bərpaedilməz olacaq. Əgər birdən çox səs treki qeydə almaq istəyirsinizsə, MKV istifadə etməyi və qeyd tamamlandıqdan sonra onu MP4/MOV formatına yenidən birləşdirməyi düşünün (Fayl → Qeydləri Yenidən Birləşdir)." +OutputWarnings.CannotPause="Xəbərdarlıq: Əgər qeyd kodlayıcısı \"(Yayım kodlayıcısından istifadə et)\" olaraq təyin edilibsə, qeydlərə fasilə vermək mümkün deyil." +OutputWarnings.CodecIncompatible="Audio və ya video kodlayıcı seçimi uyğunsuzluq səbəbindən sıfırlandı. Zəhmət olmasa, siyahıdan uyğun bir kodlayıcı seçin." +CodecCompat.Incompatible="(%1 ilə uyğun deyil)" +CodecCompat.CodecPlaceholder="Kodlayıcı Seç..." +CodecCompat.ContainerPlaceholder="Format Seç..." +CodecCompat.CodecMissingOnExit.Title="Heç Bir Kodlayıcı Seçilməyib" +CodecCompat.CodecMissingOnExit.Text="Ən azı bir video və ya səs kodlayıcısı təyin edilməyib. Zəhmət olmasa, həm qeydə alma, həm də yayım üçün kodlayıcıları seçdiyinizdən əmin olun." +CodecCompat.ContainerMissingOnExit.Title="Heç Bir Format Seçilməyib" +CodecCompat.ContainerMissingOnExit.Text="Heç bir qeyd formatı seçilməyib. Zəhmət olmasa, seçilmiş yayım kodlayıcısı ilə uyğun olan bir qeyd formatı seçin." +FinalScene.Title="Səhnəni Sil" FinalScene.Text="Ən azı bir səhnə olmalıdır." -NoSources.Title="Mənbələr yoxdur" -NoSources.Text="Deyəsən hələ də heç bir video mənbəsi əlavə etməmisiniz, ona görə də çıxışda sadəcə boş bir ekran olacaq. Bunu etmək istədiyinizə əminsiniz?" -NoSources.Text.AddSource="İstənilən vaxt əsas pəncərədə Mənbələr qutusunun altındakı + nişanına klikləyərək mənbələr əlavə edə bilərsiniz." -NoSources.Label="Heç bir mənbəniz yoxdur.\nAşağıdakı + düyməsinə klikləyərək və ya sağ klikləyərək birini əlavə edin." -ChangeBG="Rəngi tənzimlə" -CustomColor="Özəl rəng" -BrowserSource.EnableHardwareAcceleration="Səyyah Mənbə Avandanlıq Təminatı Sürətləndirməsini Fəallaşdır" +NoSources.Title="Mənbə Yoxdur" +NoSources.Text="Görünür, hələ heç bir video mənbəyi əlavə etməmisiniz, buna görə də yalnız boş ekran yayımlayacaqsınız. Bunu etmək istədiyinizə əminsiniz?" +NoSources.Text.AddSource="İstədiyiniz zaman əsas pəncərədəki Mənbələr qutusunun altındakı + işarəsinə klikləməklə mənbələr əlavə edə bilərsiniz." +NoSources.Label="Heç bir mənbəniz yoxdur.\nMənbə əlavə etmək üçün aşağıdakı + düyməsinə klikləyin\nvə ya burada sağ klikləyin." +ChangeBG="Rəng Təyin Et" +CustomColor="Fərdi Rəng" +BrowserSource.EnableHardwareAcceleration="Brauzer Mənbəyi Aparat Sürətləndirməsini Aktiv Et" About="Haqqında" -About.Info="OBS Studio ödənişsiz və açıq mənbəli video yazma və canlı yayım proqram təminatıdır." -About.Donate="Töhfə ver" -About.GetInvolved="Qoşulun" +About.Info="OBS Studio pulsuz və açıq mənbəli video yazı və canlı yayım proqram təminatıdır." +About.Donate="Töhfə Ver" +About.GetInvolved="İştirak Et" About.Authors="Müəlliflər" About.License="Lisenziya" -About.Contribute="OBS layihəsini dəstəklə" -AddUrl.Title="URL ilə mənbə əlavə et" -AddUrl.Text="URL-ni OBS-a gətirdiniz. Bu, bağlantını avtomatik olaraq mənbə kimi əlavə edəcəkdir. Davam edilsin?" -PreviewTransition="Əvvəlki keçid" -Importer="Səhnə Kolleksiya İdxalçısı" -Importer.SelectCollection="Səhnə kolleksiyası seç" +About.Error="Xəta! Faylı oxumaq mümkün olmadı.\n\nKeçid edin: %1" +About.Contribute="OBS Layihəsini Dəstəklə" +AddUrl.Title="URL vasitəsilə Mənbə Əlavə Et" +AddUrl.Text="Siz OBS-ə bir URL sürüklədiniz. Bu, linki avtomatik olaraq mənbə kimi əlavə edəcək. Davam edilsin?" +ResizeOutputSizeOfSource="Çıxışı yenidən ölçüləndir (mənbə ölçüsü)" +ResizeOutputSizeOfSource.Text="Əsas və çıxış rezolyusiyaları cari mənbənin ölçüsünə görə yenidən ölçüləndiriləcək." +ResizeOutputSizeOfSource.Continue="Davam etmək istəyirsiniz?" +PreviewTransition="Keçidə Ön Baxış" +Importer="Səhnə Kolleksiyası İdxal et" +Importer.SelectCollection="Səhnə Kolleksiyası Seç" Importer.Collection="Səhnə Kolleksiyası" -Importer.HelpText="OBS və ya digər dəstəklənən proqramlardan bu pəncərəyə idxal etmək üçün fayllar əlavə edin." +Importer.HelpText="OBS və ya digər dəstəklənən proqramlardan kolleksiyaları idxal etmək üçün bu pəncərəyə fayllar əlavə edin." Importer.Path="Kolleksiya Yolu" -Importer.Program="Aşkarlanan Tətbiqetmə" +Importer.Program="Aşkarlanan Tətbiq" Importer.AutomaticCollectionPrompt="Səhnə Kolleksiyaları üçün Avtomatik Axtarış" -Importer.AutomaticCollectionText="OBS, dəstəklənən üçüncü tərəf proqramlardan idxal edilə bilən səhnə kolleksiyalarını avtomatik olaraq tapa bilər. OBS-in səhnə kolleksiyalarını sizin üçün avtomatik tapmağını istəyirsiniz?\n\nBunu daha sonra Tənzimləmələr > Ümumi > İdxalçılar bölməsində dəyişdirə bilərsiniz." +Importer.AutomaticCollectionText="OBS, dəstəklənən üçüncü tərəf proqramlarından idxal edilə bilən səhnə kolleksiyalarını avtomatik tapa bilər. OBS-in sizin üçün kolleksiyaları avtomatik tapmasını istəyirsiniz?\n\nBunu daha sonra Parametrlər > Ümumi > İdxalçılar bölməsində dəyişə bilərsiniz." +Importer.SelectFile="Gözdən keçir..." Restart="Yenidən başlat" NeedsRestart="OBS Studio yenidən başladılmalıdır. İndi yenidən başlatmaq istəyirsiniz?" -ContextBar.NoSelectedSource="Mənbə seçilməyib" -ContextBar.MediaControls.PlayMedia="Medianı oynat" -ContextBar.MediaControls.PauseMedia="Mediaya fasilə ver" -ContextBar.MediaControls.StopMedia="Medianı dayandır" -ContextBar.MediaControls.RestartMedia="Medianı yenidən başlat" -ContextBar.MediaControls.PlaylistNext="Oynatma siyahısında növbəti" -ContextBar.MediaControls.PlaylistPrevious="Oynatma siyahısında əvvəlki" -ContextBar.MediaControls.BlindSeek="Media axtarış viceti" +LoadProfileNeedsRestart="Profil OBS-in yenidən başladılmasını tələb edən parametrlərə malikdir:\n%1\n\nBu parametrlərin qüvvəyə minməsi üçün OBS-i yenidən başlatmaq istəyirsiniz?" +ContextBar.NoSelectedSource="Heç bir mənbə seçilməyib" +ContextBar.MediaControls.PlayMedia="Medianı Oxut" +ContextBar.MediaControls.PauseMedia="Mediaya Fasilə ver" +ContextBar.MediaControls.StopMedia="Medianı Dayandır" +ContextBar.MediaControls.RestartMedia="Medianı Yenidən Başlat" +ContextBar.MediaControls.PlaylistNext="Oxutma Siyahısında Növbəti" +ContextBar.MediaControls.PlaylistPrevious="Oxutma Siyahısında Əvvəlki" +ContextBar.MediaControls.BlindSeek="Media Axtarış Vidgeti" +YouTube.Auth.Ok="İcazəvermə (avtorizasiya) uğurla tamamlandı.\nİndi bu səhifəni bağlaya bilərsiniz." +YouTube.Auth.NoCode="İcazəvermə (Avtorizasiya) prosesi tamamlanmadı." +YouTube.Auth.NoChannels="Seçilmiş hesabda heçbir kanal(lar) mövcud deyil" +YouTube.Auth.WaitingAuth.Title="YouTube İstifadəçi Avtorizasiyası" +YouTube.Auth.WaitingAuth.Text="Zəhmət olmasa, avtorizasiyanı xarici brauzerinizdə tamamlayın.<br>Əgər xarici brauzer açılmasa, bu linkə daxil olun və avtorizasiyanı tamamlayın:<br>%1" +YouTube.AuthError.Text="Kanal məlumatını əldə etmək mümkün olmadı: %1." +YouTube.Actions.WindowTitle="YouTube Yayım Quraşdırması - Kanal: %1" +YouTube.Actions.CreateNewEvent="Yeni Yayım Yarat" +YouTube.Actions.ChooseEvent="Mövcud Yayımı Seç" +YouTube.Actions.Title="Başlıq*" +YouTube.Actions.MyBroadcast="Mənim Yayımım" +YouTube.Actions.Description="Açıqlama" +YouTube.Actions.Privacy="Məxfilik*" +YouTube.Actions.Privacy.Private="Şəxsi" +YouTube.Actions.Privacy.Public="İctimai" +YouTube.Actions.Privacy.Unlisted="Siyahıda Olmayan" +YouTube.Actions.Category="Kateqoriya" +YouTube.Actions.Thumbnail="Miniatür" +YouTube.Actions.Thumbnail.SelectFile="Fayl seç..." +YouTube.Actions.Thumbnail.NoFileSelected="Heç bir fayl seçilməyib" +YouTube.Actions.Thumbnail.ClearFile="Təmizlə" +YouTube.Actions.MadeForKids="Bu video uşaqlar üçün hazırlanıb?*" +YouTube.Actions.MadeForKids.Yes="Bəli, uşaqlar üçün hazırlanıb" +YouTube.Actions.MadeForKids.No="Xeyr, uşaqlar üçün hazırlanmayıb" +YouTube.Actions.AdditionalSettings="Əlavə parametrlər" +YouTube.Actions.Latency="Gecikmə" +YouTube.Actions.Latency.Low="Aşağı" +YouTube.Actions.Latency.UltraLow="Ultra aşağı" +YouTube.Actions.EnableAutoStart="Avtomatik Başlatmanı Aktiv et" +YouTube.Actions.EnableAutoStop="Avtomatik Dayandırmanı Aktiv et" +YouTube.Actions.AutoStartStop.TT="Bu planlaşdırılmış yayımın avtomatik başlamalı olub-olmadığını göstərir" +YouTube.Actions.EnableDVR="DVR-ı Aktiv et" +YouTube.Actions.ScheduleForLater="Daha sonraya planlaşdır" +YouTube.Actions.RememberSettings="Bu parametrləri yadda saxla" +YouTube.Actions.Create_Ready="Yayımı yarat" +YouTube.Actions.Create_GoLive="Yayımı yarat və yayıma başla" +YouTube.Actions.Choose_Ready="Yayımı seç" +YouTube.Actions.Choose_GoLive="Yayımı seç və yayıma başla" +YouTube.Actions.Create_Schedule="Yayımı planlaşdır" +YouTube.Actions.Create_Schedule_Ready="Yayımı planlaşdır və seç" +YouTube.Actions.Dashboard="YouTube Studio-nu aç" +YouTube.Actions.Error.Title="Canlı yayım yaratma xətası" +YouTube.Actions.Error.Text="YouTube giriş xətası '%1'.<br/>Ətraflı xəta təsvirini <a href='https://developers.google.com/youtube/v3/live/docs/errors'>https://developers.google.com/youtube/v3/live/docs/errors</a> ünvanında tapa bilərsiniz" +YouTube.Actions.Error.General="YouTube giriş xətası. Zəhmət olmasa, şəbəkə bağlantınızı və ya YouTube serverinə girişinizi yoxlayın." +YouTube.Actions.Error.NoBroadcastCreated="Yayım yaratma xətası '%1'.<br/>Ətraflı xəta təsvirini <a href='https://developers.google.com/youtube/v3/live/docs/errors'>https://developers.google.com/youtube/v3/live/docs/errors</a> ünvanında tapa bilərsiniz" +YouTube.Actions.Error.NoStreamCreated="Heç bir yayım yaradılmadı. Zəhmət olmasa, hesabınızı yenidən bağlayın." +YouTube.Actions.Error.YouTubeApi="YouTube API Xətası. Daha ətraflı məlumat üçün zəhmət olmasa, jurnal faylına baxın." +YouTube.Actions.Error.BroadcastNotFound="Seçilmiş yayım tapılmadı." +YouTube.Actions.Error.FileMissing="Seçilmiş fayl mövcud deyil." +YouTube.Actions.Error.FileOpeningFailed="Seçilmiş faylı açmaq mümkün olmadı." +YouTube.Actions.Error.FileTooLarge="Seçilmiş fayl çox böyükdür (Limit: 2 MiB)." +YouTube.Actions.Error.BroadcastTransitionFailed="Yayımı keçirmək mümkün olmadı: %1<br/><br/>Əgər bu xəta davam edərsə, <a href='https://studio.youtube.com/video/%2/livestreaming'>yayımı YouTube Studio-da açın</a> və əl ilə cəhd edin." +YouTube.Actions.Error.BroadcastTestStarting="Yayım test mərhələsinə keçir, bu bir qədər vaxt apara bilər. Zəhmət olmasa, 10-30 saniyə sonra yenidən cəhd edin." +YouTube.Actions.EventsLoading="Tədbirlərin siyahısı yüklənir..." +YouTube.Actions.EventCreated.Title="Tədbir Yaradıldı" +YouTube.Actions.EventCreated.Text="Tədbir uğurla yaradıldı." +YouTube.Actions.Stream="Yayım" +YouTube.Actions.Stream.ScheduledFor="%1 tarixinə planlaşdırılıb" +YouTube.Actions.Stream.Resume="Kəsilmiş yayımı davam etdir" +YouTube.Actions.Stream.YTStudio="YouTube Studio tərəfindən avtomatik yaradılıb" +YouTube.Actions.Notify.CreatingBroadcast="Yeni Canlı Yayım yaradılır, zəhmət olmasa gözləyin..." +YouTube.Actions.AutoStartStreamingWarning.Title="Əl ilə başlatma tələb olunur" +YouTube.Actions.AutoStartStreamingWarning="Bu tədbir üçün avtomatik başlatma deaktiv edilib, yayımınızı başlatmaq üçün \"Canlı Yayıma Çıx\" düyməsinə klikləyin." +YouTube.Actions.AutoStopStreamingWarning="Yenidən qoşula bilməyəcəksiniz.<br>Yayımınız dayanacaq və siz artıq canlı yayımda olmayacaqsınız." +YouTube.Errors.liveStreamingNotEnabled="Seçilmiş YouTube kanalında canlı yayım aktiv deyil.<br/><br/>Daha ətraflı məlumat üçün <a href='https://www.youtube.com/features'>youtube.com/features</a> səhifəsinə baxın." +YouTube.Errors.livePermissionBlocked="Seçilmiş YouTube Kanalında canlı yayım mövcud deyil.<br/>Nəzərə alın ki, kanal parametrlərinizdə aktiv etdikdən sonra canlı yayımın mövcud olması 24 saata qədər çəkə bilər.<br/><br/>Təfərrüatlar üçün <a href='https://www.youtube.com/features'>youtube.com/features</a> səhifəsinə baxın." +YouTube.Errors.errorExecutingTransition="Arxa tərəf xətası səbəbindən keçid uğursuz oldu. Zəhmət olmasa, bir neçə saniyə sonra yenidən cəhd edin." +YouTube.Errors.errorStreamInactive="YouTube yayımınız üçün məlumat almır. Zəhmət olmasa, konfiqurasiyanızı yoxlayın və yenidən cəhd edin." +YouTube.Errors.invalidTransition="Cəhd edilən keçid yanlış idi. Bu, yayımın əvvəlki keçidi tamamlamaması səbəbindən ola bilər. Zəhmət olmasa, bir neçə saniyə gözləyin və yenidən chd edin." +YouTube.DocksRemoval.Title="Köhnə YouTube Brauzer Pəncərələrini Təmizlə" +YouTube.DocksRemoval.Text="Bu brauzer pəncərələri köhnəlmiş olduğu üçün silinəcək:\n\n%1\nƏvəzinə \"Pəncərələr/YouTube Canlı İdarəetmə Otağı\"-dan istifadə edin." +ConfigDownload.WarningMessageTitle="Xəbərdarlıq" +FailedToStartStream.MissingConfigURL="Cari xidmət üçün heç bir konfiqurasiya URL-i mövcud deyil" +FailedToStartStream.NoCustomRTMPURLInSettings="Fərdi RTMP URL-i təyin edilməyib" +FailedToStartStream.InvalidCustomConfig="Yanlış fərdi konfiqurasiya" +FailedToStartStream.MissingCanvas="Konfiqurasiya edilmiş əlavə canvas çatışmır" +FailedToStartStream.FailedToCreateMultitrackVideoService="Çoxtrekli video xidməti yaratmaq mümkün olmadı" +FailedToStartStream.FailedToCreateMultitrackVideoOutput="Çoxtrekli video RTMP çıxışı yaratmaq mümkün olmadı" +FailedToStartStream.EncoderNotAvailable="NVENC mövcud deyil.\n\n'%1' kodlayıcı növünü tapmaq mümkün olmadı" +FailedToStartStream.FailedToCreateVideoEncoder="'%1' video kodlayıcısını yaratmaq mümkün olmadı (növ: '%2')" +FailedToStartStream.FailedToGetOBSVideoInfo="'%1' kodlayıcısını yaradarkən OBS video məlumatını əldə etmək mümkün olmadı (növ: '%2')" +FailedToStartStream.FailedToCreateAudioEncoder="Səs kodlayıcısı yaratmaq mümkün olmadı" +FailedToStartStream.NoRTMPURLInConfig="Konfiqurasiya yayım hədəfi RTMP(S) URL-ini ehtiva etmir" +FailedToStartStream.FallbackToDefault="%1 istifadə edərək yayımı başlatmaq mümkün olmadı; tək kodlaşdırma parametrləri ilə yenidən cəhd etmək istəyirsiniz?" +FailedToStartStream.ConfigRequestFailed="Konfiqurasiyanı %1-dən əldə etmək mümkün olmadı<br><br>HTTP xətası: %2" +FailedToStartStream.WarningUnknownStatus="Naməlum status dəyəri '%1' alındı" +FailedToStartStream.WarningRetryNonMultitrackVideo="\n<br><br>\n%1 olmadan yayıma davam etmək istəyirsiniz?" +FailedToStartStream.WarningRetry="\n<br><br>\nYayıma davam etmək istəyirsiniz?" +FailedToStartStream.MissingEncoderConfigs="Canlı yayıma çıxma konfiqurasiyasına kodlayıcı konfiqurasiyaları daxil edilməyib" +FailedToStartStream.InvalidEncoderConfig="Canlı yayıma çıxma konfiqurasiyasına yanlış kodlayıcı konfiqurasiyası daxil idi" +FailedToStartStream.StatusMissingHTML="Canlı yayıma çıxma sorğusu naməlum xəta qaytardı" +FailedToStartStream.NoConfigSupplied="Çatışmayan konfiqurasiya" +MultitrackVideo.Info="%1 avtomatik olaraq bir neçə video keyfiyyətini kodlaşdırmaq və göndərmək üçün parametrlərinizi optimallaşdırır. Bu seçimi etmək kompüteriniz və proqram təminatı quraşdırmanız haqqında %2 məlumatlarını göndərəcək." +MultitrackVideo.IncompatibleSettings.Title="Uyğunsuz Parametrlər" +MultitrackVideo.IncompatibleSettings.Text="%1 hazırda bunlarla uyğun deyil:\n\n%2\n%1 ilə yayıma davam etmək üçün uyğunsuz parametrləri deaktiv edin:\n\n%3\nvə yenidən Yayımı Başlatın." +MultitrackVideo.IncompatibleSettings.DisableAndStartStreaming="Bu yayım üçün deaktiv et və Yayımı Başlat" +MultitrackVideo.IncompatibleSettings.UpdateAndStartStreaming="Parametrləri Güncəllə və Yayımı Başlat" +MultitrackVideo.IncompatibleSettings.AudioChannels="%1 hazırda '%2' olaraq təyin edilmiş Səs → Ümumi → Kanallar ilə uyğun deyil, %3" +MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="Səs → Ümumi → Kanallar '%1' olaraq təyin edilməlidir" +MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 Səs → Ümumi → Kanallar üçün bir neçə fərqli parametr tələb edir" +Basic.OpenPluginManager="Plagin İdarəedicisi" +PluginManager="Plagin İdarəedicisi" +PluginManager.Restart="Plagin dəyişikliklərinin tətbiq edilməsi üçün OBS Studio yenidən başladılmalıdır" +PluginManager.MissingPlugin="PLAGİN TAPILMADI" +PluginManager.Section.Discover="Gözdən keçir" +PluginManager.Section.Manage="Quraşdırıldı" +PluginManager.Section.Updates="Güncəlləmələr" +PluginManager.Section.Manage.Title="Aktiv Plaginləri İdarə et"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/be-BY.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/be-BY.ini
Changed
@@ -110,6 +110,7 @@ List="Спісам" Grid="Сеткай" Automatic="Аўта" +ComingSoon="Неўзабаве" PluginsFailedToLoad.Title="Памылка загрузкі плагіна" PluginsFailedToLoad.Text="Немагчыма запусціць наступныя плагіны OBS:\n\n%1\nАбнавіце ці выдаліце гэтыя плагіны." AlreadyRunning.Title="OBS ужо працуе" @@ -336,8 +337,8 @@ ConfirmStopRecord.Text="Ці вы ўпэўненыя, што хочаце спыніць запіс?" ConfirmBWTest.Title="Пачаць тэст паласы прапускання?" ConfirmBWTest.Text="OBS наладжана ў рэжыме тэста паласы прапускання. Гэты рэжым дазваляе праверыць сетку без пачынання эфіру. Пасля завяршэння тэста вам спатрэбіцца яго адключыць, каб вашы гледачы маглі бачыць вашу трансляцыю.\n\nХочаце працягнуць?" -ConfirmExit.Title="Выйсці з OBS?" -ConfirmExit.Text="OBS цяпер актыўны. Усе трансляцыі і (або) запісы будуць адключаныя. Ці вы ўпэўненыя, што хочаце выйсці?" +ConfirmExit.Title="Ідзе вывад" +ConfirmExit.Text="OBS у цяперашні момант працуе. Усе бягучыя працэсы трансляцыі/запісу будуць спынены." ConfirmRemove.Title="Пацвердзіць выдаленне" ConfirmRemove.Text="Ці вы ўпэўненыя, што хочаце выдаліць «%1»?" ConfirmRemove.TextMultiple="Ці вы ўпэўненыя, што хочаце выдаліць %1 элементы(-аў)?" @@ -824,12 +825,15 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Уключыць перазапіс канфігурацыі" Basic.Settings.Stream.MultitrackVideoLabel="Некалькі дарожак" Basic.Settings.Stream.MultitrackVideoExtraCanvas="Дадатковае палатно" +Basic.Settings.Stream.WHIPSimulcastLabel="Адначасная трансляцыя" +Basic.Settings.Stream.WHIPSimulcastInfo="Адначасная трансляцыя дазваляе кадаваць і дасылаць відэа ў рознай якасці. <a href='https://obsproject.com/kb/whip-streaming-guide'>Даведацца больш</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Колькасць слояў" Basic.Settings.Stream.AdvancedOptions="Дадатковыя налады" Basic.Settings.Output="Вывад" Basic.Settings.Output.Format="Фармат запісу" Basic.Settings.Output.Format.MKV="Matroska (.mkv)" -Basic.Settings.Output.Format.hMP4="Гібрыдны MP4 БЭТА (.mp4)" -Basic.Settings.Output.Format.hMOV="Гібрыдны MOV БЭТА (.mp4)" +Basic.Settings.Output.Format.hMP4="Гібрыдны MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="Гібрыдны MOV (.mov)" Basic.Settings.Output.Format.fMP4="Фрагментаваны MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="Фрагментаваны MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="Відэа ў фрагментаваным фармаце MOV запісваецца кавалкамі; фіналізацыя, якую патрабуе традыцыйны фармат MOV, не патрабуецца.\nГэта азначае, што файл можна будзе прайграць, нават калі запіс на дыск быў перарваны, напрыклад, у выніку сіняга экрана смерці або адключэння электрычнасці.\n\nНекаторыя прайгравальнікі і рэдактары відэа такі фармат не падтрымліваюць. Каб адрэндарыць запіс у больш прыдатным фармаце, перайдзіце ў Файл → Перапакаваць запісы." @@ -999,6 +1003,7 @@ Basic.Settings.Video.Numerator="Лічнік" Basic.Settings.Video.Denominator="Назоўнік" Basic.Settings.Video.Renderer="Рэндарар" +Basic.Settings.Video.Renderer.Experimental="%1 (эксперыментальны)" Basic.Settings.Video.InvalidResolution="Памылковая раздзяляльнасць. Правільны фармат: шырыняxвышыня (напр., 1920x1080)" Basic.Settings.Video.CurrentlyActive="Працуе вывад відэа. Скончыце ўсе вывады, каб мяняць налады відэа." Basic.Settings.Video.DownscaleFilter.Bilinear="Білінейны (найхутчэйшы, але выява размываецца)" @@ -1313,7 +1318,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 патрабуе задаць наладу Аўдыя → Агульныя → Каналы інакш" Basic.OpenPluginManager="Менеджар плагінаў" PluginManager="Менеджар плагінаў" -PluginManager.HelpText="Менеджар плагінаў" -PluginManager.Restart="Перазапусціць OBS?" -PluginManager.NeedsRestart="Для ўжывання змен патрабуецца перазапуск OBS. Ці вы хочаце перазапусціць праграму зараз?" +PluginManager.Restart="Каб ужыць змяненне налад плагінаў, патрабуецца перазапусціць OBS Studio" PluginManager.MissingPlugin="ПЛАГІН НЕ ЗНОЙДЗЕНЫ" +PluginManager.Section.Discover="Агляд" +PluginManager.Section.Manage="Усталяваны" +PluginManager.Section.Updates="Абнаўленні" +PluginManager.Section.Manage.Title="Кіраванне ўключанымі плагінамі"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/bg-BG.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/bg-BG.ini
Changed
@@ -314,8 +314,6 @@ ConfirmStopRecord.Text="Наистина ли искате да спрете записването?" ConfirmBWTest.Title="Да започне ли тест за честотната лента?" ConfirmBWTest.Text="OBS е конфигуриран в режим на тестване на честотната лента. Този режим позволява тестване на мрежата, без каналът ви да работи на живо. След като приключите с тестването, ще трябва да го деактивирате, за да могат зрителите да виждат вашия поток.\n\nИскате ли да продължите?" -ConfirmExit.Title="Излизате ли от OBS?" -ConfirmExit.Text="OBS във момента е активен. Всички предавания/записи ще бъдат изключени. Сигурни ли сте че искате да излезнете от програмата?" ConfirmRemove.Title="Потвърждаване на премахване" ConfirmRemove.Text="Сигурни ли сте че искате да премахнете'%1'?" ConfirmRemove.TextMultiple="Сигурни ли сте че искате да премахнете %1 избрани обекта?" @@ -763,7 +761,6 @@ Basic.Settings.Output="Изход" Basic.Settings.Output.Format="Формат на записа" Basic.Settings.Output.Format.MKV="Видеоформат Матрьошка (.mkv)" -Basic.Settings.Output.Format.hMP4="Хибрид MP4 BETA (.mp4)" Basic.Settings.Output.Format.fMP4="Фрагментиран MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="Фрагментиран MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="Фрагментирания MOV записва запиза във парчета и не изисква същото финализиране като традиционните MOV файлове.\nТова осигурява че файла остава годен за възпроизвеждане, дори ако записът на диска бъде прекъснат, за пример, в резултат на BSOD или загуба на захранване.\n\nТова може да не е съвместимо с всички плейъри и редактори. Използвайте Файл → Remux Recordings за да конвертирайте файла на по-съвместим формат, ако е необходимо."
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/bn-BD.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/bn-BD.ini
Changed
@@ -278,8 +278,6 @@ ConfirmStopRecord.Text="আপনি কি নিশ্চিত যে আপনি রেকর্ডিং বন্ধ করতে চান?" ConfirmBWTest.Title="ব্যান্ডউইথ পরীক্ষা শুরু করবেন?" ConfirmBWTest.Text="আপনি OBS ব্যান্ডউইথ পরীক্ষা মোডে সজ্জিত করেছেন। এই মোডটি আপনার চ্যানেলটি সরাসরি না করে নেটওয়ার্ক পরীক্ষার অনুমতি দেয়। একবার আপনার পরীক্ষাটি শেষ হলে, স্ট্রিমটি দর্শকদের দেখার জন্য এটিকে বন্ধ করতে হবে।\n\nআপনি কি অবিরত করতে চান?" -ConfirmExit.Title="OBS প্রস্থান করুন?" -ConfirmExit.Text="OBS বর্তমানে সক্রিয় আছে। সব নদী/রেকর্ডিং বন্ধ হয়ে যাবে। আপনি কি নিশ্চিত যে আপনি প্রস্থান করতে চান?" ConfirmRemove.Title="টেমপ্লেট সংরক্ষণ করো" ConfirmRemove.TextMultiple="আপনি কি নিশ্চিত যে আপনি %1 আইটেম অপসারণ করতে চান?" Output.StartStreamFailed="স্ট্রীমিং চালু করতে ব্যর্থ হয়েছে"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/ca-ES.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/ca-ES.ini
Changed
@@ -108,6 +108,7 @@ List="Llista" Grid="Graella" Automatic="Automàtic" +ComingSoon="Pròximament" PluginsFailedToLoad.Title="Error en iniciar complements" PluginsFailedToLoad.Text="S'ha produït un error en iniciar aquests complements de l'OBS:\n\n%1\nActualitzeu o suprimiu aquests complements." AlreadyRunning.Title="L'OBS ja s'està executant" @@ -334,8 +335,8 @@ ConfirmStopRecord.Text="Segur que voleu aturar l'enregistrament?" ConfirmBWTest.Title="Test d'amplada de banda" ConfirmBWTest.Text="Heu configurat l'OBS en mode Test d'amplada de banda. Aquest mode us permet analitzar la connexió sense cap retransmissió en directe. Una vegada finalitzada l'anàlisi, inhabiliteu aquest mode perquè el públic pugui veure la retransmissió.\n\nVoleu continuar?" -ConfirmExit.Title="Voleu sortir de l'OBS?" -ConfirmExit.Text="OBS és actualment actiu. Tots els directes/gravacions s'aturaran. Esteu segur que voleu sortir?" +ConfirmExit.Title="Sortides actives" +ConfirmExit.Text="L'OBS encara està actiu. Totes les transmissions/gravacions es tancaran." ConfirmRemove.Title="Confirmeu la supressió" ConfirmRemove.Text="Segur que voleu suprimir '%1'?" ConfirmRemove.TextMultiple="¿Segur que vols esborrar %1 elements?" @@ -811,12 +812,15 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Activa l'anul·lació de la configuració" Basic.Settings.Stream.MultitrackVideoLabel="Vídeo multipista" Basic.Settings.Stream.MultitrackVideoExtraCanvas="Llenç addicional" +Basic.Settings.Stream.WHIPSimulcastLabel="Difusió simultània" +Basic.Settings.Stream.WHIPSimulcastInfo="La difusió simultània permet codificar i enviar vídeo de diverses qualitats. <a href='https://obsproject.com/kb/whip-streaming-guide'>Més informació</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Capes totals" Basic.Settings.Stream.AdvancedOptions="Opcions avançades" Basic.Settings.Output="Sortida" Basic.Settings.Output.Format="Format d'enregistrament" Basic.Settings.Output.Format.MKV="Vídeo Matroska (.mkv)" -Basic.Settings.Output.Format.hMP4="MP4 híbrid BETA (.mp4)" -Basic.Settings.Output.Format.hMOV="MOV híbrid BETA (.mov)" +Basic.Settings.Output.Format.hMP4="MP4 híbrid (.mp4)" +Basic.Settings.Output.Format.hMOV="MOV híbrid (.mov)" Basic.Settings.Output.Format.fMP4="MP4 fragmentat (.mp4)" Basic.Settings.Output.Format.fMOV="MOV fragmentat (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="El MOV fragmentat escriu l'enregistrament en trossos i no requereix la mateixa finalització que els fitxers MOV tradicionals.\nAixò garanteix que el fitxer es pugui reproduir fins i tot si s'interromp l'escriptura al disc, per exemple, com a resultat d'un BSOD o una pèrdua d'energia.\n\nÉs possible que això no sigui compatible amb tots els reproductors i editors. Utilitzeu Fitxer → Enregistraments remux per convertir el fitxer a un format més compatible si cal." @@ -984,6 +988,7 @@ Basic.Settings.Video.Numerator="Numerador" Basic.Settings.Video.Denominator="Denominador" Basic.Settings.Video.Renderer="Renderitzador" +Basic.Settings.Video.Renderer.Experimental="%1 (experimental)" Basic.Settings.Video.InvalidResolution="El valor de resolució no és vàlid. Ha de ser ampladaxalçada (per exemple, 1920x1080)" Basic.Settings.Video.CurrentlyActive="La sortida de vídeo és actualment activa. Si us plau desactiveu qualsevol sortida per canviar la configuració de vídeo." Basic.Settings.Video.DownscaleFilter.Bilinear="Bilineal (més ràpida, però borrós si s'escala)" @@ -1002,7 +1007,7 @@ Basic.Settings.Audio.PeakMeterType.SamplePeak="Pic de mostra" Basic.Settings.Audio.PeakMeterType.TruePeak="True Peak (ús elevat de la CPU)" Basic.Settings.Audio.MultichannelWarning.Enabled="ATENCIÓ: El so envoltant està habilitat." -Basic.Settings.Audio.MultichannelWarning="Si esteu transmetent, comproveu que el vostre servei de reproducció admet tant la captura com la reproducció de so envoltant. P. ex. el Facebook 360 Live admet totalment el so envoltant. El YouTube Live admet la captura d'àudio 5.1 (i reproducció als televisors).\n\nEls filtres d'àudio de l'OBS són compatibles amb el so envoltant, tot i que no es garanteix el suport del connector VST." +Basic.Settings.Audio.MultichannelWarning="Si esteu transmetent, comproveu que el vostre servei de reproducció admet tant la captura com la reproducció de so envoltant. Per exemple, Facebook 360 Live admet totalment el so envoltant. El YouTube Live admet la captura d'àudio 5.1 (i la reproducció als televisors).\n\nEls filtres d'àudio d'OBS són compatibles amb el so envoltant, tot i que no es garanteix el suport del complement VST." Basic.Settings.Audio.MultichannelWarning.Title="Voleu habilitar el so envoltant?" Basic.Settings.Audio.MultichannelWarning.Confirm="Segur que voleu habilitar el so envoltant?" Basic.Settings.Audio.Devices="Dispositius d'àudio globals" @@ -1308,7 +1313,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 requereix diversos paràmetres diferents per a Àudio → General → Canals" Basic.OpenPluginManager="Gestor de complements" PluginManager="Gestor de complements" -PluginManager.HelpText="Gestor de complements" -PluginManager.Restart="Voleu reiniciar l'OBS?\n" -PluginManager.NeedsRestart="Per aplicar aquests canvis, cal reiniciar l'OBS. Voleu reiniciar-lo ara?" +PluginManager.Restart="S'ha de reiniciar l'OBS Studio per aplicar els canvis del complement" PluginManager.MissingPlugin="COMPLEMENT NO TROBAT" +PluginManager.Section.Discover="Navega" +PluginManager.Section.Manage="Instal·lat" +PluginManager.Section.Updates="Actualitzacions" +PluginManager.Section.Manage.Title="Gestiona els complements habilitats"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/cs-CZ.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/cs-CZ.ini
Changed
@@ -105,6 +105,7 @@ List="Seznam" Grid="Mřížka" Automatic="Automatické" +ComingSoon="Již brzy" PluginsFailedToLoad.Title="Chyba při načítání pluginu" PluginsFailedToLoad.Text="Následující OBS pluginy se nepodařilo načíst:\n\n%1\nAktualizujte nebo odstraňte tyto pluginy." AlreadyRunning.Title="OBS je již spuštěno" @@ -327,8 +328,8 @@ ConfirmStopRecord.Text="Opravdu si přejete zastavit nahrávání ?" ConfirmBWTest.Title="Spuštění testu rychlosti připojení" ConfirmBWTest.Text="Nastavili jste OBS do režimu testování připojení. Tento režim vám umožňuje otestovat vaše připojení bez toho, abyste vysílali. Poté co skončíte s testováním jej budete muset vypnout, aby vaše vysílání viděli vaši diváci.\n\nChcete začít s testováním ?" -ConfirmExit.Title="Ukončit OBS ?" -ConfirmExit.Text="OBS je stále aktivní. Ukončením budou všechna vysílání/záznamy zastavena. Jste si jisti skončit ?" +ConfirmExit.Title="Aktivní výstupy" +ConfirmExit.Text="OBS je stále aktivní. Všechna vysílání/nahrávání budou ukončena." ConfirmRemove.Title="Potvrzení odebrání" ConfirmRemove.Text="Opravdu si přejete odebrat '%1'?" ConfirmRemove.TextMultiple="Opravdu si přejete odebrat %1 položky ?" @@ -816,11 +817,13 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Povolit přepis nastaveníí" Basic.Settings.Stream.MultitrackVideoLabel="Video s více stopami" Basic.Settings.Stream.MultitrackVideoExtraCanvas="Dodatečné plátno" +Basic.Settings.Stream.WHIPSimulcastInfo="Simulcast umožňuje enkódovat a odesílat obraz ve vícero kvalitách. <a href='https://obsproject.com/kb/whip-streaming-guide'>Více informací</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Počet vrstev" Basic.Settings.Stream.AdvancedOptions="Rozšířená nastavení" Basic.Settings.Output="Výstup" Basic.Settings.Output.Format="Formát nahrávání" -Basic.Settings.Output.Format.hMP4="Hybridní MP4 BETA (.mp4)" -Basic.Settings.Output.Format.hMOV="Hybridní MOV BETA (.mov)" +Basic.Settings.Output.Format.hMP4="Hybridní MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="Hybridní MOV (.mov)" Basic.Settings.Output.Format.fMP4="Fragmentované MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="Fragmentované MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="Fragmentované MOV zapisuje záznam po částech a nevyžaduje stejnou finalizaci jako tradiční soubory MOV.\nToto zaručí, že bude možné soubor přehrát i přes přerušení zápisu souboru na disk, třeba z důvodu BSOD nebo ztráty napájení.\n\nToto nemusí být kompatibilní se všemi přehrávači a editory. V případě potřeby použijte Soubor → Převést nahrávky pro převod souboru do kompatibilnějšího formátu." @@ -989,6 +992,7 @@ Basic.Settings.Video.Numerator="Čitatel" Basic.Settings.Video.Denominator="Jmenovatel" Basic.Settings.Video.Renderer="Vykreslovač" +Basic.Settings.Video.Renderer.Experimental="%1 (Experimentální)" Basic.Settings.Video.InvalidResolution="Chybná hodnota rozlišení. Správný formát je šířkaxvýška (např. 1920x1080)" Basic.Settings.Video.CurrentlyActive="Obrazový výstup je zapnutý. Pro změnu nastavení vypněte všechny výstupy." Basic.Settings.Video.DownscaleFilter.Bilinear="Bilineární (Nejrychlejší, ale rozmazané při škálování)" @@ -1296,3 +1300,11 @@ MultitrackVideo.IncompatibleSettings.AudioChannels="%1 není aktuálně kompatibilní s Zvuk → Obecné → Kanály nastavenými na '%2', %3" MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="Zvuk → Obecné → Kanály musejí být nastaveny na '%1'" MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 vyžaduje více rozdílných nastavení pro Zvuk → Obecné → Kanály" +Basic.OpenPluginManager="Správce pluginů" +PluginManager="Správce pluginů" +PluginManager.Restart="OBS Studio je nutno restartovat než budou aplikovány změny pluginů" +PluginManager.MissingPlugin="PLUGIN NENALEZEN" +PluginManager.Section.Discover="Procházet" +PluginManager.Section.Manage="Nainstalované" +PluginManager.Section.Updates="Aktualizace" +PluginManager.Section.Manage.Title="Spravovat povolené pluginy"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/da-DK.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/da-DK.ini
Changed
@@ -103,11 +103,16 @@ List="Liste" Grid="Gitter" Automatic="Automatisk" +ComingSoon="Kommer snart" PluginsFailedToLoad.Title="Plugin-indlæsningsfejl" PluginsFailedToLoad.Text="Flg. OBS-plugins kunne ikke indlæses:\n\n%1\nOpdatér eller fjern disse plugins." AlreadyRunning.Title="OBS kører allerede" AlreadyRunning.Text="OBS kører allerede! Medmindre dette er tilsigtet, så bør du lukke enhver eksisterende OBS-proces, inden du forsøger at køre en ny. Hvis du har OBS opsat til at minimeres sig til systembakken, så tjek om den stadig kører dér." AlreadyRunning.LaunchAnyway="Start alligevel" +CrashHandling.Dialog.Title="OBS Studio nedbrud opdaget" +CrashHandling.Labels.Text="OBS Studio lukkede ikke rigtigt ned.\n\nStart i Fejlsikret tilstand (tredjeparts udvidelser, scripts og WebSockets vil være slået fra)?" +CrashHandling.Checkbox.SendReport="Jeg har læst privatlivspolitikken og samtykker til at uploade." +CrashHandling.Buttons.LaunchSafe="Start i Fejlsikret tilstand" SafeMode.Restart="Vil du genstarte OBS i Fejlsikret tilstand (tredjeparts udvidelser, scripts og WebSockets vil være slået fra)?" SafeMode.RestartNormal="Vil du genstarte OBS i normal tilstand?" ChromeOS.Title="Uunderstøttet platform" @@ -313,8 +318,6 @@ ConfirmStopRecord.Text="Sikker på, at du vil stoppe optagelsen?" ConfirmBWTest.Title="Start båndbreddetest?" ConfirmBWTest.Text="Du har OBS opsat i tilstanden båndbreddetest. Denne tilstand muliggør netværksaftestning, uden at din kanal er online. Når aftestningen er gennemført, så deaktivér tilstanden, så seerne vil kunne se din stream.\n\nVil du fortsætte?" -ConfirmExit.Title="Afslut OBS?" -ConfirmExit.Text="OBS er pt. aktiv. Alle streams/optagelser vil blive afsluttet. Sikker på, at du vil afslutte?" ConfirmRemove.Title="Bekræft Fjern" ConfirmRemove.Text="Sikker på, at '%1' skal fjernes?" ConfirmRemove.TextMultiple="Sikker på, at du vil fjerne %1 emner?" @@ -351,6 +354,10 @@ Output.NoBroadcast.Text="En udsendelse skal opættes, inden streaming kan påbegyndes." Output.BroadcastStartFailed="Start af udsendelse mislykkedes" Output.BroadcastStopFailed="Stop af udsendelse mislykkedes" +LogUploadDialog.Title="OBS Studio Log Fil Upload" +LogUploadDialog.Labels.Progress="Log upload i gang. Vent venligst..." +LogUploadDialog.Buttons.CopyURL="Kopiér Log URL" +LogUploadDialog.Buttons.AnalyzeURL="Analyser Log fil" LogUploadDialog.Buttons.RetryButton="Prøv igen" Remux.SourceFile="OBS-optagelse" Remux.TargetFile="Destinationsfil" @@ -553,6 +560,7 @@ Basic.Main.PauseRecording="Sæt optagelse på pause" Basic.Main.UnpauseRecording="Genoptag optagelse" Basic.Main.SplitFile="Opdel optagelsesfil" +Basic.Main.AddChapterMarker="Tilføj kapitelmarkør (Kun Hybrid MP4/MOV)" Basic.Main.StoppingRecording="Stopper optagelse..." Basic.Main.StopReplayBuffer="Stop Genafspilnings-buffer" Basic.Main.StoppingReplayBuffer="Stopper Genafspilnings-buffer..." @@ -921,6 +929,7 @@ Basic.Settings.Video.Numerator="Tæller" Basic.Settings.Video.Denominator="Nævner" Basic.Settings.Video.Renderer="Gengiver" +Basic.Settings.Video.Renderer.Experimental="%1 (Eksperimentel)" Basic.Settings.Video.InvalidResolution="Ugyldig opløsning. Skal være breddexhøjde (dvs. 1.920x1.080)" Basic.Settings.Video.CurrentlyActive="Videooutput erpt. aktivt. Afbryd evt. outputs fra for at ændre videoindstillinger." Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinær (hurtigst, men sløret ved skalering)" @@ -1225,3 +1234,7 @@ MultitrackVideo.IncompatibleSettings.AudioChannels="%1 er i øjeblikket ikke kompatibel med Lyd → Generelt → Kanaler sat til '%2', %3" MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="Lyd → Generelt → Kanaler skal sættes til '%1'" MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 kræver flere forskellige indstilling for Lyd → Generalt → Kanaler" +PluginManager.MissingPlugin="PLUGIN IKKE FUNDET" +PluginManager.Section.Discover="Gennemse" +PluginManager.Section.Manage="Installeret" +PluginManager.Section.Updates="Opdateringer"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/de-DE.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/de-DE.ini
Changed
@@ -106,25 +106,26 @@ List="Liste" Grid="Raster" Automatic="Automatisch" +ComingSoon="Bald verfügbar" PluginsFailedToLoad.Title="Fehler beim Laden von Plugins" PluginsFailedToLoad.Text="Folgende OBS-Plugins konnten nicht geladen werden:\n\n%1\nAktualisieren oder entfernen Sie diese." AlreadyRunning.Title="OBS wird bereits ausgeführt" AlreadyRunning.Text="OBS wird bereits ausgeführt und sollte gegebenenfalls vor dem Start einer weiteren Instanz (die sich möglicherweise im Infobereich befindet) beendet werden." AlreadyRunning.LaunchAnyway="Trotzdem starten" CrashHandling.Dialog.Title="OBS Studio Absturz erkannt" -CrashHandling.Labels.Text="OBS Studio wurde nicht ordnungsgemäß heruntergefahren.\n\nAusführen im abgesicherten Modus (Plugins von Drittanbietern, Skripte und Websockets deaktiviert)?" +CrashHandling.Labels.Text="OBS Studio wurde nicht ordnungsgemäß heruntergefahren.\n\nAusführen im abgesicherten Modus (mit deaktivierten Drittanbieter-Plugins, Skripten und WebSockets)?" CrashHandling.Labels.PrivacyNotice="Sie können auch festlegen, dass der letzte Absturzprotokoll automatisch in das OBSProject hochgeladen wird.<br /><br />Bitte lesen Sie die <a href='https://obsproject.com/privacy-policy'>Datenschutzbestimmungen</a>, bevor Sie Dateien hochladen, und achten Sie besonders auf die Abschnitte, die das Hochladen von Dateien betreffen." CrashHandling.Checkbox.SendReport="Ich habe die Datenschutzbestimmungen gelesen und stimme dem Upload zu." CrashHandling.Buttons.LaunchSafe="Im abgesicherten Modus starten" CrashHandling.Buttons.LaunchNormal="Im normalen Modus starten" CrashHandling.Errors.UploadJSONError="Beim Versuch, das letzte Absturzprotokoll hochzuladen, ist ein Fehler aufgetreten. Bitte versuchen Sie es später noch einmal." CrashHandling.Errors.Title="Fehler beim Hochladen des Absturzprotokolls" -SafeMode.Restart="Möchten Sie OBS im abgesicherten Modus (mit deaktivierten Drittanbieter-Plugins, Skripte, und WebSockets) neu starten?" +SafeMode.Restart="Möchten Sie OBS im abgesicherten Modus (mit deaktivierten Drittanbieter-Plugins, Skripten und WebSockets) neu starten?" SafeMode.RestartNormal="Möchten Sie OBS normal neu starten?" ChromeOS.Title="Nicht unterstützte Plattform" ChromeOS.Text="OBS scheint in einem ChromeOS-Container zu laufen. Diese Plattform wird nicht unterstützt." Wine.Title="Wine erkannt" -Wine.Text="OBS in Wine auszuführen wird nicht unterstützt und viele Funktionen wie Aufnahme- oder Gerätequellen funktionieren nur teils oder gar nicht.<br><br>Es wird empfohlen, stattdessen eine native Version von OBS zu verwenden, zum Beispiel <a href='https://flathub.org/apps/details/com.obsproject.Studio'>unsere Flatpak-Version</a> oder die Pakete Ihres Betriebssystems." +Wine.Text="OBS in Wine auszuführen wird nicht unterstützt und viele Funktionen wie Aufnahme- oder Gerätequellen funktionieren nur teils oder gar nicht.<br><br>Es wird empfohlen, stattdessen eine native Version von OBS zu verwenden, z. B. <a href='https://flathub.org/apps/details/com.obsproject.Studio'>unsere Flatpak-Version</a> oder die Pakete Ihres Betriebssystems." DockCloseWarning.Title="Dockbares Fenster schließen" DockCloseWarning.Text="Sie haben gerade ein dockbares Fenster geschlossen. Wenn Sie es erneut anzeigen möchten, verwenden Sie das Docks-Menü in der Menüleiste." ExtraBrowsers="Benutzerdefinierte Browser-Docks" @@ -167,7 +168,7 @@ Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="Aktuelle verwenden (%1 × %2)" Basic.AutoConfig.VideoPage.BaseResolution.Display="Monitor %1 (%2 × %3)" Basic.AutoConfig.VideoPage.FPS.UseCurrent="Aktuelle verwenden (%1)" -Basic.AutoConfig.VideoPage.FPS.PreferHighFPS="Entweder 60 oder 30, aber wenn möglich 60 bevorzugen" +Basic.AutoConfig.VideoPage.FPS.PreferHighFPS="Entweder 60 oder 30, aber wenn möglich, 60 bevorzugen" Basic.AutoConfig.VideoPage.FPS.PreferHighRes="Entweder 60 oder 30, aber hohe Auflösung bevorzugen" Basic.AutoConfig.VideoPage.CanvasExplanation="Hinweis: Die Basis-(Leinwand-)Auflösung ist nicht unbedingt Ihre Stream- oder Aufnahmeauflösung. Ihre tatsächliche Auflösung kann ausgehend von der Leinwandauflösung herunterskaliert werden, um die Ressourcennutzung oder Bitratenanforderungen zu reduzieren." Basic.AutoConfig.StreamPage="Streaminformationen" @@ -179,10 +180,10 @@ Basic.AutoConfig.StreamPage.GetStreamKey="Streamschlüssel erhalten" Basic.AutoConfig.StreamPage.MoreInfo="Mehr Informationen" Basic.AutoConfig.StreamPage.UseStreamKey="Streamschlüssel verwenden" -Basic.AutoConfig.StreamPage.UseStreamKeyAdvanced="Streamschlüssel verwenden (Erweitert)" +Basic.AutoConfig.StreamPage.UseStreamKeyAdvanced="Streamschlüssel verwenden (erweitert)" Basic.AutoConfig.StreamPage.Service="Plattform" -Basic.AutoConfig.StreamPage.Service.ShowAll="Alle anzeigen …" -Basic.AutoConfig.StreamPage.Service.Custom="Benutzerdefiniert …" +Basic.AutoConfig.StreamPage.Service.ShowAll="Alle anzeigen" +Basic.AutoConfig.StreamPage.Service.Custom="Benutzerdefiniert" Basic.AutoConfig.StreamPage.StreamKey="Streamschlüssel" Basic.AutoConfig.StreamPage.StreamKey.ToolTip="RIST: Geben Sie das Verschlüsselungspasswort ein.\nRTMP: Geben Sie den vom Dienst bereitgestellten Schlüssel ein.\nSRT: Geben Sie die streamid ein, wenn die Plattform eine verwendet." Basic.AutoConfig.StreamPage.EncoderKey="Kodiererschlüssel" @@ -296,7 +297,7 @@ Undo.Scene.Duplicate="Szene „%1“ duplizieren" Undo.ShowTransition="Zeige-Übergang bei „%1“" Undo.HideTransition="Verstecke-Übergang bei „%1“" -Undo.ShowSceneItem="„%1“ in „%2“ zeigen" +Undo.ShowSceneItem="„%1“ in „%2“ anzeigen" Undo.HideSceneItem="„%1“ in „%2“ verbergen" Undo.ReorderSources="Quellen in „%1“ neu anordnen" Undo.MoveUp="„%1“ in „%2“ hochbewegen" @@ -324,8 +325,8 @@ ConfirmStopRecord.Text="Möchten Sie die Aufnahme wirklich beenden?" ConfirmBWTest.Title="Bandbreitentest starten?" ConfirmBWTest.Text="Sie haben OBS im Bandbreitentestmodus konfiguriert. In diesem Modus können Sie Netzwerktests durchführen, ohne dass Ihr Kanal live geschaltet wird. Sobald Sie fertig mit dem Testen sind, müssen Sie ihn deaktivieren, damit die Zuschauer Ihren Stream sehen können.\n\nFortfahren?" -ConfirmExit.Title="OBS beenden?" -ConfirmExit.Text="OBS ist derzeit aktiv. Alle Streams und Aufnahmen werden beendet. Möchten Sie OBS wirklich schließen?" +ConfirmExit.Title="Aktive Ausgänge" +ConfirmExit.Text="OBS ist gerade noch aktiv. Alle Streams / Aufnahmen werden beendet." ConfirmRemove.Title="Entfernen bestätigen" ConfirmRemove.Text="Möchten Sie „%1“ wirklich entfernen?" ConfirmRemove.TextMultiple="Möchten Sie %1 Elemente wirklich entfernen?" @@ -455,7 +456,7 @@ Deinterlacing.TopFieldFirst="Oberes Feld zuerst" Deinterlacing.BottomFieldFirst="Unteres Feld zuerst" VolControl.SliderUnmuted="Lautstärkeregler für „%1“:" -VolControl.SliderMuted="Lautstärkeregler für „%1“: (Derzeit stummgeschaltet)" +VolControl.SliderMuted="Lautstärkeregler für „%1“: (derzeit stummgeschaltet)" VolControl.Mute="„%1“ stummschalten" VolControl.Properties="Eigenschaften von „%1“" VolControl.UnassignedWarning.Title="Audioquelle nicht zugewiesen" @@ -467,7 +468,7 @@ Basic.Main.AddSceneCollection.Text="Bitte geben Sie den Namen der Szenensammlung ein" Basic.Main.RenameSceneCollection.Title="Szenensammlung umbenennen" Basic.Main.RemigrateSceneCollection.Title="Auflösung der Szenensammlung aktualisieren" -Basic.Main.RemigrateSceneCollection.Text="Möchten Sie die Auflösung der Szenensammlung „%1“ an die der aktuellen Leinwand (%2 × %3) anpassen?%3" +Basic.Main.RemigrateSceneCollection.Text="Möchten Sie die Auflösung der Szenensammlung „%1“ an die aktuelle Leinwandauflösung (%2 × %3) anpassen?" Basic.Main.RemigrateSceneCollection.CannotMigrate.Active="Auflösung der Szenensammlung kann nur aktualisiert werden, wenn keine Ausgaben aktiv sind." Basic.Main.RemigrateSceneCollection.CannotMigrate.UnknownBaseResolution="Aktualisieren der Auflösung der Szenensammlung ist fehlgeschlagen. Die ursprüngliche Auflösung ist unbekannt." Basic.Main.RemigrateSceneCollection.CannotMigrate.FailedVideoReset="Zurücksetzen nicht möglich: Ändern der OBS-Auflösung ist fehlgeschlagen." @@ -488,7 +489,7 @@ Basic.Main.Sources.Lock="Fixieren" Basic.Main.Sources.LockDescription="Fixiert die Position und Größe von „%1“ in der Leinwand" Basic.PropertiesWindow="Eigenschaften von „%1“" -Basic.PropertiesWindow.AutoSelectFormat="%1 (Automatisch ausgewählt: %2)" +Basic.PropertiesWindow.AutoSelectFormat="%1 (automatisch ausgewählt: %2)" Basic.PropertiesWindow.SelectColor="Farbe auswählen" Basic.PropertiesWindow.SelectFont="Schriftart auswählen" Basic.PropertiesWindow.SelectFont.WindowTitle="Schriftart wählen" @@ -569,7 +570,7 @@ Basic.Main.Source="Quelle" Basic.Main.Controls="Steuerung" Basic.Main.PreparingStream="Wird vorbereitet …" -Basic.Main.Connecting="Verbinde …" +Basic.Main.Connecting="Verbindung wird hergestellt …" Basic.Main.StartRecording="Aufnahme starten" Basic.Main.StartReplayBuffer="Replaypuffer starten" Basic.Main.SaveReplay="Replay speichern" @@ -579,16 +580,16 @@ Basic.Main.StopRecording="Aufnahme beenden" Basic.Main.PauseRecording="Aufnahme pausieren" Basic.Main.UnpauseRecording="Aufnahme fortsetzen" -Basic.Main.SplitFile="Aufnehmende Datei teilen" +Basic.Main.SplitFile="Aufnahmedatei teilen" Basic.Main.AddChapterMarker="Kapitelmarkierung hinzufügen (nur Hybrid MP4/MOV)" -Basic.Main.StoppingRecording="Beende Aufnahme …" +Basic.Main.StoppingRecording="Aufnahme wird beendet …" Basic.Main.StopReplayBuffer="Replaypuffer stoppen" -Basic.Main.StoppingReplayBuffer="Beende Replaypuffer …" +Basic.Main.StoppingReplayBuffer="Replaypuffer wird beendet …" Basic.Main.SetupBroadcast="Übertragung verwalten" Basic.Main.StopStreaming="Stream beenden" Basic.Main.StopBroadcast="Übertragung beenden" -Basic.Main.AutoStopEnabled="(Beendet automatisch)" -Basic.Main.StoppingStreaming="Beende Stream …" +Basic.Main.AutoStopEnabled="(automatisch beenden)" +Basic.Main.StoppingStreaming="Stream wird beendet …" Basic.Main.ForceStopStreaming="Stream beenden (Verzögerung ignorieren)" Basic.Main.ShowContextBar="Quellenwerkzeugleiste anzeigen" Basic.Main.HideContextBar="Quellenwerkzeugleiste verbergen" @@ -732,13 +733,13 @@ Basic.Settings.General.OverflowHidden="Überlauf verbergen" Basic.Settings.General.OverflowAlwaysVisible="Überlauf immer anzeigen" Basic.Settings.General.OverflowSelectionHidden="Überlauf trotz verborgener Quelle anzeigen" -Basic.Settings.General.Importers="Importierung" +Basic.Settings.General.Importers="Importeure" Basic.Settings.General.AutomaticCollectionSearch="Beim Importieren bekannte Orte nach Szenensammlungen durchsuchen" Basic.Settings.General.SwitchOnDoubleClick="Szenenübergang bei Doppelklick" Basic.Settings.General.StudioPortraitLayout="Porträt-/Vertikales Layout aktivieren" Basic.Settings.General.TogglePreviewProgramLabels="Vorschau- und Programmbeschriftung anzeigen" Basic.Settings.General.Multiview.MouseSwitch="Szenen durch Klicken wechseln" -Basic.Settings.General.Multiview.DrawSourceNames="Szenennamen anzeigen" +Basic.Settings.General.Multiview.DrawSourceNames="Szenenamen anzeigen" Basic.Settings.General.Multiview.DrawSafeAreas="Sichere Bereiche anzeigen (EBU R 95)" Basic.Settings.General.MultiviewLayout="Multiview-Anordnung" Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontal, oben (8 Szenen)" @@ -798,16 +799,18 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Konfiguration überschreiben" Basic.Settings.Stream.MultitrackVideoLabel="Mehrspur-Video" Basic.Settings.Stream.MultitrackVideoExtraCanvas="Zusätzliche Leinwand" +Basic.Settings.Stream.WHIPSimulcastInfo="Mit Simulcast können Sie mehrere Videoqualitäten codieren und senden. <a href=‚https://obsproject.com/kb/whip-streaming-guide‘>Weitere Informationen</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Gesamtanzahl Ebenen" Basic.Settings.Stream.AdvancedOptions="Erweiterte Optionen" Basic.Settings.Output="Ausgabe" Basic.Settings.Output.Format="Aufnahmeformat" Basic.Settings.Output.Format.MKV="Matroska-Video (.mkv)" -Basic.Settings.Output.Format.hMP4="Hybrides MP4 BETA (.mp4)" -Basic.Settings.Output.Format.hMOV="Hybrides MOV BETA (.mov)" +Basic.Settings.Output.Format.hMP4="Hybrides MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="Hybrides MOV (.mov)" Basic.Settings.Output.Format.fMP4="Fragmentiertes MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="Fragmentiertes MOV (.mov)" -Basic.Settings.Output.Format.TT.fragmented_mov="Bei fragmentiertem MOV wird die Aufnahme in Abschnitten geschrieben und es wird nicht dieselbe Fertigstellung wie bei normalen MOV-Dateien benötigt.\nSo bleiben Dateien auch bei Abbrüchen des Schreibvorgangs abspielbar, z. B. durch einen BSOD oder Stromausfall.\n\nDies ist möglicherweise nicht mit allen Medienspielern und Editoren kompatibel. Verwenden Sie „Datei“ → „Aufnahmen remuxen“, um Dateien gegebenenfalls in ein kompatibles Format zu konvertieren." -Basic.Settings.Output.Format.TT.fragmented_mp4="Bei fragmentiertem MP4 wird die Aufnahme in Abschnitten geschrieben und es wird nicht dieselbe Fertigstellung wie bei normalen MP4-Dateien benötigt.\nSo bleiben Dateien auch bei Abbrüchen des Schreibvorgangs abspielbar, z. B. durch einen BSOD oder Stromausfall.\n\nDies ist möglicherweise nicht mit allen Medienspielern und Editoren kompatibel. Verwenden Sie „Datei“ → „Aufnahmen remuxen“, um Dateien gegebenenfalls in ein kompatibles Format zu konvertieren." +Basic.Settings.Output.Format.TT.fragmented_mov="Bei fragmentiertem MOV wird die Aufnahme in Abschnitten geschrieben und es wird nicht dieselbe Fertigstellung wie bei normalen MOV-Dateien benötigt.\nSo bleiben Dateien auch bei Abbrüchen des Schreibvorgangs abspielbar, z. B. durch einen BSOD oder Stromausfall.\n\nDies ist möglicherweise nicht mit allen Medienspielern und Editoren kompatibel. Verwenden Sie „Datei“ → „Aufnahmen remuxen“, um Dateien gegebenenfalls in ein kompatibles Format zu konvertieren." +Basic.Settings.Output.Format.TT.fragmented_mp4="Bei fragmentiertem MP4 wird die Aufnahme in Abschnitten geschrieben und es wird nicht dieselbe Fertigstellung wie bei normalen MP4-Dateien benötigt.\nSo bleiben Dateien auch bei Abbrüchen des Schreibvorgangs abspielbar, z. B. durch einen BSOD oder Stromausfall.\n\nDies ist möglicherweise nicht mit allen Medienspielern und Editoren kompatibel. Verwenden Sie „Datei“ → „Aufnahmen remuxen“, um Dateien gegebenenfalls in ein kompatibles Format zu konvertieren." Basic.Settings.Output.Encoder.Video="Videokodierer" Basic.Settings.Output.Encoder.Audio="Audiokodierer" Basic.Settings.Output.SelectDirectory="Wählen Sie den Aufnahmeordner aus" @@ -815,7 +818,7 @@ Basic.Settings.Output.DynamicBitrate.Beta="Bitrate dynamisch verändern, um Überlastung zu kontrollieren (Beta)" Basic.Settings.Output.DynamicBitrate.TT="Anstatt Frames wegfallen zu lassen, um Überlastung\nzu verringern, wird die Bitrate dynamisch verändert.\n\nBeachten Sie, dass dies die Verzögerung zu den Zuschauern\nbei erheblich unerwartet hoher Überlastung erhöhen kann.\nWenn die Bitrate fällt, kann der Wiederherstellungsvorgang\nein paar Minuten dauern.\n\nDerzeit nur für RTMP unterstützt." Basic.Settings.Output.Mode="Ausgabemodus" -Basic.Settings.Output.Mode.Simple="Simpel" +Basic.Settings.Output.Mode.Simple="Einfach" Basic.Settings.Output.Mode.Adv="Erweitert" Basic.Settings.Output.Mode.FFmpeg="FFmpeg-Ausgabe" Basic.Settings.Output.UseReplayBuffer="Replaypuffer aktivieren" @@ -857,7 +860,7 @@ Basic.Settings.Output.MaxRetries="Maximale Wiederholungsversuche" Basic.Settings.Output.Advanced="Benutzerdefinierte Kodierereinstellungen aktivieren (Erweitert)" Basic.Settings.Output.EncoderPreset="Kodierervoreinstellung" -Basic.Settings.Output.EncoderPreset.ultrafast="%1 (Niedrige CPU-Nutzung, niedrigste Qualität)" +Basic.Settings.Output.EncoderPreset.ultrafast="%1 (niedrige CPU-Nutzung, niedrigste Qualität)" Basic.Settings.Output.EncoderPreset.veryfast="%1 (Standard) (Mittlere CPU-Nutzung, Standardqualität)" Basic.Settings.Output.EncoderPreset.fast="%1 (Hohe CPU-Nutzung und Qualität)" Basic.Settings.Output.CustomEncoderSettings="Benutzerdefinierte Kodierereinstellungen" @@ -955,6 +958,7 @@ Basic.Settings.Video.FPSFraction="Bruch-FPS-Wert" Basic.Settings.Video.Numerator="Zähler" Basic.Settings.Video.Denominator="Nenner" +Basic.Settings.Video.Renderer.Experimental="%1 (experimentell)" Basic.Settings.Video.InvalidResolution="Ungültige Auflösung. Korrekte Formatierung: BreitexHöhe (z. B. 1920x1080)" Basic.Settings.Video.CurrentlyActive="Videoausgabe ist derzeit aktiv. Bitte schalten Sie alle Ausgaben ab, um die Videoeinstellungen zu ändern." Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (am schnellsten, bei Skalierung aber unscharf)" @@ -968,7 +972,7 @@ Basic.Settings.Audio.MeterDecayRate.Medium="Mittel (Type I PPM)" Basic.Settings.Audio.MeterDecayRate.Slow="Langsam (Type II PPM)" Basic.Settings.Audio.PeakMeterType="Spitzenmessertyp" -Basic.Settings.Audio.PeakMeterType.TruePeak="True Peak (Höhere CPU-Nutzung)" +Basic.Settings.Audio.PeakMeterType.TruePeak="True Peak (höhere CPU-Nutzung)" Basic.Settings.Audio.MultichannelWarning.Enabled="Achtung: Surround-Sound-Audio ist aktiviert." Basic.Settings.Audio.MultichannelWarning="Überprüfen Sie für das Streamen, ob Ihre Streamingplattform sowohl die Einspeisung als auch die Wiedergabe von Surround-Sound unterstützt. Beispielsweise unterstützt Facebook 360 Live Surround-Sound vollständig. YouTube Live unterstützt 5.1-Audioeinspeisung (und -Wiedergabe auf Fernsehgeräten).\n\nOBS-Audiofilter sind mit Surround-Sound kompatibel, die VST-Pluginunterstützung ist aber nicht garantiert." Basic.Settings.Audio.MultichannelWarning.Title="Surround-Sound-Audio aktivieren?" @@ -999,9 +1003,9 @@ Basic.Settings.Accessibility.ColorOverrides.MixerGreen="Mixerlautstärkebalken (-60 bis -20 dB)" Basic.Settings.Accessibility.ColorOverrides.MixerYellow="Mixerlautstärkebalken (-20 bis -9 dB)" Basic.Settings.Accessibility.ColorOverrides.MixerRed="Mixerlautstärkebalken (-9 bis 0 dB)" -Basic.Settings.Accessibility.ColorOverrides.MixerGreenActive="Mixerlautstärkebalken (-60 bis -20 dB) (Aktiv)" -Basic.Settings.Accessibility.ColorOverrides.MixerYellowActive="Mixerlautstärkebalken (-20 bis -9 dB) (Aktiv)" -Basic.Settings.Accessibility.ColorOverrides.MixerRedActive="Mixerlautstärkebalken (-9 bis 0 dB) (Aktiv)" +Basic.Settings.Accessibility.ColorOverrides.MixerGreenActive="Mixerlautstärkebalken (-60 bis -20 dB) (aktiv)" +Basic.Settings.Accessibility.ColorOverrides.MixerYellowActive="Mixerlautstärkebalken (-20 bis -9 dB) (aktiv)" +Basic.Settings.Accessibility.ColorOverrides.MixerRedActive="Mixerlautstärkebalken (-9 bis 0 dB) (aktiv)" Basic.Settings.Accessibility.ColorOverrides.Preset="Farbvoreinstellung" Basic.Settings.Accessibility.ColorOverrides.Preset.Default="Standard" Basic.Settings.Accessibility.ColorOverrides.Preset.Custom="Benutzerdefiniert" @@ -1073,7 +1077,7 @@ Basic.Hotkeys.SelectScene="Zur Szene wechseln" Basic.SystemTray.Show="Anzeigen" Basic.SystemTray.Hide="Verstecken" -Basic.SystemTray.Message.Reconnecting="Verbindung verloren. Verbinde erneut …" +Basic.SystemTray.Message.Reconnecting="Verbindung verloren. Verbindung wird wiederhergestellt …" Hotkeys.Insert="Einfügen" Hotkeys.Delete="Entfernen" Hotkeys.Home="Pos1" @@ -1110,7 +1114,7 @@ Unmute="Stummschaltung aufheben" Push-to-mute="Push-To-Mute" Push-to-talk="Push-To-Talk" -SceneItemShow="„%1“ zeigen" +SceneItemShow="„%1“ anzeigen" SceneItemHide="„%1“ verbergen" OutputWarnings.NoTracksSelected="Sie müssen mindestens eine Spur auswählen." OutputWarnings.NoTracksSelectedOnExit.Title="Ausgabeeinstellungsfehler" @@ -1148,14 +1152,14 @@ ResizeOutputSizeOfSource.Text="Die Basis- und Ausgabeauflösung wird auf die Größe der aktuellen Quelle skaliert." ResizeOutputSizeOfSource.Continue="Fortfahren?" PreviewTransition="Übergangsvorschau" -Importer="Szenensammlungsimportierung" +Importer="Szenesammlung importieren" Importer.SelectCollection="Wählen Sie eine Szenensammlung aus" Importer.Collection="Szenensammlung" Importer.HelpText="Fügen Sie Dateien zu diesem Fenster hinzu, um Sammlungen von OBS oder anderen bekannten Programmen zu importieren." Importer.Path="Sammlungspfad" Importer.Program="Erkannte Anwendung" Importer.AutomaticCollectionPrompt="Automatisch nach Szenensammlungen suchen" -Importer.AutomaticCollectionText="OBS kann automatisch importierbare Szenensammlungen von Drittanbieter-Programmen finden. Möchten Sie, dass OBS automatisch nach Sammlungen für Sie sucht?\n\nSie können diese Einstellung später unter „Einstellungen“ → „Allgemein“ → „Importierung“ ändern." +Importer.AutomaticCollectionText="OBS kann automatisch importierbare Szenesammlungen von Drittanbieter-Programmen finden. Möchten Sie, dass OBS automatisch nach Sammlungen für Sie sucht?\n\nSie können diese Einstellung später unter „Einstellungen“ → „Allgemein“ → „Importierung“ ändern." Importer.SelectFile="Durchsuchen..." Restart="Neustart" NeedsRestart="OBS Studio muss neu gestartet werden. Möchten Sie jetzt neu starten?" @@ -1227,7 +1231,7 @@ YouTube.Actions.Stream.ScheduledFor="Geplant für %1" YouTube.Actions.Stream.Resume="Unterbrochenen Stream fortsetzen" YouTube.Actions.Stream.YTStudio="Automatisch von YouTube Studio erstellt" -YouTube.Actions.Notify.CreatingBroadcast="Eine neue Live-Übertragung wird erstellt, bitte warten…" +YouTube.Actions.Notify.CreatingBroadcast="Eine neue Live-Übertragung wird erstellt, bitte warten …" YouTube.Actions.AutoStartStreamingWarning.Title="Manueller Start erforderlich" YouTube.Actions.AutoStartStreamingWarning="Der automatische Start ist für dieses Event deaktiviert. Klicken Sie auf „Live gehen“, um Ihre Übertragung zu starten." YouTube.Actions.AutoStopStreamingWarning="Sie können die Verbindung nicht wiederherstellen.<br>Ihr Stream wird gestoppt und Sie werden nicht länger live sein." @@ -1235,7 +1239,7 @@ YouTube.Errors.livePermissionBlocked="Livestreams sind für den gewählten YouTube-Kanal nicht verfügbar.<br/>Nach Aktivierung in Ihren Kanaleinstellungen kann die tatsächliche Freischaltung bis zu 24 Stunden dauern.<br/><br/>Gehen Sie auf <a href='https://www.youtube.com/features'>youtube.com/features</a> für mehr Informationen." YouTube.Errors.errorExecutingTransition="Der Übergang ist aufgrund eines Backend-Fehlers fehlgeschlagen. Bitte versuchen Sie es in ein paar Sekunden erneut." YouTube.Errors.errorStreamInactive="YouTube erhält keine Streamdaten. Bitte überprüfen Sie Ihre Einstellungen und versuchen Sie es erneut." -YouTube.Errors.invalidTransition="Der versuchte Übergang war ungültig. Möglicherweise hat der Stream einen vorherigen Übergang nicht beendet. Versuchen Sie es gleich nochmal." +YouTube.Errors.invalidTransition="Der versuchte Übergang war ungültig. Möglicherweise hat der Stream einen vorherigen Übergang nicht beendet. Versuchen Sie es gleich noch mal." YouTube.DocksRemoval.Title="Veraltete YouTube-Browser-Docks bereinigen" YouTube.DocksRemoval.Text="Folgende Browser-Docks werden entfernt, da diese veraltet sind:\n\n%1\nVerwenden Sie stattdessen „Docks“ → „YouTube Live Control Room“." ConfigDownload.WarningMessageTitle="Achtung" @@ -1267,9 +1271,10 @@ MultitrackVideo.IncompatibleSettings.AudioChannels="%1 ist zurzeit nicht mit auf „%2“ gesetzte Audio → Allgemein → Kanäle kompatibel. %3" MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="Audio → Allgemein → Kanäle muss auf „%1“ gesetzt werden." MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 benötigt mehrere verschiedene Einstellungen für Audio → Allgemein → Kanäle." -Basic.OpenPluginManager="Plugins" +Basic.OpenPluginManager="Plugin-Manager" PluginManager="Plugins" -PluginManager.HelpText="Plugins" -PluginManager.Restart="OBS neu starten?" -PluginManager.NeedsRestart="Um diese Änderungen zu übernehmen, muss OBS neu gestartet werden. Möchten Sie jetzt neu starten?" +PluginManager.Restart="OBS Studio muss neu gestartet werden, um die geänderten Plugins anzuwenden" PluginManager.MissingPlugin="PLUGIN NICHT GEFUNDEN" +PluginManager.Section.Discover="Durchsuchen" +PluginManager.Section.Manage="Installiert" +PluginManager.Section.Manage.Title="Aktive Plugins verwalten"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/el-GR.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/el-GR.ini
Changed
@@ -111,11 +111,15 @@ List="Λίστα" Grid="Πλέγμα" Automatic="Αυτόματο" +ComingSoon="Έρχεται σύντομα" PluginsFailedToLoad.Title="Σφάλμα Φόρτωσης Πρόσθετου" PluginsFailedToLoad.Text="Τα παρακάτω πρόσθετα του OBS απέτυχαν να φορτωθούν:\n\n%1\nΠαρακαλώ αναβαθμίστε ή αφαιρέστε αυτά τα πρόσθετα." AlreadyRunning.Title="Το OBS εκτελείται ήδη" AlreadyRunning.Text="Το OBS εκτελείται ήδη! Εκτός αν αυτός ήταν ο σκοπός σας, παρακαλούμε τερματίστε τις τρέχουσες διεργασίες OBS πριν προσπαθήσετε να εκκινήσετε μια καινούρια. Εάν έχετε ρυθμίσει το OBS να ελαχιστοποιείται στην γραμμή εργαλείων, παρακαλούμε να ελέγξετε αν τρέχει ήδη εκεί." AlreadyRunning.LaunchAnyway="Εκκίνηση ούτως ή άλλως" +CrashHandling.Checkbox.SendReport="Έχω διαβάσει την πολιτική απορρήτου και συναινώ στο ανέβασμα." +CrashHandling.Buttons.LaunchSafe="Εκτέλεση σε Ασφαλή Λειτουργία" +CrashHandling.Buttons.LaunchNormal="Εκτέλεση σε Κανονική Λειτουργία" SafeMode.Restart="Θέλετε να επανεκκινήσετε το OBS σε Ασφαλή Λειτουργία (απενεργοποιημένα πρόσθετα τρίτων, scripting και websockets)?" SafeMode.RestartNormal="Θέλετε να επανεκκινήσετε το OBS σε Κανονική Λειτουργία;" ChromeOS.Title="Μη υποστηριγμένη πλατφόρμα" @@ -329,8 +333,6 @@ ConfirmStopRecord.Text="Είστε σίγουροι ότι θέλετε να διακόψετε την εγγραφή;" ConfirmBWTest.Title="Έναρξη δοκιμής εύρους ζώνης;" ConfirmBWTest.Text="Έχετε ρυθμιστεί το OBS σε λειτουργία δοκιμής εύρους ζώνης. Αυτή η λειτουργία επιτρέπει τον έλεγχο δικτύου χωρίς να αρχίσετε ζωντανή μετάδοση. Μόλις τελειώσετε τη δοκιμή, θα πρέπει να την απενεργοποιήσετε για να μπορούν οι θεατές να δουν τη μετάδοση σας.\n\nΘέλετε να συνεχίσετε?" -ConfirmExit.Title="Έξοδος από το OBS;" -ConfirmExit.Text="Το OBS είναι προσωρινά ενεργό. Όλες οι ροές/καταγραφές θα τερματιστούν. Είστε σίγουροι ότι επιθυμείτε να το κλείσετε;" ConfirmRemove.Title="Επιβεβαίωση Κατάργησης" ConfirmRemove.Text="Είστε βέβαιοι ότι θέλετε να αφαιρέσετε το '%1';" ConfirmRemove.TextMultiple="Είστε βέβαιοι ότι θέλετε να καταργήσετε %1 επιλογές;" @@ -367,6 +369,15 @@ Output.NoBroadcast.Text="Πρέπει να ορίσετε μια αναμετάδοση προτού ξεκινήσετε την ροή." Output.BroadcastStartFailed="Αδυναμία εκκίνησης της αναμετάδοσης" Output.BroadcastStopFailed="Αδυναμία τερματισμού της αναμετάδοσης" +LogUploadDialog.Labels.PrivacyNotice="Παρακαλούμε διαβάστε την <a href='https://obsproject.com/privacy-policy'>Πολιτική Απορρήτου</a> και την ενότητα σχετικά με τη μεταφόρτωση αρχείων πριν αποστείλετε οποιαδήποτε αρχεία." +LogUploadDialog.Labels.Progress="Ανέβασμα καταγραφής σε εξέλιξη. Παρακαλούμε περιμένετε..." +LogUploadDialog.Labels.Description.AppLog="Το αρχείο καταγραφής σας έχει ανέβει. Μπορείτε τώρα να μοιραστείτε το σύνδεσμο για σκοπούς αποσφαλμάτωσης και υποστήριξης." +LogUploadDialog.Buttons.ConfirmUpload="Μεταφόρτωση" +LogUploadDialog.Buttons.CopyURL="Αντιγραφή URL καταγραφής" +LogUploadDialog.Buttons.AnalyzeURL="Ανάλυση αρχείου καταγραφής" +LogUploadDialog.Buttons.RetryButton="Προσπάθεια ξανά" +LogUploadDialog.Errors.Template="Προέκυψε σφάλμα κατά το ανέβασμα του αρχείου:\n\n%1" +LogUploadDialog.Errors.NoLogFile="Δε βρέθηκε αρχείο για ανέβασμα ή το αρχείο ήταν κενό." Remux.SourceFile="OBS Καταγραφή" Remux.TargetFile="Αρχείο Προορισμού" Remux.Remux="Μετατροπή" @@ -579,6 +590,7 @@ Basic.Main.PauseRecording="Παύση Εγγραφής" Basic.Main.UnpauseRecording="Επανέναρξη Εγγραφής" Basic.Main.SplitFile="Διαχωρισμός αρχείου εγγραφής" +Basic.Main.AddChapterMarker="Προσθήκη δείκτη κεφαλαίου (μόνο για υβριδικό MP4/MOV)" Basic.Main.StoppingRecording="Διακοπή Καταγραφής..." Basic.Main.StopReplayBuffer="Διακοπή Επανάληψης Προσωρινής Μνήμης" Basic.Main.StoppingReplayBuffer="Διακοπή Επανάληψης Προσωρινής Μνήμης..." @@ -787,7 +799,8 @@ Basic.Settings.Output="Έξοδος" Basic.Settings.Output.Format="Μορφή Καταγραφής" Basic.Settings.Output.Format.MKV="Βίντεο Matroska (.mkv)" -Basic.Settings.Output.Format.hMP4="Υβριδικό Hybrid MP4 BETA (.mp4)" +Basic.Settings.Output.Format.hMP4="Υβριδικό MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="Υβριδικό MOV (.mov)" Basic.Settings.Output.Format.fMP4="Κατακερματισμένο MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="Κατακερματισμένο MOV (.mov)" Basic.Settings.Output.Encoder.Video="Κωδικοποιητής Βίντεο" @@ -813,14 +826,14 @@ Basic.Settings.Output.Simple.RecordingQuality.Stream="Ίδιο με την ροή" Basic.Settings.Output.Simple.RecordingQuality.Small="Υψηλής Ποιότητας, Μεσαίου Μεγέθους Αρχείο" Basic.Settings.Output.Simple.RecordingQuality.HQ="Δυσδιάκριτης Ποιότητας, Μεγάλου Μεγέθους Αρχείο" -Basic.Settings.Output.Simple.RecordingQuality.Lossless="Ποιότητας Χωρίς Απώλειες, Εξαιρετικά Μεγάλου Μεγέθους Αρχείο" +Basic.Settings.Output.Simple.RecordingQuality.Lossless="Μη Απωλεστικής Ποιότητας, Εξαιρετικά Μεγάλου Μεγέθους Αρχείο" Basic.Settings.Output.Simple.Warn.VideoBitrate="Προειδοποίηση: Το bitrate βίντεο ροής θα οριστεί σε %1, το οποίο είναι το ανώτερο όριο για την τρέχουσα υπηρεσία μετάδοσης." Basic.Settings.Output.Simple.Warn.AudioBitrate="Προειδοποίηση: Το bitrate ήχου ροής θα οριστεί σε %1, το οποίο είναι το ανώτερο όριο για την τρέχουσα υπηρεσία ροής." Basic.Settings.Output.Simple.Warn.CannotPause="Προειδοποίηση: Δε μπορείτε να σταματήσετε την καταγραφή εάν η ποιότητα εγγραφής έχει οριστεί σε \"Ίδιο με τη ροή\"." Basic.Settings.Output.Simple.Warn.IncompatibleContainer="Προειδοποίηση: Η τρέχουσα επιλεγμένη μορφή καταγραφής είναι ασύμβατη με τον επιλεγμένο κωδικοποιητή ροής." Basic.Settings.Output.Simple.Warn.Encoder="Προειδοποίηση: Η καταγραφή με χρήση κωδικοποιητή λογισμικού σε διαφορετική ποιότητα από την ροή θα απαιτήσει πρόσθετη χρήση της CPU, αν πραγματοποιήσετε ταυτόχρονα μετάδοση ροής και καταγραφή." -Basic.Settings.Output.Simple.Warn.Lossless.Msg="Είστε σίγουρος ότι θέλετε να χρησιμοποιήσετε την επιλογή ποιότητα χωρίς απώλειες;" -Basic.Settings.Output.Simple.Warn.Lossless.Title="Προειδοποίηση ποιότητας χωρίς απώλειες!" +Basic.Settings.Output.Simple.Warn.Lossless.Msg="Είστε σίγουρος ότι θέλετε να χρησιμοποιήσετε μη απωλεστική ποιότητα;" +Basic.Settings.Output.Simple.Warn.Lossless.Title="Προειδοποίηση μη απωλεστικής ποιότητας!" Basic.Settings.Output.Simple.Encoder.Software="Λογισμικό (x264)" Basic.Settings.Output.Simple.Encoder.Hardware.QSV.H264="Υλικό (QSV, H.264)" Basic.Settings.Output.Simple.Encoder.Hardware.QSV.AV1="Υλικό (QSV, AV1)" @@ -947,6 +960,7 @@ Basic.Settings.Video.Numerator="Αριθμητής" Basic.Settings.Video.Denominator="Παρονομαστής" Basic.Settings.Video.Renderer="Απόδοση" +Basic.Settings.Video.Renderer.Experimental="%1 (Πειραματικό)" Basic.Settings.Video.InvalidResolution="Μη έγκυρη τιμή ανάλυσης. Πρέπει να είναι widthxheight (π.χ. 1920x1080)" Basic.Settings.Video.CurrentlyActive="Δεν υπάρχει ενεργή έξοδος βίντεο. Παρακαλώ απενεργοποιήστε κάθε έξοδο για να αλλάξετε τις ρυθμίσεις βίντεο." Basic.Settings.Video.DownscaleFilter.Bilinear="Διγραμμικό (Πιο γρήγορο, αλλά θολό στην κλιμάκωση)" @@ -1202,8 +1216,18 @@ YouTube.Errors.errorStreamInactive="Το YouTube δεν λαμβάνει δεδομένα για τη ροή σας. Παρακαλώ ελέγξτε τις ρυθμίσεις σας και προσπαθήστε ξανά." YouTube.Errors.invalidTransition="Η απόπειρα μετάβασης δεν ήταν έγκυρη. Αυτό μπορεί να οφείλεται σε προηγούμενη μη ολοκληρωμένη μετάβαση. Παρακαλώ περιμένετε μερικά δευτερόλεπτα και προσπαθήστε ξανά." ConfigDownload.WarningMessageTitle="Προσοχή" +FailedToStartStream.MissingConfigURL="Δεν υπάρχει διαθέσιμο URL παραμετροποίησης για την τρέχουσα υπηρεσία" FailedToStartStream.NoCustomRTMPURLInSettings="Δεν έχει οριστεί προσαρμοσμένο URL του RTMP" FailedToStartStream.NoRTMPURLInConfig="Η ρύθμιση δεν περιλαμβάνει URL στόχου ροής του RTMP(S)" FailedToStartStream.WarningUnknownStatus="Ελήφθη άγνωστη κατάσταση τιμής '%1'" FailedToStartStream.NoConfigSupplied="Λείπει ρύθμιση" MultitrackVideo.IncompatibleSettings.Title="Μη συμβατές ρυθμίσεις" +MultitrackVideo.IncompatibleSettings.AudioChannels="%1 δεν είναι τώρα συμβατό με Ήχος → Γενικά → Κανάλια ορισμένα σε '%2', %3" +MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="Ήχος → Γενικά → Κανάλια πρέπει να οριστεί σε '%1'" +MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 απαιτεί πολλαπλές διαφορετικές ρυθμίσεις για Ήχος → Γενικά → Κανάλια" +Basic.OpenPluginManager="Διαχειριστής προσθέτων" +PluginManager="Διαχειριστής προσθέτων" +PluginManager.MissingPlugin="ΠΡΟΣΘΕΤΟ ΔΕ ΒΡΕΘΗΚΕ" +PluginManager.Section.Discover="Περιήγηση" +PluginManager.Section.Manage="Εγκατεστημένο" +PluginManager.Section.Updates="Ενημερώσεις"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/en-GB.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/en-GB.ini
Changed
@@ -13,6 +13,8 @@ MixerToolbarMenu="Audio mixer menu" PluginsFailedToLoad.Title="Plugin load error" AlreadyRunning.Text="OBS is already running! Unless you meant to do this, please shut down any existing instances of OBS before trying to run a new instance. If you have OBS set to minimise to the system tray, please check to see if it's still running there." +CrashHandling.Labels.Text="OBS Studio did not shut down properly.\n\nRun in Safe Mode (third-party plugins, scripting, and WebSockets disabled)?" +CrashHandling.Labels.PrivacyNotice="You can also choose to automatically upload the most recent crash report to the OBS Project.<br /><br />Please read the <a href='https://obsproject.com/privacy-policy'>Privacy Policy</a> before uploading any files, paying particular attention to the sections regarding file uploads." Wine.Text="Running OBS in Wine is unsupported, and many features, such as capture or device sources, will not work or only in limited capacity.<br><br>It is recommended to run a native version of OBS instead, for example <a href='https://flathub.org/apps/details/com.obsproject.Studio'>our Flatpak version</a> or your operating system's packages." BrowserPanelInit.Title="Initialising Browser..." BrowserPanelInit.Text="Initialising browser, please wait..." @@ -105,3 +107,5 @@ YouTube.Actions.AutoStartStreamingWarning="Auto-start is disabled for this event, click \"Go Live\" to start your broadcast." YouTube.DocksRemoval.Text="These browser docks will be removed as deprecated:\n\n%1\nUse \"Docks/YouTube Live Control Room\" instead." FailedToStartStream.InvalidEncoderConfig="Go live config has an invalid encoder configuration" +Basic.OpenPluginManager="Plug-in Manager" +PluginManager="Plug-in Manager"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/en-US.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/en-US.ini
Changed
@@ -63,6 +63,8 @@ Right="Right" Top="Top" Bottom="Bottom" +Width="Width" +Height="Height" Reset="Reset" Hours="Hours" Minutes="Minutes" @@ -362,6 +364,11 @@ Undo.PasteSource="Paste Source(s) in '%1'" Undo.PasteSourceRef="Paste Source Reference(s) in '%1'" Undo.GroupItems="Group Items into '%1'" +Undo.ScaleFiltering="Scale Filtering on '%1' in '%2'" +Undo.BlendingMode="Blending Mode on '%1' in '%2'" +Undo.BlendingMethod="Blending Method on '%1' in '%2'" +Undo.DeinterlacingMode="Deinterlacing Mode on '%1'" +Undo.DeinterlacingOrder="Deinterlacing Field Order on '%1'" # transition name dialog TransitionNameDlg.Text="Please enter the name of the transition" @@ -594,7 +601,7 @@ VolControl.Mute="Mute '%1'" VolControl.Properties="Properties for '%1'" VolControl.UnassignedWarning.Title="Unassigned Audio Source" -VolControl.UnassignedWarning.Text="\"%1\" is not assigned to any audio tracks and it will not be audible in streams or recordings.\n\nTo assign an audio source to a track, open the Advanced Audio Properties via the right-click menu or the cog button in the mixer dock toolbar." +VolControl.UnassignedWarning.Text="\"%1\" is not assigned to any audio tracks and it will not be audible in streams or recordings.\n\nTo assign an audio source to a track, open the Advanced Audio Properties via the Edit menu on the menu bar, or the cog button in the mixer dock toolbar." # add scene dialog Basic.Main.AddSceneDlg.Title="Add Scene" @@ -699,24 +706,26 @@ # transform window Basic.TransformWindow="Scene Item Transform" Basic.TransformWindow.Position="Position" -Basic.TransformWindow.PositionX="Position X" -Basic.TransformWindow.PositionY="Position Y" +Basic.TransformWindow.PositionX="X" +Basic.TransformWindow.PositionY="Y" Basic.TransformWindow.Rotation="Rotation" Basic.TransformWindow.Size="Size" Basic.TransformWindow.Width="Width" Basic.TransformWindow.Height="Height" -Basic.TransformWindow.Alignment="Positional Alignment" -Basic.TransformWindow.BoundsType="Bounding Box Type" -Basic.TransformWindow.BoundsAlignment="Alignment in Bounding Box" -Basic.TransformWindow.Bounds="Bounding Box Size" +Basic.TransformWindow.Alignment="Alignment" +Basic.TransformWindow.BoundsType="Bounds Type" +Basic.TransformWindow.BoundsAlignment="Bounds Alignment" +Basic.TransformWindow.Bounds="Bounds" Basic.TransformWindow.BoundsWidth="Bounding Box Width" Basic.TransformWindow.BoundsHeight="Bounding Box Height" -Basic.TransformWindow.CropToBounds="Crop to Bounding Box" +Basic.TransformWindow.CropToBounds="Crop Bounds" Basic.TransformWindow.Crop="Crop" Basic.TransformWindow.CropLeft="Crop Left" Basic.TransformWindow.CropRight="Crop Right" Basic.TransformWindow.CropTop="Crop Top" Basic.TransformWindow.CropBottom="Crop Bottom" +Basic.TransformWindow.Accessible.PositionX="X Position" +Basic.TransformWindow.Accessible.PositionY="Y Position" Basic.TransformWindow.Alignment.TopLeft="Top Left" Basic.TransformWindow.Alignment.TopCenter="Top Center" @@ -728,13 +737,13 @@ Basic.TransformWindow.Alignment.BottomCenter="Bottom Center" Basic.TransformWindow.Alignment.BottomRight="Bottom Right" -Basic.TransformWindow.BoundsType.None="No bounds" +Basic.TransformWindow.BoundsType.None="Automatic" Basic.TransformWindow.BoundsType.MaxOnly="Maximum size only" -Basic.TransformWindow.BoundsType.ScaleInner="Scale to inner bounds" -Basic.TransformWindow.BoundsType.ScaleOuter="Scale to outer bounds" -Basic.TransformWindow.BoundsType.ScaleToWidth="Scale to width of bounds" -Basic.TransformWindow.BoundsType.ScaleToHeight="Scale to height of bounds" -Basic.TransformWindow.BoundsType.Stretch="Stretch to bounds" +Basic.TransformWindow.BoundsType.ScaleInner="Fit" +Basic.TransformWindow.BoundsType.ScaleOuter="Cover" +Basic.TransformWindow.BoundsType.ScaleToWidth="Fill Width" +Basic.TransformWindow.BoundsType.ScaleToHeight="Fill Height" +Basic.TransformWindow.BoundsType.Stretch="Stretch" Basic.TransformWindow.Title="Edit Transform for '%1'" Basic.TransformWindow.NoSelectedSource="No source selected" @@ -1014,6 +1023,9 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Enable Config Override" Basic.Settings.Stream.MultitrackVideoLabel="Multitrack Video" Basic.Settings.Stream.MultitrackVideoExtraCanvas="Additional Canvas" +Basic.Settings.Stream.WHIPSimulcastLabel="Simulcast" +Basic.Settings.Stream.WHIPSimulcastInfo="Simulcast allows you to encode and send multiple video qualities. <a href='https://obsproject.com/kb/whip-streaming-guide'>Learn More</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Total Layers" Basic.Settings.Stream.AdvancedOptions="Advanced Options" # basic mode 'output' settings @@ -1327,6 +1339,29 @@ Basic.Settings.Advanced.AutoRemux="Automatically remux to %1" Basic.Settings.Advanced.AutoRemux.MP4="(record as mkv)" +# audio mixer +Basic.AudioMixer.Pin="Pin" +Basic.AudioMixer.Unpin="Unpin" +Basic.AudioMixer.Options="Options" +Basic.AudioMixer.Hide="Hide" +Basic.AudioMixer.Unhide="Unhide" +Basic.AudioMixer.HiddenTotal="%1 hidden" +Basic.AudioMixer.ShowHidden="Show hidden sources" +Basic.AudioMixer.KeepHiddenRight="Keep hidden sources to the right" +Basic.AudioMixer.KeepHiddenBottom="Keep hidden sources at the bottom" +Basic.AudioMixer.ShowInactive="Show inactive sources" +Basic.AudioMixer.KeepInactiveRight="Keep inactive sources to the right" +Basic.AudioMixer.KeepInactiveBottom="Keep inactive sources at the bottom" +Basic.AudioMixer.Category.Global="Global" +Basic.AudioMixer.Category.Pinned="Pinned" +Basic.AudioMixer.Category.Active="Active" +Basic.AudioMixer.Category.Inactive="Inactive" +Basic.AudioMixer.Category.Preview="Preview" +Basic.AudioMixer.Category.Hidden="Hidden" +Basic.AudioMixer.Category.Unassigned="Unassigned" +Basic.AudioMixer.Layout.Horizontal="Horizontal" +Basic.AudioMixer.Layout.Vertical="Vertical" + # advanced audio properties Basic.AdvAudio="Advanced Audio Properties" Basic.AdvAudio.ActiveOnly="Active Sources Only" @@ -1627,8 +1662,12 @@ Basic.OpenPluginManager="Plugin Manager" PluginManager="Plugin Manager" PluginManager.Restart="OBS Studio must be restarted to apply plugin changes" -PluginManager.MissingPlugin="PLUGIN NOT FOUND" +PluginManager.MissingPlugin="Missing Plugins" +PluginManager.SafeMode="All plugins temporarily disabled by Safe Mode" PluginManager.Section.Discover="Browse" PluginManager.Section.Manage="Installed" PluginManager.Section.Updates="Updates" PluginManager.Section.Manage.Title="Manage Enabled Plugins" + +# Custom Widget Localization +Accessible.Widget.Name.AlignmentSelector="Alignment Selector"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/eo-UY.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/eo-UY.ini
Changed
@@ -285,8 +285,6 @@ ConfirmStopRecord.Text="Ĉu vi certas ke vi volas ĉesigi la registradon?" ConfirmBWTest.Title="Ĉu komenci kapacitan teston?" ConfirmBWTest.Text="Vi havas OBS agorditan en reĝimo de kapacita testo. Tiu ĉi reĝimo ebligas ret-testadon sen vere tujelsendi. Kiam vi finiĝas pri testado, vi devos malebligi ĝin por ke spektantoj povu vidi vian elsendon.\n\nĈu vi volas daŭrigi?" -ConfirmExit.Title="Ĉu eliri OBS?" -ConfirmExit.Text="OBS estas aktuale aktiva. Ĉiuj elsendoj/registradoj fermiĝos. Ĉu vi vere volas eliri?" ConfirmRemove.Title="Konfirmado de forigo" ConfirmRemove.TextMultiple="Ĉu vi vere volas forigi %1 erojn?" Output.StartStreamFailed="Malsukcesis ekelsendi"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/es-ES.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/es-ES.ini
Changed
@@ -109,6 +109,7 @@ List="Lista" Grid="Cuadrícula" Automatic="Automático" +ComingSoon="Próximamente" PluginsFailedToLoad.Title="Error al cargar el plugin" PluginsFailedToLoad.Text="No se han podido cargar los siguientes plugins de OBS:\n\n%1\nPor favor, actualice o elimine estos plugins." AlreadyRunning.Title="OBS ya se está ejecutando" @@ -332,8 +333,8 @@ ConfirmStopRecord.Text="¿Estás seguro de que deseas parar la grabación?" ConfirmBWTest.Title="¿Iniciar prueba de ancho de banda?" ConfirmBWTest.Text="Tienes OBS configurado en modo de prueba de ancho de banda. Este modo permite pruebas de red sin que tu canal esté en vivo. Una vez que hayas terminado de probar, necesitarás desactivarlo para que los espectadores puedan ver tu stream.\n\n¿Quieres continuar?" -ConfirmExit.Title="¿Cerrar OBS?" -ConfirmExit.Text="OBS esta siendo usado. Todas las transmisiones/grabaciones serán paradas. ¿Está seguro que quiere salir?" +ConfirmExit.Title="Salidas activas" +ConfirmExit.Text="OBS sigue activo. Se cerrarán todas las transmisiones y grabaciones." ConfirmRemove.Title="Confirmar borrado" ConfirmRemove.Text="¿Seguro que quieres eliminar '%1'?" ConfirmRemove.TextMultiple="¿Seguro que quieres eliminar %1 elementos?" @@ -811,12 +812,15 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Activar la anulación de la configuración" Basic.Settings.Stream.MultitrackVideoLabel="Video multipista" Basic.Settings.Stream.MultitrackVideoExtraCanvas="Lienzo adicional" +Basic.Settings.Stream.WHIPSimulcastLabel="Transmisión simultánea" +Basic.Settings.Stream.WHIPSimulcastInfo="La transmisión simultánea permite codificar y enviar vídeo en distintas calidades. <a href='https://obsproject.com/kb/whip-streaming-guide'>Más información</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Capas totales" Basic.Settings.Stream.AdvancedOptions="Opciones avanzadas" Basic.Settings.Output="Salida" Basic.Settings.Output.Format="Formato de grabación" Basic.Settings.Output.Format.MKV="Video Matroska (.mkv)" -Basic.Settings.Output.Format.hMP4="MP4 híbrido BETA (.mp4)" -Basic.Settings.Output.Format.hMOV="MOV híbrido BETA (.mov)" +Basic.Settings.Output.Format.hMP4="MP4 híbrido (.mp4)" +Basic.Settings.Output.Format.hMOV="MOV híbrido (.mov)" Basic.Settings.Output.Format.fMP4="MP4 fragmentado (.mp4)" Basic.Settings.Output.Format.fMOV="MOV fragmentado (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="El MOV fragmentado escribe la grabación en fragmentos y no requiere una finalización como los archivos MOV tradicionales.\nEsto garantiza que el archivo se pueda reproducir incluso si se interrumpe la escritura en el disco, por ejemplo, como resultado de un pantallazo azul o una pérdida de energía.\n\nEsto puede no ser compatible con todos los reproductores y editores. Use Archivo → Convertir grabaciones para convertir el archivo a un formato más compatible si es necesario." @@ -1293,7 +1297,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 requiere múltiples parámetros diferentes para Audio → General → Canales" Basic.OpenPluginManager="Gestor de plugins" PluginManager="Gestor de plugins" -PluginManager.HelpText="Gestor de plugins" -PluginManager.Restart="¿Reiniciar OBS?" -PluginManager.NeedsRestart="Para aplicar estos cambios, es necesario reiniciar OBS. ¿Quieres reiniciar ahora?" +PluginManager.Restart="OBS Studio debe reiniciarse para aplicar los cambios del plugin" PluginManager.MissingPlugin="PLUGIN NO ENCONTRADO" +PluginManager.Section.Discover="Examinar" +PluginManager.Section.Manage="Instalado" +PluginManager.Section.Updates="Actualizaciones" +PluginManager.Section.Manage.Title="Administrar plugins habilitados"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/et-EE.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/et-EE.ini
Changed
@@ -23,8 +23,18 @@ Mixer="Helimikser" Browse="Sirvi" DroppedFrames="Vahele jäetud kaadreid %1 (%2%)" +Projector.Open.Program="Avatud programmi projektor" +Projector.Open.Preview="Ava eelvaateprojektor" +Projector.Open.Scene="Avatud stseeni projektor" +Projector.Open.Source="Avatud lähtekoodiga projektor" +Projector.Open.Multiview="Ava mitmikvaade" +Projector.Display="Ekraan: %1" Projector.Window="Uus aken" +Projector.Title="Projektor" +Projector.Title.Scene="Stseen: %1" +Projector.Title.Source="Allikas: %1" Projector.Title.Multiview="Mitmikvaade" +Projector.ResizeWindowToContent="Mahuta aken sisule" Clear="Eemalda" Revert="Tühista" Show="Näita" @@ -84,6 +94,7 @@ LogViewer="Logivaataja" ShowOnStartup="Kuva käivitamisel" OpenFile="Ava fail" +AddScene="Lisa stseen" AddSource="Lisa allikas" RemoveScene="Eemalda valitud stseen" RemoveSource="Eemalda valitud allikas(ad)" @@ -98,12 +109,20 @@ List="Loend" Grid="Ruudustik" Automatic="Automaatne" +ComingSoon="Varsti tulekul" PluginsFailedToLoad.Title="Plugina laadimise viga" PluginsFailedToLoad.Text="Järgmiste OBS-i pluginate laadimine ebaõnnestus:\n\n%1\nPalun uuendage või eemaldage need pluginad." AlreadyRunning.Title="OBS juba töötab" AlreadyRunning.Text="OBS on juba käivitatud! Palun välju olemasolevatest protsessidest enne kui alustad uut. Kui OBS on minimeeritud süsteemi salve, siis kontrolli kas see on seal." AlreadyRunning.LaunchAnyway="Käivita siiski" CrashHandling.Dialog.Title="OBS Studio rike tuvastatud" +CrashHandling.Labels.Text="OBS Studio ei sulgunud korralikult.\n\nKas käivitada turvarežiimis (kolmandate osapoolte pluginad, skriptimine ja WebSockets keelatud)?" +CrashHandling.Labels.PrivacyNotice="Samuti saate valida uusima krahhiaruande automaatse üleslaadimise OBSProjecti.<br /><br />Enne failide üleslaadimist lugege palun <a href='https://obsproject.com/privacy-policy'>privaatsuspoliitikat</a> ja pöörake erilist tähelepanu failide üleslaadimist puudutavatele osadele." +CrashHandling.Checkbox.SendReport="Olen lugenud privaatsuspoliitikat ja annan üleslaadimisega nõusoleku." +CrashHandling.Buttons.LaunchSafe="Käivita turvarežiimis" +CrashHandling.Buttons.LaunchNormal="Käivita tavarežiimis" +CrashHandling.Errors.UploadJSONError="Uusima krahhilogi üleslaadimisel ilmnes viga. Palun proovige hiljem uuesti." +CrashHandling.Errors.Title="Krahhi logi üleslaadimise viga" SafeMode.Restart="Kas soovid OBS-i taaskäivitada turvalises režiimis (kolmandate osapoolte pluginad, skriptid ja WebSockets on keelatud)?" SafeMode.RestartNormal="Kas soovid OBS-i taaskäivitada tavarežiimis?" ChromeOS.Title="Toetuseta platvorm" @@ -185,6 +204,7 @@ Basic.AutoConfig.TestPage.SubTitle.Testing="Programm viib nüüd läbi rea teste, et hinnata ideaalseid seadeid" Basic.AutoConfig.TestPage.SubTitle.Complete="Testimine on valmis" Basic.AutoConfig.TestPage.TestingBandwidth="Ribalaiuse testimine, mis võib võtta mõned minutid..." +Basic.AutoConfig.TestPage.TestingBandwidth.NoOutput="Selle teenuse protokolli väljundit ei leitud" Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="Ühendamine: %1..." Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="Ühegi serveriga ühenduse loomine ebaõnnestus, kontrollige oma Interneti-ühendust ja proovige uuesti." Basic.AutoConfig.TestPage.TestingBandwidth.Server="Katsetan ribalaiust ühendusele %1" @@ -218,6 +238,7 @@ Basic.Stats.MegabytesSent="Andmete koguväljund" Basic.Stats.Bitrate="Bitikiirus" Basic.Stats.DiskFullIn="Ketas täis (umbes)" +Basic.Stats.DiskFullIn.Text="%1 tundi, %2 minutit" Basic.Stats.ResetStats="Nulli näidud" ResetUIWarning.Title="Kas soovite lähestada UI valikud?" ResetUIWarning.Text="Kasutajaliidese lähtestamine peidab täiendavad dokid. Kui soovid, et need dokid oleksid nähtavad, tuleb need dokkide menüüst nähtavaks teha.\n\nKas oled kindel, et soovid kasutajaliidese lähtestamist?" @@ -259,15 +280,47 @@ Undo.Item.Undo="Võta tagasi - %1" Undo.Item.Redo="Korda uuesti - %1" Undo.Sources.Multi="Kustuta %1 andmeallikat" +Undo.Filters="Krahhi logi üleslaadimise viga" +Undo.Filters.Paste.Single="Kleebi filter '%1' filtrisse '%2'" +Undo.Filters.Paste.Multiple="Kopeeri filtrid kaustast '%1' kausta '%2'" +Undo.Transform="Teisendusallikas(ed) failis '%1'" +Undo.Transform.Paste="Kleebi teisendus faili '%1'" +Undo.Transform.Rotate="Pööramine '%1'-s" +Undo.Transform.Reset="Teisendus Lähtesta failis '%1'" +Undo.Transform.HFlip="Horisontaalne pööramine '%1'-s" +Undo.Transform.VFlip="Vertikaalne pööramine '%1'-s" +Undo.Transform.FitToScreen="Mahuta ekraanile '%1'" +Undo.Transform.StretchToScreen="Venita ekraanile '%1'" +Undo.Transform.Center="Ekraani keskele paigutamine '%1'-s" +Undo.Transform.VCenter="Vertikaalselt ekraani keskpunktiks '%1'" +Undo.Transform.HCenter="Horisontaalselt ekraani keskpunkt '%1'-s" +Undo.Volume.Change="Helitugevuse muutus '%1'-l" Undo.Volume.Mute="Summuta „%1“" Undo.Volume.Unmute="Lõpeta „%1“ summutamine" +Undo.Balance.Change="Heli tasakaalu muutus '%1'-l" +Undo.SyncOffset.Change="Heli sünkroniseerimise nihke muutus '%1'-l" +Undo.MonitoringType.Change="Muuda heli jälgimist seadmel '%1'" Undo.Mixers.Change="Muuda \"%1\"-is helimikserit" +Undo.ForceMono.On="Luba sunnitud monorežiim seadmel '%1'" +Undo.ForceMono.Off="Keela sundmono kasutamine seadmel '%1'" +Undo.Properties="Omaduse muutus '%1'-l" +Undo.Scene.Duplicate="Duplikaatstseen '%1'" +Undo.ShowTransition="Näita üleminekut lehel '%1'" +Undo.HideTransition="Peida üleminek lehel '%1'" Undo.ShowSceneItem="Näita '%1' kohas '%2'" Undo.HideSceneItem="Peida '%1' kohas '%2'" +Undo.ReorderSources="Allikate järjekorda muutmine failis '%1'" +Undo.MoveUp="Liiguta '%1' üles '%2'-s" +Undo.MoveDown="Liiguta '%1' allapoole '%2'-s" +Undo.MoveToTop="Liiguta '%1' '%2' üles" +Undo.MoveToBottom="Liiguta '%1' '%2' alla" +Undo.PasteSource="Kleebi allikas(ed) kausta '%1'" +Undo.PasteSourceRef="Kleebi allikaviide(d) kausta '%1'" Undo.GroupItems="Rühmita üksused „%1“ alusel" TransitionNameDlg.Text="Sisesta ülemineku nimi" TransitionNameDlg.Title="Ülemineku nimi" TitleBar.SafeMode="TURVAREŽIIM" +TitleBar.PortableMode="Kaasaskantav režiim" TitleBar.Profile="Profiil" TitleBar.Scenes="Stseenid" NameExists.Title="Nimi on juba kasutusel" @@ -282,8 +335,8 @@ ConfirmStopRecord.Text="Kas sa oled kindel, et soovid salvestamist peatada?" ConfirmBWTest.Title="Kas käivitada ülekandekiiruse test?" ConfirmBWTest.Text="OBS on konfigureeritud ülekandekiiruse testi režiimi. See režiim võimaldab võrgutesti sooritamist ilma, et kanalile voogedastataks. Kui test on valmis, peate režiimi välja lülitama, et vaatajad taas näeksid teie voogedastust.\n\nKas soovite jätkata?" -ConfirmExit.Title="Kas väljuda OBS-ist?" -ConfirmExit.Text="OBS on hetkel aktiivne. Kõik voogedastused ja salvestused peatatakse. Kas soovid kindlasti väljuda?" +ConfirmExit.Title="Aktiivsed väljundid" +ConfirmExit.Text="OBS on praegu veel aktiivne. Kõik voogedastused/salvestused suletakse." ConfirmRemove.Title="Ümbernimetamise kinnitamine" ConfirmRemove.Text="Kas soovid kindkasti eemaldada '%1'?" ConfirmRemove.TextMultiple="Kas soovite kindlasti eemaldada %1 üksust?" @@ -305,6 +358,7 @@ Output.ConnectFail.Disconnected="Ühendus serveriga katkestatud." Output.StreamEncodeError.Title="Kodeerimise viga" Output.StreamEncodeError.Msg="Voogedastamisel tekkis kodeerija viga." +Output.StreamEncodeError.Msg.LastError="Voogedastuse ajal ilmnes kodeerija viga:<br><br>%1" Output.RecordFail.Title="Salvestamise alustamine nurjus" Output.RecordFail.Unsupported="Väljundformaat ei ole toetatud või ei toeta rohkem kui ühte helirada. Palun kontrolli oma seadeid ja proovi uuesti." Output.RecordNoSpace.Title="Kettaruumi pole piisavalt" @@ -319,6 +373,17 @@ Output.NoBroadcast.Text="Enne voogesituse alustamist pead seadistama saate." Output.BroadcastStartFailed="Saate käivitamine ebaõnnestus" Output.BroadcastStopFailed="Saate peatamine ebaõnnestus" +LogUploadDialog.Title="OBS Studio logifaili üleslaadimine" +LogUploadDialog.Labels.PrivacyNotice="Enne failide üleslaadimist lugege palun läbi <a href='https://obsproject.com/privacy-policy'>privaatsuspoliitika</a> ja selle failide üleslaadimist käsitlev osa." +LogUploadDialog.Labels.Progress="Logi üleslaadimine on pooleli. Palun oodake..." +LogUploadDialog.Labels.Description.AppLog="Teie logifail on üles laaditud. Nüüd saate URL-i veaotsingu või toe eesmärgil jagada." +LogUploadDialog.Labels.Description.CrashLog="Teie krahhiaruanne on üles laaditud. Nüüd saate URL-i veaotsingu eesmärgil jagada." +LogUploadDialog.Buttons.ConfirmUpload="Laadi üles" +LogUploadDialog.Buttons.CopyURL="Kopeeri logi URL" +LogUploadDialog.Buttons.AnalyzeURL="Logifaili analüüsimine" +LogUploadDialog.Buttons.RetryButton="Proovi uuesti" +LogUploadDialog.Errors.Template="Faili üleslaadimisel ilmnes viga:\n\n%1" +LogUploadDialog.Errors.NoLogFile="Üleslaaditavat faili ei leitud või fail oli tühi." Remux.SourceFile="OBS-i salvestus" Remux.TargetFile="Sihtfail" Remux.Remux="Konverteeri" @@ -336,6 +401,8 @@ Remux.ExitUnfinishedTitle="Kodeerimine on pooleli" Remux.ExitUnfinished="Kodeerimine ei ole veel lõpetatud. Kui kodeerimine peatada, siis võib sihtfail olla kasutuskõlbmatu.\nKas soovid kindlasti kodeerimise peatada?" Remux.HelpText="Tooge failid sellesse aknasse konverteerimiseks või valige tühi lahter \"OBS-i salvestus\", et otsida faili." +Remux.NoFilesAddedTitle="Remux-faili pole lisatud" +Remux.NoFilesAdded="Remuxile ei lisatud ühtegi faili. Eemalda kaust, mis sisaldab ühte või mitut videofaili." MissingFiles="Puuduvad failid" MissingFiles.MissingFile="Puuduv fail" MissingFiles.NewFile="Uus fail" @@ -349,6 +416,8 @@ MissingFiles.Replaced="Asendatud" MissingFiles.Cleared="Kustutatud" MissingFiles.Found="Leitud" +MissingFiles.AutoSearch="Leiti täiendavaid failivasteid" +MissingFiles.AutoSearchText="OBS leidis selles kataloogis puuduvatele failidele täiendavaid vasteid. Kas soovite need lisada?" MissingFiles.NoMissing.Title="Puuduvate failide kontroll" MissingFiles.NoMissing.Text="Ühtegi faili ei tundu olevat puudu." MacPermissions.MenuAction="Kontrolli rakenduse õigusi..." @@ -364,8 +433,13 @@ MacPermissions.Item.Camera.Details="See luba on vajalik veebikaamera või kaamerakaardi sisu salvestamiseks." MacPermissions.Item.Microphone="Mikrofon" MacPermissions.Item.Microphone.Details="OBS nõuab seda luba, kui soovid salvestada oma mikrofoni või välist heliseadet." +MacPermissions.Item.InputMonitoring="Sisendi jälgimine" +MacPermissions.Item.InputMonitoring.Details="See luba on vajalik kiirklahvide töötamiseks, kui OBS on taustal." MacPermissions.Item.Accessibility="Juurdepääsetavus" +MacPermissions.Item.Accessibility.Details="Vanemates installatsioonides võib OBS olla loetletud jaotises „Ligipääsetavus” jaotise „Sisendi jälgimine” asemel." MacPermissions.Continue="Jätka" +SourceLeak.Title="Allika puhastamise viga" +SourceLeak.Text="Stseenikogude muutmisel ilmnes probleem ja mõnda allikat ei saanud maha laadida. Selle probleemi põhjustavad tavaliselt pluginad, mis ei vabasta ressursse õigesti. Veenduge, et kõik teie kasutatavad pluginad oleksid ajakohased.\n\nOBS Studio sulgub nüüd, et vältida võimalikku andmete riknemist." Basic.DesktopDevice1="Töölaua heli" Basic.DesktopDevice2="Töölaua heli 2" Basic.AuxDevice1="Mikrofon/Aux" @@ -396,16 +470,27 @@ Deinterlacing.Discard="Loobu" Deinterlacing.TopFieldFirst="Ülemine väli esimesena" Deinterlacing.BottomFieldFirst="Alumine väli esimesena" +VolControl.SliderUnmuted="Helitugevuse liugur '%1' jaoks:" +VolControl.SliderMuted="Helitugevuse liugur seadmele '%1': (hetkel vaigistatud)" VolControl.Mute="Summuta „%1“" VolControl.Properties="'%1' atribuudid" +VolControl.UnassignedWarning.Title="Määramata heliallikas" +VolControl.UnassignedWarning.Text="„%1” pole ühelegi helirajale määratud ja seda ei kuule voogedastustes ega salvestistes.\n\nHeliallika rajale määramiseks avage paremklõpsu menüü või mikseri doki tööriistaribal oleva hammasratta nupu kaudu täpsemad heliomadused." Basic.Main.AddSceneDlg.Title="Stseeni lisamine" Basic.Main.AddSceneDlg.Text="Sisesta stseeni nimi" Basic.Main.DefaultSceneName.Text="Stseen %1" Basic.Main.AddSceneCollection.Title="Lisada stseeni kogumik" Basic.Main.AddSceneCollection.Text="Palun sisestage stseeni kogumiku nimi" Basic.Main.RenameSceneCollection.Title="Nimeta ümber stseeni kogumik" +Basic.Main.RemigrateSceneCollection.Title="Stseenikogu resolutsiooni värskendamine" +Basic.Main.RemigrateSceneCollection.Text="Kas soovite uuendada stseenikogu \"%1\" resolutsiooni, et see vastaks praeguse profiili lõuendi resolutsioonile %2x%3?" +Basic.Main.RemigrateSceneCollection.CannotMigrate.Active="Stseenide kogu resolutsiooni ei saa värskendada, kui väljundid on aktiivsed." +Basic.Main.RemigrateSceneCollection.CannotMigrate.UnknownBaseResolution="Stseenikogu resolutsiooni uuendamine ebaõnnestus. Algne resolutsioon on teadmata." +Basic.Main.RemigrateSceneCollection.CannotMigrate.FailedVideoReset="Lähtestamine pole võimalik: OBS-i eraldusvõime muutmine ebaõnnestus." +Basic.Main.RemigrateSceneCollection.CannotMigrate.BaseResolutionMatches="Lähtestamine pole võimalik: praegune resolutsioon on juba stseenide kogu baasresolutsioon." AddProfile.Title="Profiili lisamine" AddProfile.Text="Sisesta uue profiili nimi" +AddProfile.WizardCheckbox="Kuva automaatse konfigureerimise viisard" RenameProfile.Title="Profiili ümbernimetamine" Basic.Main.MixerRename.Title="Nimeta audioallikas ringi" Basic.Main.MixerRename.Text="Palun sisesta audioallika nimi" @@ -415,19 +500,32 @@ Basic.SourceSelect.AddExisting="Lisa olemasolev" Basic.SourceSelect.AddVisible="Tee allikas nähtavaks" Basic.Main.Sources.Visibility="Nähtavus" +Basic.Main.Sources.VisibilityDescription="Juhib '%1' nähtavust lõuendil" Basic.Main.Sources.Lock="Lukusta" +Basic.Main.Sources.LockDescription="Lukustab '%1' asukoha ja skaala lõuendil" Basic.PropertiesWindow="'%1' omadused" +Basic.PropertiesWindow.AutoSelectFormat="%1 (automaatne valik: %2)" Basic.PropertiesWindow.SelectColor="Vali värv" Basic.PropertiesWindow.SelectFont="Vali font" +Basic.PropertiesWindow.SelectFont.WindowTitle="Valige font" Basic.PropertiesWindow.ConfirmTitle="Seaded muutusid" Basic.PropertiesWindow.Confirm="On salvestamata muutusi. Kas soovite neid säilitada?" Basic.PropertiesWindow.NoProperties="Atribuudid pole saadaval" Basic.PropertiesWindow.AddFiles="Lisa failid" Basic.PropertiesWindow.AddDir="Lisa kataloog" Basic.PropertiesWindow.AddURL="Lisa tee/URL" +Basic.PropertiesWindow.AddEditableListDir="Lisa kataloog sihtkohta '%1'" +Basic.PropertiesWindow.AddEditableListFiles="Lisa failid kausta '%1'" +Basic.PropertiesWindow.AddEditableListEntry="Lisa kirje kausta '%1'" +Basic.PropertiesWindow.EditEditableListEntry="Muuda kirjet allikast '%1'" Basic.PropertiesView.FPS.Simple="Lihtsad FPS väärtused" +Basic.PropertiesView.FPS.Rational="Ratsionaalsed FPS-i väärtused" +Basic.PropertiesView.FPS.ValidFPSRanges="Kehtivad FPS-vahemikud:" Basic.PropertiesView.UrlButton.Text="Ava see link oma vaikimisi veebibrauseris?" Basic.PropertiesView.UrlButton.OpenUrl="Ava URL" +Basic.InteractionWindow="Suhtlemine kasutajaga '%1'" +Basic.StatusBar.Reconnecting="Ühendus katkestatud, uuestiühendamine %2 sekundi pärast (katse %1)" +Basic.StatusBar.AttemptingReconnect="Üritatakse uuesti ühendust luua... (katse %1)" Basic.StatusBar.ReconnectSuccessful="Taasühendumine edukas" Basic.StatusBar.Delay="Viivitus (%1 s)" Basic.StatusBar.DelayStartingIn="Viivitus (algab %1 s pärast)" @@ -435,12 +533,16 @@ Basic.StatusBar.DelayStartingStoppingIn="Viivitus (lõppeb %1 s pärast, algab %2 s pärast)" Basic.StatusBar.RecordingSavedTo="Salvestus salvestati \"%1\"" Basic.StatusBar.ReplayBufferSavedTo="Salvestasin taasesituse puhvri „%1“ faili" +Basic.StatusBar.ScreenshotSavedTo="Ekraanipilt salvestatud asukohta '%1'" Basic.StatusBar.AutoRemuxedTo="Salvestus konverteeriti \"%1\"-ks automaatselt" Basic.Filters="Filtrid" Basic.Filters.AsyncFilters="Audio/Video filtrid" Basic.Filters.AudioFilters="Helifiltrid" +Basic.Filters.EffectFilters="Efektifiltrid" +Basic.Filters.Title="Filtrid '%1' jaoks" Basic.Filters.AddFilter.Title="Filtri nimi" Basic.Filters.AddFilter.Text="Palun määra filtri nimi" +Basic.TransformWindow="Stseeni elemendi teisendus" Basic.TransformWindow.Position="Asukoht" Basic.TransformWindow.PositionX="Positsioon X" Basic.TransformWindow.PositionY="Positsioon Y" @@ -471,6 +573,12 @@ Basic.TransformWindow.Alignment.BottomRight="Alla paremale" Basic.TransformWindow.BoundsType.None="Piirid määramata" Basic.TransformWindow.BoundsType.MaxOnly="Maksimaalne suurus ainult" +Basic.TransformWindow.BoundsType.ScaleInner="Skaleeri sisemiste piirideni" +Basic.TransformWindow.BoundsType.ScaleOuter="Skaleeri välispiirideni" +Basic.TransformWindow.BoundsType.ScaleToWidth="Skaleeri piiride laiuse järgi" +Basic.TransformWindow.BoundsType.ScaleToHeight="Skaala piiride kõrguse järgi" +Basic.TransformWindow.BoundsType.Stretch="Venitada piirideni" +Basic.TransformWindow.Title="Redigeeri teisendust '%1' jaoks" Basic.TransformWindow.NoSelectedSource="Ühtegi allikat ei ole valitud" Basic.Main.AddSourceHelp.Title="Allikat ei saa lisada" Basic.Main.AddSourceHelp.Text="Allika lisamiseks peab olema vähemalt üks stseen." @@ -494,8 +602,10 @@ Basic.Main.StoppingRecording="Salvestamise peatamine..." Basic.Main.StopReplayBuffer="Peata taasesituse puhver" Basic.Main.StoppingReplayBuffer="Taasesitus puhvri peatamine..." +Basic.Main.SetupBroadcast="Halda leviedastust" Basic.Main.StopStreaming="Lõpeta voogedastus" Basic.Main.StopBroadcast="Lõpeta saade" +Basic.Main.AutoStopEnabled="(Automaatne seiskamine)" Basic.Main.StoppingStreaming="Voogedastuse peatamine..." Basic.Main.ForceStopStreaming="Lõpeta voogedastus (unusta viivitus)" Basic.Main.ShowContextBar="Näita allika tööriistariba" @@ -511,6 +621,7 @@ Basic.VCam.OutputType="Väljundi tüüp" Basic.VCam.OutputSelection="Väljundi valik" Basic.VCam.OutputType.Program="Programm (vaikeseade)" +Basic.VCam.OutputSelection.NoSelection="Selle väljundtüübi jaoks pole valikut" Basic.VCam.RestartWarning="Selle muudatuse jõustamiseks virtuaalne kaamera käivitatakse uuesti" Basic.MainMenu.File="&Fail" Basic.MainMenu.File.Export="&Ekspordi" @@ -525,8 +636,19 @@ Basic.MainMenu.Edit="Muuda (&E)" Basic.MainMenu.Edit.Undo="Võta tagasi (&U)" Basic.MainMenu.Edit.LockPreview="&Lukusta eelvaade" +Basic.MainMenu.Edit.Scale="Eelvaade ja skaleerimine" +Basic.MainMenu.Edit.Scale.Window="Skaleeri akna järgi" Basic.MainMenu.Edit.Scale.Canvas="Lõuend (%1x%2)" Basic.MainMenu.Edit.Scale.Output="Väljund (%1x%2)" +Basic.MainMenu.Edit.Scale.Manual="Skaleeritud (%1x%2)" +Basic.MainMenu.Edit.Scale.ZoomIn="Suumi sisse" +Basic.MainMenu.Edit.Scale.ZoomOut="Suumi välja" +Basic.MainMenu.Edit.Scale.ResetZoom="Lähtesta suum" +Basic.MainMenu.Edit.Transform="&Teisenda" +Basic.MainMenu.Edit.Transform.EditTransform="&Muuda Teisendus" +Basic.MainMenu.Edit.Transform.CopyTransform="Kopeeri teisendus" +Basic.MainMenu.Edit.Transform.PasteTransform="Kleebi teisendus" +Basic.MainMenu.Edit.Transform.ResetTransform="&Lähtesta teisendus" Basic.MainMenu.Edit.Transform.Rotate90CW="Pööra 90 kraadi paremale" Basic.MainMenu.Edit.Transform.Rotate90CCW="Pööra 90 kraadi vasakule" Basic.MainMenu.Edit.Transform.Rotate180="Pööra 180 kraadi" @@ -545,20 +667,29 @@ Basic.MainMenu.Edit.AdvAudio="Täpsem&ad Heliatribuudid" Basic.MainMenu.View="&Vaade" Basic.MainMenu.View.Toolbars="&Tööriistaribad" +Basic.MainMenu.View.ListboxToolbars="Doki tööriistaribad" Basic.MainMenu.View.ContextBar="Allika tööriistariba" +Basic.MainMenu.View.SourceIcons="Allikas ja ikoonid" Basic.MainMenu.View.StatusBar="Olekuriba (&S)" +Basic.MainMenu.View.Fullscreen.Interface="Täisekraaniliides" Basic.MainMenu.View.ResetUI="&Lähtesta UI" Basic.MainMenu.View.AlwaysOnTop="&Alati pealmine" +Basic.MainMenu.View.SceneListMode="Stseenide loendi režiim" Basic.MainMenu.Docks="&Dokid" Basic.MainMenu.Docks.ResetDocks="&Lähtesta Docks" Basic.MainMenu.Docks.LockDocks="&Lukusta Docks" +Basic.MainMenu.Docks.SideDocks="Täiskõrgused dokid" Basic.MainMenu.Docks.CustomBrowserDocks="&Kohandatud brauseri dokid..." +Basic.MainMenu.Import="Impordi..." +Basic.MainMenu.Export="Ekspordi..." Basic.MainMenu.SceneCollection="&Stseeni kogumik" Basic.MainMenu.Profile="&Profiil" Basic.MainMenu.Profile.Import="Impordi profiil" Basic.MainMenu.Profile.Export="Ekspordi profiil" Basic.MainMenu.SceneCollection.Import="Impordi stseeni kollektsioon" Basic.MainMenu.SceneCollection.Export="Ekspordi stseeni kollektsioon" +Basic.MainMenu.SceneCollection.Remigrate="Lähtesta baasresolutsioon" +Basic.MainMenu.SceneCollection.Migrate="Määra baasresolutsioon" Basic.MainMenu.Profile.Exists="Profiil on juba olemas" Basic.MainMenu.Tools="&Tööriistad" Basic.MainMenu.Help="Abi (&H)" @@ -569,9 +700,16 @@ Basic.MainMenu.Help.Logs="&Logifailid" Basic.MainMenu.Help.Logs.ShowLogs="Näita logifaile (&S)" Basic.MainMenu.Help.Logs.UploadCurrentLog="Lae ülesse praegune logifail (&C)" +Basic.MainMenu.Help.Logs.UploadLastLog="Laadi üles &eelmine logifail" Basic.MainMenu.Help.Logs.ViewCurrentLog="&Vaata praegust logifaili" +Basic.MainMenu.Help.ReleaseNotes="Väljalaskemärkmed" Basic.MainMenu.Help.CheckForUpdates="Otsi värskendusi" Basic.MainMenu.Help.Repair="Kontrolli faili terviklikkust" +Basic.MainMenu.Help.RestartSafeMode="Taaskäivita turvarežiimis" +Basic.MainMenu.Help.RestartNormal="Taaskäivita tavarežiimis" +Basic.MainMenu.Help.CrashLogs="Krahhiaruanded" +Basic.MainMenu.Help.CrashLogs.ShowLogs="&Kuva krahhiaruanded" +Basic.MainMenu.Help.CrashLogs.UploadLastLog="Laadi üles &eelmine krahhiaruanne" Basic.MainMenu.Help.About="&Teave" Basic.Settings.ProgramRestart="Nende sätete jõustumiseks tuleb taaskäivitada programm." Basic.Settings.ConfirmTitle="Kinnita muudatused" @@ -592,6 +730,13 @@ Basic.Settings.General.WarnBeforeStoppingStream="Kinnituse kuvamine voogedastuse peatamisel" Basic.Settings.General.WarnBeforeStoppingRecord="Kinnituse kuvamine salvestuse lõpetamisel" Basic.Settings.General.Projectors="Projektorid" +Basic.Settings.General.HideProjectorCursor="Peida kursor projektorite kohale" +Basic.Settings.General.ProjectorAlwaysOnTop="Hoidke projektorid alati peal" +Basic.Settings.General.Snapping="Allika joondamise klõpsimine" +Basic.Settings.General.ScreenSnapping="Tõmba allikad ekraani serva" +Basic.Settings.General.CenterSnapping="Allikate horisontaalne ja vertikaalne keskpunkt" +Basic.Settings.General.SourceSnapping="Allikate sidumine teiste allikatega" +Basic.Settings.General.SnapDistance="Plõksutundlikkus" Basic.Settings.General.SpacingHelpers="Näita pikslite joondamisjuhiseid" Basic.Settings.General.RecordWhenStreaming="Automaatne salvestamine voogesituse ajal" Basic.Settings.General.KeepRecordingWhenStreamStops="Jätka salvestamist juhul kui voogedastus peatub" @@ -601,13 +746,20 @@ Basic.Settings.General.SysTrayWhenStarted="Minimeeri süsteemi salve käivitumisel" Basic.Settings.General.SystemTrayHideMinimize="Alati Minimeeri süsteemi salve käivitumisel, tegumiriba asemel" Basic.Settings.General.SaveProjectors="Salvesta projektorid väljumisel" +Basic.Settings.General.CloseExistingProjectors="Piirang: üks täisekraaniprojektor ekraani kohta" Basic.Settings.General.Preview="Eelvaade" +Basic.Settings.General.OverflowHidden="Peida ületäitumine" +Basic.Settings.General.OverflowAlwaysVisible="Ülevool on alati nähtav" +Basic.Settings.General.OverflowSelectionHidden="Näita ületäitumist isegi siis, kui allikas on nähtamatu" Basic.Settings.General.Importers="Importijad" +Basic.Settings.General.AutomaticCollectionSearch="Importimisel otsi stseenikogude teadaolevaid asukohti" Basic.Settings.General.SwitchOnDoubleClick="Üleminek stseenile topeltklõpsamisel" +Basic.Settings.General.StudioPortraitLayout="Luba portree-/vertikaalne paigutus" Basic.Settings.General.TogglePreviewProgramLabels="Näita eelvaate/programmi silte" Basic.Settings.General.Multiview="Mitmikvaade" Basic.Settings.General.Multiview.MouseSwitch="Klõpsa stseenide ümbervahetamiseks" Basic.Settings.General.Multiview.DrawSourceNames="Näita stseenide nimesid" +Basic.Settings.General.Multiview.DrawSafeAreas="Ohutute alade joonistamine (EBU R 95)" Basic.Settings.General.MultiviewLayout="Mitmikvaate paigutus" Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horisontaalne, Üleval (8 stseeni)" Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horisontaalne, All (8 stseeni)" @@ -643,6 +795,7 @@ Basic.Settings.Stream.Custom.Username.ToolTip="RIST: sisesta srp_username.\nRTMP: sisesta kasutajanimi.\nSRT: ei kasutata." Basic.Settings.Stream.Custom.Password.ToolTip="RIST: sisestage srp_password.\nRTMP: sisestage salasõna.\nSRT: sisestage krüpteerimise salasõna." Basic.Settings.Stream.BandwidthTestMode="Ribalaiuse testrežiimi sisselülitamine" +Basic.Settings.Stream.TTVAddon="Twitchi vestluse lisandmoodulid" Basic.Settings.Stream.TTVAddon.None="Määramata" Basic.Settings.Stream.TTVAddon.Both="BetterTTV ja FrankerFaceZ" Basic.Settings.Stream.MissingSettingAlert="Puudub voogedastuse seadistus" @@ -662,13 +815,19 @@ Basic.Settings.Stream.EnableMultitrackVideo="Luba %1" Basic.Settings.Stream.MultitrackVideoMaximumAggregateBitrate="Voogedastuse maksimaalne ribalaius" Basic.Settings.Stream.MultitrackVideoMaximumAggregateBitrateAuto="Automaatne" +Basic.Settings.Stream.MultitrackVideoMaximumVideoTracks="Maksimaalne videoradade arv" Basic.Settings.Stream.MultitrackVideoMaximumVideoTracksAuto="Automaatne" +Basic.Settings.Stream.MultitrackVideoStreamDumpEnable="Luba voogesituse teisendamine FLV-vormingusse (kasutab lihtsaid salvestusfaili seadeid)" +Basic.Settings.Stream.MultitrackVideoConfigOverride="Konfiguratsiooni tühistamine (JSON)" +Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Luba konfiguratsiooni tühistamine" +Basic.Settings.Stream.MultitrackVideoLabel="Mitmekanaliline video" +Basic.Settings.Stream.MultitrackVideoExtraCanvas="Lisalõuend" Basic.Settings.Stream.AdvancedOptions="Täpsemad valikud" Basic.Settings.Output="Väljund" Basic.Settings.Output.Format="Salvestusvorming" Basic.Settings.Output.Format.MKV="Matroska videoformaat (.mkv)" -Basic.Settings.Output.Format.hMP4="Hübriid MP4 BETA (.mp4)" -Basic.Settings.Output.Format.hMOV="Hübriid MOV BETA (.mov)" +Basic.Settings.Output.Format.hMP4="Hübriid MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="Hübriid-MOV (.mov)" Basic.Settings.Output.Format.fMP4="Killustatud MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="KIllustatud MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="Killustatud MOV kirjutab salvestuse tükkidena ja ei nõua samasugust lõplikku töötlemist nagu traditsioonilised MOV-failid.\nSee tagab, et fail jääb mängitavaks isegi siis, kui kirjutamine kettale katkestatakse, näiteks BSOD-i või voolukatkestuse tõttu.\n\nSee ei pruugi ühilduda kõigi mängijate ja redaktoritega. Vajaduse korral kasutage faili teisendamiseks ühilduvamasse vormingusse Fail → Konverteeri salvestusi." @@ -676,6 +835,8 @@ Basic.Settings.Output.Encoder.Video="Video kodeerija" Basic.Settings.Output.Encoder.Audio="Heli kodeerija" Basic.Settings.Output.SelectDirectory="Vali salvestuskaust" +Basic.Settings.Output.DynamicBitrate="Muutke dünaamiliselt bitikiirust ummikute haldamiseks" +Basic.Settings.Output.DynamicBitrate.Beta="Bitikiiruse dünaamiline muutmine ummikute haldamiseks (beetaversioon)" Basic.Settings.Output.DynamicBitrate.TT="Selle asemel, et vähendada ülekoormust, muudetakse bitikiirust dünaamiliselt.\n\nPane tähele, et see võib suurendada viivitust vaatajate jaoks, kui tekib märkimisväärne äkiline ülekoormus.\nBitikiiruse languse korral võib selle taastamine võtta kuni paar minutit.\n\n Praegu on toetatud ainult RTMP." Basic.Settings.Output.Mode="Väljundrežiim" Basic.Settings.Output.Mode.Simple="Lihtne" @@ -699,6 +860,7 @@ Basic.Settings.Output.Simple.Warn.VideoBitrate="Hoiatus: Video voogedastuse bitikiiruseks määratakse %1, mis on praeguse voogedastusteenuse ülempiir." Basic.Settings.Output.Simple.Warn.AudioBitrate="Hoiatus: Audio voogedastuse bitikiiruseks määratakse %1, mis on praeguse voogedastusteenuse ülempiir." Basic.Settings.Output.Simple.Warn.CannotPause="Hoiatus: Salvestusi ei saa peatada, kui salvestuskvaliteediks on seatud \"Sama nagu voogedastus\"." +Basic.Settings.Output.Simple.Warn.IncompatibleContainer="Hoiatus: Praegu valitud salvestusvorming ei ühildu valitud voogesituse kodeerija(te)ga." Basic.Settings.Output.Simple.Warn.Encoder="Hoiatus: Salvestamine tarkvara-kodeerijaga teistsuguse kvaliteediga kui voogedastus nõuab täiendavat protsessori kasutamist, kui te voogedastate ja salvestate samal ajal." Basic.Settings.Output.Simple.Warn.Lossless="Hoiatus. Kadudeta kvaliteet tekitab tohutult suuri failimahtusid! Kadudeta kvaliteet võib kasutada kuni 7 gigabaiti kettaruumi minutis kõrge eraldusvõime ja kaadrisageduse korral. Kadudeta kvaliteet ei ole soovitatav pikkade salvestuste jaoks, kui teil ei ole väga palju kettaruumi. Kadudeta kvaliteedi kasutamisel ei ole taasesituse puhver saadaval." Basic.Settings.Output.Simple.Warn.Lossless.Msg="Kas soovite kindlasti kasutada kadudeta kvaliteeti?" @@ -716,15 +878,19 @@ Basic.Settings.Output.Simple.Encoder.Hardware.Apple.HEVC="Riistvara (Apple, HEVC)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Tarkvara (x264 madal CPU kasutus, suurendab faili suurust)" Basic.Settings.Output.Simple.Codec.AAC.Default="AAC (vaikeseade)" +Basic.Settings.Output.Simple.TwitchVodTrack="Twitchi VOD-lugu (kasutab 2. lugu)" Basic.Settings.Output.Simple.RecAudioTrack="Helirada" Basic.Settings.Output.Warn.EnforceResolutionFPS.Title="Ühildumatu eraldusvõime/kaadrisagedus" Basic.Settings.Output.Warn.EnforceResolutionFPS.Msg="See voogedastusteenus ei toeta teie praegust väljundresolutsiooni ja/või kaadrisagedust. Need muudetakse lähima ühilduva väärtusega:\n\n%1\n\n\nKas soovid jätkata?" Basic.Settings.Output.Warn.EnforceResolutionFPS.Resolution="Eraldusvõime: %1" Basic.Settings.Output.Warn.ServiceCodecCompatibility.Title="Ühildamatu kodeerija" Basic.Settings.Output.Warn.ServiceCodecCompatibility.Msg="Voogedastusteenus \"%1\" ei toeta kodeerijat \"%2\". Kodeerija vahetatakse \"%3\" vastu.\n\nKas soovid jätkata?" +Basic.Settings.Output.Warn.ServiceCodecCompatibility.Msg2="Voogedastusteenus \"%1\" ei toeta kodeerijaid \"%2\" ja \"%3\". Need kodeerijad muudetakse \"%4\" ja \"%5\"-ks.\n\nKas soovite jätkata?" Basic.Settings.Output.VideoBitrate="Video bitikiirus" Basic.Settings.Output.AudioBitrate="Audio bitikiirus" Basic.Settings.Output.Reconnect="Taasühendu automaatselt" +Basic.Settings.Output.RetryDelay="Uuesti proovimise viivitus" +Basic.Settings.Output.MaxRetries="Maksimaalne uuesti proovimiste arv" Basic.Settings.Output.Advanced="Luba kohandatud kodeeringu seaded (Täpsemad)" Basic.Settings.Output.EncoderPreset="Kodeerija eelseadistus" Basic.Settings.Output.EncoderPreset.ultrafast="%1 (madal protsessorikasutus, madalaim kvaliteet)" @@ -733,6 +899,7 @@ Basic.Settings.Output.CustomEncoderSettings="Kodeerija kohandatud seaded" Basic.Settings.Output.CustomMuxerSettings="Multiplekseri kohandatud seaded" Basic.Settings.Output.NoSpaceFileName="Ära kasuta failinimes tühikuid" +Basic.Settings.Output.Adv.Rescale="Väljundi ümberskaleerimine" Basic.Settings.Output.Adv.Rescale.Disabled="Välja lülitatud" Basic.Settings.Output.Adv.AudioTrack="Helirada" Basic.Settings.Output.Adv.Streaming="Voogedastus" @@ -743,6 +910,7 @@ Basic.Settings.Output.Adv.Audio.Track4="Rada 4" Basic.Settings.Output.Adv.Audio.Track5="Rada 5" Basic.Settings.Output.Adv.Audio.Track6="Rada 6" +Basic.Settings.Output.Adv.TwitchVodTrack="Twitchi VOD-lugu" Basic.Settings.Output.Adv.Encoder="Kodeerija seaded" Basic.Settings.Output.Adv.Recording="Salvestus" Basic.Settings.Output.Adv.Recording.Settings="Salvestuse seaded" @@ -753,6 +921,7 @@ Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Kasuta voogedastuse kodeerijat)" Basic.Settings.Output.Adv.Recording.Filename="Failinime vorming" Basic.Settings.Output.Adv.Recording.OverwriteIfExists="Kirjuta üle, kui fail on olemas" +Basic.Settings.Output.Adv.FFmpeg.CustomModeWarning="Kohandatud väljundit (FFmpeg) ei pakuta ilma turvameetmeteta.\nKaaluge salvestustüübi „Standard” kasutamist." Basic.Settings.Output.Adv.FFmpeg.Type="FFmpeg väljundi tüüp" Basic.Settings.Output.Adv.FFmpeg.Type.URL="Kirjuta URL-ile" Basic.Settings.Output.Adv.FFmpeg.Type.RecordToFile="Kirjuta faili" @@ -780,6 +949,8 @@ Basic.Settings.Output.SplitFile.TypeManual="Tükelda ainult käsitsi" Basic.Settings.Output.SplitFile.Time="Tüki aeg" Basic.Settings.Output.SplitFile.Size="Tüki suurus" +Screenshot="Ekraanipildi väljund" +Screenshot.SourceHotkey="Valitud allika ekraanipilt" Screenshot.StudioProgram="Ekraanipilt (Programm)" Screenshot.Preview="Ekraanipilt (Eelvaade)" Screenshot.Scene="Ekraanipilt (Stseen)" @@ -806,24 +977,43 @@ FilenameFormatting.TT.S="Sekund (00-59)" FilenameFormatting.TT.y="Aasta, viimased kaks numbrit (00-99)" FilenameFormatting.TT.Y="Aasta" +FilenameFormatting.TT.z="ISO 8601 nihe UTC-st ajavööndis" +FilenameFormatting.TT.Z="Ajavööndi nimi või lühend" FilenameFormatting.TT.FPS="Kaadrit sekundis" FilenameFormatting.TT.CRES="Alus (lõuendi) resolutsioon" +FilenameFormatting.TT.ORES="Väljundi (skaleeritud) eraldusvõime" FilenameFormatting.TT.VF="Videovorming" Basic.Settings.Video.Adapter="Kuvaadapter" Basic.Settings.Video.BaseResolution="Alus (lõuendi) resolutsioon" +Basic.Settings.Video.ScaledResolution="Väljundresolutsioon (skaleeritud)" +Basic.Settings.Video.DownscaleFilter="Allaskaleerimise filter" +Basic.Settings.Video.DownscaleFilter.Unavailable="Resolutsioonid sobivad, vähendamist pole vaja" +Basic.Settings.Video.FPSCommon="Levinud FPS-i väärtused" +Basic.Settings.Video.FPSInteger="Täisarvuline FPS-väärtus" +Basic.Settings.Video.FPSFraction="Murdosaline FPS-i väärtus" Basic.Settings.Video.Numerator="Lugeja" Basic.Settings.Video.Denominator="Nimetaja" Basic.Settings.Video.Renderer="Renderdaja" +Basic.Settings.Video.Renderer.Experimental="%1 (Katseversioon)" Basic.Settings.Video.InvalidResolution="Eraldusvõime ei sobi. See peab olema kujul widthxheight (nt 1920x1080)" Basic.Settings.Video.CurrentlyActive="Videoväljund on praegu aktiivne. Videoseadete muutmiseks lülitage kõik väljundid välja." +Basic.Settings.Video.DownscaleFilter.Bilinear="Bilineaarne (kiireim, aga skaleerimisel udune)" +Basic.Settings.Video.DownscaleFilter.Bicubic="Bikuubiline (teritatud skaleering, 16 sämplit)" +Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (teritatud skaleering, 36 sämplit)" +Basic.Settings.Video.DownscaleFilter.Area="Pindala (kaalutud summa, 4/6/9 valimit)" Basic.Settings.Audio="Heli" Basic.Settings.Audio.SampleRate="Diskreetimissagedus" Basic.Settings.Audio.Channels="Kanalid" Basic.Settings.Audio.Meters="Meetrit" +Basic.Settings.Audio.MeterDecayRate="Lagunemiskiirus" Basic.Settings.Audio.MeterDecayRate.Fast="Kiire" Basic.Settings.Audio.MeterDecayRate.Medium="Keskmine (tüüp I PPM)" Basic.Settings.Audio.MeterDecayRate.Slow="Aeglane (tüüp II PPM)" +Basic.Settings.Audio.PeakMeterType="Tippmõõturi tüüp" +Basic.Settings.Audio.PeakMeterType.SamplePeak="Proovi tipp" +Basic.Settings.Audio.PeakMeterType.TruePeak="Tõeline tippkoormus (kõrgem protsessori kasutus)" Basic.Settings.Audio.MultichannelWarning.Enabled="HOIATUS: ruumiline heli on sisse lülitatud." +Basic.Settings.Audio.MultichannelWarning="Striimimise korral kontrollige, kas teie voogedastusteenus toetab nii ruumilise heli edastamist kui ka taasesitamist. Näiteks Facebook 360 Live toetab täielikult ruumilise heli edastamist; YouTube Live toetab 5.1 heli edastamist (ja taasesitamist telerites).\n\nOBS-i helifiltrid ühilduvad ruumilise heliga, kuigi VST-pluginate tuge ei garanteerita." Basic.Settings.Audio.MultichannelWarning.Title="Luba ruumiline heli?" Basic.Settings.Audio.MultichannelWarning.Confirm="Kas oled kindel, et soovid lubada ruumilise heli kasutamist?" Basic.Settings.Audio.Devices="Globaalsed audioseadmed" @@ -833,6 +1023,10 @@ Basic.Settings.Audio.AuxDevice2="Mikrofon/Lisaheli 2" Basic.Settings.Audio.AuxDevice3="Mikrofon/Lisaheli 3" Basic.Settings.Audio.AuxDevice4="Mikrofon/Lisaheli 4" +Basic.Settings.Audio.EnablePushToMute="Vaigistamise vajutamise lubamine" +Basic.Settings.Audio.PushToMuteDelay="Vaigistamiseks vajutamise viivitus" +Basic.Settings.Audio.EnablePushToTalk="Luba raadiosaatja funktsioon" +Basic.Settings.Audio.PushToTalkDelay="Push-to-talk viivitus" Basic.Settings.Audio.UnknownAudioDevice="Seade ühendamata või pole saadaval" Basic.Settings.Audio.Disabled="Välja lülitatud" Basic.Settings.Audio.LowLatencyBufferingMode="Madala viivitusega audiopuhvri režiim (Decklink/NDI väljundite jaoks)" @@ -881,26 +1075,48 @@ Basic.Settings.Advanced.Video.ColorRange.Full="Täielik" Basic.Settings.Advanced.Video.SdrWhiteLevel="SDR-i valge värvi tase" Basic.Settings.Advanced.Video.HdrNominalPeakLevel="HDR-i nominaalne tipptase" +Basic.Settings.Advanced.Audio.MonitoringDevice="Jälgimisseade" Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Vaikeseade" +Basic.Settings.Advanced.Audio.DisableAudioDucking="Keela Windowsi heli vaigistamine" Basic.Settings.Advanced.StreamDelay="Voogedastuse Viivitus" Basic.Settings.Advanced.StreamDelay.Duration="Kestus" +Basic.Settings.Advanced.StreamDelay.Preserve="Säilita katkestuspunkt (suurenda viivitust uuesti ühendamisel)" Basic.Settings.Advanced.StreamDelay.MemoryUsage="Hinnanguline mälu hõivatus: %1 MB" Basic.Settings.Advanced.Network="Võrk" Basic.Settings.Advanced.Network.Disabled="Hetkel valitud voogedastusprotokoll ei toeta võrguseadete muutmist." +Basic.Settings.Advanced.Network.BindToIP="IP-aadressiga sidumine" +Basic.Settings.Advanced.Network.IPFamily="IP-perekond" Basic.Settings.Advanced.Network.EnableNewSocketLoop="Luba võrgu optimeerimine" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Luba TCP tempo" Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Püüab muuta RTMP väljundit sõbralikumaks teistele võrgu viivitusetundlikele rakendustele, reguleerides edastamiskiirust.\nSee võib suurendada ebastabiilsete ühenduste puhul kaadrite kadumise ohtu." +Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Kiirklahvide fookuse käitumine" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Ärge kunagi keela kiirklahvide kasutamist" +Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Keela kiirklahvid, kui peaaken on fookuses" +Basic.Settings.Advanced.Hotkeys.DisableHotkeysOutOfFocus="Keela kiirklahvid, kui peaaken pole fookuses" Basic.Settings.Advanced.AutoRemux="Konverteeri %1-ks automaatselt" Basic.Settings.Advanced.AutoRemux.MP4="(salvesta mkv'na)" Basic.AdvAudio="Täpsemad heliatribuudid" +Basic.AdvAudio.ActiveOnly="Ainult aktiivsed allikad" Basic.AdvAudio.Name="Nimi" Basic.AdvAudio.Volume="Heli" +Basic.AdvAudio.VolumeSource="Helitugevus '%1' jaoks" +Basic.AdvAudio.MonoSource="Mono allamiksimine failile '%1'" Basic.AdvAudio.Balance="Tasakaal" +Basic.AdvAudio.BalanceSource="Saldo summale '%1'" +Basic.AdvAudio.SyncOffset="Sünkroniseerimise nihe" +Basic.AdvAudio.SyncOffsetSource="Sünkroniseerimise nihe '%1' jaoks" +Basic.AdvAudio.Monitoring="Heli jälgimine" Basic.AdvAudio.Monitoring.None="Välja lülitatud" +Basic.AdvAudio.Monitoring.MonitorOnly="Ainult monitor (vaigistatud väljund)" +Basic.AdvAudio.Monitoring.Both="Monitor ja väljund" +Basic.AdvAudio.MonitoringSource="Heli jälgimine '%1' jaoks" Basic.AdvAudio.AudioTracks="Rajad" Basic.Settings.Hotkeys="Kiirklahvid" +Basic.Settings.Hotkeys.Pair="'%1'-ga jagatud klahvikombinatsioonid toimivad lülititena" +Basic.Settings.Hotkeys.FilterByHotkey="Filtreeri kiirklahvi järgi" Basic.Settings.Hotkeys.DuplicateWarning="See kiirklahv on jagatud ühe või mitme teise toiminguga, klõpsake, et näidata konflikte" Basic.Settings.Hotkeys.PleaseWait="Kiirklahvide laadimine, palun oota..." +Basic.Hotkeys.SelectScene="Lülitu stseenile" Basic.SystemTray.Show="Näita" Basic.SystemTray.Hide="Peida" Basic.SystemTray.Message.Reconnecting="Ühendus katkestatud. Uuesti ühendamine..." @@ -915,15 +1131,27 @@ Hotkeys.Down="Alla" Hotkeys.Menu="Menüü" Hotkeys.Space="Tühik" +Hotkeys.NumpadNum="Numbriklaviatuur %1" +Hotkeys.NumpadMultiply="Numbriklahvistiku korrutamine" +Hotkeys.NumpadDivide="Numbriklahvistiku jagamine" +Hotkeys.NumpadAdd="Numbriklahvistiku lisamine" +Hotkeys.NumpadSubtract="Numbriklahvistiku lahutamine" +Hotkeys.NumpadDecimal="Numbriklaviatuuri kümnendsüsteemis" +Hotkeys.AppleKeypadEqual="= (Klaviatuur)" Hotkeys.MouseButton="Hiir %1" Mute="Summuta" Unmute="Lõpeta summutamine" Push-to-mute="Vajuta ja vaigista" Push-to-talk="Vajuta ja räägi" SceneItemShow="Näita „%1“" +SceneItemHide="Peida '%1'" OutputWarnings.NoTracksSelected="Pead valima vähemalt ühe raja" +OutputWarnings.NoTracksSelectedOnExit.Title="Väljundseadete viga" +OutputWarnings.NoTracksSelectedOnExit.Text="Kõigil väljunditel peab olema valitud vähemalt üks heliriba." OutputWarnings.MP4Recording="Hoiatus: MP4/MOV-i salvestusi ei saa taastada, kui faili ei saa lõplikult vormistada (nt BSOD-i, voolukatkestuse jms tõttu). Kui soovid salvestada mitu helirada, kaalu MKV kasutamist ja salvestuse konverteerimist MP4/MOV-i pärast selle lõpetamist (Fail → Konverteeri salvestusi)." OutputWarnings.CannotPause="Hoiatus: Salvestusi ei saa peatada, kui salvestuse kodeerija on seadistatud \"(Kasuta voogedastuse kodeerijat)\"" +OutputWarnings.CodecIncompatible="Heli- või videokooderi valik lähtestati ühildumatuse tõttu. Palun valige loendist ühilduv kodeerija." +CodecCompat.Incompatible="(Ei ühildu %1-ga)" CodecCompat.CodecPlaceholder="Vali kodeerija..." CodecCompat.ContainerPlaceholder="Vali vorming..." CodecCompat.CodecMissingOnExit.Title="Kodeerija on valimata" @@ -934,12 +1162,14 @@ FinalScene.Text="Vähemalt üks stseen on vajalik." NoSources.Title="Pole Allikaid" NoSources.Text="Paistab, et sa ei ole veel ühtegi videoallikat lisanud, nii et sa väljastad ainult tühja ekraani. Kas oled kindel, et soovid seda teha?" +NoSources.Text.AddSource="The audio or video encoder selection was reset due to incompatibility. Please select a compatible encoder from the list." NoSources.Label="Sul ei ole ühtegi allikat.\nKlõpsa alloleval + nupul,\nvõi paremklõpsa siin, et lisada üks." ChangeBG="Vali värv" CustomColor="Kohandatud värv" BrowserSource.EnableHardwareAcceleration="Brauseri allika riistvarakiirenduse lubamine" About="Teave" About.Info="OBS Studio on tasuta ja avatud lähtekoodiga video salvestamise ja otseülekande tarkvara." +About.Donate="Tee panus" About.GetInvolved="Võta osa" About.Authors="Autorid" About.License="Litsents" @@ -951,16 +1181,33 @@ ResizeOutputSizeOfSource.Text="Baasi ja väljundi eraldusvõimed muutuvad vastavalt praeguse allika suurusele." ResizeOutputSizeOfSource.Continue="Kas soovid jätkata?" PreviewTransition="Ülemineku eelvaade" +Importer="Stseenide kogu importimine" +Importer.SelectCollection="Valige stseenide kogu" Importer.Collection="Stseenide kollektsioon" Importer.HelpText="Lisa sellesse aknasse faile, et importida kollektsioone OBSist või teistest toetatud programmidest." +Importer.Path="Kogumistee" Importer.Program="Tuvastatud rakendused" +Importer.AutomaticCollectionPrompt="Stseenikogude automaatne otsimine" Importer.AutomaticCollectionText="OBS suudab automaatselt leida imporditavad stseenikogumid toetatud kolmandate osapoolte programmidest. Kas soovid, et OBS leiaks sinu eest automaatselt kollektsioone?\n\nSeda saad hiljem muuta jaotises Seaded > Üldine > Importijad." +Importer.SelectFile="Sirvi..." Restart="Taaskäivita" +NeedsRestart="OBS Studio vajab taaskäivitamist. Kas soovite kohe taaskäivitada?" LoadProfileNeedsRestart="Profiil sisaldab seadeid, mis nõuavad OBS-i taaskäivitamist:\n%1\n\nKas soovid OBS-i taaskäivitada, et need seaded jõustuksid?" +ContextBar.NoSelectedSource="Allikat pole valitud" ContextBar.MediaControls.PlayMedia="Käivita media" ContextBar.MediaControls.PauseMedia="Peata meedia" ContextBar.MediaControls.StopMedia="Lõpeta meedia" ContextBar.MediaControls.RestartMedia="Taaskäivita meedia" +ContextBar.MediaControls.PlaylistNext="Järgmine esitusloendis" +ContextBar.MediaControls.PlaylistPrevious="Eelmine esitusloendis" +ContextBar.MediaControls.BlindSeek="Meediaotsingu vidin" +YouTube.Auth.Ok="Autoriseerimine edukalt lõpule viidud.\nNüüd saate selle lehe sulgeda." +YouTube.Auth.NoCode="Autoriseerimisprotsessi ei viidud lõpule." +YouTube.Auth.NoChannels="Valitud kontol pole kanalit saadaval" +YouTube.Auth.WaitingAuth.Title="YouTube'i kasutaja autoriseerimine" +YouTube.Auth.WaitingAuth.Text="Palun viige autoriseerimine lõpule oma välises brauseris.<br>Kui väline brauser ei avane, klõpsake sellel lingil ja viige autoriseerimine lõpule:<br>%1" +YouTube.AuthError.Text="Kanaliteabe hankimine ebaõnnestus: %1." +YouTube.Actions.WindowTitle="Kanaliteabe hankimine ebaõnnestus: %1." YouTube.Actions.CreateNewEvent="Alusta uut otseülekannet" YouTube.Actions.ChooseEvent="Vali olemasolev otseülekannet" YouTube.Actions.Title="Pealkiri*" @@ -985,6 +1232,7 @@ YouTube.Actions.Latency.UltraLow="Ülimadal" YouTube.Actions.EnableAutoStart="Luba automaatne-sisselülitamine" YouTube.Actions.EnableAutoStop="Luba automaatne-väljalülitamine" +YouTube.Actions.AutoStartStop.TT="Näitab, kas see ajastatud ülekanne peaks algama automaatselt" YouTube.Actions.EnableDVR="Luba DVR" YouTube.Actions.ScheduleForLater="Ajasta hilisemaks" YouTube.Actions.RememberSettings="Jäta need seaded meelde" @@ -995,13 +1243,69 @@ YouTube.Actions.Create_Schedule="Ajasta saade" YouTube.Actions.Create_Schedule_Ready="Ajasta ja vali saade" YouTube.Actions.Dashboard="Ava YouTube Studio" +YouTube.Actions.Error.Title="Otseülekande loomise viga" YouTube.Actions.Error.Text="YouTube'i juurdepääsuviga \"%1\".<br/>Täpne veakirjeldus on leitav aadressil <a href='https://developers.google.com/youtube/v3/live/docs/errors'>https://developers.google.com/youtube/v3/live/docs/errors</a>" +YouTube.Actions.Error.General="YouTube'i juurdepääsu viga. Palun kontrollige oma võrguühendust või YouTube'i serveri juurdepääsu." YouTube.Actions.Error.NoBroadcastCreated="Saate loomise viga \"%1\".<br/>Täpne veakirjeldus on leitav aadressil <a href='https://developers.google.com/youtube/v3/live/docs/errors'>https://developers.google.com/youtube/v3/live/docs/errors</a>" +YouTube.Actions.Error.NoStreamCreated="Otseülekannet ei loodud. Palun linkige oma konto uuesti." +YouTube.Actions.Error.YouTubeApi="YouTube'i API viga. Lisateabe saamiseks vaadake logifaili." +YouTube.Actions.Error.BroadcastNotFound="Valitud saadet ei leitud." YouTube.Actions.Error.FileMissing="Valitud fail ei eksisteeri." YouTube.Actions.Error.FileOpeningFailed="Valitud faili avamine ei õnnestunud." +YouTube.Actions.Error.FileTooLarge="Valitud fail on liiga suur (piirang: 2 MiB)." +YouTube.Actions.Error.BroadcastTransitionFailed="Saate üleminek ebaõnnestus: %1<br/><br/>Kui see viga püsib, <a href='https://studio.youtube.com/video/%2/livestreaming'>avage saate YouTube Studios</a> ja proovige käsitsi." +YouTube.Actions.Error.BroadcastTestStarting="Saade läheb üle testimisfaasi, see võib võtta veidi aega. Palun proovige uuesti 10–30 sekundi pärast." +YouTube.Actions.EventsLoading="Sündmuste loendi laadimine..." +YouTube.Actions.EventCreated.Title="Sündmus loodud" +YouTube.Actions.EventCreated.Text="Sündmus edukalt loodud." YouTube.Actions.Stream="Voogedastus" +YouTube.Actions.Stream.ScheduledFor="Ajastatud %1 jaoks" +YouTube.Actions.Stream.Resume="Jätka katkenud otseülekannet" +YouTube.Actions.Stream.YTStudio="YouTube Studio loodud automaatselt" +YouTube.Actions.Notify.CreatingBroadcast="Uue otseülekande loomine, palun oodake..." YouTube.Actions.AutoStartStreamingWarning.Title="Manuaalne käivitamine vajalik" YouTube.Actions.AutoStartStreamingWarning="Automaatne käivitamine on selle sündmuse puhul välja lülitatud, klõpsa \"Käivita otseülekanne\", et alustada ülekannet." YouTube.Actions.AutoStopStreamingWarning="Sa ei saa uuesti ühendust luua.<br>Sinu voogedastus seiskub ja sa ei ole enam otseülekandes." +YouTube.Errors.liveStreamingNotEnabled="Valitud YouTube'i kanalil pole otseülekanne lubatud.<br/><br/>Lisateavet leiate aadressilt <a href='https://www.youtube.com/features'>youtube.com/features</a>." +YouTube.Errors.livePermissionBlocked="Valitud YouTube'i kanalil pole otseülekanne saadaval.<br/>Pange tähele, et pärast otseülekande lubamist kanali seadetes võib selle kättesaadavaks muutumine võtta kuni 24 tundi.<br/><br/>Lisateavet leiate aadressilt <a href='https://www.youtube.com/features'>youtube.com/features</a>." YouTube.Errors.errorExecutingTransition="Üleminek ebaõnnestus backend-vea tõttu. Palun proovi mõne sekundi pärast uuesti." +YouTube.Errors.errorStreamInactive="YouTube ei saa teie otseülekande andmeid kätte. Palun kontrollige oma konfiguratsiooni ja proovige uuesti." +YouTube.Errors.invalidTransition="Üritatud üleminek oli kehtetu. See võib olla tingitud sellest, et voog pole eelmist üleminekut lõpetanud. Palun oota paar sekundit ja proovi uuesti." +YouTube.DocksRemoval.Title="Tühjenda YouTube'i brauseri dokid" +YouTube.DocksRemoval.Text="Need brauseri dokid eemaldatakse aegunud tugi tõttu:\n\n%1\nKasutage selle asemel valikut „Docks/YouTube Live Control Room”." ConfigDownload.WarningMessageTitle="Hoiatus" +FailedToStartStream.MissingConfigURL="Praeguse teenuse jaoks pole konfiguratsiooni URL-i saadaval" +FailedToStartStream.NoCustomRTMPURLInSettings="Kohandatud RTMP URL-i pole määratud" +FailedToStartStream.InvalidCustomConfig="Kehtetu kohandatud konfiguratsioon" +FailedToStartStream.MissingCanvas="Konfigureeritud lisalõuend puudub" +FailedToStartStream.FailedToCreateMultitrackVideoService="Mitmekanalilise videoteenuse loomine ebaõnnestus" +FailedToStartStream.FailedToCreateMultitrackVideoOutput="Mitmekanalilise video RTMP väljundi loomine ebaõnnestus" +FailedToStartStream.EncoderNotAvailable="NVENC pole saadaval.\in\Kodeerija tüübi '%1' leidmine ebaõnnestus." +FailedToStartStream.FailedToCreateVideoEncoder="Videokooderi '%1' loomine ebaõnnestus (tüüp: '%2')" +FailedToStartStream.FailedToGetOBSVideoInfo="OBS-video info hankimine kodeerija '%1' loomisel ebaõnnestus (tüüp: '%2')" +FailedToStartStream.FailedToCreateAudioEncoder="Helikooderi loomine ebaõnnestus" +FailedToStartStream.FallbackToDefault="Voo käivitamine %1 abil nurjus; kas soovite uuesti proovida ühe kodeerimise sätetega?" +FailedToStartStream.ConfigRequestFailed="Konfiguratsiooni %1-lt ei õnnestunud tuua<br><br>HTTP-viga: %2" +FailedToStartStream.WarningUnknownStatus="Saadi tundmatu olekuväärtus '%1'" +FailedToStartStream.WarningRetryNonMultitrackVideo="\n<br><br>\nKas soovite voogesitust jätkata ilma %1-ta?" +FailedToStartStream.WarningRetry="\n<br><br>\nKas soovite voogedastust jätkata?" +FailedToStartStream.MissingEncoderConfigs="Avaldamise konfiguratsioon ei sisaldanud kodeerija konfiguratsioone" +FailedToStartStream.InvalidEncoderConfig="Avaldamise konfiguratsioon sisaldas sobimatut kodeerija konfiguratsiooni" +FailedToStartStream.StatusMissingHTML="Avaldamise taotlus tagastas määratlemata vea" +FailedToStartStream.NoConfigSupplied="Puuduv konfiguratsioon" +MultitrackVideo.Info="%1 optimeerib automaatselt teie seadeid mitme videokvaliteedi kodeerimiseks ja saatmiseks. Selle valiku valimine saadab %2 teavet teie arvuti ja tarkvara seadistuse kohta." +MultitrackVideo.IncompatibleSettings.Title="Ühildamatud sätted" +MultitrackVideo.IncompatibleSettings.Text="%1 ei ühildu hetkel järgmisega:\n\n%2\nVoogedastuse jätkamiseks %1-ga keelake ühildumatud sätted:\n\n%3\nja alustage voogedastust uuesti." +MultitrackVideo.IncompatibleSettings.DisableAndStartStreaming="Keela selle voo jaoks ja alusta voogesitust" +MultitrackVideo.IncompatibleSettings.UpdateAndStartStreaming="Värskenda seadeid ja alusta voogedastust" +MultitrackVideo.IncompatibleSettings.AudioChannels="%1 ei ole hetkel ühilduv Heli → Üldine → Kanalid seadistusega '%2', %3" +MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="Heli → Üldine → Kanalid peab olema seatud väärtusele '%1'" +MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 nõuab Heli → Üldine → Kanalid jaoks mitut erinevat seadet." +Basic.OpenPluginManager="Pluginate haldur" +PluginManager="Pluginate haldur" +PluginManager.Restart="Pluginate muudatuste rakendamiseks tuleb OBS Studio taaskäivitada" +PluginManager.MissingPlugin="Plugini ei leitud" +PluginManager.Section.Discover="Sirvi" +PluginManager.Section.Manage="Paigaldatud" +PluginManager.Section.Updates="Värskendused" +PluginManager.Section.Manage.Title="Halda lubatud pluginaid"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/eu-ES.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/eu-ES.ini
Changed
@@ -111,11 +111,20 @@ List="Zerrenda" Grid="Sareta" Automatic="Automatikoa" +ComingSoon="Laster gurekin" PluginsFailedToLoad.Title="Plugin-a kargatzeko errorea" PluginsFailedToLoad.Text="OBS plugin hauek ezin izan dira kargatu:\n\n%1\nMesedez, eguneratu edo kendu plugin hauek." AlreadyRunning.Title="OBS dagoeneko martxan dago" AlreadyRunning.Text="OBS dagoeneko martxan dago! Bestelakorik nahi ez baduzu Itxi irekita dagoen saioa beste saio bat ireki baino lehen. Ezarri baduzu OBS agertzea minimizatua sistemaren erretiluan begiratu eta oraindik exekutatzen ari den bertan." AlreadyRunning.LaunchAnyway="Abiarazi hala ere" +CrashHandling.Dialog.Title="OBS Studioren hutsegitea detektatu da" +CrashHandling.Labels.Text="OBS Studiok ez da behar bezala itzali.\n\nNahi duzu segurtasun moduan exekutatzea (hirugarrenen pluginak eta websocket-ak desgaituta)?" +CrashHandling.Labels.PrivacyNotice="Aukeratu dezakezu ere automatikoki kargatzea azken hutsegite-txostena OBSProject-era.<br /><br />Irakurri, mesedez, <a href='https://obsproject.com/privacy-policy'> pribatutasun gidalerroa</a> edozein fitxategia kargatu aurretik eta jarri arreta berezia fitxategien igoerei buruzko zatietan." +CrashHandling.Checkbox.SendReport="Irakurri dut pribatutasun gidalerroa eta baimena ematen dut igotzeko." +CrashHandling.Buttons.LaunchSafe="Exekutatu segurtasun moduan" +CrashHandling.Buttons.LaunchNormal="Exekutatu modu arruntean" +CrashHandling.Errors.UploadJSONError="Errore bat gertatu da saiatzean azken hutsegite-txostena igotzen. Saiatu beranduago." +CrashHandling.Errors.Title="Hutsegite erregistroa igotzeko errorea" SafeMode.Restart="OBS modu seguruan berrabiarazi nahi duzu (hirugarrenen pluginak, script-ak eta WebSockets desgaituta)?" SafeMode.RestartNormal="Nahi duzu OBS modu normalean berrabiarazi ?" ChromeOS.Title="Euskarririk gabeko plataforma" @@ -328,8 +337,6 @@ ConfirmStopRecord.Text="Ziur zaude grabazioa gelditu nahi duzula?" ConfirmBWTest.Title="Banda zabaleraren azterketa hasi?" ConfirmBWTest.Text="OBS banda zabalera azterketa moduan duzu konfiguratua. Modu honek sareko azterketak egiteko aukera ematen du zure kanala aktibatu gabe. Behin azterketa egin ondoren, desaktibatu behar duzu ikusleek zure transmisioa ikus dezaten.\n\nJarraitu nahi duzu?" -ConfirmExit.Title="Irten OBS-tik?" -ConfirmExit.Text="OBS jardunean dago. Transmisio/grabazio guztiak itzaliko dira. Ziur zaude irten nahi duzula?" ConfirmRemove.Title="Baieztatu kentzea" ConfirmRemove.Text="Ziur zaude '%1' kendu nahi duzula?" ConfirmRemove.TextMultiple="Seguru zaude %1 elementu ezabatu nahi dituzula?" @@ -366,6 +373,17 @@ Output.NoBroadcast.Text="Emankizun bat konfiguratu behar duzu transmisio bat hasi ahal izateko." Output.BroadcastStartFailed="Huts egin du emankizuna abiatzen" Output.BroadcastStopFailed="Huts egin du emankizuna gelditzen" +LogUploadDialog.Title="OBS Studio erregistro fitxategiaren igoera" +LogUploadDialog.Labels.PrivacyNotice="Mesedez, irakurri <a href='https://obsproject.com/privacy-policy'> pribatutasun gidalerroa</a> eta edozein fitxategi igo aurretik fitxategiak igotzeari buruzko atala." +LogUploadDialog.Labels.Progress="Erregistroa igotzen. Itxaron..." +LogUploadDialog.Labels.Description.AppLog="Zure erregistro fitxategia igo da. Orain URLa partekatu dezakezu arazketa- edo euskarri-helburuetarako." +LogUploadDialog.Labels.Description.CrashLog="Hutsegite txostena igo da. Orain URLa parteka dezakezu arazketa proposatzeko." +LogUploadDialog.Buttons.ConfirmUpload="Igo" +LogUploadDialog.Buttons.CopyURL="Kopiatu erregistroaren URLa" +LogUploadDialog.Buttons.AnalyzeURL="Aztertu erregistro fitxategia" +LogUploadDialog.Buttons.RetryButton="Saiatu berriro" +LogUploadDialog.Errors.Template="Errore bat gertatu da fitxategia igotzean:\n\n%1" +LogUploadDialog.Errors.NoLogFile="Ez dago igotzeko fitxategirik edo hutsik dago." Remux.SourceFile="OBS grabazioa" Remux.TargetFile="Helburu-fitxategia" Remux.Remux="Multiplexatu" @@ -581,6 +599,7 @@ Basic.Main.PauseRecording="Pausatu grabazioa" Basic.Main.UnpauseRecording="Amaitu grabazioaren pausa" Basic.Main.SplitFile="Zatitu grabaketa fitxategia" +Basic.Main.AddChapterMarker="Gehitu kapitulu-markatzailea (bakarrik Hybrid MP4/MOV)" Basic.Main.StoppingRecording="Grabazioa gelditzen..." Basic.Main.StopReplayBuffer="Gelditu erreprodukzio bufferra" Basic.Main.StoppingReplayBuffer="Erreprodukzio bufferra gelditzen..." @@ -809,7 +828,8 @@ Basic.Settings.Output="Irteera" Basic.Settings.Output.Format="Grabazio-formatua" Basic.Settings.Output.Format.MKV="Matroska Bideoa (.mkv)" -Basic.Settings.Output.Format.hMP4="MP4 hibridoa BETA (.mp4)" +Basic.Settings.Output.Format.hMP4="MP4 hibridoa (.mp4)" +Basic.Settings.Output.Format.hMOV="MOV hibridoa (.mov)" Basic.Settings.Output.Format.fMP4="MP4 Fragmentatuta (.mp4)" Basic.Settings.Output.Format.fMOV="MOV Fragmentatuta (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="MOV zatikatuak grabaketa zatika idazten du eta ez du MOV fitxategi tradizionalen amaiera bera behar.\nHori esker, fitxategia erreproduzigarria izaten jarraitzen du diskoan idaztea eten bada ere, adibidez, BSOD edo energia galtzearen ondorioz.\n\n Baliteke hau ez izatea erreproduzigailu eta editore guztiekin bateragarria. Erabili Fitxategia → Remux Grabaketak fitxategia formatu bateragarriago batera bihurtzeko, behar izanez gero." @@ -977,6 +997,7 @@ Basic.Settings.Video.Numerator="Zenbakitzailea" Basic.Settings.Video.Denominator="Izendatzailea" Basic.Settings.Video.Renderer="Errendatzailea" +Basic.Settings.Video.Renderer.Experimental="%1 (esperimentala)" Basic.Settings.Video.InvalidResolution="Bereizmen baliogabea. Izan behar da widthxheight (adib. 1920x1080)" Basic.Settings.Video.CurrentlyActive="Bideo irteera gaituta dago une honetan. Eten irteera guztiak bideo ezarpenak aldatzeko." Basic.Settings.Video.DownscaleFilter.Bilinear="Bilineala (Azkarrena, baina lausoa eskalatuz gero)" @@ -1298,3 +1319,11 @@ MultitrackVideo.IncompatibleSettings.AudioChannels="Une honetan %1 ez da bateragarria Audioa → Orokorra → Kanalak '%2', %3 gisa ezarrita" MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="Audioa → Orokorra → Kanalak '%1' gisa ezarri behar da" MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1-ek hainbat ezarpen desberdin behar ditu Audioa → Orokorra → Kanalak" +Basic.OpenPluginManager="Pluginen kudeatzailea" +PluginManager="Pluginen kudeatzailea" +PluginManager.Restart="OBS Studio berrabiarazi behar da plugin aldaketak aplikatzeko" +PluginManager.MissingPlugin="PLUGINA EZ DA AURKITU" +PluginManager.Section.Discover="Nabigatu" +PluginManager.Section.Manage="Instalatua" +PluginManager.Section.Updates="Eguneraketak" +PluginManager.Section.Manage.Title="Kudeatu gaitutako pluginak"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/fa-IR.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/fa-IR.ini
Changed
@@ -5,7 +5,7 @@ Close="بستن" Save="ذخیره" Discard="صرف نظر" -Disable="از کار افتاده" +Disable="غیرفعال" Yes="بله" No="خير" Add="افزودن" @@ -111,6 +111,7 @@ List="فهرست" Grid="جدول" Automatic="خودکار" +ComingSoon="بزودی" PluginsFailedToLoad.Title="خطا بارگذاری افزونه" PluginsFailedToLoad.Text="افزونههای OBS زیر بارگیری نشدند:\n\n%1\nلطفاً این افزونهها را بهروزرسانی یا حذف کنید." AlreadyRunning.Title="برنامه OBS از قبل در حال اجراست" @@ -337,8 +338,8 @@ ConfirmStopRecord.Text="مطمئن هستید که می خواهید ضبط کردن را متوقف کنید؟" ConfirmBWTest.Title="شروع تست پهنای باند؟" ConfirmBWTest.Text="شما OBS را در حالت آزمایش پهنای باند پیکربندی کرده اید. این حالت امکان آزمایش شبکه بدون فعال شدن کانال شما را فراهم می کند. پس از پایان آزمایش ، برای اینکه بینندگان بتوانند جریان شما را ببینند ، باید آن را غیرفعال کنید.\n\nآیا می خواهید ادامه دهید?" -ConfirmExit.Title="خروج از OBS؟" -ConfirmExit.Text="برنامه OBS در حال حاضر فعل است. تمامی پخش/ضبطها قطع خواهند شد. آیا مطمئنید که میخواهید خارج شوید؟" +ConfirmExit.Title="خروجیهای فعال" +ConfirmExit.Text="OBS هنوز فعال است. تمام پخشها/ضبطها متوقف خواهند شد." ConfirmRemove.Title="تایید حذف" ConfirmRemove.Text="آیا مطمئنید که می خواهید «%1» را حذف کنید؟" ConfirmRemove.TextMultiple="آیا مطمئن هستید که میخواهید %1 آیتم را حذف کنید؟" @@ -827,12 +828,15 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="فعالکردن ابطال کانفینگ" Basic.Settings.Stream.MultitrackVideoLabel="ویدئو چندلایه" Basic.Settings.Stream.MultitrackVideoExtraCanvas="بوم اضافی" +Basic.Settings.Stream.WHIPSimulcastLabel="پخش همزمان" +Basic.Settings.Stream.WHIPSimulcastInfo="پخش همزمان به شما امکان میدهد چندین کیفیت ویدیویی را رمزگذاری و ارسال کنید. <a href='https://obsproject.com/kb/whip-streaming-guide'>بیشتر بدانید</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="کل لایهها" Basic.Settings.Stream.AdvancedOptions="تنظیمات پیشرفته" Basic.Settings.Output="خروجی" Basic.Settings.Output.Format="فرمت ضبط" Basic.Settings.Output.Format.MKV="فیلم ماتروسکا (.mkv)" -Basic.Settings.Output.Format.hMP4="هیبریدی MP4 آزمایشی (.mp4)" -Basic.Settings.Output.Format.hMOV="هیبرید MOV آزمایشی (.mov)" +Basic.Settings.Output.Format.hMP4="MP4 ترکیبی (.mp4)" +Basic.Settings.Output.Format.hMOV="MOV ترکیبی (.mov)" Basic.Settings.Output.Format.fMP4="MP4 قطعه شده (.mp4)" Basic.Settings.Output.Format.fMOV="MOV قطعه شده (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="MOV تکهتکهشده ضبط را به صورت تکهای مینویسد و نیازی به نهاییسازی مشابه فایلهای MOV سنتی ندارد.\nاین تضمین میکند که فایل حتی اگر نوشتن روی دیسک قطع شود، مثلاً در نتیجه BSOD یا قطع برق، همچنان قابل پخش است.\n\ nاین ممکن است با همه پخش کننده ها و ویرایشگرها سازگار نباشد. از فایل ← ریماکس های ضبط شده برای تبدیل فایل به فرمت سازگارتر در صورت لزوم استفاده کنید." @@ -1003,6 +1007,7 @@ Basic.Settings.Video.Numerator="صورت کسر" Basic.Settings.Video.Denominator="مخرج کسر" Basic.Settings.Video.Renderer="خروجی" +Basic.Settings.Video.Renderer.Experimental="%1 (آزمایشی)" Basic.Settings.Video.InvalidResolution="مقدار رزولوشن نامعتبر است. باید widthxheight باشد (یعنی 1920x1080)" Basic.Settings.Video.CurrentlyActive="خروجی ویدئو در حال حاضر فعال است. لطفاً برای تغییر تنظیمات ویدئو، همه ی خروجی ها را خاموش کنید." Basic.Settings.Video.DownscaleFilter.Bilinear="دوسویه (سریع تر، اما در صورت مقیاس زدگی تار است)" @@ -1330,7 +1335,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 به تنظیمات مختلف چندگانه برای صوت ← عمومی ← کانال ها نیاز دارد" Basic.OpenPluginManager="مدیریت افزونه" PluginManager="مدیریت افزونه" -PluginManager.HelpText="مدیریت افزونه" -PluginManager.Restart="راهاندازی مجدد OBS؟" -PluginManager.NeedsRestart="برای اعمال این تغییرات، OBS باید مجدداً راهاندازی شود. آیا میخواهید همین حالا مجدداً راهاندازی کنید؟" +PluginManager.Restart="برای اعمال تغییرات پلاگین لازم است OBS Studio ریاستارت شود" PluginManager.MissingPlugin="افزونه یافت نشد" +PluginManager.Section.Discover="مرور" +PluginManager.Section.Manage="نصب شده" +PluginManager.Section.Updates="بهروزرسانیها" +PluginManager.Section.Manage.Title="مدیریت پلاگینهای فعال شده"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/fi-FI.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/fi-FI.ini
Changed
@@ -27,14 +27,14 @@ Projector.Open.Scene="Avaa näkymä projektori" Projector.Open.Source="Avaa lähteen projektori" Projector.Open.Multiview="Avaa Moninäkymä" -Projector.Display="Monitori %1" +Projector.Display="Näyttö %1" Projector.Window="Uusi ikkuna" Projector.Title="Projektori" Projector.Title.Scene="Näkymä: %1" Projector.Title.Source="Lähde: %1" Projector.Title.Multiview="Moninäkymä" Projector.ResizeWindowToContent="Sovita ikkuna sisältöön" -Clear="Nollaa" +Clear="Tyhjennä" Revert="Palauta" Show="Näytä" Hide="Piilota" @@ -45,7 +45,7 @@ Enable="Ota käyttöön" DisableOSXVSync="Poista macOS V-Sync käytöstä" ResetOSXVSyncOnExit="Palauta macOS V-Sync suljettaessa" -HighResourceUsage="Enkoodaus on ylikuormitettu! Harkitse laatu-asetusten laskemista tai käytä nopeampaa preset-asetusta." +HighResourceUsage="Enkoodaus on ylikuormitettu! Harkitse laatu-asetusten laskemista tai käytä nopeampaa enkoodauksen esiasetusta." Transition="Siirtymä" QuickTransitions="Pikasiirtymät" FadeToBlack="Häivytys mustaan" @@ -108,6 +108,7 @@ List="Lista" Grid="Ruudukko" Automatic="Automaattinen" +ComingSoon="Tulossa pian" PluginsFailedToLoad.Title="Liitännäisen latausvirhe" PluginsFailedToLoad.Text="Seuraavien OBS-liitännäisten lataaminen epäonnistui:\n\n%1\nPäivitä tai poista kyseiset liitänäiset." AlreadyRunning.Title="OBS on jo käynnissä" @@ -119,6 +120,7 @@ CrashHandling.Checkbox.SendReport="Olen lukenut tietosuojakäytännön ja hyväksyn lähetyksen." CrashHandling.Buttons.LaunchSafe="Käynnistä vikasietotilassa" CrashHandling.Buttons.LaunchNormal="Käynnistä normaalissa tilassa" +CrashHandling.Errors.UploadJSONError="Virhe tapahtui ladatessa viimeisintä kaatumisilmoitusta. Yritäthän myöhemmin uudelleen." CrashHandling.Errors.Title="Kaatumislokin lähetysvirhe" SafeMode.Restart="Haluatko käynnistää OBS:n uudelleen vikasietotilaan (kolmannen osapuolen liitännäiset, komentosarjat ja WebSocketit poistetaan käytöstä)?" SafeMode.RestartNormal="Haluatko käynnistää OBS:n uudelleen normaalissa tilassa?" @@ -332,8 +334,6 @@ ConfirmStopRecord.Text="Haluatko varmasti lopettaa tallennuksen?" ConfirmBWTest.Title="Aloita kaistan nopeustesti?" ConfirmBWTest.Text="OBS on asetettu kaistan nopeustestitilaan. Tämä tila antaa sinun testata verkkoa ilman että kanava menee Live-tilaan. Kun olet valmis testauksen kanssa, sinun täytyy ottaa se pois käytöstä, jotta muut voivat nähdä lähetyksesi.\n\nHaluatko jatkaa?" -ConfirmExit.Title="Sulje OBS?" -ConfirmExit.Text="OBS on aktiivinen. Kaikki lähetykset/tallennukset suljetaan. Haluatko varmasti sulkea ohjelman?" ConfirmRemove.Title="Vahvista poisto" ConfirmRemove.Text="Haluatko varmasti poistaa '%1'?" ConfirmRemove.TextMultiple="Haluatko varmasti poistaa %1 kohdetta?" @@ -370,6 +370,7 @@ Output.NoBroadcast.Text="Sinun täytyy määrittää lähetys, ennen kuin voit aloittaa striimauksen." Output.BroadcastStartFailed="Lähetyksen käynnistäminen epäonnistui" Output.BroadcastStopFailed="Lähetyksen pysäyttäminen epäonnistui" +LogUploadDialog.Title="OBS Studion lokitiedoston lähetys" LogUploadDialog.Labels.PrivacyNotice="Lue <a href='https://obsproject.com/privacy-policy'>tietosuojakäytäntö</a> ja sen osio liittyen tiedostojen lähettämiseen, ennen kuin lähetät yhtäkään tiedostoa." LogUploadDialog.Labels.Progress="Lokin lähetys on meneillään, odota hetki..." LogUploadDialog.Labels.Description.AppLog="Lokitiedostosi on ladattu. Nyt voit jakaa URL-osoitteen vianjäljitystä tai tukea varten." @@ -590,6 +591,7 @@ Basic.Main.PauseRecording="Keskeytä tallennus" Basic.Main.UnpauseRecording="Jatka tallennusta" Basic.Main.SplitFile="Pilko tallennettu tiedosto" +Basic.Main.AddChapterMarker="Lisää kappalemerkki (vain hybridi MP4/MOV)" Basic.Main.StoppingRecording="Pysäytetään tallennusta..." Basic.Main.StopReplayBuffer="Pysäytä toistopuskuri" Basic.Main.StoppingReplayBuffer="Pysäytetään toistopuskuria..." @@ -985,6 +987,7 @@ Basic.Settings.Video.Numerator="Osoittaja" Basic.Settings.Video.Denominator="Nimittäjä" Basic.Settings.Video.Renderer="Hahmontaja" +Basic.Settings.Video.Renderer.Experimental="%1 (Kokeellinen)" Basic.Settings.Video.InvalidResolution="Vialliset resoluution asetus. Muodon pitää olla leveysxkorkeus (esim. 1920x1080)" Basic.Settings.Video.CurrentlyActive="Kuvan ulostulo on tällä hetkellä käytössä. Kytke pois kaikki ulostulot vaihtaaksesi kuva-asetuksia." Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (nopein, mutta epätarkka skaalattaessa)" @@ -1289,7 +1292,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 vaatii useita eri asetuksia Ääni → Yleiset → Kanavat" Basic.OpenPluginManager="Liitännäisen hallinta" PluginManager="Liitännäisen hallinta" -PluginManager.HelpText="Liitännäisen hallinta" -PluginManager.Restart="Käynnistetäänkö OBS uudelleen?" -PluginManager.NeedsRestart="Muutosten voimaantulo vaatii, että OBS käynnistetään uudelleen. Haluatko käynnistää uudelleen nyt?" +PluginManager.Restart="OBS Studio tulee käynnistää uudelleen, jotta liitännäismuutokset tulevat voimaan" PluginManager.MissingPlugin="LIITÄNNÄISTÄ EI LÖYTYNYT" +PluginManager.Section.Discover="Selaa" +PluginManager.Section.Manage="Asennettu" +PluginManager.Section.Updates="Päivitykset" +PluginManager.Section.Manage.Title="Hallitse käytössä olevia liitännäisiä"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/fil-PH.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/fil-PH.ini
Changed
@@ -16,12 +16,23 @@ Properties="Mga Katangian" MoveUp="Igalaw Pataas" MoveDown="Igalaw Pababa" -Settings="Mga Setting" +Settings="Pagtatakda" +Display="Displey" Name="Pangalan" Exit="Umalis" Mixer="Mixer ng Audio" Browse="Maghanap" DroppedFrames="Nalaglag na mga Frame %1 (%2%)" +Projector.Open.Program="Buksan ang Program Projector" +Projector.Open.Preview="Buksan ang Preview Projector" +Projector.Open.Scene="Buksan ang Scene Projector" +Projector.Open.Source="Open Source na Projector" +Projector.Open.Multiview="Buksan ang Multiview" +Projector.Display="Displey: %1" +Projector.Window="Bagong window" +Projector.Title.Scene="Eksena: %1" +Projector.Title.Source="Pagtututok: %1" +Projector.ResizeWindowToContent="Pagkasyahin ang window sa nilalaman" Clear="Alisin" Revert="Ibalik" Show="Ipakita" @@ -60,14 +71,14 @@ RestoreDefaults="Mga Default" HideMixer="Itago sa Mixer" TransitionOverride="Mas Susunding Transisyon" -ShowTransition="Transisyon ng Ipinapakita" -HideTransition="Transisyon ng Itinatago" +ShowTransition="Ipapakitang Transisyon" +HideTransition="Itatagong Transisyon" None="Wala" StudioMode.Preview="Pribyu" StudioMode.Program="Programa" StudioMode.PreviewSceneName="Pasilip: %1" StudioMode.ProgramSceneName="Programa: %1" -ShowInMultiview="Ipakita sa Maramihang Pagtanaw" +ShowInMultiview="Ipakita sa Multiview" VerticalLayout="Patayong Layout" Group="Grupo" DoNotShowAgain="Huwag nang ipakita ulit" @@ -79,30 +90,39 @@ LogViewer="Pantingin sa Log" ShowOnStartup="Ipakita pagbukas" OpenFile="Buksan ang file" -AddSource="Magdagdag ng Pinagmulan" +AddScene="Magdagdag ng Eksena" +AddSource="Magdagdag ng Pagtututok" RemoveScene="Alisin ang Napiling Eksena" -RemoveSource="Alisin ang Napiling Eksena(s)" +RemoveSource="Alisin ang mga Napiling Pagtututok" MoveSceneUp="Ilipat Ang Eksena Pababa" MoveSceneDown="Ilipat Ang Eksena Pababa" -MoveSourceUp="Ilipat Ang Eksena(s) Pataas" -MoveSourceDown="Ilipat Ang Eksena(s) Pababa" -SourceProperties="Buksan Ang Pinagmulan Ng Katangian." -SourceFilters="Buksan Ang Pinagmulan Ng Filters" +MoveSourceUp="Ilipat ang mga Pagtututok Pataas" +MoveSourceDown="Ilipat ang mga Pagtututok Pababa" +SourceProperties="Buksan ang mga Katangian ng Pagtututok" +SourceFilters="Buksan ang mga Filter ng Pagtututok" MixerToolbarMenu="Tunog ng Mixer Menu" SceneFilters="Buksan Ang Eskena Filters" List="Listahan" Automatic="Awtomatiko" +ComingSoon="Papaparating Na" PluginsFailedToLoad.Title="Ang mga Plugin ay nag error sa pag-load." PluginsFailedToLoad.Text="Nabigong mag-load ang mga sumusunod na plugin ng OBS:\n\n%1\nPaki-update o alisin ang mga plugin na ito." AlreadyRunning.Title="Tumatakbo na ang OBS" AlreadyRunning.Text="Tumatakbo na ang OBS! Maliban na lamang kung gusto mong gawin ito, pakiusap patayin ang anomang umiiral na instansiya ng OBS bago subukang magpatakbo ng panibagong instansiya. Kung itinakda sa OBS na lumiit tungo sa system tray, pakitingnan kung ito ay tumatakbo pa rin doon." AlreadyRunning.LaunchAnyway="Patakbuhin pa rin" +CrashHandling.Dialog.Title="Nalamang Nag-crash ang OBS Studio" +CrashHandling.Labels.Text="Hindi maayos ang pagkasara ng OBS Studio.\n\nIpatakbo sa Safe Mode (hindi ipapagana ang mga third-party plugins, scripting, at WebSockets)?" +CrashHandling.Labels.PrivacyNotice="Maaari mo ring piliin na awtomatiko ang pag-upload ng pinakabagong crash report sa OBSProject.<br /><br />Mangyaring basahin ang <a href='https://obsproject.com/privacy-policy'>Mga Patakaran sa Pribasya</a> bago i-upload ang mga file at magbigay pansin sa mga parte ukol sa pag-upload ng mga file." +CrashHandling.Checkbox.SendReport="Binasa ko ang patakaran sa pribasya at pinahihintulotan ko ang pag-upload." +CrashHandling.Buttons.LaunchSafe="Ipatakbo sa Safe Mode." +CrashHandling.Buttons.LaunchNormal="Ipatakbo sa Karaniwang Paraan." +CrashHandling.Errors.UploadJSONError="Isang error ang nangyari habang ina-upload ang kamakailang ulat ng pagkandarapa. Mangyaring pakisubukan muli mamamaya." SafeMode.Restart="Nais mo bang i-restart ang OBS sa Ligtas na Mode (hindi pinagana ang mga third-party na plugin, scripting, at WebSockets)?" SafeMode.RestartNormal="Nais mo bang i-restart ang OBS sa Normal na Mode?" ChromeOS.Title="Hindi suportadong Plataporma" ChromeOS.Text="Mukhang tumatakbo ang OBS sa loob ng isang lalagyan ng ChromeOS. Ang platform na ito ay hindi na suportado." Wine.Title="May natuklasan na wine" -Wine.Text="Ang pagpapatakbo ng OBS sa Wine ay hindi suportado, at maraming mga feature tulad ng pagkuha o mga pinagmumulan ng device ay hindi gagana o sa limitadong kapasidad lamang.<br><br>Inirerekomenda na magpatakbo na lang ng native na bersyon ng OBS, halimbawa <a href='https://flathub.org/apps/details/com.obsproject.Studio'>aming bersyon ng Flatpak</a> o ang mga package ng iyong operating system." +Wine.Text="Hindi sinusuporta ang pagpapatakbo ng OBS sa Wine, at maraming feature ang hindi gagana o magkakakulang tulad ng dakip o mga pagtututok ng device. <br><br>Inimumungkahi ang pagtatakbo ng wastong bersiyon ng OBS, isang halimbawa na ang <a href='https://flathub.org/apps/details/com.obsproject.Studio'>bersiyong Flatpak namin</a> o package ng operating system mo." DockCloseWarning.Title="Isinasara ang Dockable Window" DockCloseWarning.Text="Isinara mo ang dockable na window. Kung gusto mong ipakita itong muli, gamitin ang Docks menu sa menu bar." ExtraBrowsers="Mga Pasadyang Browser Dock" @@ -138,16 +158,17 @@ Basic.AutoConfig.ApplySettings="Gamitin ang Kaayusan" Basic.AutoConfig.StartPage="Kaalaman sa Paggamit" Basic.AutoConfig.StartPage.SubTitle="Tukuyin ang nais mong paggamitan ng programa" -Basic.AutoConfig.StartPage.PrioritizeStreaming="I-optimize para sa pag-stream, pangalawa lang ang pagrerecord" -Basic.AutoConfig.StartPage.PrioritizeRecording="I-optimize para sa pagrerecord, hindi ako mag-iistream" +Basic.AutoConfig.StartPage.PrioritizeStreaming="I-optimize para sa pagsi-stream, pangalawa lang ang pagrerecord" +Basic.AutoConfig.StartPage.PrioritizeRecording="I-optimize para sa pagrerecord, hindi ako magsi-stream" Basic.AutoConfig.StartPage.PrioritizeVirtualCam="Virtual camera lang ang gagamitin ko" Basic.AutoConfig.VideoPage="Kaayusan ng Video" Basic.AutoConfig.VideoPage.SubTitle="Tukuyin ang mga video setting na nais mong gamitin" Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="Gamitin ang Kasalukuyan(%1x%2)" +Basic.AutoConfig.VideoPage.BaseResolution.Display="%1 Displey (%2x%3)" Basic.AutoConfig.VideoPage.FPS.UseCurrent="Gamitin ang Kasalukuyan (%1)" Basic.AutoConfig.VideoPage.FPS.PreferHighFPS="Maaaring 60 o 30, pero piliin ang 60 kung maaari" -Basic.AutoConfig.VideoPage.FPS.PreferHighRes="Maaaring 60 o 30, pero piliin ang mas mataas na resolusyon" -Basic.AutoConfig.VideoPage.CanvasExplanation="Paalala: Ang kanbas (base) na ito ay hindi kinakailangan na kaparehas ng resolusyon ng iyong stream or record. Ang iyong actual stream/record na resolusyon ay maaaring pagkasyahin para sa resolusyon ng kanbas para mabawasan ang paggamit kinakailangan na bitrate." +Basic.AutoConfig.VideoPage.FPS.PreferHighRes="60 o 30, pero piliin ang mas mataas na resolusyon" +Basic.AutoConfig.VideoPage.CanvasExplanation="Paalala: Ang kanbas (basehan) na ito ay hindi kinakailangang magkaparehas sa resolusyon ng iyong pagsi-stream o pagrerekord. Maaaring pagkasyahin ang iyong tunay na resolusyon sa pagsi-stream o pagrerekord sa resolusyon ng kanbas upang mabawasan ang paggamit ng mapagkukunan at ng mga kinakailangang bitrate." Basic.AutoConfig.StreamPage="Impormasyon sa Stream" Basic.AutoConfig.StreamPage.SubTitle="Pakilagay ang iyong impormasyon pang stream" Basic.AutoConfig.StreamPage.ConnectAccount="I-connect ang Account (ipinapayo)" @@ -204,6 +225,7 @@ Basic.Stats.DroppedFrames="Nalaglag na mga Frame (Network)" Basic.Stats.MegabytesSent="Kabuoang Nilabas na Data" Basic.Stats.DiskFullIn="Mapupuno ang disk (sa loob ng halos)" +Basic.Stats.DiskFullIn.Text="%s Oras, %2 Minuto" Basic.Stats.ResetStats="I-reset ang Estadistika" ResetUIWarning.Title="Sigurado ka bang nais mong i-reset ang UI?" ResetUIWarning.Text="Ang pag-reset sa UI ay magtatago ng mga karagdagang dock. Kakailanganin mong i-unhide ang mga dock na ito mula sa menu ng Docks kung gusto mong makita ang mga ito.\n\nSigurado ka bang gusto mong i-reset ang UI?" @@ -222,20 +244,20 @@ Updater.RepairConfirm.Text="Ang pagsisimula ng pagsusuri sa integridad ay mai-scan ang iyong pag-install ng OBS para sa sirang at muling i-download ang mga sirang/binagong file. Maaaring tumagal ito ng ilang sandali.\n\nGusto mo bang magpatuloy?" Updater.FailedToLaunch="Nabigong ilunsad ang updater" QuickTransitions.SwapScenes="Magpalit ng Pribyu/Programa ng Eksena Pagkatapos Mag-transition" -QuickTransitions.SwapScenesTT="Pinagpapalit ang mga pribyu at bunga na eksena matapos ang pagbabago (kung umiiral pa ang orihinal na eksena ng bunga).\nHindi nito ibabalik ang mga pagkakaibang nagawa orihinal na eksena ng bunga." +QuickTransitions.SwapScenesTT="Pinagpapalit ang mga pribyu at bunga na eksena matapos ang pagbabago (kung umiiral pa ang orihinal na eksena ng programa).\nHindi nito maibabalik ang mga pagbabagong ginawa sa orihinal na eksena ng programa." QuickTransitions.DuplicateScene="I-duplicate ang Eksena" QuickTransitions.DuplicateSceneTT="Kapag nag-e-edit ng parehong eksena, nagbibigay-daan sa pag-edit ng pagbabago/pagpapakita ng mga source nang hindi binabago ang output ng program.\nUpang i-edit ang mga property ng mga source nang hindi binabago ang output ng program, paganahin ang 'Duplicate Sources'.\nAng pagbabago sa value na ito ay magre-reset sa kasalukuyang eksena ng program (kung ito ay mayroon pa din)." -QuickTransitions.EditProperties="I-duplicate ang mga Pinagtutukan" +QuickTransitions.EditProperties="I-duplicate ang mga Pagtututok" QuickTransitions.EditPropertiesTT="Kapag nag-e-edit ng parehong eksena, pinapayagan ang pag-edit ng mga katangian ng mga source nang hindi binabago ang output ng program.\nMaaari lang itong gamitin kung ang 'Duplicate Scene' ay naka-enable.\nAng ilang partikular na source (gaya ng pagkuha o media source) ay hindi sumusuporta dito at hindi maaaring i-edit hiwalay.\nAng pagpapalit ng value na ito ay magre-reset sa kasalukuyang eksena ng programa (kung mayroon pa rin ito).\n\nBabala: Dahil madodoble ang mga source, maaaring mangailangan ito ng dagdag na mapagkukunan ng system o video." QuickTransitions.HotkeyName="Mabilis na Pagpapalit-eksena: %1" -Basic.AddTransition="Magdagdag ng configurable na transisyon" -Basic.RemoveTransition="Tangalin ang configurable transition" +Basic.AddTransition="Magdagdag ng Maisasaayos na Transisyon" +Basic.RemoveTransition="Tangalin ang Maisasaayos na Transisyon" Basic.TransitionProperties="Mga Katangian ng Transisyon" Basic.SceneTransitions="Mga Pagpapalit-eksena" Basic.TransitionDuration="Tagal" Basic.TogglePreviewProgramMode="Ang Studio Mode" -Basic.EnablePreviewProgramMode="Paganahin Ang Studio Mode" -Basic.DisablePreviewProgramMode="Huwag Paganahin Ang Studio Mode" +Basic.EnablePreviewProgramMode="Paganahin ang Studio Mode" +Basic.DisablePreviewProgramMode="Huwag Paganahin ang Studio Mode" Undo.Undo="Ibalik" Undo.Redo="Ulitin" Undo.Add="Pagdagdag ng '%1'" @@ -248,7 +270,7 @@ Undo.Filters="Pagbabago ng Filter sa '%1'" Undo.Filters.Paste.Single="Pagpaste ng Filter na '%1' sa '%2'" Undo.Filters.Paste.Multiple="Kopyahin ang mga Filters mula sa '%1' patungong '%2'" -Undo.Transform="Pagtransform ng/mga source sa '%1'" +Undo.Transform="Pagtransform ng (mga) pagtutok Sa '%1'" Undo.Transform.Paste="Pagpaste ng Transformation sa '%1'" Undo.Transform.Rotate="Pagikot sa '%1'" Undo.Transform.Reset="Pagreset ng Transform sa '%1'" @@ -257,8 +279,8 @@ Undo.Transform.FitToScreen="Ikasya sa Tabing sa '%1'" Undo.Transform.StretchToScreen="Ilapad sa Tabing sa '%1'" Undo.Transform.Center="I-gitna sa Tabing sa '%1'" -Undo.Transform.VCenter="I-gitna ng patayo sa Tabing sa '%1'" -Undo.Transform.HCenter="I-gitna ng pahalang sa Tabing sa '%1'" +Undo.Transform.VCenter="I-patayong Gitna sa Tabing sa '%1'" +Undo.Transform.HCenter="I-pahalang Gitna sa Tabing sa '%1'" Undo.Volume.Change="Pagbago ng Lakas ng Tunog sa '%1'" Undo.Volume.Mute="Pagtatahimik ng '%1'" Undo.Volume.Unmute="Pag-unmute ng '%1'" @@ -280,7 +302,7 @@ Undo.MoveToTop="Paglipat ng '%1' sa pinakataas sa '%2'" Undo.MoveToBottom="Paglipat ng '%1' sa pinakamalalim sa '%2'" Undo.PasteSource="Pagpasta ng/mga Sources sa '%1'" -Undo.PasteSourceRef="Pagpasta ng/mga Pantukoy sa mga Source sa '%1'" +Undo.PasteSourceRef="I-paste ang mga Sangguniang Pagtutukoy sa '%1'" Undo.GroupItems="Pagtitipon ng mga items sa '%1'" TransitionNameDlg.Text="Pakilagay ang pangalan ng transisyon" TransitionNameDlg.Title="Pangalan ng Transisyon" @@ -299,8 +321,6 @@ ConfirmStopRecord.Text="Sigurado ka bang nais mong itigil ang pagrerecord?" ConfirmBWTest.Title="Simulan ang Pagsusuri ng Bandwidth?" ConfirmBWTest.Text="Na-configure mo ang OBS sa bandwidth test mode. Nagbibigay-daan ang mode na ito para sa subokin ang network nang hindi na-live ang iyong channel. Kapag tapos ka na sa pagtest, kakailanganin mong i-disable ito para makita ng mga manonood ang iyong stream.\n\nGusto mo bang magpatuloy?" -ConfirmExit.Title="Lumabas sa OBS?" -ConfirmExit.Text="Ang OBS ay kasulukuyang aktibo. Lahat ng stream o recording ay papatayin. Sigurado ka bang gusto mong umalis?" ConfirmRemove.Title="I-kumpirma ang pagtangal" ConfirmRemove.Text="Sigurado ka bang nais mong tanggalin ang '$1'?" ConfirmRemove.TextMultiple="Sigurado ka bang nais mong alisin ang %1 na mga bagay?" @@ -314,7 +334,7 @@ Output.ReplayBuffer.PauseWarning.Title="Hindi makapagsa-save ng mga replay habang naka-pause" Output.ReplayBuffer.PauseWarning.Text="Babala: Ang mga muling pagpapalabas ay hindi maaring ma-save kapag nakahinto ang recording." Output.ConnectFail.Title="Bigong kumunekta" -Output.ConnectFail.BadPath="Hindi wasto ang Path or ang Connection URL. Pakitingnan ang settings para ma kumpirma na ito ay pwede." +Output.ConnectFail.BadPath="Di-wastong Landas o Connection URL. Pakitingnan ang settings upang mapatunayang wasto ang mga ito." Output.ConnectFail.ConnectFailed="Bigong kumunekta sa serber" Output.ConnectFail.InvalidStream="Di maka pasok sa tinutukoy na channel or stream key, pakitignan ng maayos ang stream key. Kung tama, Maaaring may problema sa pagkunekta sa serber." Output.ConnectFail.HdrDisabled="Ang output ng HDR ay kasalukuyang hindi pinagana para sa output na ito." @@ -327,23 +347,30 @@ Output.RecordFail.Unsupported="Ang output format ay maaring di suportado or di sinusuportahan ang higit sa isang audio track. Pakitingnan ang iyong settings at simulan ulet." Output.RecordNoSpace.Title="Hindi sapat ang iyong espasyo" Output.RecordNoSpace.Msg="Di sapat ang espasyo para ipatuloy ang pagrerekord." -Output.RecordError.Title="May error sa pagrekord" -Output.RecordError.Msg="Hindi tiyak na error habang nagrerekord." -Output.RecordError.EncodeErrorMsg="Mayroong error ang lumabas habang ikaw ay nag-re-rekord." -Output.RecordError.EncodeErrorMsg.LastError="Isang error sa encoder ang naganap habang nagre-record:<br><br>%1" -Output.BadPath.Title="Di mabuting File Path" -Output.BadPath.Text="Hindi mabuksan ang na-configure na Pagre-record na Path Pakisuri ang iyong Pag-record na Path Pakiusap pakisuri sa ilalim ng Setting → Output → Pagre-record." +Output.RecordError.Title="Error habanag nagrerekord" +Output.RecordError.Msg="Isang hindi matiyak na error habang nagrerekord." +Output.RecordError.EncodeErrorMsg="Isang encoder error habang nagrerekord" +Output.RecordError.EncodeErrorMsg.LastError="Isang encoder error habang nagrerekord:<br><br>%1" +Output.BadPath.Title="Di-wastong Landas ng File" +Output.BadPath.Text="Hindi mabuksan ang na-configure na Recording Path. Pakiusap pakisuri ang Recording Path sa loob ng Settings → Output → Pagre-record." Output.NoBroadcast.Title="Walang Broadcast na Kinunfigure" Output.NoBroadcast.Text="Kailangan mong mag-set up ng broadcast bago ka magsimulang mag-stream." Output.BroadcastStartFailed="Nabigong simulan ang palabas" Output.BroadcastStopFailed="Nabigong pigilan ang palabas" -Remux.SourceFile="Obs Recording" +LogUploadDialog.Title="Na-upload na ang Log File ng OBS Studio" +LogUploadDialog.Labels.PrivacyNotice="Pakibasa ng <a href='https://obsproject.com/privacy-policy'>Mga Patakaran sa Pribasya</a> at ang pangkat ukol sa pag-upload ng mga file bago mag-upload ng kahit na anong file." +LogUploadDialog.Labels.Progress="Ina-upload ang iyong log file. Mangyaring pakihintay..." +LogUploadDialog.Labels.Description.AppLog="Na-upload na ang iyong log file. Maaari mo nang ibahagi ang URL para sa pagdedebug o pagpapatulong." +LogUploadDialog.Labels.Description.CrashLog="Na-upload na ang iyong ulat ng pagkandarapa. Maaari mo nang ibahagi ang URL para sa pagdedebug." +LogUploadDialog.Buttons.ConfirmUpload="I-upload" +LogUploadDialog.Buttons.CopyURL="Kopyahin ang Log URL" +LogUploadDialog.Buttons.RetryButton="Subukan muli" Remux.Stop="Itigil ang Pagre-remux" Remux.ClearFinished="Alisin ang mga Tapos na" Remux.ClearAll="Alisin Lahat" Remux.FinishedTitle="Tapos na ang Remuxing" -Remux.Finished="Ang Recording remuxed" -Remux.FinishedError="Ang Recording Remuxed, pero ang file ay hindi kumpleto" +Remux.Finished="Nai-remux na ang pagrerekord" +Remux.FinishedError="Nai-remux na ang pagrerekord, ngunit maaring hindi kompleto ang file." Remux.SelectRecording="Pumili ng ni-record ng OBS..." Remux.SelectTarget="Pumili ng patutunguhang file..." Remux.FileExistsTitle="Ang napiling mga file ay umiiral na" @@ -386,7 +413,7 @@ MacPermissions.Item.Microphone.Details="Kailangan ang OBS ng itong permisyon kung gumugusto nakaptur ng iyong mikropono o isang eksternal na awdio kagamitan." MacPermissions.Item.Accessibility="Aksesibilidad" MacPermissions.Continue="Ipagpatuloy" -SourceLeak.Title="Error Sa Paglilinis Ng Pinagmulan" +SourceLeak.Title="Error Sa Paglilinis ng Pagtututok" SourceLeak.Text="May problema habang binabago ang mga koleksyon ng eksena at ang ilang mga mapagkukunan ay hindi maaaring i-unload. Ang isyung ito ay karaniwang sanhi ng mga plugin na hindi naglalabas ng mga mapagkukunan nang maayos. Pakiusap tiyakin na ang anumang mga plugin na iyong ginagamit ay napapanahon.\n\nOBS Studio ay lalabas na ngayon para maiwasan ang anumang potensyal na katiwalian ng data." Basic.DesktopDevice1="Tinig ng Desktop" Basic.DesktopDevice2="Ika-2 Tinig ng Desktop" @@ -395,9 +422,9 @@ Basic.AuxDevice3="Ang Mic/Aux 3" Basic.AuxDevice4="Ang Mic/Aux 4" Basic.Scene="Eksena" -Basic.DisplayCapture="Ang nakunan na display" -Basic.Main.PreviewConextMenu.Enable="Ipakita muli ang Larawan" -Basic.Main.Preview.Disable="Di-pinagana ang Preview" +Basic.DisplayCapture="Dakip ng Displey" +Basic.Main.PreviewConextMenu.Enable="Paganahin ang Pribyu" +Basic.Main.Preview.Disable="Huwag Paganahin ang Pribyu" ScaleFiltering="I-filter iskala" ScaleFiltering.Point="Punto" ScaleFiltering.Area="Laki" @@ -415,7 +442,7 @@ VolControl.SliderUnmuted="Pandausdos ng lakas ng tunog ng '%1':" VolControl.SliderMuted="Pandausdos ng lakas ng tunog ng '%1': (kasalukuyang nakatahimik)" VolControl.Properties="Mga Katangian para sa '%1'" -VolControl.UnassignedWarning.Title="Hindi Nakatalagang Mapagkukunan Ng Audio" +VolControl.UnassignedWarning.Title="Hindi Nakatalagang Pagtututok ng Audio" VolControl.UnassignedWarning.Text="Ang \"%1 \" ay hindi nakatalaga sa anumang mga audio track at hindi ito maririnig sa mga stream o pag-record.\n\n upang magtalaga ng isang mapagkukunan ng audio sa isang track, buksan ang mga advanced na properties ng Audio sa pamamagitan ng menu ng pag-click sa kanan o ang pindutan ng cog sa toolbar ng mixer dock" Basic.Main.AddSceneDlg.Title="Magdagdag ng mga Eksena" Basic.Main.AddSceneDlg.Text="Pakilagay ang pangalan ng eksena" @@ -429,7 +456,7 @@ RenameProfile.Title="Palitan ang pangalan ng Profile" Basic.Main.MixerRename.Title="Palitan ang pangalan ng Audio Source" Basic.Main.MixerRename.Text="Maaring pangalanin ang pinagtututukan ng audio" -Basic.Main.PreviewDisabled="Kasalukuyang hindi pinagana ang pag-preview" +Basic.Main.PreviewDisabled="Kasalukuyang hindi pinapagana ang pribyu" Basic.SourceSelect="Lumikha / Pumili ng mga Pagtutukan" Basic.SourceSelect.CreateNew="Gumawa ng bago" Basic.SourceSelect.AddExisting="Magdagdag ng Umiiral na" @@ -448,7 +475,7 @@ Basic.PropertiesWindow.NoProperties="Walang makikitang mga katangian" Basic.PropertiesWindow.AddFiles="Magdagdag ng mga File" Basic.PropertiesWindow.AddDir="Magdagdag ng Direktoryo" -Basic.PropertiesWindow.AddURL="Magdagdag ng Path / URL" +Basic.PropertiesWindow.AddURL="Magdagdag ng Path/URL" Basic.PropertiesWindow.AddEditableListDir="Magdagdag ng direktoryo sa '%1'" Basic.PropertiesWindow.AddEditableListFiles="Magdagdag ng mga file sa '%1'" Basic.PropertiesWindow.AddEditableListEntry="Magdagdag ng entry sa '%1'" @@ -566,23 +593,24 @@ Basic.MainMenu.Edit="I-&edit" Basic.MainMenu.Edit.Undo="Pawalang-bisa (&U)" Basic.MainMenu.Edit.Redo="Mag-&redo" -Basic.MainMenu.Edit.LockPreview="I-preview ang I-preview (&L)" +Basic.MainMenu.Edit.LockPreview="I-&lock ang Pribyu" +Basic.MainMenu.Edit.Scale="Pagsi-&scale ng Pribyu" Basic.MainMenu.Edit.Scale.Canvas="Kanbas (%1x%2)" Basic.MainMenu.Edit.Transform="Anyo (&T)" Basic.MainMenu.Edit.Transform.EditTransform="Baguhin ang Anyo (&E)..." Basic.MainMenu.Edit.Transform.CopyTransform="Kopyahin ang Anyo" -Basic.MainMenu.Edit.Transform.PasteTransform="I-dikit ang Anyo" +Basic.MainMenu.Edit.Transform.PasteTransform="I-paste ang Anyo" Basic.MainMenu.Edit.Transform.ResetTransform="I-&reset ang Anyo" -Basic.MainMenu.Edit.Transform.Rotate90CW="Paikuting 90 degrees pakanan" -Basic.MainMenu.Edit.Transform.Rotate90CCW="Paikuting 90 degrees pakaliwa" -Basic.MainMenu.Edit.Transform.Rotate180="Paikuting 180 degrees" +Basic.MainMenu.Edit.Transform.Rotate90CW="Paikutin ng 90 degrees pakanan" +Basic.MainMenu.Edit.Transform.Rotate90CCW="Paikutin ng 90 degrees pakaliwa" +Basic.MainMenu.Edit.Transform.Rotate180="Paikutin ng 180 degrees" Basic.MainMenu.Edit.Transform.FlipHorizontal="Baligtaring Pa&halang" -Basic.MainMenu.Edit.Transform.FlipVertical="Baligtaring Patayo (&v)" -Basic.MainMenu.Edit.Transform.FitToScreen="I-sakto sa screen (&f)" -Basic.MainMenu.Edit.Transform.StretchToScreen="Banatin para sa &screen" +Basic.MainMenu.Edit.Transform.FlipVertical="Baligtaring Patayo (&V)" +Basic.MainMenu.Edit.Transform.FitToScreen="Pagkasyahin sa screen (&F)" +Basic.MainMenu.Edit.Transform.StretchToScreen="Banatin sa &screen" Basic.MainMenu.Edit.Transform.CenterToScreen="Igitna sa s&creen" -Basic.MainMenu.Edit.Transform.VerticalCenter="Igitna sa Patayo" -Basic.MainMenu.Edit.Transform.HorizontalCenter="Igitna sa Pahalang" +Basic.MainMenu.Edit.Transform.VerticalCenter="I-patayong Gitna" +Basic.MainMenu.Edit.Transform.HorizontalCenter="I-pahalang Gitna" Basic.MainMenu.Edit.Order="Ay&os" Basic.MainMenu.Edit.Order.MoveUp="Itaas (&U)" Basic.MainMenu.Edit.Order.MoveDown="Ibaba (&D)" @@ -604,7 +632,7 @@ Basic.MainMenu.Profile.Export="I-export ang Profile" Basic.MainMenu.SceneCollection.Import="Umangkat ng Koleksyon ng Eksena" Basic.MainMenu.SceneCollection.Export="Magluwas ng Koleksyon ng Eksena" -Basic.MainMenu.SceneCollection.Migrate="Ilagay ang Basehan na Resolution" +Basic.MainMenu.SceneCollection.Migrate="Ilagay ang Basehang Resolusyon" Basic.MainMenu.Profile.Exists="Ang Profile ay umiiral na ngayon" Basic.MainMenu.Tools="Mga Kasangkapan (&T)" Basic.MainMenu.Help="Tulong (&H)" @@ -643,7 +671,7 @@ Basic.Settings.General.WarnBeforeStartingStream="Ipakita ang konpirmasyon ng palitang-usap nang magsimula ang mga stream" Basic.Settings.General.WarnBeforeStoppingStream="Ipakita ang konpirmasyon ng palitang-usap nang ihinto ang mga stream" Basic.Settings.General.WarnBeforeStoppingRecord="Ipakita ang Kumpirmasyon ng dialog kapag huminto sa pagre-record" -Basic.Settings.General.Projectors="Mga prodyektor" +Basic.Settings.General.Projectors="Mga Projector" Basic.Settings.General.HideProjectorCursor="Itago ang kursor sa harap ng mga prodyektor" Basic.Settings.General.ProjectorAlwaysOnTop="Gawing laging nakakataas ang mga prodyektor" Basic.Settings.General.Snapping="Pinagmulan ng Paghahanay na isnaping" @@ -668,9 +696,8 @@ Basic.Settings.General.Importers="Mga taga-import" Basic.Settings.General.AutomaticCollectionSearch="Maghanap sa mga kilalang lugar para sa mga koleksyon ng eksena kapag nag-aangkat" Basic.Settings.General.SwitchOnDoubleClick="Lumipat sa eksena kapag nakadalawang-pindot" -Basic.Settings.General.StudioPortraitLayout="Paganahin ang larawan/vertical layout" +Basic.Settings.General.StudioPortraitLayout="Paganahin ang portrait/vertical layout" Basic.Settings.General.TogglePreviewProgramLabels="Ipakita ang mga label ng preview/program" -Basic.Settings.General.Multiview="Kadaming-pagtingin" Basic.Settings.General.Multiview.MouseSwitch="Pindutin para lumipat sa mga eksena" Basic.Settings.General.Multiview.DrawSourceNames="Ipakita ang mga pangalan ng eksena" Basic.Settings.General.Multiview.DrawSafeAreas="Iguhit ang mga safe area (EBU R 95)" @@ -744,7 +771,7 @@ Basic.Settings.Output.Simple.Warn.Encoder="Babala: Ang pagrekord sa isang encoder ng software sa ibang kalidad kaysa sa stream ay mangangailangan ng dagdag na paggamit ng CPU kung mag-stream at mag-record ka sa parehong oras." Basic.Settings.Output.Simple.Warn.Lossless.Msg="Sigurado ka bang gusto mong gumamit ng kalidad na walang pagkawala?" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Software (x264 mababang preset ng paggamit ng CPU, nagpapataas ng laki ng file)" -Basic.Settings.Output.Warn.EnforceResolutionFPS.Title="Hindi Nagaakmang Resolusyon o Bilis ng Frames" +Basic.Settings.Output.Warn.EnforceResolutionFPS.Title="Di-Akmang Resolusyon o Framerate" Basic.Settings.Output.Warn.EnforceResolutionFPS.Msg="Ang serbisyong pangstreaming ito ay hindi sinusuporta ang kasalukuyang resolusyon at/o ang bilis ng frames mo. Papalitan sila sa mga pinakaakmang value:\n\n%1\n\n. Gusto mo bang magpatuloy?" Basic.Settings.Output.Warn.EnforceResolutionFPS.Resolution="Resolusyon: %1" Basic.Settings.Output.Warn.EnforceResolutionFPS.FPS="Bilis ng Frames: %1" @@ -805,10 +832,10 @@ Basic.Settings.Output.SplitFile.Size="Hatiin ang Sukat" Screenshot="Pagtutunguan ng Screenshot" Screenshot.SourceHotkey="I-screenshot Ang Napiling Pinagtututukan" -Screenshot.StudioProgram="Kuha ng Screen (Program)" -Screenshot.Preview="Screenshot (Prebiyu)" -Screenshot.Scene="Kuha ng Screen (Eksena)" -Screenshot.Source="Screenshot (Pinagtututukan)" +Screenshot.StudioProgram="I-save ang Screenshot ng Programa" +Screenshot.Preview="I-save ang Preview Screenshot" +Screenshot.Scene="I-save ang Screenshot ng Eksena" +Screenshot.Source="I-save ang Screenshot ng Pinagtututukan" FilenameFormatting.TT.CCYY="Taon, apat na digit" FilenameFormatting.TT.YY="Taon, huling dalawang digit (00-99)" FilenameFormatting.TT.MM="Buwan bilang isang decimal number (01-12)" @@ -832,13 +859,13 @@ FilenameFormatting.TT.Y="Taon" Basic.Settings.Video="Bidyo" Basic.Settings.Video.Adapter="Adapter ng Bidyo" -Basic.Settings.Video.BaseResolution="Base (Kanbas) Resolusyon" -Basic.Settings.Video.ScaledResolution="Output (Pinaliit) Resolusyon" +Basic.Settings.Video.BaseResolution="Basehang (Kanbas) Resolusyon" +Basic.Settings.Video.ScaledResolution="Output na (Scaled) Resolusyon" Basic.Settings.Video.DownscaleFilter.Unavailable="Nagtutugma ang mga resolusyon, walang kinakailangang pagbabawas" Basic.Settings.Video.FPSCommon="Karaniwang Balyo ng FPS" Basic.Settings.Video.FPSInteger="Balyo ng Integer FPS" Basic.Settings.Video.FPSFraction="Balyo ng Fractional FPS" -Basic.Settings.Video.InvalidResolution="Ang Balyo ng resolusyong ay imbalido. Dapat ito widthxheight (i.e. 1920x1080)" +Basic.Settings.Video.InvalidResolution="Ang value ng resolusyon ay imbalido. Dapat ito ay widthxheight (i.e. 1920x1080)" Basic.Settings.Video.CurrentlyActive="Ang kasulukuyang Bidyo output ay aktibo. Paki turn off ang anumang output para mabago ang bidyo settings." Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (Pinakamabilis, pero malabo pag mag i-scaling)" Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubic (Sharpened scaling, 16 mga halimbawa)" @@ -983,7 +1010,7 @@ AddUrl.Title="Magdagdag ng Source gamit ang URL" AddUrl.Text="Hinila mo ang isang URL papunta sa OBS. Kusang madaragdag ang link bilang isang source. Tuloy?" ResizeOutputSizeOfSource="Baguhin ang laki ng output (laki ng pinagmulan)" -ResizeOutputSizeOfSource.Text="Ang mga base at output resolution ay babaguhin sa laki ng kasalukuyang pinagmulan." +ResizeOutputSizeOfSource.Text="Ang basehan at output na resolusyon ay magiging magkasinlaki ng kasalukuyang source." ResizeOutputSizeOfSource.Continue="Gusto mo bang magpatuloy?" PreviewTransition="Silipin ang Transisyon" Importer="Pang-angkat ng Koleksyon ng Eksena" @@ -1060,7 +1087,7 @@ YouTube.Actions.EventsLoading="Naglulunan ng listahan ng mga events" YouTube.Actions.EventCreated.Title="Nagawa ang Event" YouTube.Actions.EventCreated.Text="Matagumpay na nagawa ang Event" -YouTube.Actions.Stream.ScheduledFor="Nakaskedyul para sa %1" +YouTube.Actions.Stream.ScheduledFor="Nakaiskedyul sa %1" YouTube.Actions.Stream.Resume="Ipatuloy ang nahintong stream" YouTube.Actions.Stream.YTStudio="Kusang ginawa ng Youtube Studio" YouTube.Actions.Notify.CreatingBroadcast="Gumagawa ng bagong Live na Palabas, sandali lang..."
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/fr-FR.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/fr-FR.ini
Changed
@@ -108,6 +108,7 @@ List="Liste" Grid="Grille" Automatic="Automatique" +ComingSoon="Nouveauté à venir" PluginsFailedToLoad.Title="Erreur de chargement du plugin" PluginsFailedToLoad.Text="Les plugins OBS suivants n'ont pas pu être chargés :\n\n%1\nVeuillez mettre à jour ou supprimer ces plugins." AlreadyRunning.Title="OBS est déjà en cours d'exécution" @@ -116,7 +117,7 @@ CrashHandling.Dialog.Title="Détection d'un crash d'OBS Studio" CrashHandling.Labels.Text="OBS Studio ne s'est pas arrêté correctement. \n\nExécuter en mode sans échec (plugins tiers, scripts et WebSockets désactivés)?" CrashHandling.Labels.PrivacyNotice="Vous pouvez également téléverser automatiquement le rapport de crash le plus récent vers OBSProject.<br /><br />Veuillez lire la <a href='https://obsproject.com/privacy-policy'>Politique de Confidentialité</a> et porter une attention particulière aux sections concernant le téléversement avant de téléverser des fichiers." -CrashHandling.Checkbox.SendReport="J'ai lu la politique de confidentialité et j'accepte le téléversement. " +CrashHandling.Checkbox.SendReport="J'ai lu la politique de confidentialité et j'accepte le téléversement." CrashHandling.Buttons.LaunchSafe="Démarrer en mode sans échec" CrashHandling.Buttons.LaunchNormal="Démarrer en mode normal" CrashHandling.Errors.UploadJSONError="Une erreur est survenue lors de la tentative de téléversement du rapport de crash le plus récent. Veuillez réessayer plus tard." @@ -330,8 +331,8 @@ ConfirmStopRecord.Text="Êtes-vous certain de vouloir arrêter l'enregistrement ?" ConfirmBWTest.Title="Démarrer le test de bande passante ?" ConfirmBWTest.Text="Vous avez configuré OBS en mode \"test de bande passante\". Ce mode permet de tester le réseau sans que votre chaîne ne soit en direct. Une fois que vous aurez effectué les tests, vous devrez le désactiver afin que les spectateurs puissent voir votre stream.\n\nVoulez-vous continuer ?" -ConfirmExit.Title="Quitter OBS ?" -ConfirmExit.Text="OBS est actuellement actif. Tous les streams/enregistrements vont être arrêtés. Êtes-vous sûr de vouloir quitter ?" +ConfirmExit.Title="Sorties Actives" +ConfirmExit.Text="OBS est encore en cours d’utilisation. Tous les flux/enregistrements seront arrêtés." ConfirmRemove.Title="Confirmer la suppression" ConfirmRemove.Text="Êtes-vous sûr de vouloir supprimer '%1' ?" ConfirmRemove.TextMultiple="Voulez-vous vraiment supprimer %1 éléments ?" @@ -798,12 +799,14 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Activer la configuration de remplacement" Basic.Settings.Stream.MultitrackVideoLabel="Vidéo multipiste" Basic.Settings.Stream.MultitrackVideoExtraCanvas="Canevas additionnel" +Basic.Settings.Stream.WHIPSimulcastInfo="Simulcast vous permet d'encoder et d'envoyer plusieurs qualités vidéo. <a href=“https://obsproject.com/kb/whip-streaming-guide”>En savoir plus</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Nombre total de couches" Basic.Settings.Stream.AdvancedOptions="Options avancées" Basic.Settings.Output="Sortie" Basic.Settings.Output.Format="Format d'enregistrement" Basic.Settings.Output.Format.MKV="Vidéo Matroska (.mkv)" -Basic.Settings.Output.Format.hMP4="MP4 hybride BÊTA (.mp4)" -Basic.Settings.Output.Format.hMOV="MOV hybride BETA (.mov)" +Basic.Settings.Output.Format.hMP4="MP4 hybride (.mp4)" +Basic.Settings.Output.Format.hMOV="MOV hybride (.mov)" Basic.Settings.Output.Format.fMP4="MP4 fragmenté (.mp4)" Basic.Settings.Output.Format.fMOV="MOV fragmenté (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="Le MOV fragmenté enregistre l'enregistrement par morceaux et ne nécessite pas la même finalisation que les fichiers MOV traditionnels.\nCela garantit que le fichier reste lisible même si l'écriture sur le disque est interrompue, par exemple, suite à un BSOD ou d'une coupure de courant.\n\nCe format peut ne pas être compatible avec tous les lecteurs et éditeurs. Utilisez Fichier → Convertir des enregistrements pour convertir le fichier dans un format plus compatible si nécessaire." @@ -970,6 +973,7 @@ Basic.Settings.Video.Numerator="Numérateur" Basic.Settings.Video.Denominator="Dénominateur" Basic.Settings.Video.Renderer="Rendu" +Basic.Settings.Video.Renderer.Experimental="%1 (Expérimental)" Basic.Settings.Video.InvalidResolution="Valeurs de résolution non-valides. Elles doivent être au format largeurxhauteur (par exemple 1920x1080)" Basic.Settings.Video.CurrentlyActive="La sortie vidéo est actuellement active. Veuillez éteindre toutes les sorties avant de modifier vos paramètres vidéo." Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinéaire (le plus rapide, mais flou en cas de mise à l'échelle)" @@ -1288,7 +1292,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 nécessite plusieurs paramètres différents pour Audio → Général → Chaînes" Basic.OpenPluginManager="Gestionnaire de plugins" PluginManager="Gestionnaire de plugins" -PluginManager.HelpText="Gestionnaire de plugins" -PluginManager.Restart="Redémarrer OBS ?" -PluginManager.NeedsRestart="Pour appliquer ces modifications, OBS doit redémarrer. Voulez-vous redémarrer maintenant ?" +PluginManager.Restart="OBS Studio doit être redémarré pour applique les modifications de plugin" PluginManager.MissingPlugin="PLUGIN INTROUVABLE" +PluginManager.Section.Discover="Parcourir" +PluginManager.Section.Manage="Installé" +PluginManager.Section.Updates="Mises à jour" +PluginManager.Section.Manage.Title="Gestion des plugins activés"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/gd-GB.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/gd-GB.ini
Changed
@@ -23,6 +23,17 @@ Mixer="Measgadair fuaime" Browse="Rùraich" DroppedFrames="Frèaman a thuit: %1 (%2%)" +Projector.Open.Program="Proiseactair Prògram Fosgailte" +Projector.Open.Preview="Fosgail am Proiseactair Ro-shealladh" +Projector.Open.Scene="Proiseactair Seallaidh Fosgailte" +Projector.Open.Source="Proiseactair Stòr Fosgailte" +Projector.Open.Multiview="Fosgail Ioma-shealladh" +Projector.Window="Uinneag ùr" +Projector.Title="Pròiseactair" +Projector.Title.Scene="Sealladh:%1" +Projector.Title.Source="Stòr: %1" +Projector.Title.Multiview="Ioma-shealladh" +Projector.ResizeWindowToContent="Freagarraich an uinneag ris an t-susbaint" Clear="Falamhaich" Revert="Till" Show="Seall" @@ -82,6 +93,7 @@ LogViewer="Sealladair logaichean" ShowOnStartup="Seall aig an toiseach" OpenFile="Fosgail am faidhle" +AddScene="Cuir sealladh ris" AddSource="Cuir na Tùs" AlreadyRunning.Title="Tha OBS ’ga ruith mar-thà" AlreadyRunning.Text="Tha OBS ’ga ruith mar-thà! Mur ann gun robh thu airson seo a dhèanamh, dùin sìos gach ionstans de dh’OBS mus fheuch thu ri ionstans eile dheth a ruith. Ma shuidhich thu OBS ach an dèid fhìor-lùghdachadh gu treidhe an t-siostaim thoir sùil a bheil e ’ga ruith an-siud fhathast." @@ -272,8 +284,6 @@ ConfirmStopRecord.Text="A bheil thu cinnteach gu bheil thu airson sgur dhen chlàradh?" ConfirmBWTest.Title="A bheil thu airson deuchainn an leud banna a thòiseachadh?" ConfirmBWTest.Text="Rèitich thu OBS sa mhodh deuchainn leud banna. Leigidh am modh seo leat an lìonra a chur fo dheuchainn gun a bhith tighinn beò air an t-seanail agad. Nuair a bhios tu deiseil leis an deuchainn, feumaidh tu a chur à comas ach am faic an amharc an sruthadh agad.\n\nA bheil thu airson leantainn air adhart?" -ConfirmExit.Title="A bheil thu airson OBS fhàgail?" -ConfirmExit.Text="Tha OBS gnìomhach an-dràsta. Thèid gach sruthadh no clàradh a chur gu crìch. A bheil thu cinnteach gu bheil thu airson fhàgail?" ConfirmRemove.Title="Dearbh an toirt air falbh" ConfirmRemove.TextMultiple="A bheil thu cinnteach gu bheil thu airson %1 nithean a thoirt air falbh?" Output.StartStreamFailed="Cha deach leinn tòiseachadh air an t-sruthadh"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/gl-ES.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/gl-ES.ini
Changed
@@ -110,6 +110,7 @@ List="Lista" Grid="Grella" Automatic="Automático" +ComingSoon="Proximamente" PluginsFailedToLoad.Title="Erro ao cargar o complemento" PluginsFailedToLoad.Text="Os seguintes complementos de OBS non se puideron cargar:\n\n%1\nPor favor, actualiza ou elimina estes complementos." AlreadyRunning.Title="O OBS xa está en execución" @@ -335,8 +336,8 @@ ConfirmStopRecord.Text="Confirma que quere deter a gravación?" ConfirmBWTest.Title="Iniciar a proba do largo de banda?" ConfirmBWTest.Text="Tes o OBS configurado no modo de proba de largo de banda. Este modo permite probar a rede sen que a túa canle entre en directo. Unha vez rematada a proba, terás que desactivalo para que os espectadores poidan ver a túa emisión.\n\nQueres continuar?" -ConfirmExit.Title="Saír do OBS?" -ConfirmExit.Text="O OBS está activo neste intre. Deteranse todas as emisións/gravacións. Confirmas que queres saír?" +ConfirmExit.Title="Saídas activas" +ConfirmExit.Text="O OBS segue activo. Finalizaranse todas as transmisións/gravacións." ConfirmRemove.Title="Confirmar a retirada" ConfirmRemove.Text="Estás seguro de que desexas eliminar '%1'?" ConfirmRemove.TextMultiple="Confirmas que queres eliminar %1 elementos?" @@ -574,7 +575,7 @@ Basic.TransformWindow.BoundsType.ScaleToHeight="Escalar á altura dos límites" Basic.TransformWindow.BoundsType.Stretch="Estricar ata os límites" Basic.TransformWindow.Title="Editar transformación para '%1'" -Basic.TransformWindow.NoSelectedSource="Non hai ningunha fonte seleccionada" +Basic.TransformWindow.NoSelectedSource="Ningunha fonte seleccionada" Basic.Main.AddSourceHelp.Title="Non é posíbel engadir a fonte" Basic.Main.AddSourceHelp.Text="Ten que ter cando menos 1 escena para engadir unha fonte." Basic.Main.Scenes="Escenas" @@ -820,8 +821,8 @@ Basic.Settings.Stream.AdvancedOptions="Opcións avanzadas" Basic.Settings.Output="Saída" Basic.Settings.Output.Format="Formato de gravación" -Basic.Settings.Output.Format.hMP4="MP4 híbrido BETA (.mp4)" -Basic.Settings.Output.Format.hMOV="MOV híbrido BETA (.mov)" +Basic.Settings.Output.Format.hMP4="Híbrido MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="Híbrido MOV (.mov)" Basic.Settings.Output.Format.fMP4="MP4 fragmentado (.mp4)" Basic.Settings.Output.Format.fMOV="MOV fragmentado (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="MOV fragmentado escribe a gravación en partes e non require a mesma finalización que os ficheiros MOV tradicionais.\nIsto garante que o ficheiro siga sendo reproducible mesmo se a escrita no disco se interrompe, por exemplo, como resultado dun pantallazo azul ou perda de enerxía.\n\nIsto pode non ser compatible con todos os reprodutores e editores. Use Ficheiro → Remux gravacións para converter o ficheiro a un formato máis compatible se é necesario." @@ -1190,7 +1191,7 @@ Restart="Reiniciar" NeedsRestart="É preciso reiniciar o OBS Studio. Quere reinicialo agora?" LoadProfileNeedsRestart="O perfil contén configuracións que requiren reiniciar OBS: \n%1\n\nQueres reiniciar OBS para que estas configuracións teñan efecto?" -ContextBar.NoSelectedSource="Non hai ningunha fonte seleccionada" +ContextBar.NoSelectedSource="Ningunha fonte seleccionada" ContextBar.MediaControls.PlayMedia="Reproducir o medio" ContextBar.MediaControls.PauseMedia="Pausar o medio" ContextBar.MediaControls.StopMedia="Deter o medio" @@ -1298,3 +1299,11 @@ MultitrackVideo.IncompatibleSettings.AudioChannels="%1 non é actualmente compatible con Son → Xeral → Canles configurado en '%2', %3" MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="Son → Xeral → Canles ten que estar configurado en '%1'" MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 require diferentes configuracións para Son → Xeral → Canles" +Basic.OpenPluginManager="Xestor de complementos" +PluginManager="Xestor de complementos" +PluginManager.Restart="É necesario reiniciar OBS Studio para aplicar os trocos no cmplemento" +PluginManager.MissingPlugin="COMPLEMENTO NON ATOPADO" +PluginManager.Section.Discover="Navegar" +PluginManager.Section.Manage="Instalado" +PluginManager.Section.Updates="Actualizacións" +PluginManager.Section.Manage.Title="Xestionar complementos Activados"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/he-IL.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/he-IL.ini
Changed
@@ -111,6 +111,7 @@ List="רשימה" Grid="טבלה" Automatic="אוטומטי" +ComingSoon="בקרוב" PluginsFailedToLoad.Title="שגיאה בטעינת תוסף" PluginsFailedToLoad.Text="טעינת תוספי OBS הבאים נכשלה:\n\n%1\nנא לעדכן או להסיר תוספים אלה." AlreadyRunning.Title="OBS פועל כבר" @@ -337,8 +338,8 @@ ConfirmStopRecord.Text="האם לעצור את ההקלטה?" ConfirmBWTest.Title="להתחיל את בדיקת רוחב הפס?" ConfirmBWTest.Text="הגדרת את OBS למצב בדיקת רוחב פס. מצב זה מאפשר בדיקת רשת בלי שהערוץ שלך ישדר. כאשר הבדיקה תסתיים, יש לבטל מצב זה על מנת שהצופים שלך יוכלו לצפות בשידור החי.\n\nלהמשיך?" -ConfirmExit.Title="לצאת מ־OBS?" -ConfirmExit.Text="OBS פעיל כרגע. כל השידורים החיים/ההקלטות ייסגרו. לצאת?" +ConfirmExit.Title="ערוצי פלט פעילים" +ConfirmExit.Text="OBS עדיין פעיל כרגע. כל ההזרמות/הקלטות ייכבו." ConfirmRemove.Title="אישור הסרה" ConfirmRemove.Text="להסיר את ‚%1’?" ConfirmRemove.TextMultiple="להסיר %1 פריטים?" @@ -828,12 +829,15 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="הפעלת דריסת הגדרות" Basic.Settings.Stream.MultitrackVideoLabel="סרטון רב־רצועות" Basic.Settings.Stream.MultitrackVideoExtraCanvas="משטח עבודה נוסף" +Basic.Settings.Stream.WHIPSimulcastLabel="שידור מקבילי" +Basic.Settings.Stream.WHIPSimulcastInfo="שידור מקבילי מאפשר לך לקודד ולשלוח מגוון איכויות וידאו. <a href='https://obsproject.com/kb/whip-streaming-guide'>מידע נוסף</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="סך כל השכבות" Basic.Settings.Stream.AdvancedOptions="אפשרויות מתקדמות" Basic.Settings.Output="פלט" Basic.Settings.Output.Format="תצורת הקלטה" Basic.Settings.Output.Format.MKV="סרטון Matroska (.mkv)" -Basic.Settings.Output.Format.hMP4="MP4 משולב ניסיוני (.mp4)" -Basic.Settings.Output.Format.hMOV="MOV משולב בשלבי בדיקה (.mov)" +Basic.Settings.Output.Format.hMP4="MP4 משולב (.mp4)" +Basic.Settings.Output.Format.hMOV="MOV משולב (.mov)" Basic.Settings.Output.Format.fMP4="MP4 מחולק (.mp4)" Basic.Settings.Output.Format.fMOV="MOV מחולק (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="MOV מחולק כותב את ההקלטה במקטעים ואינו דורש את אותו הגימור כמו קובצי MOV מסורתיים.\nאופן השמירה הזה מבטיח שלא תהיה בעיה לנגן את הקובץ אפילו אם הכתיבה לכונן נקטעת, למשל, כתוצאה ממסך כחול או נפילת חשמל.\n\nיש איזשהו חשש לחוסר תאימות מול כל הנגנים והעורכים. אפשר להשתמש בקובץ ← ריבוב הקלטות כדי להמיר את הקובץ לתצורה תואמת יותר במידת הצורך." @@ -1004,6 +1008,7 @@ Basic.Settings.Video.Numerator="מונה" Basic.Settings.Video.Denominator="מכנה" Basic.Settings.Video.Renderer="מעבד" +Basic.Settings.Video.Renderer.Experimental="%1 (ניסיוני)" Basic.Settings.Video.InvalidResolution="ערך רזולוציה לא חוקי. חייב להיות widthxheight (לדוגמה 1920x1080)" Basic.Settings.Video.CurrentlyActive="פלט וידאו פעיל כעת. נא כבה את כל הפלטים בכדי לשנות הגדרות וידאו." Basic.Settings.Video.DownscaleFilter.Bilinear="דו־ליניארי (מהיר ביותר, מטושטש בשינוי קנה מידה)" @@ -1330,7 +1335,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 דורש מגוון הגדרות שונות עבור שמע ← כללי ← ערוצים" Basic.OpenPluginManager="מנהל תוספים" PluginManager="מנהל תוספים" -PluginManager.HelpText="מנהל תוספים" -PluginManager.Restart="להפעיל מחדש את OBS?" -PluginManager.NeedsRestart="כדי להחיל שינויים אלה, יש להפעיל מחדש את OBS. האם ברצונך להפעיל מחדש עכשיו?" +PluginManager.Restart="צריך להפעיל מחדש את OBS Studio כדי להחיל שינויי תוספים" PluginManager.MissingPlugin="תוסף לא נמצא" +PluginManager.Section.Discover="עיון" +PluginManager.Section.Manage="מותקן" +PluginManager.Section.Updates="עדכונים" +PluginManager.Section.Manage.Title="ניהול תוספים פעילים"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/hi-IN.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/hi-IN.ini
Changed
@@ -26,6 +26,7 @@ Stereo="स्टीरियो" DroppedFrames="हटाए गए फ़्रेम %1 (%2%)" Projector.Open.Program="प्रोग्राम प्रोजेक्टर खोलें" +Projector.Open.Preview="पूर्वावलोकन प्रोजेक्टर खोलें" Projector.Open.Scene="दृश्य प्रोजेक्टर खोलें" Projector.Open.Source="स्रोत प्रोजेक्टर खोलें" Projector.Open.Multiview="मल्टीव्यू में दिखाएँ" @@ -110,6 +111,7 @@ List="सूची" Grid="ग्रिड" Automatic="स्वचालित" +ComingSoon="जल्द आ रहा है" PluginsFailedToLoad.Title="प्लगइन लोड त्रुटि" PluginsFailedToLoad.Text="निम्न OBS प्लग इन लोड होने में विफल :\n\n%1\nकृपया इन प्लग इन को अपडेट करें या निकालें." AlreadyRunning.Title="OBS चल रहा है" @@ -117,6 +119,12 @@ AlreadyRunning.LaunchAnyway="फिर भी लॉन्च करें" CrashHandling.Dialog.Title="OBS स्टूडियो क्रैश हुआ है" CrashHandling.Labels.Text="आपके पिछले सत्र में OBS ठीक से बंद नहीं हुआ.\n\nक्या आप सुरक्षित मोड में चलाना चाहेंगे (तृतीय-पक्ष प्लगइन्स, स्क्रिप्टिंग और वेबसॉकेट्स अक्षम)?" +CrashHandling.Labels.PrivacyNotice="आप OBSProject पर नवीनतम क्रैश रिपोर्ट को स्वचालित रूप से अपलोड करना भी चुन सकते हैं.<br /><br />आप किसी भी फ़ाइल अपलोड करने से पहले कृपया <a href='https://obsproject.com/privacy-policy'> गोपनीयता नीति</a> पढ़ें तथा फ़ाइल अपलोड करने से संबंधित भागों पर विशेष ध्यान दें." +CrashHandling.Checkbox.SendReport="मैंने गोपनीयता नीति और अपलोड के लिए सहमति पढ़ी है." +CrashHandling.Buttons.LaunchSafe="सुरक्षित मोड में चलाएं" +CrashHandling.Buttons.LaunchNormal="सामान्य मोड में चलाएं" +CrashHandling.Errors.UploadJSONError="सबसे हालिया क्रैश लॉग अपलोड करने का प्रयास करते समय एक त्रुटि हुई. कृपया बाद में फिर से प्रयास करें." +CrashHandling.Errors.Title="क्रैश लॉग अपलोड त्रुटि" SafeMode.Restart="क्या आप ओबीएस को सुरक्षित मोड में पुनः आरंभ करना चाहते हैं (तृतीय-पक्ष प्लगइन्स, स्क्रिप्टिंग और वेबसॉकेट्स अक्षम)?" SafeMode.RestartNormal="क्या आप ओबीएस को सामान्य मोड में पुनः आरंभ करना चाहते हैं?" ChromeOS.Title="असमर्थित प्लेटफार्म" @@ -233,6 +241,7 @@ Basic.Stats.MegabytesSent="कुल डेटा आउटपुट" Basic.Stats.Bitrate="बिटरेट" Basic.Stats.DiskFullIn="डिस्क पूर्ण (लगभग)" +Basic.Stats.DiskFullIn.Text="%1 घंटे, %2 मिनट" Basic.Stats.ResetStats="आँकड़े रीसेट करें" ResetUIWarning.Title="कृपया सुनिश्चित करें कि आप UI रीसेट करना चाहते हैं?" ResetUIWarning.Text="UI को रीसेट करने से अतिरिक्त डॉक छिप जाएंगे। अगर आप चाहते हैं कि ये डॉक दिखाई दें, तो आपको इन डॉक को डॉक्स मेनू से दिखाना होगा.\n\nक्या आप वाकई UI को रीसेट करना चाहते हैं?" @@ -329,8 +338,8 @@ ConfirmStopRecord.Text="क्या आप रिकॉर्डिंग को रोकना चाहते हैं?" ConfirmBWTest.Title="बैंडविड्थ टेस्ट आरंभ करें?" ConfirmBWTest.Text="आपका OBS बैंडविड्थ परीक्षण मोड में कॉन्फ़िगर है. यह मोड आपके चैनल को लाइव किए बिना नेटवर्क टेस्टिंग की अनुमति देता है. एक बार जब आप परीक्षण कर लेते हैं, तो आपको दर्शकों को अपनी स्ट्रीम देखने में सक्षम करने के लिए इसे निष्क्रिय करना होगा.\n\nक्या आप आगे जाना चाहते हैं?" -ConfirmExit.Title="OBS से निकलें?" -ConfirmExit.Text="OBS वर्तमान में सक्रिय है. सभी स्ट्रीम/रिकॉर्डिंग बंद हो जाएंगे. क्या आप सचमुच बाहर निकलना चाहते हैं?" +ConfirmExit.Title="सक्रिय आउटपुट" +ConfirmExit.Text="OBS अभी भी सक्रिय है. सभी सक्रिय स्ट्रीम/रिकॉर्डिंग बंद हो जाएंगे." ConfirmRemove.Title="हटाने की संपुष्टि" ConfirmRemove.Text="क्या आप सचमुच '%1' को हटाना चाहते हैं?" ConfirmRemove.TextMultiple="क्या आप सचमुच %1 को हटाना चाहते हैं?" @@ -367,6 +376,16 @@ Output.NoBroadcast.Text="स्ट्रीमिंग शुरू करने से पहले आपको एक प्रसारण सेट करना होगा." Output.BroadcastStartFailed="प्रसारण आरंभ करने में विफल" Output.BroadcastStopFailed="प्रसारण का अंत करने में विफल" +LogUploadDialog.Title="OBS Studio लॉग फ़ाइल अपलोड" +LogUploadDialog.Labels.PrivacyNotice="कृपया कोई भी फ़ाइल अपलोड करने से पहले <a href='https://obsproject.com/privacy-policy'>गोपनीयता नीति</a> और फ़ाइल अपलोड से संबंधित उसका अनुभाग पढ़ें।" +LogUploadDialog.Labels.Progress="लॉग अपलोड प्रगति पर है। कृपया प्रतीक्षा करें..." +LogUploadDialog.Labels.Description.AppLog="आपकी लॉग फ़ाइल अपलोड कर दी गई है। अब आप डीबगिंग या सहायता के लिए URL साझा कर सकते हैं।" +LogUploadDialog.Labels.Description.CrashLog="आपकी क्रैश रिपोर्ट अपलोड कर दी गई है। अब आप डीबगिंग के लिए URL शेयर कर सकते हैं।" +LogUploadDialog.Buttons.ConfirmUpload="अपलोड" +LogUploadDialog.Buttons.CopyURL="URL की प्रतिलिपि बनाएं" +LogUploadDialog.Buttons.AnalyzeURL="लॉग फ़ाइल का विश्लेषण करें" +LogUploadDialog.Buttons.RetryButton="दुबारा कोशिश करें" +LogUploadDialog.Errors.Template="फ़ाइल अपलोड करते समय एक त्रुटि हुई:\n\n%1" Remux.SourceFile="OBS रिकॉर्डिंग" Remux.TargetFile="लक्ष्य फाइल" Remux.Remux="रीमक्स" @@ -619,6 +638,9 @@ Basic.MainMenu.Edit.Scale.Canvas="कैनवास (%1x%2)" Basic.MainMenu.Edit.Scale.Output="आउटपुट (%1x%2)" Basic.MainMenu.Edit.Scale.Manual="स्केल किया गया (%1x%2)" +Basic.MainMenu.Edit.Scale.ZoomIn="ज़ूम इन" +Basic.MainMenu.Edit.Scale.ZoomOut="ज़ूम आउट" +Basic.MainMenu.Edit.Scale.ResetZoom="ज़ूम रीसेट करें" Basic.MainMenu.Edit.Transform="रूपांतर करें (&T)" Basic.MainMenu.Edit.Transform.EditTransform="रूपांतर संपादित करें... (&E)" Basic.MainMenu.Edit.Transform.CopyTransform="रूपांतर की प्रतिलिपि बनाएं" @@ -655,6 +677,8 @@ Basic.MainMenu.Docks.LockDocks="डॉक्स &लॉक करें" Basic.MainMenu.Docks.SideDocks="पूर्ण-ऊंचाई वाले डॉक्स(&F)" Basic.MainMenu.Docks.CustomBrowserDocks="&कस्टम ब्राउज़र डॉक्स..." +Basic.MainMenu.Import="आयात..." +Basic.MainMenu.Export="निर्यात..." Basic.MainMenu.SceneCollection="दृश्य संग्रह (&S)" Basic.MainMenu.Profile="प्रोफ़ाइल (&P)" Basic.MainMenu.Profile.Import="प्रोफ़ाइल आयात करें" @@ -753,6 +777,13 @@ Basic.Settings.Appearance.General.Theme="प्रदर्शनशैली" Basic.Settings.Appearance.General.Variant="शैली" Basic.Settings.Appearance.General.NoVariant="कोई शैलियाँ उपलब्ध नहीं हैं" +Basic.Settings.Appearance.FontScale="फ़ॉन्ट आकार" +Basic.Settings.Appearance.Density="घनत्व" +Basic.Settings.Appearance.Classic="क्लासिक" +Basic.Settings.Appearance.Compact="सघन" +Basic.Settings.Appearance.Normal="सामान्य" +Basic.Settings.Appearance.Comfortable="सहज" +Basic.Settings.Appearance.OptionsWarning="इस शैली के लिए कुछ उपस्थिति विकल्प उपलब्ध नहीं हैं." Basic.Settings.Stream="स्ट्रीम" Basic.Settings.Stream.Destination="गंतव्य" Basic.Settings.Stream.Custom.UseAuthentication="प्रमाणीकरण का प्रयोग करें" @@ -787,12 +818,13 @@ Basic.Settings.Stream.MultitrackVideoConfigOverride="कॉन्फ़िग ओवरराइड (JSON)" Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="कॉन्फ़िग ओवरराइड सक्षम करें" Basic.Settings.Stream.MultitrackVideoLabel="मल्टीट्रैक वीडियो" +Basic.Settings.Stream.MultitrackVideoExtraCanvas="अतिरिक्त कैनवास" Basic.Settings.Stream.AdvancedOptions="उन्नत विकल्प" Basic.Settings.Output="आउटपुट" Basic.Settings.Output.Format="रिकॉर्डिंग प्रारूप" Basic.Settings.Output.Format.MKV="मत्रोस्का वीडियो (.mkv)" -Basic.Settings.Output.Format.hMP4="हाइब्रिड MP4 बीटा (.mp4)" -Basic.Settings.Output.Format.hMOV="हाइब्रिड MOV बीटा (.mov)" +Basic.Settings.Output.Format.hMP4="हाइब्रिड MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="हाइब्रिड MOV (.mov)" Basic.Settings.Output.Format.fMP4="खंडित MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="खंडित MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="खंडित MOV रिकॉर्डिंग को विखंडों में लिखता है और पारंपरिक MOV फ़ाइलों के समान इन्हेंअंतिम रूप देने की आवश्यकता नहीं होती है.\nयह सुनिश्चित करता है कि डिस्क पर लिखने में बाधा होने पर भी फ़ाइल चलने योग्य बनी रहे, उदाहरण के लिए, BSOD या पावर लॉस के परिणामस्वरूप.\n\nयह सभी प्लेअर्स और संपादकों के साथ संगत नहीं भी हो सकता है. यदि आवश्यक हो तो फ़ाइल को अधिक संगत प्रारूप में बदलने के लिए फ़ाइल → रीमक्स रिकॉर्डिंग का उपयोग करें." @@ -961,6 +993,7 @@ Basic.Settings.Video.Numerator="अंश" Basic.Settings.Video.Denominator="भाजक" Basic.Settings.Video.Renderer="रेंडरर" +Basic.Settings.Video.Renderer.Experimental="%1 (प्रयोगात्मक)" Basic.Settings.Video.InvalidResolution="अमान्य रिज़ॉल्यूशन मान. चौड़ाई x ऊंचाई (यानी 1920x1080) होनी चाहिए" Basic.Settings.Video.CurrentlyActive="वीडियो आउटपुट वर्तमान में सक्रिय है. वीडियो सेटिंग बदलने के लिए कृपया किसी भी आउटपुट को बंद करें." Basic.Settings.Video.DownscaleFilter.Bilinear="बाइलिनियर (सबसे तेज़, लेकिन स्केलिंग होने पर धुंधली)" @@ -1170,6 +1203,7 @@ Importer.Program="ऐप्लिकेशन का पता चला" Importer.AutomaticCollectionPrompt="दृश्य संग्रह के लिए स्वचालित रूप से खोज करें" Importer.AutomaticCollectionText="ओबीएस स्वचालित रूप से समर्थित तृतीय-पक्ष प्रोग्रामों से आयात योग्य दृश्य संग्रह ढूंढ सकता है. क्या आप चाहते हैं कि OBS आपके लिए स्वचालित रूप से संग्रह ढूंढे?\n\nआप इसे बाद में सेटिंग > सामान्य > आयातक में जाकर बदल सकते हैं." +Importer.SelectFile="ब्राउज़ करें..." Restart="पुनः आरंभ करें" NeedsRestart="OBS स्टूडियो को पुनरारंभ करने की आवश्यकता है. क्या आप अभी पुनः आरंभ करना चाहते हैं?" LoadProfileNeedsRestart="प्रोफ़ाइल में ऐसी सेटिंग्स हैं जिनके लिए OBS को पुन: आरंभ करने की आवश्यकता है :\n%1\n\nक्या आप इन सेटिंग्स के प्रभावी होने के लिए OBS को पुन: आरंभ करना चाहते हैं?" @@ -1258,6 +1292,7 @@ FailedToStartStream.MissingConfigURL="वर्तमान सेवा के लिए कोई कॉन्फिग URL उपलब्ध नहीं है" FailedToStartStream.NoCustomRTMPURLInSettings="कस्टम RTMP URL निर्दिष्ट नहीं है" FailedToStartStream.InvalidCustomConfig="अमान्य कस्टम कॉन्फ़िग" +FailedToStartStream.MissingCanvas="एक कॉन्फ़िगर किया गया अतिरिक्त कैनवास अनुपस्थित है" FailedToStartStream.FailedToCreateMultitrackVideoService="मल्टीट्रैक वीडियो सेवा निर्माण में विफल" FailedToStartStream.FailedToCreateMultitrackVideoOutput="मल्टीट्रैक वीडियो RTMP आउटपुट बनाने में विफल" FailedToStartStream.EncoderNotAvailable="NVENC उपलब्ध नहीं है.\n\nएनकोडर प्रकार '%1' ढूंढने में विफल" @@ -1281,3 +1316,11 @@ MultitrackVideo.IncompatibleSettings.AudioChannels="%1 वर्तमान में ऑडियो → सामान्य → चैनल के साथ संगत नहीं है '%2', %3 पर सेट किया गया" MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="ऑडियो → सामान्य → चैनल को '%1' पर सेट करने की आवश्यकता है" MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 को ऑडियो → सामान्य → चैनल के लिए कई अलग-अलग सेटिंग्स की आवश्यकता है" +Basic.OpenPluginManager="प्लगइन प्रबंधक" +PluginManager="प्लगइन प्रबंधक" +PluginManager.Restart="प्लगइन परिवर्तन लागू करने के लिए OBS स्टूडियो को पुनरारंभ किया जाना चाहिए" +PluginManager.MissingPlugin="प्लगइन नहीं मिला" +PluginManager.Section.Discover="ब्राउज़" +PluginManager.Section.Manage="इंस्टॉल हुआ" +PluginManager.Section.Updates="अपडेट" +PluginManager.Section.Manage.Title="सक्षम प्लगइन्स प्रबंधित करें"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/hr-HR.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/hr-HR.ini
Changed
@@ -108,11 +108,16 @@ List="Popis" Grid="Rešetka" Automatic="Automatski" +ComingSoon="Uskoro dolazi" PluginsFailedToLoad.Title="Greška u učitavanju plugin" PluginsFailedToLoad.Text="Naredni OBS plugins nisu uspjelo utvarati:\n\n%1\nMolim vas ažuriranje ili sklanjajte ovi plugins." AlreadyRunning.Title="OBS je već pokrenut" AlreadyRunning.Text="OBS je već pokrenut! Osim ako to niste namjeravali učiniti, isključite sve postojeće OBS instance prije nego što pokušate pokrenuti novu instancu. Ako imate OBS postavljen na minimiziraj u traku sustava, provjerite radi li još uvijek tamo." AlreadyRunning.LaunchAnyway="Svejedno pokreni" +CrashHandling.Dialog.Title="Rušenje programa OBS Studio" +CrashHandling.Buttons.LaunchSafe="Pokreni u sigurnom načinu" +CrashHandling.Buttons.LaunchNormal="Pokreni u normalnom načinu" +CrashHandling.Errors.UploadJSONError="Prilikom prijenosa posljednjeg zapisnika o rušenju dogodila se pogreška. Ponovno pokušajte kasnije." SafeMode.Restart="Želite li ponovno pokrenuti OBS u sigurnom načinu (strani dodatci, skripte i WebSocketi onemogućeni)?" SafeMode.RestartNormal="Želite li ponovno pokrenuti OBS u normalnom načinu?" ChromeOS.Title="Nepodržana platforma" @@ -324,8 +329,6 @@ ConfirmStopRecord.Text="Stvarno želiš prekinuti snimanje?" ConfirmBWTest.Title="Započeti test propusnosti?" ConfirmBWTest.Text="OBS je konfiguriran u načinu rada za testiranje propusnosti. Ovaj način rada omogućuje testiranje mreže bez pokretanja uživo vašeg kanala. Nakon što završite s testiranjem, morat ćete ga onemogućiti kako bi gledatelji mogli vidjeti vaš stream.\n\nŽelite li nastaviti?" -ConfirmExit.Title="Napustiti OBS?" -ConfirmExit.Text="OBS je trenutačno aktivan. Svi streamovi/snimanja bit će ugašeni. Jeste li sigurni da želite izaći?" ConfirmRemove.Title="Potvrdi uklanjanje" ConfirmRemove.Text="Stvarno želiš ukloniti „%1”?" ConfirmRemove.TextMultiple="Jeste li sigurni da želite ukloniti %1 stavke?" @@ -362,6 +365,11 @@ Output.NoBroadcast.Text="Prije početka streaminga morate postaviti emitiranje." Output.BroadcastStartFailed="Nije uspjelo započeti emitiranje" Output.BroadcastStopFailed="Zaustavljanje emitiranja nije uspjelo" +LogUploadDialog.Buttons.ConfirmUpload="Prijenos" +LogUploadDialog.Buttons.CopyURL="Kopiraj URL zapisnika" +LogUploadDialog.Buttons.AnalyzeURL="Analizira Log datoteke" +LogUploadDialog.Buttons.RetryButton="Pokušaj ponovno" +LogUploadDialog.Errors.Template="Nastala je pogreška prilikom slanja datoteke:\n\n%1" Remux.SourceFile="OBS-snimak" Remux.TargetFile="Datoteka" Remux.Stop="Zaustavi remultiplikator" @@ -762,8 +770,8 @@ Basic.Settings.Appearance.Density="Gustoća" Basic.Settings.Appearance.Classic="Klasično" Basic.Settings.Appearance.Compact="Kompaktno" -Basic.Settings.Appearance.Normal="Normalna" -Basic.Settings.Appearance.Comfortable="Udoban" +Basic.Settings.Appearance.Normal="Normalno" +Basic.Settings.Appearance.Comfortable="Ugodno" Basic.Settings.Appearance.OptionsWarning="Neke opcije izgleda nisu dostupne za ovaj stil." Basic.Settings.Stream="Strim" Basic.Settings.Stream.Destination="Odredište" @@ -800,11 +808,15 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Omogući poništavanje konfiguracije" Basic.Settings.Stream.MultitrackVideoLabel="Višekanalni video" Basic.Settings.Stream.MultitrackVideoExtraCanvas="Dodatno platno" +Basic.Settings.Stream.WHIPSimulcastLabel="Simultani prijenos" +Basic.Settings.Stream.WHIPSimulcastInfo="Simultani prijenos vam omogućuje odiranje i slanje videa različitih kvaliteta. <a href='https://obsproject.com/kb/whip-streaming-guide'>Više informacija</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Ukupno slojeva" Basic.Settings.Stream.AdvancedOptions="Napredne mogućnosti" Basic.Settings.Output="Izlaz" Basic.Settings.Output.Format="Format snimanja" Basic.Settings.Output.Format.MKV="Matroska video (.mkv)" -Basic.Settings.Output.Format.hMP4="Hibridni MP4 BETA (.mp4)" +Basic.Settings.Output.Format.hMP4="Hibridni MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="Hibridni MOV (.mov)" Basic.Settings.Output.Format.fMP4="Fragmentirani MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="Fragmentirani MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="Fragmentirani MOV sprema snimku u dijelovima i ne zahtijeva dovršavanje poput tradicionalnih MOV datoteka.\nTo osigurava ispravno funkcioniranje datoteke čak i ako se snimanje prekine, primjerice zbog gubitka struje.\n\nOva značajka mogla bi biti nekompatibilna s nekim reproduktorima ili uređivačima. Za pretvorbu datoteke u kompatibilniji format idite na Datoteka → Prepakiranje snimaka." @@ -1289,3 +1301,11 @@ MultitrackVideo.IncompatibleSettings.AudioChannels="%1 trenutno nije kompatibilan s postavkom Audio → Općenito → Kanali postavljenom na '%2', %3" MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="Zvuk → Općenito → Kanali treba biti postavljeno na '%1'" MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 zahtijeva više različitih postavki za Zvuk → Općenito → Kanali" +Basic.OpenPluginManager="Upravljanje dodacima" +PluginManager="Upravljanje dodacima" +PluginManager.Restart="OBS Studio treba ponovno pokrenuti kako bi se promjene primijenile na dodatak" +PluginManager.MissingPlugin="DODATAK NIJE PRONAĐEN" +PluginManager.Section.Discover="Pregledaj" +PluginManager.Section.Manage="Instalirano" +PluginManager.Section.Updates="Ažuriranja" +PluginManager.Section.Manage.Title="Upravljanje omogućenim dodacima"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/hu-HU.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/hu-HU.ini
Changed
@@ -107,6 +107,7 @@ List="Lista" Grid="Rács" Automatic="Automatikus" +ComingSoon="Hamarosan" PluginsFailedToLoad.Title="Hiba a bővítmény betöltése során" PluginsFailedToLoad.Text="A következő OBS bővítmények betöltése sikertelen:\n\n%1\nFrissítse vagy távolítsa el ezeket a bővítményeket." AlreadyRunning.Title="Az OBS már fut" @@ -114,9 +115,12 @@ AlreadyRunning.LaunchAnyway="Indítás mindenképpen" CrashHandling.Dialog.Title="Az OBS Studio összeomlása észlelve" CrashHandling.Labels.Text="Az OBS Studio nem megfelelően állt le.\n\nÚjraindítja csökkentett módban (letiltja a harmadik féltől származó bővítményeket, szkripteket és WebSocketeket)?" +CrashHandling.Labels.PrivacyNotice="Automatikusan is feltöltheti a legfrissebb összeomlás-jelentést az OBS Projekt felé.<br /><br />Mielőtt bármilyen fájlt feltöltene, olvassa el az <a href='https://obsproject.com/privacy-policy'>Adatvédelmi irányelveket</a>, és különösen figyeljen oda a fájlfeltöltésekre vonatkozó részeket." CrashHandling.Checkbox.SendReport="Elolvastam az adatvédelmi irányelveket, és beleegyezek a feltöltésbe." CrashHandling.Buttons.LaunchSafe="Futtatás csökkentett módban" CrashHandling.Buttons.LaunchNormal="Futtatás normál módban" +CrashHandling.Errors.UploadJSONError="Hiba történt a legutóbbi összeomlás-jelentés feltöltési kísérlete során. Próbálja újra később." +CrashHandling.Errors.Title="Összeomlásjelentés-feltöltési hiba" SafeMode.Restart="Újraindítja csökkentett módban az OBS-t (letiltja a harmadik féltől származó bővítményeket, szkripteket és WebSocketeket)?" SafeMode.RestartNormal="Újraindítja normál módban az OBS-t?" ChromeOS.Title="Nem támogatott platform" @@ -260,7 +264,7 @@ Basic.AddTransition="Konfigurálható átmenet hozzáadása" Basic.RemoveTransition="Konfigurálható átmenet eltávolítása" Basic.TransitionProperties="Átmenet tulajdonságai" -Basic.SceneTransitions="Jelenet átmenetek" +Basic.SceneTransitions="Jelenetátmenetek" Basic.TransitionDuration="Időtartam" Basic.TogglePreviewProgramMode="Stúdió mód" Basic.EnablePreviewProgramMode="Stúdió mód engedélyezése" @@ -271,9 +275,9 @@ Undo.Delete="„%1” törlése" Undo.Rename="„%1” átnevezése" Undo.SceneCollection.Switch="Váltás erre: „%1”" -Undo.Item.Undo="Visszavonás: %1" -Undo.Item.Redo="Mégis: %1" -Undo.Sources.Multi="%1 forrás törlése" +Undo.Item.Undo="%1 Visszavonása" +Undo.Item.Redo="%1 Újrateremtése" +Undo.Sources.Multi="%1 forrásinak törlése" Undo.Filters="„%1” szűrő megváltoztatása" Undo.Filters.Paste.Single="„%1” szűrő beillesztése ide: „%2”" Undo.Filters.Paste.Multiple="Szűrők másolása innen: „%1”, ide: „%2”" @@ -329,8 +333,8 @@ ConfirmStopRecord.Text="Biztos, hogy leállítja a felvételt?" ConfirmBWTest.Title="Sávszélesség teszt indítása?" ConfirmBWTest.Text="Az OBS sávszélességteszt módra van beállítva. Ez a mód hálózattesztelésre való, anélkül működik, hogy élő adást indítana. Amint a vizsgálat lezajlott, ki kell kapcsolnia, hogy az adás a nézők számára is megjelenjen.\n\nFolytatja?" -ConfirmExit.Title="Kilép az OBS-ből?" -ConfirmExit.Text="Az OBS jelenleg aktív. Minden közvetítést vagy felvétel le fog állni. Biztos, hogy kilép?" +ConfirmExit.Title="Aktív kimenetek" +ConfirmExit.Text="Az OBS jelenleg is aktív. Az összes közvetítés/felvétel le fog állni." ConfirmRemove.Title="Eltávolítás megerősítése" ConfirmRemove.Text="Biztos, hogy eltávolítja a következőt: „%1”?" ConfirmRemove.TextMultiple="Biztos, hogy eltávolítja ezt a(z) %1 elemet?" @@ -367,6 +371,8 @@ Output.NoBroadcast.Text="Be kell állítania egy adást, hogy elindíthassa a közvetítést." Output.BroadcastStartFailed="Az adás elindítása sikertelen" Output.BroadcastStopFailed="Az adás leállítása sikertelen" +LogUploadDialog.Title="OBS Studio-naplófájlfeltöltés" +LogUploadDialog.Labels.PrivacyNotice="Mielőtt bármilyen fájt feltöltene, olvassa el az <a href='https://obsproject.com/privacy-policy'>Adatvédelmi irányelveket</a> és a fájlfeltöltésre vonatkozó szakaszokat." LogUploadDialog.Labels.Progress="A napló feltöltése folyamatban van. Kis türelmet…" LogUploadDialog.Labels.Description.AppLog="A naplófájl feltöltésre került. Most már megoszthatja ezt a webcímet hibakeresési és támogatási célokból." LogUploadDialog.Labels.Description.CrashLog="Az összeomlási jelentés feltöltésre került. Most már megoszthatja ezt a webcímet hibakeresési célokból." @@ -374,6 +380,8 @@ LogUploadDialog.Buttons.CopyURL="Napló webcímének másolása" LogUploadDialog.Buttons.AnalyzeURL="Naplófájl elemzése" LogUploadDialog.Buttons.RetryButton="Újra" +LogUploadDialog.Errors.Template="Hiba történt a fájl feltöltése során:\n\n%1" +LogUploadDialog.Errors.NoLogFile="Nem található feltöltendő fájl, vagy a fájl üres volt." Remux.SourceFile="OBS felvétel" Remux.TargetFile="Célfájl" Remux.Stop="Remux megállítása" @@ -396,7 +404,6 @@ MissingFiles.MissingFile="Hiányzó fájl" MissingFiles.NewFile="Új fájl" MissingFiles.HelpText="Néhány fájl hiányzik az OBS legutolsó használata óta." -MissingFiles.Clear="<törölve>" MissingFiles.NumFound="%1 / %2 találat" MissingFiles.Search="Könyvtár keresése…" MissingFiles.SelectFile="Fájl kiválasztása..." @@ -588,6 +595,7 @@ Basic.Main.PauseRecording="Felvétel szüneteltetése" Basic.Main.UnpauseRecording="Felvétel folytatása" Basic.Main.SplitFile="Felvétel fájljának felosztása" +Basic.Main.AddChapterMarker="Fejezetjel hozzáadása (csak hibrid MP4/MOV esetén)" Basic.Main.StoppingRecording="Felvétel leállítása..." Basic.Main.StopReplayBuffer="Visszajátszási puffer megállítása" Basic.Main.StoppingReplayBuffer="Visszajátszási puffer megállítása…" @@ -812,10 +820,13 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Beállítások felülbírálásának bekapcsolása" Basic.Settings.Stream.MultitrackVideoLabel="Többsávos videó" Basic.Settings.Stream.MultitrackVideoExtraCanvas="További vászon" +Basic.Settings.Stream.WHIPSimulcastInfo="A Simulcast lehetővé teszi több videóminőség egyidejű kódolását és küldését. <a href='https://obsproject.com/kb/whip-streaming-guide'>További tudnivalók</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Rétegek száma" Basic.Settings.Stream.AdvancedOptions="Speciális beállítások" Basic.Settings.Output="Kimenet" Basic.Settings.Output.Format="Felvétel formátuma" -Basic.Settings.Output.Format.hMP4="Hibrid MP4 BÉTA (.mp4)" +Basic.Settings.Output.Format.hMP4="Hibrid MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="Hibrid MOV (.mov)" Basic.Settings.Output.Format.fMP4="Töredékes MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="Töredékes MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="A töredékes MOV darabokban írja ki a felvételt, és nem igényli a hagyományos MOV-fájlok esetén szükséges véglegesítést.\nEz biztosítja azt, hogy a fájl akkor is lejátszható marad, ha a lemezre írás megszakad, például egy kékhalál vagy egy áramszünet miatt.\n\nEz nem biztos, hogy minden lejátszóval és szerkesztővel kompatibilis. Ha szükséges, akkor használja Fájl → Felvételek remuxolása lehetőséget, hogy kompatibilisebb formátumba alakítsa a fájlt." @@ -984,6 +995,7 @@ Basic.Settings.Video.Numerator="Számláló" Basic.Settings.Video.Denominator="Nevező" Basic.Settings.Video.Renderer="Megjelenítő" +Basic.Settings.Video.Renderer.Experimental="%1 (kísérleti)" Basic.Settings.Video.InvalidResolution="Érvénytelen felbontás érték. szélességxmagasság formátumúnak kell lennie (például 1920 x 1080)" Basic.Settings.Video.CurrentlyActive="A videokimenet jelenleg aktív. Kapcsoljon ki minden kimenetet a videobeállítások módosításához." Basic.Settings.Video.DownscaleFilter.Bilinear="Bilineáris (leggyorsabb, de méretezésnél elmosódott lehet)" @@ -1156,7 +1168,7 @@ NoSources.Title="Nincsenek források" NoSources.Text="Úgy fest, hogy nem adott hozzá semmilyen videóforrást, így fekete képet fog adni. Biztos, hogy ezt szeretné?" NoSources.Text.AddSource="Hozzáadhat forrásokat bármikor a + ikonra kattintva a Források doboz alatt a fő ablakban." -NoSources.Label="Önnek nincsenek forrásai.\nKattintson alul a + gombra,\nvagy jobbklikkeljen ide, hogy hozzáadjon egyet." +NoSources.Label="Nincsenek forrásai.\nKattintson alul a + gombra,\nvagy kattintson ide jobb egérgombbal,\nhogy hozzáadjon egyet." ChangeBG="Szín megadása" CustomColor="Egyéni szín" BrowserSource.EnableHardwareAcceleration="Böngészőforrás hardveres támogatásának engedélyezése" @@ -1181,7 +1193,7 @@ Importer.Path="Gyűjtemény elérési útja" Importer.Program="Észlelt alkalmazás" Importer.AutomaticCollectionPrompt="Jelenetgyűjtemények automatikus keresése" -Importer.AutomaticCollectionText="Az OBS automatikusan tud importálható jelenetgyűjteményeket keresni a támogatott harmadik félektől származó programokból. Szeretné, hogy az OBS automatikusan megkeresse Önnek a gyűjteményeket?\n\nKésőbb is beállíthatja ezt a Beállítások > Általános > Importálók menüpont alatt." +Importer.AutomaticCollectionText="Az OBS képes arra, hogy automatikusan importáható jelenetgyűjteményeket keressen a támogatott harmadik felektől származó programokból. Szeretné, hogy az OBS automatikusan megkeresse a gyűjteményeket?\n\nEzt később a Beállítások > Általános > Importálók menüpont alatt változtathatja meg." Importer.SelectFile="Tallózás..." Restart="Újraindítás" NeedsRestart="Az OBS Studio újraindítása szükséges. Szeretné újraindítani most?" @@ -1298,7 +1310,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="A(z) %1 több különböző beállítást igényel ennél: Hang → Általános → Csatornák" Basic.OpenPluginManager="Bővítménykezelő" PluginManager="Bővítménykezelő" -PluginManager.HelpText="Bővítménykezelő" -PluginManager.Restart="Újraindítja az OBS-t?" -PluginManager.NeedsRestart="A módosítások alkalmazásához újra kell indítani az OBS-t. Újraindítja most?" +PluginManager.Restart="A bővítményváltozások alkalmazásához újra kell indítani az OBS Studiót" PluginManager.MissingPlugin="A BŐVÍTMÉNY NEM TALÁLHATÓ" +PluginManager.Section.Discover="Tallózás" +PluginManager.Section.Manage="Telepítve" +PluginManager.Section.Updates="Frissítések" +PluginManager.Section.Manage.Title="Engedélyezett bővítmények kezelése"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/hy-AM.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/hy-AM.ini
Changed
@@ -310,8 +310,6 @@ ConfirmStopRecord.Text="Իսկապե՞ս ուզում եք դադարեցնել տեսագրումը:" ConfirmBWTest.Title="Սկսե՞լ թողունակության թեստը:" ConfirmBWTest.Text="Դուք կարգավորել եք OBS-ը թողունակության փորձարկման ռեժիմում: Այս ռեժիմը թույլ է տալիս փորձարկել ցանցը՝ առանց ձեր ալիքի ուղիղ եթերում: Փորձարկումն ավարտելուց հետո դուք պետք է անջատեք այս գործառույթը, որպեսզի դիտողները տեսնեն ձեր հեռարձակումը:\n\nՑանկանու՞մ եք շարունակել:" -ConfirmExit.Title="Դ՞ուրս գալ OBS-ից" -ConfirmExit.Text="OBS-ն այժմ ակտիվ է: Բոլոր հեռարձակումները/տեսագրությունները կփակվեն: Վստա՞հ եք, որ ցանկանում եք դուրս գալ:" ConfirmRemove.Title="Հաստատել հեռացումը" ConfirmRemove.Text="Իսկապե՞ս ցանկանում եք հեռացնել '%1'-ը:" ConfirmRemove.TextMultiple="Իսկապե՞ս ուզում եք հեռացնել %1 տարր:"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/id-ID.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/id-ID.ini
Changed
@@ -107,6 +107,7 @@ List="Daftar" Grid="Kisi-kisi" Automatic="Otomatis" +ComingSoon="Segera Hadir" PluginsFailedToLoad.Title="Kesalahan Memuat Plugin" PluginsFailedToLoad.Text="Plugin OBS berikut ini gagal untuk memuat:\n\n%1\nMohon perbarui atau hapus plugin tersebut." AlreadyRunning.Title="OBS sudah berjalan" @@ -328,8 +329,8 @@ ConfirmStopRecord.Text="Apakah Anda yakin ingin berhenti merekam?" ConfirmBWTest.Title="Mulai Pengujian Bandwidth?" ConfirmBWTest.Text="Anda telah mengonfigurasi OBS dalam mode pengujian bandwidth. Mode ini memungkinkan Anda untuk pengujian jaringan tanpa membuat saluran Anda disiarkan secara langsung. Setelah Anda selesai menguji, Anda harus menonaktifkannya agar penonton dapat melihat tayangan streaming Anda. \n\nApakah Anda ingin melanjutkan?" -ConfirmExit.Title="Keluar OBS?" -ConfirmExit.Text="Saat ini OBS sedang berjalan. Semua tayangan streaming/rekaman akan dinonaktifkan. Apakah Anda yakin ingin keluar?" +ConfirmExit.Title="Output yang Aktif" +ConfirmExit.Text="Saat ini OBS masih dalam keadaan aktif. Semua rekaman/streaming akan dinonaktifkan." ConfirmRemove.Title="Konfirmasi Hapus" ConfirmRemove.Text="Apakah Anda yakin ingin menghapus '%1'?" ConfirmRemove.TextMultiple="Apakah Anda yakin ingin menghapus item-item %1?" @@ -805,11 +806,12 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Aktifkan Penimpa Konfigurasi" Basic.Settings.Stream.MultitrackVideoLabel="Video Multitrack" Basic.Settings.Stream.MultitrackVideoExtraCanvas="Kanvas Tambahan" +Basic.Settings.Stream.WHIPSimulcastLabel="Siarsimul" +Basic.Settings.Stream.WHIPSimulcastInfo="Siarsimul memungkinkan Anda untuk mengkode dan mengirimkan beberapa kualitas video. <a href='https://obsproject.com/kb/whip-streaming-guide'>Pelajari Lebih Lanjut</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Total Lapisan" Basic.Settings.Stream.AdvancedOptions="Opsi Lanjutan" Basic.Settings.Output.Format="Format Rekaman" Basic.Settings.Output.Format.MKV="Video Matroska (.mkv)" -Basic.Settings.Output.Format.hMP4="Hybrid MP4 PERCOBAAN (.mp4)" -Basic.Settings.Output.Format.hMOV="Hybrid MOV PERCOBAAN (.mov)" Basic.Settings.Output.Format.fMP4="Pecahan MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="Pecahan MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="Pecahan MOV menulis rekaman dalam potongan chunk dan tidak memerlukan finalisasi yang sama seperti berkas MOV tradisional.\nIni memastikan berkas tetap dapat diputar bahkan jika menulis ke penyimpanan nya mengalami interupsi. Contohnya, akibat BSOD atau mati listrik.\n\nIni mungkin tidak kompatibel dengan semua pemutar dan penyunting. Gunakan Berkas → Remux Rekaman untuk mengubah berkas ke dalam format yang kompatibel jika diperlukan." @@ -973,6 +975,7 @@ Basic.Settings.Video.FPSFraction="Nilai FPS Pecahan" Basic.Settings.Video.Numerator="Pembilang" Basic.Settings.Video.Denominator="Penyebut" +Basic.Settings.Video.Renderer.Experimental="%1 (Percobaan)" Basic.Settings.Video.InvalidResolution="Nilai resolusi tidak sah. Harus lebarxtinggi (mis. 1920x1080)" Basic.Settings.Video.CurrentlyActive="Saat ini output video sedang aktif. Mohon nonaktifkan semua output untuk mengubah pengaturan video." Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (Tercepat, namun buram jika diskalakan)" @@ -1272,7 +1275,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 membutuhkan berbagai pengaturan yang berbeda untuk Audio → Umum → Saluran" Basic.OpenPluginManager="Pengelola Plugin" PluginManager="Pengelola Plugin" -PluginManager.HelpText="Pengelola Plugin" -PluginManager.Restart="Aktifkan Ulang OBS?" -PluginManager.NeedsRestart="Untuk menerapkan perubahan tersebut, OBS perlu diaktifkan ulang. Apakah Anda ingin mengaktifkan ulang sekarang?" +PluginManager.Restart="OBS Studio harus diaktifkan ulang untuk menerapkan perubahan plugin" PluginManager.MissingPlugin="PLUGIN TIDAK DITEMUKAN" +PluginManager.Section.Discover="Telusuri" +PluginManager.Section.Manage="Terpasang" +PluginManager.Section.Updates="Pembaruan" +PluginManager.Section.Manage.Title="Kelola Plugin yang Aktif"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/it-IT.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/it-IT.ini
Changed
@@ -107,6 +107,7 @@ List="Elenco" Grid="Griglia" Automatic="Automatico" +ComingSoon="Prossimamente" PluginsFailedToLoad.Title="Errore caricamento plugin" PluginsFailedToLoad.Text="Non sono stati caricati i seguenti plugin OBS :\n\n%1\nAggiorna o rimuovi questi plugin." AlreadyRunning.Title="OBS è già in esecuzione" @@ -330,8 +331,8 @@ ConfirmStopRecord.Text="Sei sicuro di voler interrompere la registrazione?" ConfirmBWTest.Title="Vuoi avviare il test della larghezza di banda?" ConfirmBWTest.Text="Hai configurato OBS in modalità di test di larghezza di banda. Questa modalità ti permette di eseguire i test della rete senza dover avviare una diretta. Quando hai finito di eseguire i test, ricordati di disattivare la modalità per permettere ai tuoi spettatori di guardare la diretta.\n\nVuoi continuare?" -ConfirmExit.Title="Vuoi uscire da OBS?" -ConfirmExit.Text="OBS è attualmente attivo. Tutte le dirette/registrazioni saranno interrotte. Sei sicuro di voler uscire?" +ConfirmExit.Title="Outpit attivi" +ConfirmExit.Text="OBS è ancora attualmente attivo. Tutti gli streaming/registrazioni verranno interrotti." ConfirmRemove.Title="Conferma la rimozione" ConfirmRemove.Text="Sei sicuro di voler rimuovere '%1'?" ConfirmRemove.TextMultiple="Sei sicuro di voler rimuovere %1 elementi?" @@ -818,12 +819,14 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Abilita la sovrascrittura della configurazione" Basic.Settings.Stream.MultitrackVideoLabel="Video multi traccia" Basic.Settings.Stream.MultitrackVideoExtraCanvas="Tele aggiuntive..." +Basic.Settings.Stream.WHIPSimulcastInfo="Simulcast consente di codificare e inviare più qualità video. <a href='https://obsproject.com/kb/whip-streaming-guide'>Maggiori info</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Livelli totali" Basic.Settings.Stream.AdvancedOptions="Opzioni avanzate" Basic.Settings.Output="Uscita" Basic.Settings.Output.Format="Formato di registrazione" Basic.Settings.Output.Format.MKV="Video Matroska (.mkv)" -Basic.Settings.Output.Format.hMP4="MP4 ibrido BETA (.mp4)" -Basic.Settings.Output.Format.hMOV="MOV ibrido BETA (.mov)" +Basic.Settings.Output.Format.hMP4="MP4 ibrido (.mp4)" +Basic.Settings.Output.Format.hMOV="MOV ibrido (.mov)" Basic.Settings.Output.Format.fMP4="MP4 frammentato (.mp4)" Basic.Settings.Output.Format.fMOV="MOV frammentato (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="Un file MOV frammentato scrive la registrazione in pezzi e non richiede la stessa finalizzazione dei file MOV tradizionali.\nQuesto assicura che il file rimanga riproducibile anche se la scrittura su disco viene interrotta, ad esempio, a causa di un BSOD o di una mancanza alimentazione.\n\nIl file frammentato porebbe non essere compatibile con tutti i programmi di riproduzione/modifica.\nSe necessario usa 'File' → 'Remux registrazioni' per convertire il file in un formato più compatibile." @@ -977,6 +980,7 @@ Basic.Settings.Video.Numerator="Numeratore" Basic.Settings.Video.Denominator="Denominatore" Basic.Settings.Video.Renderer="Modalità di rendering" +Basic.Settings.Video.Renderer.Experimental="%1 (sperimentale)" Basic.Settings.Video.InvalidResolution="Valore della risoluzione non valido. Deve essere larghezzaxaltezza (ad esempio 1920x1080)" Basic.Settings.Video.CurrentlyActive="L'uscita video è attualmente attiva. Interrompi qualunque uscita video per poter cambiare le impostazioni." Basic.Settings.Video.DownscaleFilter.Bilinear="Bilineare (il più veloce, ma sfocato se ridimensionato)" @@ -1298,7 +1302,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 richiede più configurazioni differenti per Audio → Generale → Canali" Basic.OpenPluginManager="Gestione plugin" PluginManager="Gestione plugin" -PluginManager.HelpText="Gestione plugin" -PluginManager.Restart="Vuoi riavviare OBS?" -PluginManager.NeedsRestart="Per applicare questi cambiamenti, OBS deve essere riavviato. Vuoi riavviare OBS?" +PluginManager.Restart="Per applicare le modifiche al plugin è necessario riavviare OBS Studio" PluginManager.MissingPlugin="PLUGIN NON TROVATO" +PluginManager.Section.Discover="Sfoglia" +PluginManager.Section.Manage="Installato" +PluginManager.Section.Updates="Aggiornamenti" +PluginManager.Section.Manage.Title="Gestisci plugin abilitati"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/ja-JP.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/ja-JP.ini
Changed
@@ -110,20 +110,21 @@ List="リスト" Grid="グリッド" Automatic="自動" +ComingSoon="近日公開" PluginsFailedToLoad.Title="プラグイン読み込みエラー" PluginsFailedToLoad.Text="以下のOBSプラグインの読み込みに失敗しました:\n\n%1\nこれらのプラグインを更新または削除してください。" AlreadyRunning.Title="OBSは既に実行中です" AlreadyRunning.Text="OBSは既に実行中です! 意図的でない限り新しいインスタンスを実行する前に既存のOBSインスタンスをシャットダウンしてください。 もしOBSをシステムトレイに最小化されるように設定されている場合は、まだ実行中であるかどうかを確認してください。" AlreadyRunning.LaunchAnyway="とにかく起動する" CrashHandling.Dialog.Title="OBS Studioのクラッシュが検出されました" -CrashHandling.Labels.Text="OBS Studioは正常にシャットダウンしませんでした。\n\nセーフモードで実行しますか? (サードパーティプラグイン、スクリプト、およびWebSocketは無効)" +CrashHandling.Labels.Text="OBS Studioは正常にシャットダウンされませんでした。\n\nセーフモード (サードパーティプラグイン、スクリプト、WebSocketは無効) で実行しますか?" CrashHandling.Labels.PrivacyNotice="最新のクラッシュレポートをOBSProjectに自動的にアップロードすることもできます。<br /><br />ファイルをアップロードする前に <a href='https://obsproject.com/privacy-policy'>プライバシーポリシー</a> をお読みいただき特にファイルのアップロードに関する部分に注意してください。" CrashHandling.Checkbox.SendReport="プライバシーポリシーを読みアップロードに同意します。" CrashHandling.Buttons.LaunchSafe="セーフモードで実行" CrashHandling.Buttons.LaunchNormal="通常モードで実行" CrashHandling.Errors.UploadJSONError="最新のクラッシュログのアップロード中にエラーが発生しました。 後でもう一度お試しください。" CrashHandling.Errors.Title="クラッシュログアップロードエラー" -SafeMode.Restart="OBSをセーフモード (サードパーティプラグイン、スクリプト、WebSocketが無効) で再起動しますか?" +SafeMode.Restart="OBSをセーフモード (サードパーティプラグイン、スクリプト、WebSocketは無効) で再起動しますか?" SafeMode.RestartNormal="OBSを通常モードで再起動しますか?" ChromeOS.Title="サポートされていないプラットフォーム" ChromeOS.Text="OBSはChromeOSのコンテナ内で実行されているようです。このプラットフォームはサポートされていません。" @@ -335,8 +336,8 @@ ConfirmStopRecord.Text="録画を停止しますか?" ConfirmBWTest.Title="帯域幅テストを開始しますか?" ConfirmBWTest.Text="OBSが帯域幅テストモードに設定されています。 このモードではチャンネルを配信中にしなくてもネットワークテストをすることが可能です。 テストが終了したら視聴者があなたの配信を見ることができるようにするために無効にする必要があります。\n\n続行しますか?" -ConfirmExit.Title="OBSを終了しますか?" -ConfirmExit.Text="OBSは現在アクティブです。 すべての配信/録画がシャットダウンされます。 終了してもよろしいですか?" +ConfirmExit.Title="アクティブな出力" +ConfirmExit.Text="OBSは現在アクティブです。 すべての配信/録画はシャットダウンされます。" ConfirmRemove.Title="削除の確認" ConfirmRemove.Text="'%1' を削除してもよろしいですか?" ConfirmRemove.TextMultiple="選択した %1 項目を削除してもよろしいですか?" @@ -825,11 +826,12 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="設定の上書きを有効にする" Basic.Settings.Stream.MultitrackVideoLabel="マルチトラックビデオ" Basic.Settings.Stream.MultitrackVideoExtraCanvas="追加キャンバス" +Basic.Settings.Stream.WHIPSimulcastLabel="サイマルキャスト" +Basic.Settings.Stream.WHIPSimulcastInfo="サイマルキャストでは複数のビデオ品質をエンコードして送信することができます。 <a href='https://obsproject.com/kb/whip-streaming-guide'>詳しくはこちら</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="合計レイヤー数" Basic.Settings.Stream.AdvancedOptions="詳細オプション" Basic.Settings.Output="出力" Basic.Settings.Output.Format="録画フォーマット" -Basic.Settings.Output.Format.hMP4="Hybrid MP4 ベータ版 (.mp4)" -Basic.Settings.Output.Format.hMOV="Hybrid MOV ベータ版 (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="Fragmented MOVは録画をチャンクで書き込み従来のMOVファイルのようなファイナライズ(完成処理)を必要としません。\nこれにより、例えばBSODや停電などの結果としてディスクへの書き込みが中断された場合でも、ファイルの再生が可能な状態を維持します。\n\nこれはすべてのプレーヤーやエディターで互換性があるとは限りません。 必要に応じて「ファイル → 録画の再多重化」を使用してより互換性の高い形式に変換してください。" Basic.Settings.Output.Format.TT.fragmented_mp4="Fragmented MP4は録画をチャンクで書き込み従来のMP4ファイルのようなファイナライズ(完成処理)を必要としません。\nこれにより、例えばBSODや停電などの結果としてディスクへの書き込みが中断された場合でも、ファイルの再生が可能な状態を維持します。\n\nこれはすべてのプレーヤーやエディターで互換性があるとは限りません。 必要に応じて「ファイル → 録画の再多重化」を使用してより互換性の高い形式に変換してください。" Basic.Settings.Output.Encoder.Video="映像エンコーダ" @@ -996,6 +998,7 @@ Basic.Settings.Video.Numerator="分子" Basic.Settings.Video.Denominator="分母" Basic.Settings.Video.Renderer="レンダラー" +Basic.Settings.Video.Renderer.Experimental="%1 (実験的)" Basic.Settings.Video.InvalidResolution="解像度の値が不正です。幅x高さ (例 1920x1080)にしてください" Basic.Settings.Video.CurrentlyActive="映像出力は現在アクティブです。映像設定を変更するには出力を停止してください。" Basic.Settings.Video.DownscaleFilter.Bilinear="バイリニア (最速だが、スケーリングするとぼやける)" @@ -1317,7 +1320,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 は 音声 → 一般 → チャンネル に複数の異なる設定が必要です" Basic.OpenPluginManager="プラグインマネージャー" PluginManager="プラグインマネージャー" -PluginManager.HelpText="プラグインマネージャー" -PluginManager.Restart="OBSを再起動しますか?" -PluginManager.NeedsRestart="これらの変更を適用するには、OBSを再起動する必要があります。 今すぐ再起動しますか?" +PluginManager.Restart="プラグインの変更を適用するにはOBS Studioを再起動する必要があります" PluginManager.MissingPlugin="プラグインが見つかりません" +PluginManager.Section.Discover="参照" +PluginManager.Section.Manage="インストール済み" +PluginManager.Section.Updates="更新" +PluginManager.Section.Manage.Title="有効プラグインの管理"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/ka-GE.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/ka-GE.ini
Changed
@@ -25,10 +25,10 @@ Mono="მონო" Stereo="სტერეო" DroppedFrames="კადრების ვარდნა %1 (%2%)" -Projector.Open.Program="პროგრამის ჩვენების გახსნა" -Projector.Open.Preview="შესათვალიერებელი ჩვენების გახსნა" -Projector.Open.Scene="სცენის ჩვენების გახსნა" -Projector.Open.Source="წყაროს ჩვენების გახსნა" +Projector.Open.Program="პროგრამის საჩვენებლად გაიხსნას" +Projector.Open.Preview="შეთვალიერების საჩვენებლად გაიხსნას" +Projector.Open.Scene="სცენის საჩვენებლად გაიხსნას" +Projector.Open.Source="წყაროს საჩვენებლად გაიხსნას" Projector.Open.Multiview="მრავალხედიანის გახსნა" Projector.Display="ეკრანი: %1" Projector.Window="ახალი ფანჯარა" @@ -36,7 +36,7 @@ Projector.Title.Scene="სცენა: %1" Projector.Title.Source="წყარო: %1" Projector.Title.Multiview="მრავალხედიანი" -Projector.ResizeWindowToContent="ფანჯრის შიგთავსის ზომაზე მორგება" +Projector.ResizeWindowToContent="ფანჯრის მორგება შიგთავსის ზომაზე" Clear="გასუფთავება" Revert="დაბრუნება" Show="ჩვენება" @@ -111,6 +111,7 @@ List="სია" Grid="ცხრილი" Automatic="ავტომატური" +ComingSoon="მალე" PluginsFailedToLoad.Title="დანამატის ჩატვირთვის შეცდომა" PluginsFailedToLoad.Text="მოცემული OBS-დანამატები ვერ ჩაიტვირთა:\n\n%1\nგთხოვთ, განაახლოთ ან მოაცილოთ აღნიშნული დანამატები." AlreadyRunning.Title="OBS უკვე გაშვებულია" @@ -148,7 +149,7 @@ Auth.ChannelFailure.Text="%1-ის არხის მონაცემების ჩატვირთვა ვერ მოხერხდა\n\n%2: %3" Auth.Chat="სასაუბრო" Auth.StreamInfo="ნაკადის მონაცემები" -TwitchAuth.Stats="Twitch-ის სტატისტიკა" +TwitchAuth.Stats="Twitch-გაზომვები" TwitchAuth.Feed="Twitch მოქმედებების არხი" TwitchAuth.TwoFactorFail.Title="ნაკადის გასაღების მოთხოვნა ვერ მოხერხდა" TwitchAuth.TwoFactorFail.Text="OBS ვერ უკავშირდება თქვენს Twitch-ანგარიშს. გთხოვთ გადაამოწმოთ, ნამდვილად ჩართული გაქვთ თუ არა ორსაფეხურიანი დადასტურება შესვლისას, თქვენი <a href='https://www.twitch.tv/settings/security'>Twitch-ის უსაფრთხოების პარამეტრებიდან</a>, რაც მოითხოვება ნაკადის გასაშვებად." @@ -221,13 +222,13 @@ Basic.AutoConfig.Info="თვითგამართვის მეგზური ირჩევს საუკეთესო პარამეტრებს თქვენი კომპიუტერის სიმძლავრისა და ინტერნეტსიჩქარის მიხედვით." Basic.AutoConfig.RunAnytime="მისი გაშვება ნებისმიერ დროს შეიძლება ხელსაწყოების მენიუდან." Basic.AutoConfig.TestPage.Result.StreamingResolution="ნაკადის (ზომაცვლილის) გაფართოება" -Basic.Stats="სტატისტიკა" +Basic.Stats="გაზომვები" Basic.Stats.CPUUsage="CPU დატვირთვა" Basic.Stats.HDDSpaceAvailable="ხელმისაწვდომი ადგილი დისკზე" Basic.Stats.MemoryUsage="მეხსიერების დატვირთვა" Basic.Stats.AverageTimeToRender="კადრის დამუშავების საშუალო დრო" -Basic.Stats.SkippedFrames="დაშიფვრის დაყოვნების გამო გამოტოვებული კადრები" -Basic.Stats.MissedFrames="დამუშავების დაყოვნების გამო გამოტოვებული კადრები" +Basic.Stats.SkippedFrames="დაშიფვრის შეყოვნებით დაკლებული კადრები" +Basic.Stats.MissedFrames="დამუშავების შეყოვნებით დაკლებული კადრები" Basic.Stats.Output.Stream="ნაკადი" Basic.Stats.Output.Recording="ჩაწერა" Basic.Stats.Status="მდგომარეობა" @@ -241,7 +242,7 @@ Basic.Stats.Bitrate="ბიტსიხშირე" Basic.Stats.DiskFullIn="დარჩენილი ადგილი დისკზე (დაახლ.)" Basic.Stats.DiskFullIn.Text="%1 საათი, %2 წუთი" -Basic.Stats.ResetStats="სტატისტიკის ჩამოყრა" +Basic.Stats.ResetStats="გაზომვების განულება" ResetUIWarning.Title="ნამდვილად გსურთ იერსახის პარამეტრების ჩამოყრა?" ResetUIWarning.Text="შედეგად, დამატებითი ნაწილები დაიმალება. მათი ხელახლა გამოჩენა, შესაძლებელი იქნება იერსახის ნაწილების მენიუდან, სურვილის შემთხვევაში.\n\nნამდვილად გსურთ იერსახის პარამეტრების ჩამოყრა?" Updater.Title="ხელმისაწვდომია განახლება" @@ -258,12 +259,12 @@ Updater.RepairConfirm.Title="მთლიანობის გადამოწმების დასტური" Updater.RepairConfirm.Text="მთლიანობის შემოწმებით მოინახება დაყენებული OBS-ის დაზიანებული ფაილები და ახლიდან ჩამოიტვირთება მათი შემცვლელი. გარკვეულ ხანს შეიძლება გასტანოს.\n\nგსურთ, განაგრძოთ?" Updater.FailedToLaunch="განახლების გაშვება ვერ მოხერხდა" -QuickTransitions.SwapScenes="გადასვლისას შესათვალიერებელი/გადაცემის სცენების შენაცვლება" -QuickTransitions.SwapScenesTT="გადასვლისას შესათვალიერებელი და გადასაცემად გამოტანილი სცენები ადგილებს გაცვლის (თუ გადაცემის თავდაპირველი სცენა კიდევ შემორჩენილია).\nგადაცემის თავდაპირველ სცენაზე გაკეთებული ცვლილებები არ გაუქმდება." +QuickTransitions.SwapScenes="გადასვლისას შეთვალიერება/გადაცემული სცენების შენაცვლება" +QuickTransitions.SwapScenesTT="გადასვლისას შესათვალიერებელი და გამოტანილი სცენები ადგილებს გაცვლის (თუ გადაცემულის თავდაპირველი სცენა ჯერ კიდევ შემორჩენილია).\გადაცემულის თავდაპირველ სცენაზე გაკეთებული ცვლილებები შენარჩუნდება." QuickTransitions.DuplicateScene="სცენის გაორკეცება" -QuickTransitions.DuplicateSceneTT="იმავე სცენის ჩასწორებისას, წყაროების გარდაქმნა/გამოჩენას შეძლებთ გამოტანილის ხელუხლებლად.\nდამატებით წყაროს პარამეტრების ჩასასწორებლად კი ჩართეთ „წყაროს გაორკეცება“.\nამ მნიშვნელობის ცვლილებისას გამოტანილი სცენა დაბრუნდება საწყისზე (თუ კიდევ შერმოჩენილია)." +QuickTransitions.DuplicateSceneTT="იმავე სცენის ჩასწორებისას, წყაროების გარდაქმნა/გამოჩენას შეძლებთ გამოტანილის ხელუხლებლად.\წყაროს პარამეტრების ჩასასწორებლად კი ჩართეთ „წყაროს გაორკეცება“.\nამ მნიშვნელობის ცვლილებისას გამოტანილი სცენა ბრუნდება საწყისზე (თუ კიდევ შერმოჩენილია)." QuickTransitions.EditProperties="წყაროს გაორკეცება" -QuickTransitions.EditPropertiesTT="იმავე სცენის ჩასწორებისას, წყაროს პარამეტრების შეცვლას შეძლებთ გამოტანილის ხელუხლებლად.\nიმუშავებს, მხოლოდ „სცენის გაორკეცებისას“.\nზოგიერთი წყარო (მაგალითად გადაღება ან ფაილები) არაა მხარდაჭერილი და ცალ-ცალკე ვერ ჩასწორდება.\nამ მნიშვნელობის ცვლილებისას გამოტანილი სცენა დაბრუნდება საწყისზე (თუ კიდევ შემორჩენილია).\n\nგაფრთხილება: წყაროს გაორკეცებისას შესაძლოა, სისტემის და ვიდეოდაფის დატვირთვამ მოიმატოს." +QuickTransitions.EditPropertiesTT="იმავე სცენის ჩასწორებისას, წყაროს პარამეტრების შეცვლას შეძლებთ გამოტანილის ხელუხლებლად.\nიმუშავებს მხოლოდ „სცენის გაორკეცებისას“.\nზოგიერთი წყარო (მაგალითად გადაღებისას ან ფაილების ჩვენებისას) მხარდაუჭერელია და სათითაოდ ვერ ჩასწორდება.\nამ მნიშვნელობის ცვლილებისას გამოტანილი სცენა ბრუნდება საწყისზე (თუ კიდევ შემორჩენილია).\n\nგაფრთხილება: წყაროს გაორკეცებისას შესაძლოა სისტემის და ვიდეოდაფის დატვირთვამ მოიმატოს." QuickTransitions.HotkeyName="სწრაფი გადასვლა: %1" Basic.AddTransition="გასამართი გადასვლის დამატება" Basic.RemoveTransition="გასამართი გადასვლის ამოშლა" @@ -337,8 +338,8 @@ ConfirmStopRecord.Text="ნამდვილად გსურთ ჩაწერის შეწყვეტა?" ConfirmBWTest.Title="შემოწმდეს ქსელის გამტარუნარიანობა?" ConfirmBWTest.Text="OBS-ისთვის მითითებული გაქვთ ქსელის გამტარუნარიანობის რეჟიმი. ეს რეჟიმი საშუალებას გაძლევთ, შეამოწმოთ ქსელის მუშაობა თქვენს არხზე პირდაპირ ეთერში გასვლის გარეშე. შემოწმების დასრულებისთანავე საჭიროა მისი გათიშვა, რომ მაყურებლებმა შეძლონ გაშვებული ნაკადის ხილვა\n\nგსურთ, განაგრძოთ?" -ConfirmExit.Title="OBS-დან გასვლა?" -ConfirmExit.Text="OBS ამჟამად მოქმედია. ყველა გაშვებული ნაკადი/ჩაწერა შეწყდება. ნამდვილად გსურთ გამოსვლა?" +ConfirmExit.Title="მოქმედი გამოტანა" +ConfirmExit.Text="OBS ჯერ კიდევ მოქმედია. ყველა მიმდინარე ნაკადი/ჩაწერა შეწყდება." ConfirmRemove.Title="წაშლის დადასტურება" ConfirmRemove.Text="ნამდვილად გსურთ, წაიშალოს „%1“?" ConfirmRemove.TextMultiple="ნამდვილად გსურთ, წაიშალოს %1 მათგანი?" @@ -372,7 +373,7 @@ Output.BadPath.Title="ფაილის არამართებული მისამართი" Output.BadPath.Text="ჩაწერისთვის შერჩეული საქაღალდე ვერ იხსნება. გთხოვთ გადაამოწმოთ მისამართი – პარამეტრები → გამოტანა → ჩაწერა." Output.NoBroadcast.Title="გადაცემა არაა გამართული" -Output.NoBroadcast.Text="ჯერ უნდა გამართოთ გადაცემა, ეთერში გაშვებამდე." +Output.NoBroadcast.Text="ჯერ უნდა გამართოთ გადაცემა ეთერში გაშვებამდე." Output.BroadcastStartFailed="ვერ მოხერხდა გადაცემის წამოწყება" Output.BroadcastStopFailed="ვერ მოხერხდა გადაცემის შეწყვეტა" LogUploadDialog.Title="OBS Studio – აღრიცხვის ფაილის ატვირთვა" @@ -386,13 +387,13 @@ LogUploadDialog.Buttons.RetryButton="გამეორება" LogUploadDialog.Errors.Template="შეცდომა წარმოიშვა ატვირთვის მცდელობისას:\n\n%1" LogUploadDialog.Errors.NoLogFile="ასატვირთი ფაილი ვერ მოიძებნა ან ცარიელია." -Remux.SourceFile="OBS ჩანაწერი" +Remux.SourceFile="OBS-ჩანაწერი" Remux.TargetFile="საბოლოო ფაილი" Remux.Remux="გადაფუთვა" Remux.Stop="გადაფუთვის შეწყვეტა" Remux.ClearFinished="დასრულებულების მოცილება" Remux.ClearAll="ყველას მოცილება" -Remux.OBSRecording="OBS ჩანაწერი" +Remux.OBSRecording="OBS-ჩანაწერი" Remux.FinishedTitle="გადაფუთვა დასრულებულია" Remux.Finished="ჩანაწერის გადაფუთვა დასრულდა" Remux.FinishedError="ჩანაწერის გადაფუთვა დასრულდა, თუმცა ფაილი, შესაძლოა არასრული იყოს" @@ -402,7 +403,7 @@ Remux.FileExists="მოცემული საბოლოო ფაილები უკვე არსებობს. გსურთ მათი ჩანაცვლება?" Remux.ExitUnfinishedTitle="მიმდინარეობს გადაფუთვა" Remux.ExitUnfinished="გადაფუთვა ჯერ არ დასრულებულა, ახლავე შეწყვეტის შედეგად, დასამუშავებელი საბოლოო ფაილი გამოუსადეგარი გახდება.\nნამდვილად გსურთ გადაფუთვის შეწყვეტა?" -Remux.HelpText="გადმოიტანეთ ფაილები გადასაფუთად ამ ფანჯარაში ან დაწკაპეთ „OBS ჩანაწერის“ ველის მარჯვენა კიდეზე, ფაილის ასარჩევად." +Remux.HelpText="გადმოიტანეთ ფაილები გადასაფუთად ამ ფანჯარაში ან დაწკაპეთ „OBS-ჩანაწერის“ ველის მარჯვენა კიდეზე ფაილის ასარჩევად." Remux.NoFilesAddedTitle="გადასაფუთი ფაილი არ დამატებულა" Remux.NoFilesAdded="გადასაფუთი ფაილი არაა. მოათავსეთ ერთი ან რამდენიმე ვიდეოს შემცველი საქაღალდე." MissingFiles="ფაილები აკლია" @@ -598,7 +599,7 @@ Basic.Main.PauseRecording="ჩაწერის შეჩერება" Basic.Main.UnpauseRecording="ჩაწერის გაგრძელება" Basic.Main.SplitFile="ჩანაწერისთვის ფაილის დანაწევრება" -Basic.Main.AddChapterMarker="თავის სანიშნის დართვა (შერეული MP4/MOV მხოლოდ)" +Basic.Main.AddChapterMarker="თავებად მონიშვნა (შერეული MP4/MOV მხოლოდ)" Basic.Main.StoppingRecording="ჩაწერა წყდება..." Basic.Main.StopReplayBuffer="გადახვევის გამორთვა" Basic.Main.StoppingReplayBuffer="გადახვევა გამოირთვება..." @@ -730,9 +731,9 @@ Basic.Settings.General.WarnBeforeStartingStream="დასტურის მოთხოვნა ეთერში გაშვებისას" Basic.Settings.General.WarnBeforeStoppingStream="დასტურის მოთხოვნა ნაკადის შეწყვეტისას" Basic.Settings.General.WarnBeforeStoppingRecord="დასტურის მოთხოვნა ჩაწერის შეწყვეტისას" -Basic.Settings.General.Projectors="გამოსახულების ჩვენება" +Basic.Settings.General.Projectors="საჩვენებელი გამოტანა" Basic.Settings.General.HideProjectorCursor="მაჩვენებლის დამალვა ჩვენებებზე" -Basic.Settings.General.ProjectorAlwaysOnTop="მიღებული გამოსახულებების სხვა ფანჯრების ზემოთ დატოვება" +Basic.Settings.General.ProjectorAlwaysOnTop="საჩვენებელი ფანჯრის ზემოთ შენარჩუნება" Basic.Settings.General.Snapping="წყაროს ჩარჩოს მიზიდვა განთავსებისას" Basic.Settings.General.ScreenSnapping="წყაროს ჩარჩოს მიზიდვა ეკრანის კიდესთან" Basic.Settings.General.CenterSnapping="წყაროს ჩარჩოს შუაწერტილისკენ მიზიდვა, თარაზულად და შვეულად" @@ -746,8 +747,8 @@ Basic.Settings.General.SysTray="სისტემის არე" Basic.Settings.General.SysTrayWhenStarted="სისტემის არეში ჩაკეცვა გაშვებისთანავე" Basic.Settings.General.SystemTrayHideMinimize="ყოველთვის სისტემის არეში ჩაკეცვა, ამოცანათა ზოლის ნაცვლად" -Basic.Settings.General.SaveProjectors="ჩვენების პარამეტრების დამახსოვრება გასვლისას" -Basic.Settings.General.CloseExistingProjectors="თითო სრულეკრანიანი ჩვენება თითოეულ ეკრანზე." +Basic.Settings.General.SaveProjectors="ჩვენებების დამახსოვრება გასვლისას" +Basic.Settings.General.CloseExistingProjectors="მხოლოდ თითო სრულეკრანიანი ჩვენება თითო ეკრანზე." Basic.Settings.General.Preview="შეთვალიერება" Basic.Settings.General.OverflowHidden="ზედმეტი არეების დამალვა" Basic.Settings.General.OverflowAlwaysVisible="ზედმეტი არეების ყოველთვის გამოჩენა" @@ -776,10 +777,10 @@ Basic.Settings.General.ChannelDescription.stable="უახლესი მდგრადი გამოშვება" Basic.Settings.General.ChannelName.beta="საცდელი / გამოსაშვებად მომზადებული" Basic.Settings.General.ChannelDescription.beta="სავარაუდოდ არამდგრადი გამოშვებამდელი ვერსიები" -Basic.Settings.Appearance="ვიზუალი" +Basic.Settings.Appearance="იერსახე" Basic.Settings.Appearance.General="ზოგადი" Basic.Settings.Appearance.General.Theme="თემა" -Basic.Settings.Appearance.General.Variant="სტილი" +Basic.Settings.Appearance.General.Variant="გაფორმება" Basic.Settings.Appearance.General.NoVariant="სტილები არაა" Basic.Settings.Appearance.FontScale="შრიფტის ზომა" Basic.Settings.Appearance.Density="სიმჭიდროვე" @@ -823,16 +824,19 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="კონფიგურაციის გადაწერის ჩართვა" Basic.Settings.Stream.MultitrackVideoLabel="მრავალჩანაწერიანი ვიდეო" Basic.Settings.Stream.MultitrackVideoExtraCanvas="დამატებითი ფონი" +Basic.Settings.Stream.WHIPSimulcastLabel="თანადროული გადაცემა" +Basic.Settings.Stream.WHIPSimulcastInfo="თანაგადაცემის მეშვეობით ვიდეო იშიფრება და იგზავნება რამდენიმე ხარისხით. <a href='https://obsproject.com/kb/whip-streaming-guide'>ვრცლად</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="შრეები სულ" Basic.Settings.Stream.AdvancedOptions="დამატებითი პარამეტრები" Basic.Settings.Output="გამოტანა" Basic.Settings.Output.Format="ჩაწერის ფორმატი" Basic.Settings.Output.Format.MKV="Matroska-ვიდეო (.mkv)" -Basic.Settings.Output.Format.hMP4="ჰიბრიდული MP4 ბეტა (.mp4)" -Basic.Settings.Output.Format.hMOV="შერეული MOV ბეტა (.mov)" +Basic.Settings.Output.Format.hMP4="შერეული MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="შერეული MOV (.mov)" Basic.Settings.Output.Format.fMP4="დანაწევრებული MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="დანაწევრებული MOV (.mov)" -Basic.Settings.Output.Format.TT.fragmented_mov="დანაწევრებული MOV-ჩანაწერი შედგება ნაწილებისგან და არ სჭირდება სრული სახის მიცემა მსგავსად ძველებური MOV-ფაილებისა.\nშედეგად, გასაშვებად ვარგისი რჩება დისკზე ჩაწერის უეცრად შეწყვეტის დროსაც კი, მაგალითად, ლურჯი ეკრანის ან ძაბვის ვარდნის გამო.\n\nამიტომ შეიძლება თავსებადი არ იყოს ყველა დამკვრელ და სამონტაჟო პროგრამასთან. თუ მეტად თავსებადი ფორმატია საჭირო, იხილეთ ფაილი → ჩანაწერების გადაფუთვა." -Basic.Settings.Output.Format.TT.fragmented_mp4="დანაწევრებული MP4-ჩანაწერი შედგება ნაწილებისგან და არ სჭირდება სრული სახის მიცემა მსგავსად ძველებური MP4-ფაილებისა.\nშედეგად, გასაშვებად ვარგისი რჩება დისკზე ჩაწერის უეცრად შეწყვეტის დროსაც კი, მაგალითად, ლურჯი ეკრანის ან ძაბვის ვარდნის გამო.\n\nამიტომ შეიძლება თავსებადი არ იყოს ყველა დამკვრელ და სამონტაჟო პროგრამასთან. თუ მეტად თავსებადი ფორმატია საჭირო, იხილეთ ფაილი → ჩანაწერების გადაფუთვა." +Basic.Settings.Output.Format.TT.fragmented_mov="დანაწევრებული MOV-ჩანაწერი შედგება ნაწილებისგან და არ ითხოვს სრული სახის მიცემას ძველებური MOV-ფაილებისგან განსხვავებით.\nშედეგად, გასაშვებად ვარგისი რჩება ჩაწერის უეცრად შეწყვეტის შემთხვევაშიც, მაგალითად, ლურჯი ეკრანის ან ძაბვის ვარდნის გამო.\n\nამიტომ შეიძლება არ იყოს თავსებადი ყველა დამკვრელ და სამონტაჟო პროგრამასთან. თუ მეტად თავსებადი ფორმატია საჭირო, იხილეთ ფაილი → ჩანაწერების გადაფუთვა." +Basic.Settings.Output.Format.TT.fragmented_mp4="დანაწევრებული MP4-ჩანაწერი შედგება ნაწილებისგან და არ ითხოვს სრული სახის მიცემას ძველებური MP4-ფაილებისგან განსხვავებით.\nშედეგად, გასაშვებად ვარგისი რჩება ჩაწერის უეცრად შეწყვეტის შემთხვევაშიც, მაგალითად, ლურჯი ეკრანის ან ძაბვის ვარდნის გამო.\n\nამიტომ შეიძლება თავსებადი არ იყოს ყველა დამკვრელ და სამონტაჟო პროგრამასთან. თუ მეტად თავსებადი ფორმატია საჭირო, იხილეთ ფაილი → ჩანაწერების გადაფუთვა." Basic.Settings.Output.Encoder.Video="ვიდეომშიფრავი" Basic.Settings.Output.Encoder.Audio="ხმის მშიფრავი" Basic.Settings.Output.SelectDirectory="საქაღალდის არჩევა ჩანაწერისთვის" @@ -877,7 +881,7 @@ Basic.Settings.Output.Simple.Encoder.Hardware.NVENC.HEVC="აპარატურული (NVENC, HEVC)" Basic.Settings.Output.Simple.Encoder.Hardware.Apple.H264="აპარატურული (Apple, H.264)" Basic.Settings.Output.Simple.Encoder.Hardware.Apple.HEVC="აპარატურული (Apple, HEVC)" -Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="პროგრამული (x264 ნაკლები CPU-მოხმარების მზა პარამეტრ. მეტი ფაილის ზომით)" +Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="პროგრამული (x264 ნაკლები CPU-მოხმარების მზა პარამ. მეტი ფაილის ზომით)" Basic.Settings.Output.Simple.Codec.AAC.Default="AAC (ნაგულისხმევი)" Basic.Settings.Output.Simple.TwitchVodTrack="Twitch-VOD-ჩანაწერი (გამოიყენება ჩანაწერი 2)" Basic.Settings.Output.Simple.RecAudioTrack="ხმოვანი ჩანაწერი" @@ -886,19 +890,19 @@ Basic.Settings.Output.Warn.EnforceResolutionFPS.Resolution="გაფართოება: %1" Basic.Settings.Output.Warn.EnforceResolutionFPS.FPS="FPS (კადრი/წმ): %1" Basic.Settings.Output.Warn.ServiceCodecCompatibility.Title="შეუთავსებელი დამშიფრავი" -Basic.Settings.Output.Warn.ServiceCodecCompatibility.Msg="ნაკადის გამშვები მომსახურება „%1“ ვერ იყენებს „%2\" დამშიფრავს. სანაცვლოდ მიეთითება „%3“.\n\nგსურთ, განაგრძოთ?" -Basic.Settings.Output.Warn.ServiceCodecCompatibility.Msg2="ნაკადის გამშვები მომსახურება „%1“ ვერ იყენებს „%2\" და „%3“ დამშიფრავებს. სანაცვლოდ მიეთითება „%4“ და „%5“.\n\nგსურთ, განაგრძოთ?" +Basic.Settings.Output.Warn.ServiceCodecCompatibility.Msg="ნაკადის გამშვები მომსახურება „%1“ და დამშიფრავი „%2\" შეუთავსებელია. სანაცვლოდ მიეთითება „%3“.\n\nგსურთ, განაგრძოთ?" +Basic.Settings.Output.Warn.ServiceCodecCompatibility.Msg2="ნაკადის გამშვები მომსახურება „%1“ შეუთავსებელია დამშიფრავებთან „%2\" და „%3“. სანაცვლოდ მიეთითება „%4“ და „%5“.\n\nგსურთ, განაგრძოთ?" Basic.Settings.Output.VideoBitrate="ვიდეოს ბიტსიხშირე" Basic.Settings.Output.AudioBitrate="ხმის ბიტსიხშირე" Basic.Settings.Output.Reconnect="თვითდაკავშირება ხელახლა" Basic.Settings.Output.RetryDelay="დაყოვნება მცდელობამდე" Basic.Settings.Output.MaxRetries="მცდელობა არაუმეტეს" -Basic.Settings.Output.Advanced="დამშიფრავის პარამეტრების მითითება (გაფართოებული)" -Basic.Settings.Output.EncoderPreset="მშიფრავის მზა პარამეტრ." +Basic.Settings.Output.Advanced="დამშიფრავის გამართვა (გაფართოებული)" +Basic.Settings.Output.EncoderPreset="მშიფრავის მზა პარამ." Basic.Settings.Output.EncoderPreset.ultrafast="%1 (პროცესორის ნაკლებად დატვირთვა, დაბალი ხარისხი)" Basic.Settings.Output.EncoderPreset.veryfast="%1 (ნაგულისხმევი) (პროცესორის ზომიერად დატვირთვა, საშუალო ხარისხი)" Basic.Settings.Output.EncoderPreset.fast="%1 (პროცესორის მეტად დატვირთვა, მაღალი ხარისხი)" -Basic.Settings.Output.CustomEncoderSettings="დამშიფრავის პარამეტრების მითითება" +Basic.Settings.Output.CustomEncoderSettings="მორგებული პარამ. მითითება" Basic.Settings.Output.CustomMuxerSettings="მფუთავის პარამ. მითითება" Basic.Settings.Output.NoSpaceFileName="ფაილის სახელის შექმნა გამოტოვებული ადგილების გარეშე" Basic.Settings.Output.Adv.Rescale="გამოტანის ზომაცვლა" @@ -998,6 +1002,7 @@ Basic.Settings.Video.Numerator="მრიცხველი" Basic.Settings.Video.Denominator="მნიშვნელი" Basic.Settings.Video.Renderer="დამმუშავებელი" +Basic.Settings.Video.Renderer.Experimental="%1 (საცდელი)" Basic.Settings.Video.InvalidResolution="გაფართოების არასწორი მნიშვნელობა. უნდა იყოს widthxheight (მაგ. 1920x1080)" Basic.Settings.Video.CurrentlyActive="მიმდინარეობს ვიდეოს გამოტანა. გთხოვთ, გათიშოთ ყველა გამოტანილი სიგნალი, ვიდეოს პარამეტრების ჩასასწორებლად." Basic.Settings.Video.DownscaleFilter.Bilinear="ორხაზოვანი (უსწრაფესი, მაგრამ ბუნდოვანი ზომაცვლა)" @@ -1053,7 +1058,7 @@ Basic.Settings.Accessibility.ColorOverrides.Preset.Custom="მითითებული" Basic.Settings.Accessibility.ColorOverrides.Preset.ColorBlind1="დაქვეითებული ფერითი მხედველობისთვის" Basic.Settings.Advanced="დამატებითი" -Basic.Settings.Advanced.General.ConfirmOnExit="მოქმედი გამოტანის შესახებ გაფრთხილება გამოსვლისას." +Basic.Settings.Advanced.General.ConfirmOnExit="მოქმედი გამოტანის შესახებ გაფრთხილება გათიშვისას" Basic.Settings.Advanced.General.ProcessPriority="უპირატესობა დამუშავებისას" Basic.Settings.Advanced.General.ProcessPriority.High="მაღალი" Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="საშუალოზე მაღალი" @@ -1091,11 +1096,11 @@ Basic.Settings.Advanced.Network.IPFamily="IP-ჯგუფი" Basic.Settings.Advanced.Network.EnableNewSocketLoop="ქსელის გამოყენების გაუმჯობესება" Basic.Settings.Advanced.Network.EnableLowLatencyMode="TCP-კავშირების გამართვა" -Basic.Settings.Advanced.Network.TCPPacing.Tooltip="მცდელობა, RTMP-გამოტანა იყოს მეტად თავსებადი დაყოვნებაზე დამოკიდებულ სხვა პროგრამებთან ქსელში, გადაცემის სიხშირის მოწესრიგებით.\nამან შესაძლოა გაზარდოს კადრების გამოტოვების ალბათობა, არამდგრადი კავშირებისას." +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="მცდელობა, რომ RTMP-გამოტანა ნაკლებ უშლიდეს ხელს ქსელში დაყოვნებაზე დამოკიდებულ სხვა პროგრამებს გადაცემის სიხშირის მოწესრიგებით.\nშედეგად შესაძლოა გაიზარდოს კადრების გამოტოვების ალბათობა არამდგრადი კავშირებისას." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="სწრაფი ღილაკების მოქმედება" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="არასდროს გაითიშოს" -Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="გაითიშოს, მთავარ ფანჯარაზე გადასვლისას" -Basic.Settings.Advanced.Hotkeys.DisableHotkeysOutOfFocus="გაითიშოს, მთავარი ფანჯრიდან გადასვლისას" +Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="გაითიშოს მთავარ ფანჯარაზე გადასვლისას" +Basic.Settings.Advanced.Hotkeys.DisableHotkeysOutOfFocus="გაითიშოს მთავარი ფანჯრიდან გადასვლისას" Basic.Settings.Advanced.AutoRemux="თვითშეფუთვა %1 ფაილად" Basic.Settings.Advanced.AutoRemux.MP4="(ჩაწერა mkv-ფაილად)" Basic.AdvAudio="ხმის გაფართოებული პარამეტრები" @@ -1107,8 +1112,8 @@ Basic.AdvAudio.MonoSource="ხმის დაყვანა მონოზე „%1“" Basic.AdvAudio.Balance="წონასწორობა" Basic.AdvAudio.BalanceSource="წონასწორობა „%1“" -Basic.AdvAudio.SyncOffset="სინქრონიზაციის გასწორება" -Basic.AdvAudio.SyncOffsetSource="სინქრონიზაციის გასწორება „%1“" +Basic.AdvAudio.SyncOffset="სინქრ. წანაცვლება" +Basic.AdvAudio.SyncOffsetSource="სინქრ. წანაცვლება – „%1“" Basic.AdvAudio.Monitoring="ხმის მოსმენა" Basic.AdvAudio.Monitoring.None="მოსმენის გარეშე" Basic.AdvAudio.Monitoring.MonitorOnly="მხოლოდ მოსმენა (უხმო გამოტანა)" @@ -1311,7 +1316,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 საჭიროებს რამდენიმე სხვადასხვა მითითებას ხმა → მთავარი → არხები" Basic.OpenPluginManager="დანამატების სამართავი" PluginManager="დანამატების სამართავი" -PluginManager.HelpText="დანამატების სამართავი" -PluginManager.Restart="ხელახლა გაეშვას OBS?" -PluginManager.NeedsRestart="ცვლილებების ასახვისთვის OBS Studio საჭიროებს ხელახლა გაშვებას. გსურთ, ახლავე გაეშვას?" +PluginManager.Restart="OBS Studio კვლავ უნდა გაეშვას დანამატის ცვლილების ასახვისთვის" PluginManager.MissingPlugin="ᲓᲐᲜᲐᲛᲐᲢᲘ ᲕᲔᲠ ᲛᲝᲘᲫᲔᲑᲜᲐ" +PluginManager.Section.Discover="მოძიება" +PluginManager.Section.Manage="ჩადგმული" +PluginManager.Section.Updates="განახლებები" +PluginManager.Section.Manage.Title="მოქმედი დანამატების მართვა"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/kaa.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/kaa.ini
Changed
@@ -262,8 +262,6 @@ ConfirmStopRecord.Title="Jazıp alıwdı toqtatılsın ba?" ConfirmStopRecord.Text="Jazıp alıwdı toqtatıwǵa isenimińiz kámil me?" ConfirmBWTest.Title="Ótkeriw qábiletin tekseriwdi baslaw kerek pe?" -ConfirmExit.Title="OBSdan shıǵasız ba?" -ConfirmExit.Text="OBS iske túsirilgen. Barlıq esittiriwler/jazıp alıw óshiriledi. Shıǵıwǵa isenimińiz kámil me?" ConfirmRemove.Title="Óshiriwdi tastıyıqlaw" ConfirmRemove.Text="%1 óshiriwge isenimińiz kámil me'?" ConfirmRemove.TextMultiple="%1 elementti óshiriwge isenimińiz kámil me?"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/kab-KAB.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/kab-KAB.ini
Changed
@@ -209,8 +209,6 @@ ConfirmStopRecord.Title="Ad tḥebseḍ asekles?" ConfirmStopRecord.Text="D tidet tebɣiḍ ad tḥebseḍ asekles?" ConfirmBWTest.Title="Sekker akayad n tehri n tesfift?" -ConfirmExit.Title="Ad teffɣeḍ si OBS?" -ConfirmExit.Text="OBS itteddu akka tura. Akk isuddman/ikalasen ad xsin. D tidet tebɣiḍ ad teffɣeḍ?" ConfirmRemove.Title="Sentem tukksa" ConfirmRemove.TextMultiple="D tidet tebɣiḍ ad tekkseḍ %1 n yiferdisen?" Output.StartStreamFailed="D awezɣi asekker n usuddem"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/kmr-TR.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/kmr-TR.ini
Changed
@@ -23,9 +23,16 @@ Mixer="Tevlihevkera dengê" Browse="Bigere" DroppedFrames="Ketina çarçoveyan %1 (%2%)" +Projector.Open.Program="Projektora bernameyê veke" +Projector.Open.Preview="Projektora pêşdîtinê veke" +Projector.Open.Scene="Projektorê dîmenê veke" +Projector.Open.Source="Projektorê çavkaniyê veke" +Projector.Display="Dîmender: %1" Projector.Window="Çarçoveya nû" +Projector.Title="Projektor" Projector.Title.Scene="Dîmen: %1" Projector.Title.Source="Çavkanî: %1" +Projector.Title.Multiview="Pirdîmen" Projector.ResizeWindowToContent="Çarçoveyê li naverokê guncav bike" Clear="Pak bike" Revert="Vegerîne rewşa berê" @@ -99,13 +106,18 @@ MixerToolbarMenu="Menuya tevlihevkara dengê" SceneFilters="Parzûnên çavkaniya vekirî" List="Lîste" -Grid="Izxare" +Grid="Tor" Automatic="Xweber" +ComingSoon="Di nêzik de" PluginsFailedToLoad.Title="Di barkirina pêvekê de çewtî derket" PluginsFailedToLoad.Text="Barkirina pêvekên OBS:\n\n%1\nTêk çû jkx rojane bike an jî van pêvekan jê bibe." AlreadyRunning.Title="OBS jixwe dixebite" AlreadyRunning.Text="OBS jixwe dixebite! Ku te nexwest vê yekê bike, ji kerema xwe berî ku tu hewl bidî ku tomarkirinekî nû bixebitnî hemû tomarkirinekê heyî yên OBS-ê bigire. Ku te OBS saz kiriye ku li pêşpirtika pergalê piçûk bibe, ji kerema xwe li wir kontrol bike ka ew hin jî dixebite." AlreadyRunning.LaunchAnyway="Bi her awayî dest pê bike" +CrashHandling.Dialog.Title="Têkçûna OBS Studio hat dîtin" +CrashHandling.Checkbox.SendReport="Min polîtika taybetiyê xwendiye û ji bo barkirinê dipejirînim." +CrashHandling.Buttons.LaunchSafe="Di moda ewle de bixebitîne" +CrashHandling.Buttons.LaunchNormal="Di moda normal de bixebitîne" ChromeOS.Title="Platforma nepiştgirî" ChromeOS.Text="Xuye ku OBS di hindirê konteynirek ChromeOS de dixebite. Ev platform nayê piştgirîkirin." Wine.Title="Wine hate dîtin" @@ -218,6 +230,7 @@ Basic.Stats.MegabytesSent="Derana giştî ya daneyan" Basic.Stats.Bitrate="Rêjeya bitê" Basic.Stats.DiskFullIn="Dîsk wê tijî be (nêzik de.)" +Basic.Stats.DiskFullIn.Text="%1 demjimêr, %2 xulek" Basic.Stats.ResetStats="Rêjejimaran ji nû ve saz bike" ResetUIWarning.Title="Tu dixwazî navrûya bikarhêneriyê ji nû ve saz bikî?" ResetUIWarning.Text="Ji nû ve sazkirina UI dê Bender din veşêre. Ku tu dixwazî nîşan bide, divê tu van deran ji menuya dîtinê veşêrî.\n\n Ji dil dixwazî UI ji nû ve saz bikî?" @@ -248,6 +261,8 @@ Basic.SceneTransitions="Derbasbûnên dîmenan" Basic.TransitionDuration="Dema derbasbûnê" Basic.TogglePreviewProgramMode="Awayê studyo" +Basic.EnablePreviewProgramMode="Awaya studioyê çalak bike" +Basic.DisablePreviewProgramMode="Awaya studioyê çalak neke" Undo.Undo="Vegerîne" Undo.Redo="Dûbare bike" Undo.Add="'%1' Tevlî bike" @@ -296,6 +311,7 @@ Undo.GroupItems="Hêmanan di '%1' de kom bike" TransitionNameDlg.Text="Ji kerema xwe navê derbasbûnê binivsîne" TransitionNameDlg.Title="Navê derbasbûnê" +TitleBar.SafeMode="AWAYA PARASTÎ" TitleBar.Profile="Profîl" TitleBar.Scenes="Dîmen" NameExists.Title="Nav jixwe heye" @@ -310,8 +326,8 @@ ConfirmStopRecord.Text="Ma tu bi rastî dixwazî tomarkirinê rawestînî?" ConfirmBWTest.Title="Dest bi testa leza herikê bike?" ConfirmBWTest.Text="Tu OBS-ê di moda testa leza herikê bi rê ve dibî. Ev mod dihêle ku tu bêyî ku kanala te biçe weşana zindî torê test bikî. Gava te test qedand, ji bo ku temaşevan bikaribin herika te bibînin, tu yê wê neçalak bikî.\n \nTu dixwazî bidomînî?" -ConfirmExit.Title="Ji OBS derkevî?" -ConfirmExit.Text="OBS niha çalak e. Hemû weşan/tomarkirin wê bêne girtin. Ma tu bi rastî dixwazî ku derkevî?" +ConfirmExit.Title="Deranên çalak" +ConfirmExit.Text="OBS hîn çalak e. Hemû weşan/tomarkirin wê werin girtin." ConfirmRemove.Title="Jêbirinê bipejirîne" ConfirmRemove.Text="Tu bi rastî dixwazî '%1' rakî?" ConfirmRemove.TextMultiple="Tu dixwazî hêmanên %1 jê bibî?" @@ -345,6 +361,8 @@ Output.NoBroadcast.Text="Berî ku tu dest bi weşanê bikî, divê ku tu weşanekê saz bikî." Output.BroadcastStartFailed="Destpêkirina weşanê têkçû" Output.BroadcastStopFailed="Rawestandina weşanê têkçû" +LogUploadDialog.Buttons.ConfirmUpload="Bar bike" +LogUploadDialog.Buttons.CopyURL="Girêdanên têketinan jê bigire" Remux.SourceFile="Tomarkirina OBS" Remux.TargetFile="Pelê armanc" Remux.Remux="Guhertina formatê" @@ -446,6 +464,7 @@ Basic.PropertiesWindow.AutoSelectFormat="%1 (hilbijartina bixweber: %2)" Basic.PropertiesWindow.SelectColor="Reng hilbijêre" Basic.PropertiesWindow.SelectFont="Curenivîs hilbijêre" +Basic.PropertiesWindow.SelectFont.WindowTitle="Cûrenivîsekê hilbijêre" Basic.PropertiesWindow.ConfirmTitle="Sazkarî hatin guhertin" Basic.PropertiesWindow.Confirm="Guhertinên nehatine tomarkirin hene. Tu dixwazî wan tomar bikî?" Basic.PropertiesWindow.NoProperties="Tu taybetmendiyên heyî tune" @@ -575,6 +594,9 @@ Basic.MainMenu.Edit.Scale="Pêşdîtin & pîvandin (&S)" Basic.MainMenu.Edit.Scale.Window="Bo çarçoveyê bipîve" Basic.MainMenu.Edit.Scale.Output="Deran (%1x%2)" +Basic.MainMenu.Edit.Scale.ZoomIn="Nêzîk bike" +Basic.MainMenu.Edit.Scale.ZoomOut="" +Basic.MainMenu.Edit.Scale.ResetZoom="Mezinkirinê ji nû ve saz bike" Basic.MainMenu.Edit.Transform="Biguherîne (&T)" Basic.MainMenu.Edit.Transform.EditTransform="Guh&ertinê serrast bike..." Basic.MainMenu.Edit.Transform.CopyTransform="Guhertinê jê bigire" @@ -608,6 +630,8 @@ Basic.MainMenu.Docks.ResetDocks="&Benderê ji nû ve saz bike" Basic.MainMenu.Docks.LockDocks="&Benderê kilît bike" Basic.MainMenu.Docks.CustomBrowserDocks="&Benderên gerokê kesanekirî..." +Basic.MainMenu.Import="Têxistin..." +Basic.MainMenu.Export="Derxistin..." Basic.MainMenu.SceneCollection="Berhevoka dîmenan (&S)" Basic.MainMenu.Profile="&Profîl" Basic.MainMenu.Profile.Import="Profîlê têxê" @@ -629,6 +653,8 @@ Basic.MainMenu.Help.ReleaseNotes="Nîşeyên weşanê" Basic.MainMenu.Help.CheckForUpdates="Ji bo rojanekirinê kontrol bike" Basic.MainMenu.Help.Repair="Yekbûna pelê kontrol bike" +Basic.MainMenu.Help.RestartSafeMode="Di moda ewle de ji nû ve dest pê bike" +Basic.MainMenu.Help.RestartNormal="Di moda normal de ji nû ve dest pê bike" Basic.MainMenu.Help.CrashLogs="Ragîhandinê &têkçûnan" Basic.MainMenu.Help.CrashLogs.ShowLogs="Ragihandinên têkçûyînê nîşan bide (&S)" Basic.MainMenu.Help.CrashLogs.UploadLastLog="Ragihandina têkçûnê &paş bar bike (&P)" @@ -700,6 +726,7 @@ Basic.Settings.Appearance.General="Giştî" Basic.Settings.Appearance.General.Theme="Rûkar" Basic.Settings.Appearance.FontScale="Meznihaiya çûrenivîsê" +Basic.Settings.Appearance.Classic="Klasîk" Basic.Settings.Stream="Weşan" Basic.Settings.Stream.Custom.UseAuthentication="Rastandinê bi kar bîne" Basic.Settings.Stream.Custom.Username="Navê bikarhêneriyê" @@ -979,6 +1006,7 @@ Basic.Settings.Advanced.Network="Tor" Basic.Settings.Advanced.Network.Disabled="Protokola weşana hilbijartî ya niha piştgirî nade guhertina sazkariyên torê." Basic.Settings.Advanced.Network.BindToIP="Bi IP ve girê bide" +Basic.Settings.Advanced.Network.IPFamily="Malbata IP" Basic.Settings.Advanced.Network.EnableNewSocketLoop="Baştirînkirina torê çalak bike" Basic.Settings.Advanced.Network.EnableLowLatencyMode="TCP pacing çalak bike" Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Hewl dide ku rtMP hilberîna hevaltiyê ji bo sepanên din ên hesas ên derengbûnê yên li ser torê bi rêjeya vegûhestinê re bike.\nDibe ku rîska çarçoveyên hatine avêtin li ser pêwendiyên nediyar zêde bike." @@ -1168,3 +1196,13 @@ YouTube.Errors.errorStreamInactive="Toutube daneyan ji weşanê te nastîne. Jkx pevsazkirina xwe kontrol bike." YouTube.Errors.invalidTransition="Hewldana derbasbûnê ne derbasdar bû. Ev dibe ku ji ber ku weşanê derbasbûneke berê neqedandiye. Ji kerema xwe çend çirkeyan bimîne û dîsa biceribîne." ConfigDownload.WarningMessageTitle="Hişyarî" +FailedToStartStream.NoConfigSupplied="Rêkxistinê wendayî" +MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="Deng → Giştî → Kenal divê bo '%1' were sazkirin" +Basic.OpenPluginManager="Rêveberiya pêvekê" +PluginManager="Rêveberiya pêvekê" +PluginManager.Restart="Ji bo sepandina guhertinên pêvekan divê OBS Studio ji nû ve were destpêkirin" +PluginManager.MissingPlugin="PÊVEK NEHAT DÎTIN" +PluginManager.Section.Discover="Bigere" +PluginManager.Section.Manage="Sazkirî" +PluginManager.Section.Updates="Rojanekirin" +PluginManager.Section.Manage.Title="Pêvekên çalakkirî bi rê ve bibe"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/ko-KR.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/ko-KR.ini
Changed
@@ -111,11 +111,20 @@ List="목록" Grid="격자" Automatic="자동" +ComingSoon="곧 출시" PluginsFailedToLoad.Title="플러그인 로딩 오류" PluginsFailedToLoad.Text="다음 플러그인을 로딩하는데 실패했습니다:\n\n%1\n이 플러그인을 업데이트 하거나 삭제하십시오." AlreadyRunning.Title="OBS가 이미 실행 중입니다" AlreadyRunning.Text="OBS가 이미 실행 중입니다! 의도한 것이 아니라면 새로운 OBS를 실행하기 전에 이미 동작 중인 프로그램을 종료하십시오. OBS가 시스템 트레이에 최소화되어 있는지도 확인하십시오." AlreadyRunning.LaunchAnyway="경고를 무시하고 실행" +CrashHandling.Dialog.Title="OBS Studio의 비정상 종료가 감지됨" +CrashHandling.Labels.Text="OBS Studio가 비정상적으로 종료되었습니다.\n\n안전 모드로 실행하시겠습니까? (서드파티 플러그인, 스크립트 및 WebSocket 비활성화됨) " +CrashHandling.Labels.PrivacyNotice="비정상 종료 보고서를 OBSProject에 자동으로 업로드하도록 선택할 수도 있습니다. .<br /><br />파일을 업로드하기 전에 반드시 <a href='https://obsproject.com/privacy-policy'>개인정보 보호정책</a>을 읽어보시고, 파일 업로드와 관련된 부분을 특히 주의 깊게 확인하시기 바랍니다." +CrashHandling.Checkbox.SendReport="개인정보 처리방침을 읽었으며 업로드에 동의합니다." +CrashHandling.Buttons.LaunchSafe="안전 모드로 실행" +CrashHandling.Buttons.LaunchNormal="일반 모드로 실행" +CrashHandling.Errors.UploadJSONError="가장 최근의 비정상 종료 로그를 업로드하는 중 오류가 발생했습니다. 나중에 다시 시도해 주세요." +CrashHandling.Errors.Title="비정상 종료 업로드 오류" SafeMode.Restart="안전모드에서 OBS를 다시 시작하시겠습니까? (3자 제공 플러그인, 스크립트, 웹소켓 꺼짐)" SafeMode.RestartNormal="OBS를 일반 모드로 다시 실행하시겠습니까?" ChromeOS.Title="지원하지 않는 플랫폼" @@ -329,8 +338,8 @@ ConfirmStopRecord.Text="정말로 녹화를 중단하시겠습니까?" ConfirmBWTest.Title="대역폭 점검 시작 확인" ConfirmBWTest.Text="OBS가 대역폭 시험 상태입니다. 방송을 송출하지 않고 네트워크를 점검할 수 있습니다. 시험을 종료해야 시청자가 방송을 볼 수 있습니다.\n\n계속하겠습니까?" -ConfirmExit.Title="OBS를 종료할까요?" -ConfirmExit.Text="OBS가 현재 작동 중입니다. 모든 방송/녹화가 중단됩니다. 정말로 종료하시겠습니까?" +ConfirmExit.Title="활성 출력" +ConfirmExit.Text="OBS는 아직 활성입니다. 모든 스트림/레코딩은 꺼질 것입니다." ConfirmRemove.Title="제거 확인" ConfirmRemove.Text="'%1'을(를) 정말로 제거할까요?" ConfirmRemove.TextMultiple="정말로 %1 개의 항목을 제거하겠습니까?" @@ -367,6 +376,17 @@ Output.NoBroadcast.Text="방송을 진행하기 전에 방송 설정이 필요합니다" Output.BroadcastStartFailed="방송 시작에 실패했습니다" Output.BroadcastStopFailed="방송 종료에 실패했습니다" +LogUploadDialog.Title="OBS Studio 로그 파일 업로드" +LogUploadDialog.Labels.PrivacyNotice="파일을 업로드하기 전에 <a href='https://obsproject.com/privacy-policy'>개인정보 보호정책</a> 및 파일 업로드 관련 섹션을 읽어주세요." +LogUploadDialog.Labels.Progress="로그 업로드 진행중. 기다려 주세요..." +LogUploadDialog.Labels.Description.AppLog="로그 파일을 올렸습니다. 이 URL을 디버깅 혹은 문제 해결을 위해 공유할 수 있습니다." +LogUploadDialog.Labels.Description.CrashLog="비정상 종료 현상에 관한 로그가 업로드되었습니다. 이 URL을 디버깅 목적으로 공유할 수 있습니다." +LogUploadDialog.Buttons.ConfirmUpload="업로드" +LogUploadDialog.Buttons.CopyURL="로그 URL 복사" +LogUploadDialog.Buttons.AnalyzeURL="로그 파일 분석" +LogUploadDialog.Buttons.RetryButton="재시도" +LogUploadDialog.Errors.Template="파일을 업로드하는 중 오류가 발생했습니다:\n\n %1" +LogUploadDialog.Errors.NoLogFile="업로드 할 파일을 찾지 못했거나, 파일이 비어 있습니다." Remux.SourceFile="OBS 녹화본" Remux.TargetFile="대상 파일" Remux.Stop="Remux 중단" @@ -806,12 +826,15 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="구성 재정의 활성화" Basic.Settings.Stream.MultitrackVideoLabel="멀티트랙 비디오" Basic.Settings.Stream.MultitrackVideoExtraCanvas="추가 캔바스" +Basic.Settings.Stream.WHIPSimulcastLabel="시뮬캐스트" +Basic.Settings.Stream.WHIPSimulcastInfo="시뮬캐스트는 복수의 비디오 품질로 인코딩하고 전송할 수 있도록 해줍니다. <a href='https://obsproject.com/kb/whip-streaming-guide'>자세히 알아보기</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="전체 레이어" Basic.Settings.Stream.AdvancedOptions="고급 옵션" Basic.Settings.Output="출력" Basic.Settings.Output.Format="녹화 형식" Basic.Settings.Output.Format.MKV="Matroska 비디오 (.mkv)" -Basic.Settings.Output.Format.hMP4="하이브리드 MP4 베타 (.mp4)" -Basic.Settings.Output.Format.hMOV="하이브리드 MOV 베타 (.mov)" +Basic.Settings.Output.Format.hMP4="하이브리드 MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="하이브리드 MOV (.mov)" Basic.Settings.Output.Format.fMP4="Fragmented MP4 비디오 (.mp4)" Basic.Settings.Output.Format.fMOV="Fragmented MOV 비디오 (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="Fragmented MOV는 녹화본을 청크 단위로 기록하며 기존의 MOV 파일에서 필요하던 마무리 작업이 필요하지 않습니다.\n따라서, 블루 스크린이 발생하거나 전원이 끊겨 파일 기록이 중단되더라도 녹화본을 이용할 수 있습니다.\n\n이는 모든 영상 플레이어 및 에디터와는 호환되지 않을 수 있습니다. 필요하다면 파일 → 녹화본 Remux를 이용하여, 보다 호환성 있는 형식으로 변환하세요." @@ -981,6 +1004,7 @@ Basic.Settings.Video.Numerator="분자" Basic.Settings.Video.Denominator="분모" Basic.Settings.Video.Renderer="렌더러" +Basic.Settings.Video.Renderer.Experimental="%1 (실험적)" Basic.Settings.Video.InvalidResolution="유효하지 않은 해상도 값입니다. 반드시 너비x높이 형식이어야 합니다. (예시: 1920x1080)" Basic.Settings.Video.CurrentlyActive="현재 비디오가 출력되고 있습니다. 비디오 설정을 변경하려면 관련 작업을 중단해야 합니다." Basic.Settings.Video.DownscaleFilter.Bilinear="이중선형 (빠름, 크기가 바뀌면 흐려짐)" @@ -1293,3 +1317,11 @@ MultitrackVideo.IncompatibleSettings.AudioChannels="%1은(는) 오디오 → 일반 → 채널에 설정된 '%2', %3와(과) 호환하지 않습니다" MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="오디오 → 일반 → 채널을 '%1'(으)로 설정해야 합니다." MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1은(는) 오디오 → 일반 → 채널에 대한 여러 다른 설정이 필요합니다." +Basic.OpenPluginManager="플러그인 관리" +PluginManager="플러그인 관리" +PluginManager.Restart="플러그인 변경을 적용하려면 OBS Studio를 다시 시작해야 합니다" +PluginManager.MissingPlugin="플러그인을 찾을 수 없음" +PluginManager.Section.Discover="탐색" +PluginManager.Section.Manage="설치함" +PluginManager.Section.Updates="업데이트" +PluginManager.Section.Manage.Title="켜진 플러그인 관리"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/lo-LA.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/lo-LA.ini
Changed
@@ -1,79 +1,1165 @@ Language="ພາສາລາວ" OK="ໂອເຄ" -Apply="ສະໝັກ" +Apply="ນຳໃຊ້" Cancel="ຍົກເລີກ" Close="ປິດ" Save="ບັນທຶກ" -Discard="ຍົກເລີກ" -Disable="ງົດການໃຊ້ງານ" -Yes="ແມ່ນແລ້ວ" +Discard="ຖິ້ມ" +Disable="ປິດການໃຊ້ງານ" +Yes="ແມ່ນ" No="ບໍ່" Add="ເພີ່ມ" Remove="ເອົາອອກ" Rename="ປ່ຽນຊື່" Interact="ໂຕ້ຕອບ" -Filters="ເພີ່ມພິເສດ" -Properties="ລາຍລະອຽດ" -MoveUp="ຍັບຂຶ້ນເທິງ" -MoveDown="ຍັບລົງລຸ່ມ" +Filters="ຟິວເຕີ" +Properties="ຄຸນສົມບັດ" +MoveUp="ຍັບຂຶ້ນ" +MoveDown="ຍັບລົງ" Settings="ຕັ້ງຄ່າ" Display="ຈໍສະແດງຜົນ" Name="ຊື່" Exit="ອອກ" -Mixer="ບ່ອນປັບສຽງ" +Mixer="ມິກເຊີ (Mixer)" Browse="ເປີດຫາ" Mono="ໂມໂນ" -Stereo="ສະເຕີຣີໂອ" -DroppedFrames="ເຟຣມຫຼຸດລົງ %1 (%2%)" -Clear="ອະນາໄມ" -Revert="ກັບຄືນ" +Stereo="ສະເຕີຣິໂອ" +DroppedFrames="ເຟຣມຕົກ %1 (%2%)" +Projector.Open.Program="ເປີດ ໂປຣເຈັກເຕີ (Program)" +Projector.Open.Preview="ເປີດ ໂປຣເຈັກເຕີ (Preview)" +Projector.Open.Scene="ເປີດ ໂປຣເຈັກເຕີ (Scene)" +Projector.Open.Source="ເປີດ ໂປຣເຈັກເຕີ (Source)" +Projector.Open.Multiview="ເປີດ ມຸມມອງລວມ (Multiview)" +Projector.Display="ຈໍສະແດງຜົນ: %1" +Projector.Window="ໜ້າຕ່າງໃໝ່" +Projector.Title="ໂປຣເຈັກເຕີ" +Projector.Title.Scene="ສາກ (Scene): %1" +Projector.Title.Source="ແຫຼ່ງທີ່ມາ (Source): %1" +Projector.Title.Multiview="ມຸມມອງລວມ (Multiview)" +Projector.ResizeWindowToContent="ປັບຂະໜາດໜ້າຕ່າງໃຫ້ພໍດີກັບເນື້ອຫາ" +Clear="ລຶບລ້າງ" +Revert="ກັບຄືນຄ່າເດີມ" Show="ສະແດງ" -Hide="ເຊື່ອງໄວ້" -UnhideAll="ບໍ່ຕ້ອງເຊື່ອງ (ທັງໝົດ)" -Untitled="ອີໂນອີເນ່" +Hide="ເຊື່ອງ" +UnhideAll="ສະແດງທັງໝົດ" +Untitled="ບໍ່ມີຊື່" New="ສ້າງໃໝ່" -Duplicate="ສຳເນົາອອກມາ" +Duplicate="ສຳເນົາ" Enable="ເປີດໃຊ້ງານ" DisableOSXVSync="ປິດໃຊ້ງານ macOS V-Sync" -ResetOSXVSyncOnExit="ຣີເຊັດ macOS V-Sync ເມື່ອອອກ" -HighResourceUsage="ການ Encode ເລີ່ມເກີນຂີດຈຳກັດ! ລອງພິຈາລະນາ ປັບການຕັ້ງຄ່າ ວີດີໂອ ໜ້ອຍລົງ ຫລື ເລືອກໃຊ້ encoding preset." -Transition="ການຫັນປ່ຽນ" -QuickTransitions="ການຫັນປ່ຽນດ່ວນ" +ResetOSXVSyncOnExit="ຣີເຊັດ macOS V-Sync ເມື່ອອອກຈາກໂປຣແກຣມ" +HighResourceUsage="ການເຂົ້າລະຫັດເກີນຂີດຈຳກັດ! ພິຈາລະນາລົດການຕັ້ງຄ່າວິດີໂອລົງ ຫຼື ໃຊ້ຄ່າທີ່ຕັ້ງໄວ້ກ່ອນຂອງຕົວເຂົ້າລະຫັດທີ່ໄວຂຶ້ນ." +Transition="ການປ່ຽນສາກ" +QuickTransitions="ການປ່ຽນສາກດ່ວນ" FadeToBlack="ຈາງລົງເປັນສີດຳ" Left="ຊ້າຍ" -Right="ສິດ" +Right="ຂວາ" Top="ເທິງ" Bottom="ລຸ່ມ" Reset="ຣີເຊັດ" Hours="ຊົ່ວໂມງ" Minutes="ນາທີ" Seconds="ວິນາທີ" -Deprecated="ເຊົາໃຊ້ແລ້ວ" -ReplayBuffer="ຫຼິ້ນ Buffer ຄືນໃໝ່" +Deprecated="ເລີກໃຊ້ແລ້ວ" +ReplayBuffer="ບັບເຟີການຫຼິ້ນຍ້ອນຫຼັງ" Import="ນຳເຂົ້າ" Export="ສົ່ງອອກ" Copy="ສຳເນົາ" Paste="ວາງ" -PasteReference="ວາງ (ອ້າງອີງ)" +PasteReference="ວາງ (ການອ້າງອີງ)" PasteDuplicate="ວາງ (ຊໍ້າກັນ)" -RemuxRecordings="ການບັນທຶກ Remux" +RemuxRecordings="ຣີມັກສ໌ (Remux) ການບັນທຶກ" Next="ຕໍ່ໄປ" -Back="ກັບຄືນໄປບ່ອນ" +Back="ກັບຄືນ" Defaults="ຄ່າເລີ່ມຕົ້ນ" -RestoreDefaults="ຄ່າເລີ່ມຕົ້ນ" -HideMixer="ເຊື່ອງໃນ Mixer" -TransitionOverride="ລົບລ້າງການຫັນປ່ຽນ" +RestoreDefaults="ຄືນຄ່າເລີ່ມຕົ້ນ" +HideMixer="ເຊື່ອງໃນ ມິກເຊີ" +TransitionOverride="ລົບລ້າງການປ່ຽນສາກ" +ShowTransition="ສະແດງ ການປ່ຽນສາກ" +HideTransition="ເຊື່ອງ ການປ່ຽນສາກ" +None="ບໍ່ມີ" +StudioMode.Preview="ຕົວຢ່າງ (Preview)" +StudioMode.Program="ໂປຣແກຣມ (Program)" +StudioMode.PreviewSceneName="ຕົວຢ່າງ: %1" +StudioMode.ProgramSceneName="ໂປຣແກຣມ: %1" +ShowInMultiview="ສະແດງໃນ ມຸມມອງລວມ" +VerticalLayout="ການຈັດວາງແນວຕັ້ງ" +Group="ຈັດກຸ່ມ" +DoNotShowAgain="ບໍ່ຕ້ອງສະແດງອີກ" +Default="(ຄ່າເລີ່ມຕົ້ນ)" +Calculating="ກຳລັງຄິດໄລ່..." Fullscreen="ເຕັມຈໍ" -LockVolume="ລັອກລະດັບສຽງໄວ້" -LogViewer="ເບິ່ງ Log" +Windowed="ແບບໜ້າຕ່າງ" +RefreshBrowser="ຣີເຟຣຊ" +AspectRatio="ອັດຕາສ່ວນພາບ <b>%1:%2</b>" +LockVolume="ລັອກລະດັບສຽງ" +LogViewer="ຕົວເບິ່ງ Log" +ShowOnStartup="ສະແດງເມື່ອເປີດໂປຣແກຣມ" OpenFile="ເປີດໄຟລ໌" -AlreadyRunning.Title="OBS ກຳລັງເປີດເຮັດວຽກແລ້ວ" -AlreadyRunning.LaunchAnyway="ແນວໃດ໋ກາຊີເປີດ" -DockCloseWarning.Title="ກຳລັງຈະປິດໜ້າຕ່າງ" +AddScene="ເພີ່ມສາກ" +AddSource="ເພີ່ມແຫຼ່ງທີ່ມາ" +RemoveScene="ລຶບສາກທີ່ເລືອກ" +RemoveSource="ລຶບແຫຼ່ງທີ່ມາທີ່ເລືອກ" +MoveSceneUp="ຍັບສາກຂຶ້ນ" +MoveSceneDown="ຍັບສາກລົງ" +MoveSourceUp="ຍັບແຫຼ່ງທີ່ມາຂຶ້ນ" +MoveSourceDown="ຍັບແຫຼ່ງທີ່ມາລົງ" +SourceProperties="ເປີດຄຸນສົມບັດຂອງແຫຼ່ງທີ່ມາ" +SourceFilters="ເປີດຟິວເຕີຂອງແຫຼ່ງທີ່ມາ" +MixerToolbarMenu="ເມນູ ມິກເຊີສຽງ" +SceneFilters="ເປີດຟິວເຕີຂອງສາກ" +List="ລາຍການ" +Grid="ຕາຕະລາງ" +Automatic="ອັດຕະໂນມັດ" +ComingSoon="ໄວໆນີ້" +PluginsFailedToLoad.Title="ເກີດຂໍ້ຜິດພາດໃນການໂຫຼດປັກອິນ" +PluginsFailedToLoad.Text="OBS ບໍ່ສາມາດໂຫຼດປັກອິນຕໍ່ໄປນີ້ໄດ້:\n\n%1\nກະລຸນາອັບເດດ ຫຼື ລຶບປັກອິນເຫຼົ່ານີ້ອອກ." +AlreadyRunning.Title="OBS ເປີດຢູ່ແລ້ວ" +AlreadyRunning.Text="OBS ກຳລັງເຮັດວຽກຢູ່! ຫາກທ່ານບໍ່ໄດ້ຕັ້ງໃຈຈະເຮັດແບບນີ້, ກະລຸນາປິດ OBS ທີ່ເປີດຄ້າງໄວ້ກ່ອນ ທີ່ຈະເປີດອັນໃໝ່ຂຶ້ນມາ. ຖ້າທ່ານຕັ້ງຄ່າໃຫ້ OBS ຫຍໍ້ລົງໄປໃນ System Tray, ກະລຸນາກວດເບິ່ງວ່າ ມັນຍັງເຮັດວຽກຢູ່ບ່ອນນັ້ນຫຼືບໍ່." +AlreadyRunning.LaunchAnyway="ເປີດຕໍ່ໄປ" +CrashHandling.Dialog.Title="ກວດພົບການປິດໂປຣແກຣມຜິດປົກກະຕິຂອງ OBS Studio" +CrashHandling.Labels.Text="OBS Studio ບໍ່ໄດ້ປິດລົງຢ່າງຖືກຕ້ອງ.\n\nຕ້ອງການເປີດໃນ ໂໝດປອດໄພ (Safe Mode) ຫຼື ບໍ່ (ປິດການໃຊ້ງານປັກອິນພາຍນອກ, ສະຄຣິບ ແລະ WebSockets)?" +CrashHandling.Labels.PrivacyNotice="ທ່ານສາມາດເລືອກທີ່ຈະອັບໂຫຼດລາຍງານການແຄຣຊ (Crash report) ຫຼ້າສຸດໄປຍັງ OBSProject ໄດ້ໂດຍອັດຕະໂນມັດ.<br /><br />ກະລຸນາອ່ານ <a href='https://obsproject.com/privacy-policy'>ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວ</a> ກ່ອນທີ່ຈະອັບໂຫຼດໄຟລ໌ ແລະ ໃສ່ໃຈເປັນພິເສດໃນສ່ວນທີ່ກ່ຽວກັບການອັບໂຫຼດໄຟລ໌." +CrashHandling.Checkbox.SendReport="ຂ້ອຍໄດ້ອ່ານນະໂຍບາຍຄວາມເປັນສ່ວນຕົວ ແລະ ຍິນຍອມໃຫ້ອັບໂຫຼດ." +CrashHandling.Buttons.LaunchSafe="ເປີດໃນ ໂໝດປອດໄພ (Safe Mode)" +CrashHandling.Buttons.LaunchNormal="ເປີດໃນ ໂໝດປົກກະຕິ" +CrashHandling.Errors.UploadJSONError="ເກີດຂໍ້ຜິດພາດຂະນະອັບໂຫຼດບັນທຶກການແຄຣຊ (Crash log) ຫຼ້າສຸດ. ກະລຸນາລອງໃໝ່ພາຍຫຼັງ." +CrashHandling.Errors.Title="ເກີດຂໍ້ຜິດພາດໃນການອັບໂຫຼດ Crash Log" +SafeMode.Restart="ທ່ານຕ້ອງການຣີສະຕາດ OBS ໃນໂໝດປອດໄພ (Safe Mode) ຫຼື ບໍ່ (ປິດການໃຊ້ງານປັກອິນພາຍນອກ, ສະຄຣິບ ແລະ WebSockets)?" +SafeMode.RestartNormal="ທ່ານຕ້ອງການຣີສະຕາດ OBS ໃນໂໝດປົກກະຕິ ຫຼື ບໍ່?" +ChromeOS.Title="ແພລັດຟອມທີ່ບໍ່ຮອງຮັບ" +ChromeOS.Text="ເບິ່ງຄືວ່າ OBS ກຳລັງເຮັດວຽກຢູ່ໃນ ChromeOS container. ແພລັດຟອມນີ້ຍັງບໍ່ຮອງຮັບ." +Wine.Title="ກວດພົບ Wine" +Wine.Text="ການເປີດ OBS ໃນ Wine ແມ່ນບໍ່ໄດ້ຮັບການຮອງຮັບ, ແລະ ຫຼາຍຟີເຈີ ເຊັ່ນ: ການບັນທຶກ (Capture) ຫຼື ແຫຼ່ງທີ່ມາຂອງອຸປະກອນ ຈະບໍ່ເຮັດວຽກ ຫຼື ເຮັດວຽກໄດ້ຢ່າງຈຳກັດ.<br><br>ແນະນຳໃຫ້ໃຊ້ OBS ເວີຊັນ Native ແທນ, ຕົວຢ່າງເຊັ່ນ <a href='https://flathub.org/apps/details/com.obsproject.Studio'>ເວີຊັນ Flatpak</a> ຫຼື ແພັກເກດຂອງລະບົບປະຕິບັດການຂອງທ່ານ." +DockCloseWarning.Title="ກຳລັງປິດໜ້າຕ່າງ Dock" +DockCloseWarning.Text="ທ່ານຫາກໍ່ປິດໜ້າຕ່າງແບບ Dock. ຫາກທ່ານຕ້ອງການສະແດງມັນອີກຄັ້ງ, ໃຫ້ໃຊ້ເມນູ Docks ຢູ່ເທິງແຖບເມນູ." +ExtraBrowsers.Info="ເພີ່ມ Docks ໂດຍການໃສ່ຊື່ ແລະ URL, ຈາກນັ້ນກົດ ນຳໃຊ້ ຫຼື ປິດ ເພື່ອເປີດ Docks. ທ່ານສາມາດເພີ່ມ ຫຼື ລຶບ Docks ໄດ້ທຸກເວລາ." +ExtraBrowsers.DockName="ຊື່ Dock" +Auth.Authing.Title="ກຳລັງຢືນຢັນຕົວຕົນ..." +Auth.Authing.Text="ກຳລັງຢືນຢັນຕົວຕົນກັບ %1, ກະລຸນາລໍຖ້າ..." +Auth.AuthFailure.Title="ການຢືນຢັນຕົວຕົນລົ້ມເຫຼວ" +Auth.AuthFailure.Text="ການຢືນຢັນຕົວຕົນກັບ %1 ລົ້ມເຫຼວ:\n\n%2: %3" +Auth.InvalidScope.Title="ຕ້ອງການການຢືນຢັນຕົວຕົນ" +Auth.InvalidScope.Text="ຂໍ້ກຳນົດການຢືນຢັນຕົວຕົນສຳລັບ %1 ມີການປ່ຽນແປງ. ບາງຟີເຈີອາດຈະໃຊ້ງານບໍ່ໄດ້." +Auth.LoadingChannel.Title="ກຳລັງໂຫຼດຂໍ້ມູນຊ່ອງ..." +Auth.LoadingChannel.Text="ກຳລັງໂຫຼດຂໍ້ມູນຊ່ອງສຳລັບ %1, ກະລຸນາລໍຖ້າ..." +Auth.LoadingChannel.Error="ບໍ່ສາມາດດຶງຂໍ້ມູນຊ່ອງໄດ້." +Auth.ChannelFailure.Title="ໂຫຼດຊ່ອງລົ້ມເຫຼວ" +Auth.ChannelFailure.Text="ການໂຫຼດຂໍ້ມູນຊ່ອງສຳລັບ %1 ລົ້ມເຫຼວ\n\n%2: %3" Auth.Chat="ແຊັດ" -BandwidthTest.Region.US="ສະຫາລັດອາເມລິກາ" +Auth.StreamInfo="ຂໍ້ມູນການສະຕຣີມ" +TwitchAuth.Stats="ສະຖິຕິ Twitch" +TwitchAuth.Feed="ຟີດກິດຈະກຳ Twitch" +TwitchAuth.TwoFactorFail.Title="ບໍ່ສາມາດດຶງຄ່າ Stream key ໄດ້" +TwitchAuth.TwoFactorFail.Text="OBS ບໍ່ສາມາດເຊື່ອມຕໍ່ກັບບັນຊີ Twitch ຂອງທ່ານໄດ້. ກະລຸນາກວດສອບວ່າໄດ້ຕັ້ງຄ່າການຢືນຢັນຕົວຕົນສອງຊັ້ນ (2FA) ໃນ <a href='https://www.twitch.tv/settings/security'>ການຕັ້ງຄ່າຄວາມປອດໄພ Twitch</a> ຂອງທ່ານແລ້ວ, ເນື່ອງຈາກຈຳເປັນຕ້ອງໃຊ້ສຳລັບການສະຕຣີມ." +RestreamAuth.Channels="ຊ່ອງ Restream" +Copy.Filters="ສຳເນົາ ຟິວເຕີ" +Paste.Filters="ວາງ ຟິວເຕີ" +BrowserPanelInit.Title="ກຳລັງເລີ່ມຕົ້ນລະບົບ ບຣາວເຊີ..." +BrowserPanelInit.Text="ກຳລັງເລີ່ມຕົ້ນລະບົບ ບຣາວເຊີ, ກະລຸນາລໍຖ້າ..." +BandwidthTest.Region="ພາກພື້ນ" +BandwidthTest.Region.US="ສະຫະລັດອາເມຣິກາ" BandwidthTest.Region.EU="ເອີຣົບ" BandwidthTest.Region.Asia="ອາຊີ" BandwidthTest.Region.Other="ອື່ນໆ" -Basic.AutoConfig.VideoPage="ສ່ວນການຕັ້ງຄ່າວີດີໂອ" +Basic.AutoConfig="ຕົວຊ່ວຍການຕັ້ງຄ່າອັດຕະໂນມັດ" +Basic.AutoConfig.ApplySettings="ນຳໃຊ້ການຕັ້ງຄ່າ" +Basic.AutoConfig.StartPage="ຂໍ້ມູນການໃຊ້ງານ" +Basic.AutoConfig.StartPage.SubTitle="ລະບຸສິ່ງທີ່ທ່ານຕ້ອງການໃຊ້ໂປຣແກຣມນີ້ເຮັດ" +Basic.AutoConfig.StartPage.PrioritizeStreaming="ປັບໃຫ້ເໝາະສົມສຳລັບການສະຕຣີມ, ການບັນທຶກເປັນຮອງ" +Basic.AutoConfig.StartPage.PrioritizeRecording="ປັບໃຫ້ເໝາະສົມສຳລັບການບັນທຶກເທົ່ານັ້ນ, ຂ້ອຍຈະບໍ່ສະຕຣີມ" +Basic.AutoConfig.StartPage.PrioritizeVirtualCam="ຂ້ອຍຈະໃຊ້ພຽງແຕ່ກ້ອງສະເໝືອນ (Virtual camera)" +Basic.AutoConfig.VideoPage="ການຕັ້ງຄ່າວິດີໂອ" +Basic.AutoConfig.VideoPage.SubTitle="ລະບຸການຕັ້ງຄ່າວິດີໂອທີ່ທ່ານຕ້ອງການໃຊ້" +Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="ໃຊ້ຄ່າປັດຈຸບັນ (%1x%2)" +Basic.AutoConfig.VideoPage.BaseResolution.Display="ຈໍສະແດງຜົນ %1 (%2x%3)" +Basic.AutoConfig.VideoPage.FPS.UseCurrent="ໃຊ້ຄ່າປັດຈຸບັນ (%1)" +Basic.AutoConfig.VideoPage.FPS.PreferHighFPS="60 ຫຼື 30, ແຕ່ເນັ້ນ 60 ຖ້າເປັນໄປໄດ້" +Basic.AutoConfig.VideoPage.FPS.PreferHighRes="60 ຫຼື 30, ແຕ່ເນັ້ນຄວາມລະອຽດສູງ" +Basic.AutoConfig.VideoPage.CanvasExplanation="ໝາຍເຫດ: ຄວາມລະອຽດຂອງ Canvas (Base) ບໍ່ຈຳເປັນຕ້ອງຄືກັບຄວາມລະອຽດທີ່ທ່ານຈະສະຕຣີມ ຫຼື ບັນທຶກ. ຄວາມລະອຽດການສະຕຣີມ/ບັນທຶກ ຕົວຈິງຂອງທ່ານອາດຈະຖືກຫຍໍ້ລົງຈາກຄວາມລະອຽດ Canvas ເພື່ອຫຼຸດການໃຊ້ຊັບພະຍາກອນ ຫຼື ຄວາມຕ້ອງການບິດເຣດ (Bitrate)." +Basic.AutoConfig.StreamPage="ຂໍ້ມູນການສະຕຣີມ" +Basic.AutoConfig.StreamPage.SubTitle="ກະລຸນາໃສ່ຂໍ້ມູນການສະຕຣີມຂອງທ່ານ" +Basic.AutoConfig.StreamPage.ConnectAccount="ເຊື່ອມຕໍ່ບັນຊີ (ແນະນຳ)" +Basic.AutoConfig.StreamPage.DisconnectAccount="ຕັດການເຊື່ອມຕໍ່ບັນຊີ" +Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="ຕັດການເຊື່ອມຕໍ່ບັນຊີ?" +Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="ການປ່ຽນແປງນີ້ຈະມີຜົນທັນທີ. ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການຕັດການເຊື່ອມຕໍ່ບັນຊີຂອງທ່ານ?" +Basic.AutoConfig.StreamPage.GetStreamKey="ຮັບ Stream Key" +Basic.AutoConfig.StreamPage.MoreInfo="ຂໍ້ມູນເພີ່ມເຕີມ" +Basic.AutoConfig.StreamPage.UseStreamKey="ໃຊ້ Stream Key" +Basic.AutoConfig.StreamPage.UseStreamKeyAdvanced="ໃຊ້ Stream Key (ຂັ້ນສູງ)" +Basic.AutoConfig.StreamPage.Service="ຜູ້ໃຫ້ບໍລິການ" Basic.AutoConfig.StreamPage.Service.ShowAll="ສະແດງທັງໝົດ..." +Basic.AutoConfig.StreamPage.Service.Custom="ກຳນົດເອງ..." +Basic.AutoConfig.StreamPage.Server="ເຊີບເວີ" +Basic.AutoConfig.StreamPage.StreamKey.ToolTip="RIST: ໃສ່ encryption passphrase.\nRTMP: ໃສ່ຄ່າ key ທີ່ໄດ້ຈາກຜູ້ໃຫ້ບໍລິການ.\nSRT: ໃສ່ streamid ຖ້າຜູ້ໃຫ້ບໍລິການຕ້ອງໃຊ້." +Basic.AutoConfig.StreamPage.ConnectedAccount="ບັນຊີທີ່ເຊື່ອມຕໍ່" +Basic.AutoConfig.StreamPage.PerformBandwidthTest="ປະເມີນບິດເຣດດ້ວຍການທົດສອບແບນວິດ (ອາດໃຊ້ເວລາສອງສາມນາທີ)" +Basic.AutoConfig.StreamPage.PreferHardwareEncoding="ເນັ້ນໃຊ້ການເຂົ້າລະຫັດດ້ວຍຮາດແວ (Hardware encoding)" +Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="Hardware Encoding ຊ່ວຍຫຼຸດການໃຊ້ງານ CPU ໄດ້ຫຼາຍ, ແຕ່ອາດຈະຕ້ອງການບິດເຣດທີ່ສູງກວ່າເພື່ອໃຫ້ໄດ້ຄຸນນະພາບລະດັບດຽວກັນ." +Basic.AutoConfig.StreamPage.StreamWarning.Title="ຄຳເຕືອນການສະຕຣີມ" +Basic.AutoConfig.StreamPage.StreamWarning.Text="ການທົດສອບແບນວິດກຳລັງຈະສະຕຣີມຂໍ້ມູນວິດີໂອແບບສຸ່ມທີ່ບໍ່ມີສຽງໄປຍັງຊ່ອງຂອງທ່ານ. ຖ້າເປັນໄປໄດ້, ແນະນຳໃຫ້ປິດການບັນທຶກວິດີໂອການສະຕຣີມຊົ່ວຄາວ ແລະ ຕັ້ງຄ່າການສະຕຣີມເປັນສ່ວນຕົວ ຈົນກວ່າການທົດສອບຈະສຳເລັດ. ດຳເນີນການຕໍ່ບໍ່?" +Basic.AutoConfig.StreamPage.UseMultitrackVideo="ທົດສອບ %1" +Basic.AutoConfig.TestPage="ຜົນລັບສຸດທ້າຍ" +Basic.AutoConfig.TestPage.SubTitle.Testing="ໂປຣແກຣມກຳລັງດຳເນີນການທົດສອບຊຸດໜຶ່ງ ເພື່ອປະເມີນຄ່າທີ່ເໝາະສົມທີ່ສຸດ" +Basic.AutoConfig.TestPage.SubTitle.Complete="ການທົດສອບສຳເລັດ" +Basic.AutoConfig.TestPage.TestingBandwidth="ກຳລັງທົດສອບແບນວິດ, ອາດໃຊ້ເວລາສອງສາມນາທີ..." +Basic.AutoConfig.TestPage.TestingBandwidth.NoOutput="ບໍ່ພົບ Output ສຳລັບໂປຣໂຕຄໍຂອງບໍລິການນີ້" +Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="ກຳລັງເຊື່ອມຕໍ່ໄປຍັງ: %1..." +Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="ບໍ່ສາມາດເຊື່ອມຕໍ່ກັບເຊີບເວີໃດໆໄດ້, ກະລຸນາກວດສອບການເຊື່ອມຕໍ່ອິນເຕີເນັດຂອງທ່ານ ແລະ ລອງໃໝ່ອີກຄັ້ງ." +Basic.AutoConfig.TestPage.TestingBandwidth.Server="ກຳລັງທົດສອບແບນວິດສຳລັບ: %1" +Basic.AutoConfig.TestPage.TestingStreamEncoder="ກຳລັງທົດສອບຕົວເຂົ້າລະຫັດການສະຕຣີມ, ອາດໃຊ້ເວລາໜຶ່ງນາທີ..." +Basic.AutoConfig.TestPage.TestingRecordingEncoder="ກຳລັງທົດສອບຕົວເຂົ້າລະຫັດການບັນທຶກ, ອາດໃຊ້ເວລາໜຶ່ງນາທີ..." +Basic.AutoConfig.TestPage.TestingRes.Fail="ບໍ່ສາມາດເລີ່ມຕົ້ນຕົວເຂົ້າລະຫັດໄດ້" +Basic.AutoConfig.TestPage.TestingRes.Resolution="ກຳລັງທົດສອບ %1x%2 %3 FPS..." +Basic.AutoConfig.TestPage.Result.StreamingEncoder="ຕົວເຂົ້າລະຫັດການສະຕຣີມ" +Basic.AutoConfig.TestPage.Result.RecordingEncoder="ຕົວເຂົ້າລະຫັດການບັນທຶກ" +Basic.AutoConfig.TestPage.Result.Header="ໂປຣແກຣມໄດ້ກຳນົດວ່າ ຄ່າປະເມີນເຫຼົ່ານີ້ ເໝາະສົມທີ່ສຸດສຳລັບທ່ານ:" +Basic.AutoConfig.TestPage.Result.Footer="ເພື່ອໃຊ້ການຕັ້ງຄ່າເຫຼົ່ານີ້, ໃຫ້ກົດ ນຳໃຊ້ການຕັ້ງຄ່າ. ເພື່ອຕັ້ງຄ່າຕົວຊ່ວຍໃໝ່ ແລະ ລອງອີກຄັ້ງ, ໃຫ້ກົດ ກັບຄືນ. ເພື່ອກຳນົດການຕັ້ງຄ່າດ້ວຍຕົວເອງ, ໃຫ້ກົດ ຍົກເລີກ ແລະ ເປີດ ການຕັ້ງຄ່າ." +Basic.AutoConfig.Info="ຕົວຊ່ວຍການຕັ້ງຄ່າອັດຕະໂນມັດ ຈະກຳນົດການຕັ້ງຄ່າທີ່ດີທີ່ສຸດ ໂດຍອີງໃສ່ສະເປັກຄອມພິວເຕີ ແລະ ຄວາມໄວອິນເຕີເນັດຂອງທ່ານ." +Basic.AutoConfig.RunAnytime="ສາມາດສັ່ງງານໄດ້ທຸກເມື່ອ ໂດຍໄປທີ່ເມນູ ເຄື່ອງມື." +Basic.AutoConfig.TestPage.Result.StreamingResolution="ຄວາມລະອຽດການສະຕຣີມ (Scaled)" +Basic.Stats="ສະຖິຕິ" +Basic.Stats.CPUUsage="ການໃຊ້ງານ CPU" +Basic.Stats.HDDSpaceAvailable="ພື້ນທີ່ດິສກ໌ທີ່ຫວ່າງ" +Basic.Stats.MemoryUsage="ການໃຊ້ງານໜ່ວຍຄວາມຈຳ" +Basic.Stats.AverageTimeToRender="ເວລາສະເລ່ຍໃນການ Render ເຟຣມ" +Basic.Stats.SkippedFrames="ເຟຣມທີ່ຂ້າມໄປ ເນື່ອງຈາກການເຂົ້າລະຫັດຊັກຊ້າ" +Basic.Stats.MissedFrames="ເຟຣມທີ່ພາດໄປ ເນື່ອງຈາກການ Render ຊັກຊ້າ" +Basic.Stats.Output.Stream="ສະຕຣີມ" +Basic.Stats.Output.Recording="ການບັນທຶກ" +Basic.Stats.Status="ສະຖານະ" +Basic.Stats.Status.Recording="ກຳລັງບັນທຶກ" +Basic.Stats.Status.Live="ຖ່າຍທອດສົດ" +Basic.Stats.Status.Reconnecting="ກຳລັງເຊື່ອມຕໍ່ໃໝ່" +Basic.Stats.Status.Inactive="ບໍ່ໄດ້ເຮັດວຽກ" +Basic.Stats.Status.Active="ກຳລັງເຮັດວຽກ" +Basic.Stats.DroppedFrames="ເຟຣມຕົກ (ເຄືອຂ່າຍ)" +Basic.Stats.MegabytesSent="ຂໍ້ມູນສົ່ງອອກທັງໝົດ" +Basic.Stats.Bitrate="ບິດເຣດ" +Basic.Stats.DiskFullIn="ດິສກ໌ຈະເຕັມໃນອີກ (ປະມານ)" +Basic.Stats.DiskFullIn.Text="%1 ຊົ່ວໂມງ, %2 ນາທີ" +Basic.Stats.ResetStats="ຣີເຊັດສະຖິຕິ" +ResetUIWarning.Title="ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການຣີເຊັດ UI?" +ResetUIWarning.Text="ການຣີເຊັດ UI ຈະເຊື່ອງ Docks ເພີ່ມເຕີມຕ່າງໆ. ທ່ານຈະຕ້ອງຍົກເລີກການເຊື່ອງ Docks ເຫຼົ່ານີ້ຈາກເມນູ Docks ຫາກທ່ານຕ້ອງການໃຫ້ມັນສະແດງຂຶ້ນມາ.\n\nທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການຣີເຊັດ UI?" +Updater.Title="ມີອັບເດດໃໝ່" +Updater.Text="ມີອັບເດດໃໝ່ພ້ອມໃຫ້ໃຊ້ງານ:" +Updater.UpdateNow="ອັບເດດດຽວນີ້" +Updater.RemindMeLater="ເຕືອນຂ້ອຍພາຍຫຼັງ" +Updater.Skip="ຂ້າມເວີຊັນນີ້" +Updater.NoUpdatesAvailable.Title="ບໍ່ມີອັບເດດ" +Updater.NoUpdatesAvailable.Text="ບໍ່ມີອັບເດດໃຫ້ໃຊ້ງານໃນຂະນະນີ້" +Updater.BranchNotFound.Title="ຊ່ອງທາງການອັບເດດຖືກລຶບ" +Updater.BranchNotFound.Text="ຊ່ອງທາງການອັບເດດທີ່ທ່ານເລືອກບໍ່ສາມາດໃຊ້ໄດ້ອີກຕໍ່ໄປ, OBS ຖືກຣີເຊັດເປັນຄ່າເລີ່ມຕົ້ນ." +Updater.RepairButUpdatesAvailable.Title="ບໍ່ສາມາດກວດສອບຄວາມສົມບູນໄດ້" +Updater.RepairButUpdatesAvailable.Text="ການກວດສອບຄວາມສົມບູນຂອງໄຟລ໌ ສາມາດເຮັດໄດ້ສະເພາະກັບເວີຊັນຫຼ້າສຸດເທົ່ານັ້ນ. ໃຫ້ໃຊ້ ວິທີໃຊ້ → ກວດຫາການອັບເດດ ເພື່ອກວດສອບ ແລະ ອັບເດດການຕິດຕັ້ງ OBS ຂອງທ່ານ." +Updater.RepairConfirm.Title="ຢືນຢັນການກວດສອບຄວາມສົມບູນ" +Updater.RepairConfirm.Text="ການເລີ່ມກວດສອບຄວາມສົມບູນ ຈະສະແກນການຕິດຕັ້ງ OBS ຂອງທ່ານ ເພື່ອຫາໄຟລ໌ທີ່ເສຍຫາຍ ແລະ ດາວໂຫຼດໄຟລ໌ທີ່ເສຍ/ຖືກດັດແປງ ມາໃໝ່. ຂັ້ນຕອນນີ້ອາດໃຊ້ເວລາຄາວໜຶ່ງ.\n\nທ່ານຕ້ອງການດຳເນີນການຕໍ່ບໍ່?" +Updater.FailedToLaunch="ເປີດຕົວອັບເດດບໍ່ສຳເລັດ" +QuickTransitions.SwapScenes="ສັບປ່ຽນສາກ ຕົວຢ່າງ/ໂປຣແກຣມ ຫຼັງຈາກປ່ຽນສາກ" +QuickTransitions.SwapScenesTT="ສັບປ່ຽນສາກຕົວຢ່າງ ແລະ ສາກໂປຣແກຣມ ຫຼັງຈາກປ່ຽນສາກ (ຫາກສາກເດີມຂອງໂປຣແກຣມຍັງມີຢູ່).\nສິ່ງນີ້ຈະບໍ່ຍົກເລີກການປ່ຽນແປງໃດໆ ທີ່ອາດຈະເກີດຂຶ້ນກັບສາກເດີມຂອງໂປຣແກຣມ." +QuickTransitions.DuplicateScene="ສຳເນົາສາກ" +QuickTransitions.DuplicateSceneTT="ເມື່ອແກ້ໄຂສາກດຽວກັນ, ອະນຸຍາດໃຫ້ແກ້ໄຂ ການແປງ (transform)/ການເບິ່ງເຫັນ ຂອງແຫຼ່ງທີ່ມາ ໂດຍບໍ່ແກ້ໄຂ output ຂອງໂປຣແກຣມ.\nເພື່ອແກ້ໄຂຄຸນສົມບັດຂອງແຫຼ່ງທີ່ມາໂດຍບໍ່ແກ້ໄຂ output ຂອງໂປຣແກຣມ, ໃຫ້ເປີດໃຊ້ 'ສຳເນົາ ແຫຼ່ງທີ່ມາ'.\nການປ່ຽນແປງຄ່ານີ້ຈະຣີເຊັດສາກໂປຣແກຣມປັດຈຸບັນ (ຫາກຍັງມີຢູ່)." +QuickTransitions.EditProperties="ສຳເນົາ ແຫຼ່ງທີ່ມາ" +QuickTransitions.EditPropertiesTT="ເມື່ອແກ້ໄຂສາກດຽວກັນ, ອະນຸຍາດໃຫ້ແກ້ໄຂຄຸນສົມບັດຂອງແຫຼ່ງທີ່ມາ ໂດຍບໍ່ແກ້ໄຂ output ຂອງໂປຣແກຣມ.\nສາມາດໃຊ້ໄດ້ສະເພາະເມື່ອເປີດໃຊ້ 'ສຳເນົາສາກ'.\nແຫຼ່ງທີ່ມາບາງຢ່າງ (ເຊັ່ນ: ການ capture ຫຼື ສື່) ບໍ່ຮອງຮັບສິ່ງນີ້ ແລະ ບໍ່ສາມາດແກ້ໄຂແຍກກັນໄດ້.\nການປ່ຽນແປງຄ່ານີ້ຈະຣີເຊັດສາກໂປຣແກຣມປັດຈຸບັນ (ຫາກຍັງມີຢູ່).\n\nຄຳເຕືອນ: ເນື່ອງຈາກແຫຼ່ງທີ່ມາຈະຖືກສຳເນົາ, ສິ່ງນີ້ອາດຕ້ອງການຊັບພະຍາກອນລະບົບ ຫຼື ວິດີໂອເພີ່ມເຕີມ." +QuickTransitions.HotkeyName="ການປ່ຽນສາກດ່ວນ: %1" +Basic.AddTransition="ເພີ່ມ ການປ່ຽນສາກທີ່ກຳນົດຄ່າໄດ້" +Basic.RemoveTransition="ລຶບ ການປ່ຽນສາກທີ່ກຳນົດຄ່າໄດ້" +Basic.TransitionProperties="ຄຸນສົມບັດການປ່ຽນສາກ" +Basic.SceneTransitions="ການປ່ຽນສາກ" +Basic.TransitionDuration="ໄລຍະເວລາ" +Basic.TogglePreviewProgramMode="ໂໝດສະຕູດິໂອ" +Basic.EnablePreviewProgramMode="ເປີດໃຊ້ ໂໝດສະຕູດິໂອ" +Basic.DisablePreviewProgramMode="ປິດໃຊ້ ໂໝດສະຕູດິໂອ" +Undo.Undo="ກັບຄືນ (Undo)" +Undo.Redo="ເຮັດຊ້ຳ (Redo)" +Undo.Add="ເພີ່ມ '%1'" +Undo.Delete="ລຶບ '%1'" +Undo.Rename="ປ່ຽນຊື່ '%1'" +Undo.SceneCollection.Switch="ສະລັບໄປ '%1'" +Undo.Item.Undo="ກັບຄືນ %1" +Undo.Item.Redo="ເຮັດຊ້ຳ %1" +Undo.Sources.Multi="ລຶບ %1 ແຫຼ່ງທີ່ມາ" +Undo.Filters="ການປ່ຽນແປງຟິວເຕີໃນ '%1'" +Undo.Filters.Paste.Single="ວາງ ຟິວເຕີ '%1' ໃສ່ '%2'" +Undo.Filters.Paste.Multiple="ສຳເນົາ ຟິວເຕີ ຈາກ '%1' ໄປ '%2'" +Undo.Transform="ແປງ (Transform) ແຫຼ່ງທີ່ມາ ໃນ '%1'" +Undo.Transform.Paste="ວາງ ການແປງ (Transformation) ໃນ '%1'" +Undo.Transform.Rotate="ໝຸນ ໃນ '%1'" +Undo.Transform.Reset="ຣີເຊັດ ການແງ ໃນ '%1'" +Undo.Transform.HFlip="ພິກແນວນອນ ໃນ '%1'" +Undo.Transform.VFlip="ພິກແນວຕັ້ງ ໃນ '%1'" +Undo.Transform.FitToScreen="ປັບໃຫ້ພໍດີໜ້າຈໍ ໃນ '%1'" +Undo.Transform.StretchToScreen="ຢືດໃຫ້ເຕັມໜ້າຈໍ ໃນ '%1'" +Undo.Transform.Center="ຈັດເຄິ່ງກາງໜ້າຈໍ ໃນ '%1'" +Undo.Transform.VCenter="ຈັດເຄິ່ງກາງແນວຕັ້ງ ໃນ '%1'" +Undo.Transform.HCenter="ຈັດເຄິ່ງກາງແນວນອນ ໃນ '%1'" +Undo.Volume.Change="ການປ່ຽນແປງລະດັບສຽງໃນ '%1'" +Undo.Volume.Mute="ປິດສຽງ '%1'" +Undo.Volume.Unmute="ເປີດສຽງ '%1'" +Undo.Balance.Change="ການປ່ຽນແປງຄວາມສົມດຸນສຽງໃນ '%1'" +Undo.SyncOffset.Change="ການປ່ຽນແປງ Audio Sync Offset ໃນ '%1'" +Undo.MonitoringType.Change="ປ່ຽນການ Monitor ສຽງໃນ '%1'" +Undo.Mixers.Change="ປ່ຽນ ມິກເຊີສຽງ ໃນ '%1'" +Undo.ForceMono.On="ເປີດໃຊ້ ບັງຄັບໂມໂນ ໃນ '%1'" +Undo.ForceMono.Off="ປິດໃຊ້ ບັງຄັບໂມໂນ ໃນ '%1'" +Undo.Properties="ການປ່ຽນແປງຄຸນສົມບັດໃນ '%1'" +Undo.Scene.Duplicate="ສຳເນົາ ສາກ '%1'" +Undo.ShowTransition="ສະແດງ ການປ່ຽນສາກ ໃນ '%1'" +Undo.HideTransition="ເຊື່ອງ ການປ່ຽນສາກ ໃນ '%1'" +Undo.ShowSceneItem="ສະແດງ '%1' ໃນ '%2'" +Undo.HideSceneItem="ເຊື່ອງ '%1' ໃນ '%2'" +Undo.ReorderSources="ຈັດລຳດັບແຫຼ່ງທີ່ມາໃໝ່ໃນ '%1'" +Undo.MoveUp="ຍັບ '%1' ຂຶ້ນ ໃນ '%2'" +Undo.MoveDown="ຍັບ '%1' ລົງ ໃນ '%2'" +Undo.MoveToTop="ຍັບ '%1' ໄປເທິງສຸດ ໃນ '%2'" +Undo.MoveToBottom="ຍັບ '%1' ໄປລຸ່ມສຸດ ໃນ '%2'" +Undo.PasteSource="ວາງ ແຫຼ່ງທີ່ມາ ໃນ '%1'" +Undo.PasteSourceRef="ວາງ ການອ້າງອີງແຫຼ່ງທີ່ມາ ໃນ '%1'" +Undo.GroupItems="ຈັດກຸ່ມລາຍການເຂົ້າໃນ '%1'" +TransitionNameDlg.Text="ກະລຸນາໃສ່ຊື່ຂອງການປ່ຽນສາກ" +TransitionNameDlg.Title="ຊື່ການປ່ຽນສາກ" +TitleBar.SafeMode="ໂໝດປອດໄພ (SAFE MODE)" +TitleBar.PortableMode="ໂໝດພົກພາ (Portable Mode)" +TitleBar.Profile="ໂປຣໄຟລ໌" +TitleBar.Scenes="ສາກ" +NameExists.Title="ມີຊື່ນີ້ຢູ່ແລ້ວ" +NameExists.Text="ຊື່ນີ້ຖືກໃຊ້ງານແລ້ວ." +NoNameEntered.Title="ກະລຸນາໃສ່ຊື່ທີ່ຖືກຕ້ອງ" +NoNameEntered.Text="ທ່ານບໍ່ສາມາດໃຊ້ຊື່ຫວ່າງເປົ່າໄດ້." +ConfirmStart.Title="ເລີ່ມສະຕຣີມ?" +ConfirmStart.Text="ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການເລີ່ມສະຕຣີມ?" +ConfirmStop.Title="ຢຸດສະຕຣີມ?" +ConfirmStop.Text="ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການຢຸດສະຕຣີມ?" +ConfirmStopRecord.Title="ຢຸດບັນທຶກ?" +ConfirmStopRecord.Text="ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການຢຸດບັນທຶກ?" +ConfirmBWTest.Title="ເລີ່ມທົດສອບແບນວິດ?" +ConfirmBWTest.Text="ທ່ານໄດ້ຕັ້ງຄ່າ OBS ໃນໂໝດທົດສອບແບນວິດ. ໂໝດນີ້ອະນຸຍາດໃຫ້ທົດສອບເຄືອຂ່າຍໂດຍທີ່ຊ່ອງຂອງທ່ານບໍ່ໄດ້ຖ່າຍທອດສົດອອກໄປແທ້ໆ. ເມື່ອທ່ານທົດສອບສຳເລັດແລ້ວ, ທ່ານຈະຕ້ອງປິດການໃຊ້ງານມັນ ເພື່ອໃຫ້ຜູ້ຊົມສາມາດເຫັນການສະຕຣີມຂອງທ່ານໄດ້.\n\nທ່ານຕ້ອງການດຳເນີນການຕໍ່ບໍ່?" +ConfirmExit.Title="Output ຍັງເຮັດວຽກຢູ່" +ConfirmExit.Text="OBS ຍັງເຮັດວຽກຢູ່. ການສະຕຣີມ/ການບັນທຶກ ທັງໝົດຈະຖືກປິດລົງ." +ConfirmRemove.Title="ຢືນຢັນການລຶບ" +ConfirmRemove.Text="ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການລຶບ '%1'?" +ConfirmRemove.TextMultiple="ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການລຶບ %1 ລາຍການ?" +ConfirmReset.Title="ຣີເຊັດຄຸນສົມບັດ" +ConfirmReset.Text="ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການຣີເຊັດຄຸນສົມບັດປັດຈຸບັນ ເປັນຄ່າເລີ່ມຕົ້ນ?" +Output.StartStreamFailed="ເລີ່ມການສະຕຣີມບໍ່ສຳເລັດ" +Output.StartRecordingFailed="ເລີ່ມການບັນທຶກບໍ່ສຳເລັດ" +Output.StartReplayFailed="ເລີ່ມ Replay buffer ບໍ່ສຳເລັດ" +Output.StartVirtualCamFailed="ເລີ່ມ ກ້ອງສະເໝືອນ (Virtual camera) ບໍ່ສຳເລັດ" +Output.StartFailedGeneric="ການເລີ່ມ Output ລົ້ມເຫຼວ. ກະລຸນາກວດເບິ່ງ log ສຳລັບລາຍລະອຽດ.\n\nໝາຍເຫດ: ຖ້າທ່ານກຳລັງໃຊ້ຕົວເຂົ້າລະຫັດ NVENC ຫຼື AMD, ກະລຸນາກວດສອບໃຫ້ແນ່ໃຈວ່າ ໄດຣເວີວິດີໂອຂອງທ່ານເປັນເວີຊັນຫຼ້າສຸດ." +Output.ReplayBuffer.PauseWarning.Title="ບໍ່ສາມາດບັນທຶກ Replay ໃນຂະນະທີ່ຢຸດຊົ່ວຄາວໄດ້" +Output.ReplayBuffer.PauseWarning.Text="ຄຳເຕືອນ: ບໍ່ສາມາດບັນທຶກ Replay ໃນຂະນະທີ່ການບັນທຶກຖືກຢຸດຊົ່ວຄາວ." +Output.ConnectFail.Title="ການເຊື່ອມຕໍ່ລົ້ມເຫຼວ" +Output.ConnectFail.BadPath="Path ຫຼື URL ການເຊື່ອມຕໍ່ ບໍ່ຖືກຕ້ອງ. ກະລຸນາກວດສອບການຕັ້ງຄ່າຂອງທ່ານເພື່ອຢືນຢັນວ່າຖືກຕ້ອງ." +Output.ConnectFail.ConnectFailed="ການເຊື່ອມຕໍ່ກັບເຊີບເວີລົ້ມເຫຼວ" +Output.ConnectFail.InvalidStream="ບໍ່ສາມາດເຂົ້າເຖິງ ຊ່ອງ ຫຼື stream key ທີ່ລະບຸໄດ້, ກະລຸນາກວດສອບ stream key ຂອງທ່ານອີກຄັ້ງ. ຖ້າມັນຖືກຕ້ອງ, ອາດຈະມີບັນຫາໃນການເຊື່ອມຕໍ່ກັບເຊີບເວີ." +Output.ConnectFail.HdrDisabled="Output ແບບ HDR ຖືກປິດການໃຊ້ງານຢູ່ໃນຂະນະນີ້ສຳລັບ Output ນີ້." +Output.ConnectFail.Error="ເກີດຂໍ້ຜິດພາດທີ່ບໍ່ຄາດຄິດຂະນະພະຍາຍາມເຊື່ອມຕໍ່ກັບເຊີບເວີ. ຂໍ້ມູນເພີ່ມເຕີມຢູ່ໃນໄຟລ໌ log." +Output.ConnectFail.Disconnected="ຕັດການເຊື່ອມຕໍ່ຈາກເຊີບເວີແລ້ວ." +Output.StreamEncodeError.Title="ຂໍ້ຜິດພາດການເຂົ້າລະຫັດ" +Output.StreamEncodeError.Msg="ເກີດຂໍ້ຜິດພາດຂອງຕົວເຂົ້າລະຫັດຂະນະສະຕຣີມ." +Output.StreamEncodeError.Msg.LastError="ເກີດຂໍ້ຜິດພາດຂອງຕົວເຂົ້າລະຫັດຂະນະສະຕຣີມ:<br><br>%1" +Output.RecordFail.Title="ເລີ່ມການບັນທຶກບໍ່ສຳເລັດ" +Output.RecordFail.Unsupported="ຮູບແບບ Output ບໍ່ຮອງຮັບ ຫຼື ບໍ່ຮອງຮັບແທຣັກສຽງຫຼາຍກວ່າໜຶ່ງແທຣັກ. ກະລຸນາກວດສອບການຕັ້ງຄ່າຂອງທ່ານ ແລະ ລອງໃໝ່ອີກຄັ້ງ." +Output.RecordNoSpace.Title="ພື້ນທີ່ດິສກ໌ບໍ່ພຽງພໍ" +Output.RecordNoSpace.Msg="ພື້ນທີ່ດິສກ໌ບໍ່ພຽງພໍທີ່ຈະດຳເນີນການບັນທຶກຕໍ່." +Output.RecordError.Title="ຂໍ້ຜິດພາດການບັນທຶກ" +Output.RecordError.Msg="ເກີດຂໍ້ຜິດພາດທີ່ບໍ່ລະບຸຂະນະບັນທຶກ." +Output.RecordError.EncodeErrorMsg="ເກີດຂໍ້ຜິດພາດຂອງຕົວເຂົ້າລະຫັດຂະນະບັນທຶກ." +Output.RecordError.EncodeErrorMsg.LastError="ເກີດຂໍ້ຜິດພາດຂອງຕົວເຂົ້າລະຫັດຂະນະບັນທຶກ:<br><br>%1" +Output.BadPath.Title="File Path ບໍ່ຖືກຕ້ອງ" +Output.BadPath.Text="ບໍ່ສາມາດເປີດ Recording Path ທີ່ຕັ້ງຄ່າໄວ້ໄດ້. ກະລຸນາກວດສອບ Recording Path ຂອງທ່ານໃນ ການຕັ້ງຄ່າ → ສົ່ງອອກ → ການບັນທຶກ." +Output.NoBroadcast.Title="ບໍ່ໄດ້ຕັ້ງຄ່າການອອກອາກາດ" +Output.NoBroadcast.Text="ທ່ານຈຳເປັນຕ້ອງຕັ້ງຄ່າການອອກອາກາດ ກ່ອນທີ່ທ່ານຈະສາມາດເລີ່ມສະຕຣີມໄດ້." +Output.BroadcastStartFailed="ເລີ່ມການອອກອາກາດບໍ່ສຳເລັດ" +Output.BroadcastStopFailed="ຢຸດການອອກອາກາດບໍ່ສຳເລັດ" +LogUploadDialog.Title="ອັບໂຫຼດໄຟລ໌ Log ຂອງ OBS Studio" +LogUploadDialog.Labels.PrivacyNotice="ກະລຸນາອ່ານ <a href='https://obsproject.com/privacy-policy'>ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວ</a> ແລະ ພາກສ່ວນທີ່ກ່ຽວກັບການອັບໂຫຼດໄຟລ໌ ກ່ອນທີ່ຈະອັບໂຫຼດໄຟລ໌ໃດໆ." +LogUploadDialog.Labels.Progress="ກຳລັງອັບໂຫຼດ Log. ກະລຸນາລໍຖ້າ..." +LogUploadDialog.Labels.Description.AppLog="ໄຟລ໌ Log ຂອງທ່ານຖືກອັບໂຫຼດແລ້ວ. ຕອນນີ້ທ່ານສາມາດແບ່ງປັນ URL ເພື່ອຈຸດປະສົງໃນການແກ້ໄຂບັນຫາ ຫຼື ການຊັບພອດ." +LogUploadDialog.Labels.Description.CrashLog="ລາຍງານການ Crash ຂອງທ່ານຖືກອັບໂຫຼດແລ້ວ. ຕອນນີ້ທ່ານສາມາດແບ່ງປັນ URL ເພື່ອຈຸດປະສົງໃນການແກ້ໄຂບັນຫາ." +LogUploadDialog.Buttons.ConfirmUpload="ອັບໂຫຼດ" +LogUploadDialog.Buttons.CopyURL="ສຳເນົາ Log URL" +LogUploadDialog.Buttons.AnalyzeURL="ວິເຄາະໄຟລ໌ Log" +LogUploadDialog.Buttons.RetryButton="ລອງໃໝ່" +LogUploadDialog.Errors.Template="ເກີດຂໍ້ຜິດພາດຂະນະພະຍາຍາມອັບໂຫຼດໄຟລ໌:\n\n%1" +LogUploadDialog.Errors.NoLogFile="ບໍ່ພົບໄຟລ໌ທີ່ຈະອັບໂຫຼດ ຫຼື ໄຟລ໌ຫວ່າງເປົ່າ." +Remux.SourceFile="ການບັນທຶກ OBS" +Remux.TargetFile="ໄຟລ໌ເປົ້າໝາຍ" +Remux.Remux="ຣີມັກສ໌ (Remux)" +Remux.Stop="ຢຸດການຣີມັກສ໌" +Remux.ClearFinished="ລຶບລາຍການທີ່ສຳເລັດ" +Remux.ClearAll="ລຶບລາຍການທັງໝົດ" +Remux.OBSRecording="ການບັນທຶກ OBS" +Remux.FinishedTitle="ການຣີມັກສ໌ສຳເລັດ" +Remux.Finished="ຣີມັກສ໌ການບັນທຶກແລ້ວ" +Remux.FinishedError="ຣີມັກສ໌ການບັນທຶກແລ້ວ, ແຕ່ໄຟລ໌ອາດຈະບໍ່ສົມບູນ" +Remux.SelectRecording="ເລືອກ ການບັນທຶກ OBS..." +Remux.SelectTarget="ເລືອກ ໄຟລ໌ເປົ້າໝາຍ..." +Remux.FileExistsTitle="ມີໄຟລ໌ເປົ້າໝາຍຢູ່ແລ້ວ" +Remux.FileExists="ມີໄຟລ໌ເປົ້າໝາຍຕໍ່ໄປນີ້ຢູ່ແລ້ວ. ທ່ານຕ້ອງການຂຽນທັບພວກມັນບໍ່?" +Remux.ExitUnfinishedTitle="ກຳລັງຣີມັກສ໌" +Remux.ExitUnfinished="ການຣີມັກສ໌ຍັງບໍ່ສຳເລັດ, ການຢຸດຕອນນີ້ອາດເຮັດໃຫ້ໄຟລ໌ເປົ້າໝາຍໃຊ້ງານບໍ່ໄດ້.\nທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການຢຸດການຣີມັກສ໌?" +Remux.HelpText="ລາກໄຟລ໌ໃສ່ໜ້າຕ່າງນີ້ເພື່ອຣີມັກສ໌, ຫຼື ເລືອກຊ່ອງ \"ການບັນທຶກ OBS\" ທີ່ຫວ່າງຢູ່ ເພື່ອເປີດຫາໄຟລ໌." +Remux.NoFilesAddedTitle="ບໍ່ໄດ້ເພີ່ມໄຟລ໌ຣີມັກສ໌" +Remux.NoFilesAdded="ບໍ່ມີໄຟລ໌ຖືກເພີ່ມເພື່ອຣີມັກສ໌. ໃຫ້ລາກໂຟນເດີທີ່ມີໄຟລ໌ວິດີໂອໜຶ່ງ ຫຼື ຫຼາຍໄຟລ໌ເຂົ້າມາ." +MissingFiles="ໄຟລ໌ທີ່ຫາຍໄປ" +MissingFiles.MissingFile="ໄຟລ໌ທີ່ຫາຍໄປ" +MissingFiles.NewFile="ໄຟລ໌ໃໝ່" +MissingFiles.HelpText="ບາງໄຟລ໌ຫາຍໄປຕັ້ງແຕ່ຄັ້ງລ່າສຸດທີ່ທ່ານໃຊ້ OBS." +MissingFiles.Clear="<ລຶບລ້າງ>" +MissingFiles.NumFound="ພົບ %1 ຈາກ %2" +MissingFiles.Search="ຄົ້ນຫາ ໄດເຣັກທໍຣີ..." +MissingFiles.SelectFile="ເລືອກໄຟລ໌..." +MissingFiles.SelectDir="ເລືອກໂຟນເດີທີ່ຈະຄົ້ນຫາ" +MissingFiles.State="ສະຖານະ" +MissingFiles.Missing="ຫາຍໄປ" +MissingFiles.Replaced="ແທນທີ່ແລ້ວ" +MissingFiles.Cleared="ລຶບລ້າງແລ້ວ" +MissingFiles.Found="ພົບແລ້ວ" +MissingFiles.AutoSearch="ພົບໄຟລ໌ເພີ່ມເຕີມທີ່ກົງກັນ" +MissingFiles.AutoSearchText="OBS ພົບໄຟລ໌ທີ່ກົງກັນເພີ່ມເຕີມສຳລັບໄຟລ໌ທີ່ຫາຍໄປໃນໄດເຣັກທໍຣີນັ້ນ. ທ່ານຕ້ອງການເພີ່ມພວກມັນບໍ່?" +MissingFiles.NoMissing.Title="ກວດສອບໄຟລ໌ທີ່ຫາຍໄປ" +MissingFiles.NoMissing.Text="ບໍ່ມີໄຟລ໌ໃດຫາຍໄປ." +MacPermissions.MenuAction="ກວດສອບການອະນຸຍາດແອັບ..." +MacPermissions.Title="ກວດສອບການອະນຸຍາດແອັບ" +MacPermissions.Description="OBS Studio ຕ້ອງການການອະນຸຍາດຈາກທ່ານ ເພື່ອໃຫ້ສາມາດໃຫ້ບໍລິການບາງຟີເຈີໄດ້. ແນະນຳໃຫ້ເປີດໃຊ້ການອະນຸຍາດເຫຼົ່ານີ້, ແຕ່ບໍ່ຈຳເປັນຕ້ອງໃຊ້ເພື່ອໃຊ້ງານແອັບ. ທ່ານສາມາດເປີດໃຊ້ມັນພາຍຫຼັງໄດ້ສະເໝີ." +MacPermissions.Description.OpenDialog="ທ່ານສາມາດເປີດກ່ອງຂໍ້ຄວາມນີ້ໄດ້ໃໝ່ຜ່ານເມນູ OBS Studio." +MacPermissions.AccessGranted="ອະນຸຍາດການເຂົ້າເຖິງແລ້ວ" +MacPermissions.RequestAccess="ຮ້ອງຂໍການເຂົ້າເຖິງ" +MacPermissions.OpenPreferences="ເປີດ %1 Preferences" +MacPermissions.Item.ScreenRecording="ການບັນທຶກໜ້າຈໍ" +MacPermissions.Item.ScreenRecording.Details="OBS ຕ້ອງການການອະນຸຍາດນີ້ ເພື່ອໃຫ້ສາມາດບັນທຶກໜ້າຈໍຂອງທ່ານໄດ້." +MacPermissions.Item.Camera="ກ້ອງ" +MacPermissions.Item.Camera.Details="ການອະນຸຍາດນີ້ຈຳເປັນ ເພື່ອບັນທຶກເນື້ອຫາຈາກ webcam ຫຼື capture card." +MacPermissions.Item.Microphone="ໄມໂຄຣໂຟນ" +MacPermissions.Item.Microphone.Details="OBS ຕ້ອງການການອະນຸຍາດນີ້ ຫາກທ່ານຕ້ອງການບັນທຶກສຽງໄມໂຄຣໂຟນ ຫຼື ອຸປະກອນສຽງພາຍນອກຂອງທ່ານ." +MacPermissions.Item.InputMonitoring="ການ Monitor Input" +MacPermissions.Item.InputMonitoring.Details="ການອະນຸຍາດນີ້ຈຳເປັນສຳລັບໃຫ້ຄີລັດ (Hotkeys) ເຮັດວຽກໄດ້ ໃນຂະນະທີ່ OBS ຢູ່ໃນພື້ນຫຼັງ." +MacPermissions.Item.Accessibility="ການເຂົ້າເຖິງ (Accessibility)" +MacPermissions.Item.Accessibility.Details="ໃນການຕິດຕັ້ງທີ່ເກົ່າກວ່າ, OBS ອາດຈະຢູ່ໃນລາຍການ \"Accessibility\" ແທນທີ່ຈະເປັນ \"Input Monitoring\"." +MacPermissions.Continue="ດຳເນີນການຕໍ່" +SourceLeak.Title="ຂໍ້ຜິດພາດການລ້າງ Source" +SourceLeak.Text="ເກີດບັນຫາຂະນະປ່ຽນ Scene collection ແລະ ບາງ sources ບໍ່ສາມາດ unload ໄດ້. ບັນຫານີ້ມັກເກີດຈາກປັກອິນທີ່ບໍ່ຄືນຊັບພະຍາກອນຢ່າງຖືກຕ້ອງ. ກະລຸນາກວດສອບໃຫ້ແນ່ໃຈວ່າປັກອິນທີ່ທ່ານໃຊ້ເປັນເວີຊັນຫຼ້າສຸດ.\n\nOBS Studio ຈະປິດລົງດຽວນີ້ ເພື່ອປ້ອງກັນຂໍ້ມູນເສຍຫາຍ." +Basic.DesktopDevice1="ສຽງເດັສທັອບ (Desktop Audio)" +Basic.DesktopDevice2="ສຽງເດັສທັອບ 2" +Basic.AuxDevice1="ໄມ/Aux" +Basic.AuxDevice2="ໄມ/Aux 2" +Basic.AuxDevice3="ໄມ/Aux 3" +Basic.AuxDevice4="ໄມ/Aux 4" +Basic.Scene="ສາກ (Scene)" +Basic.DisplayCapture="ການບັນທຶກໜ້າຈໍ" +Basic.Main.PreviewConextMenu.Enable="ເປີດໃຊ້ ຕົວຢ່າງ (Preview)" +Basic.Main.Preview.Disable="ປິດ ຕົວຢ່າງ (Preview)" +ScaleFiltering="ການກອງສະເກລ (Scale Filtering)" +BlendingMethod="ວິທີການປະສົມ (Blending Method)" +BlendingMethod.Default="ຄ່າເລີ່ມຕົ້ນ" +BlendingMethod.SrgbOff="ປິດ SRGB" +BlendingMode="ໂໝດການປະສົມ (Blending Mode)" +VolControl.SliderUnmuted="ແຖບເລື່ອນລະດັບສຽງສຳລັບ '%1':" +VolControl.SliderMuted="ແຖບເລື່ອນລະດັບສຽງສຳລັບ '%1': (ປິດສຽງຢູ່)" +VolControl.Mute="ປິດສຽງ '%1'" +VolControl.Properties="ຄຸນສົມບັດສຳລັບ '%1'" +VolControl.UnassignedWarning.Title="ແຫຼ່ງສຽງທີ່ບໍ່ໄດ້ກຳນົດ" +VolControl.UnassignedWarning.Text="\"%1\" ບໍ່ໄດ້ຖືກກຳນົດໃຫ້ກັບແທຣັກສຽງໃດໆ ແລະ ຈະບໍ່ໄດ້ຍິນໃນການສະຕຣີມ ຫຼື ການບັນທຶກ.\n\nເພື່ອກຳນົດແຫຼ່ງສຽງໃຫ້ກັບແທຣັກ, ໃຫ້ເປີດ ຄຸນສົມບັດສຽງຂັ້ນສູງ ຜ່ານເມນູຄລິກຂວາ ຫຼື ປຸ່ມຮູບເຟືອງໃນແຖບເຄື່ອງມື mixer dock." +Basic.Main.AddSceneDlg.Title="ເພີ່ມສາກ" +Basic.Main.AddSceneDlg.Text="ກະລຸນາໃສ່ຊື່ຂອງສາກ" +Basic.Main.DefaultSceneName.Text="ສາກ %1" +Basic.Main.AddSceneCollection.Title="ເພີ່ມ Scene Collection" +Basic.Main.AddSceneCollection.Text="ກະລຸນາໃສ່ຊື່ຂອງ Scene collection" +Basic.Main.RenameSceneCollection.Title="ປ່ຽນຊື່ Scene Collection" +Basic.Main.RemigrateSceneCollection.Title="ອັບເດດຄວາມລະອຽດ Scene Collection" +Basic.Main.RemigrateSceneCollection.Text="ທ່ານຕ້ອງການອັບເດດຄວາມລະອຽດ scene collection ຂອງ \"%1\" ໃຫ້ກົງກັບຄວາມລະອຽດ canvas ຂອງໂປຣໄຟລ໌ປັດຈຸບັນ %2x%3 ຫຼື ບໍ່?" +Basic.Main.RemigrateSceneCollection.CannotMigrate.Active="ບໍ່ສາມາດອັບເດດຄວາມລະອຽດ scene collection ຂະນະທີ່ outputs ກຳລັງເຮັດວຽກ." +Basic.Main.RemigrateSceneCollection.CannotMigrate.UnknownBaseResolution="ອັບເດດຄວາມລະອຽດ scene collection ລົ້ມເຫຼວ. ບໍ່ຮູ້ຄວາມລະອຽດເດີມ." +Basic.Main.RemigrateSceneCollection.CannotMigrate.FailedVideoReset="ຣີເຊັດບໍ່ໄດ້: ການປ່ຽນຄວາມລະອຽດ OBS ລົ້ມເຫຼວ." +Basic.Main.RemigrateSceneCollection.CannotMigrate.BaseResolutionMatches="ຣີເຊັດບໍ່ໄດ້: ຄວາມລະອຽດປັດຈຸບັນກົງກັບ base resolution ຂອງ scene collection ແລ້ວ." +AddProfile.Title="ເພີ່ມໂປຣໄຟລ໌" +AddProfile.Text="ກະລຸນາໃສ່ຊື່ຂອງໂປຣໄຟລ໌" +AddProfile.WizardCheckbox="ສະແດງຕົວຊ່ວຍການຕັ້ງຄ່າອັດຕະໂນມັດ" +RenameProfile.Title="ປ່ຽນຊື່ໂປຣໄຟລ໌" +Basic.Main.MixerRename.Title="ປ່ຽນຊື່ແຫຼ່ງສຽງ" +Basic.Main.MixerRename.Text="ກະລຸນາໃສ່ຊື່ຂອງແຫຼ່ງສຽງ" +Basic.Main.PreviewDisabled="ຕົວຢ່າງ (Preview) ຖືກປິດການໃຊ້ງານຢູ່" +Basic.SourceSelect="ສ້າງ/ເລືອກ ແຫຼ່ງທີ່ມາ" +Basic.SourceSelect.CreateNew="ສ້າງໃໝ່" +Basic.SourceSelect.AddExisting="ເພີ່ມທີ່ມີຢູ່ແລ້ວ" +Basic.SourceSelect.AddVisible="ເຮັດໃຫ້ແຫຼ່ງທີ່ມາເບິ່ງເຫັນໄດ້" +Basic.Main.Sources.Visibility="ການເບິ່ງເຫັນ" +Basic.Main.Sources.VisibilityDescription="ຄວບຄຸມການເບິ່ງເຫັນຂອງ '%1' ໃນ canvas" +Basic.Main.Sources.Lock="ລັອກ" +Basic.Main.Sources.LockDescription="ລັອກຕຳແໜ່ງ ແລະ ຂະໜາດຂອງ '%1' ໃນ canvas" +Basic.PropertiesWindow="ຄຸນສົມບັດສຳລັບ '%1'" +Basic.PropertiesWindow.AutoSelectFormat="%1 (ເລືອກອັດຕະໂນມັດ: %2)" +Basic.PropertiesWindow.SelectColor="ເລືອກສີ" +Basic.PropertiesWindow.SelectFont="ເລືອກຟອນ" +Basic.PropertiesWindow.SelectFont.WindowTitle="ເລືອກຟອນ" +Basic.PropertiesWindow.ConfirmTitle="ການຕັ້ງຄ່າປ່ຽນແປງ" +Basic.PropertiesWindow.Confirm="ມີການປ່ຽນແປງທີ່ຍັງບໍ່ໄດ້ບັນທຶກ. ທ່ານຕ້ອງການເກັບມັນໄວ້ບໍ່?" +Basic.PropertiesWindow.NoProperties="ບໍ່ມີຄຸນສົມບັດ" +Basic.PropertiesWindow.AddFiles="ເພີ່ມໄຟລ໌" +Basic.PropertiesWindow.AddDir="ເພີ່ມ ໄດເຣັກທໍຣີ" +Basic.PropertiesWindow.AddURL="ເພີ່ມ Path/URL" +Basic.PropertiesWindow.AddEditableListDir="ເພີ່ມ ໄດເຣັກທໍຣີ ໃສ່ '%1'" +Basic.PropertiesWindow.AddEditableListFiles="ເພີ່ມໄຟລ໌ໃສ່ '%1'" +Basic.PropertiesWindow.AddEditableListEntry="ເພີ່ມລາຍການໃສ່ '%1'" +Basic.PropertiesWindow.EditEditableListEntry="ແກ້ໄຂລາຍການຈາກ '%1'" +Basic.PropertiesView.FPS.Simple="ຄ່າ FPS ແບບງ່າຍ" +Basic.PropertiesView.FPS.Rational="ຄ່າ FPS ແບບ Rational" +Basic.PropertiesView.FPS.ValidFPSRanges="ຊ່ວງ FPS ທີ່ໃຊ້ໄດ້:" +Basic.PropertiesView.UrlButton.Text="ເປີດລິງກ໌ນີ້ໃນເວັບບຣາວເຊີເລີ່ມຕົ້ນຂອງທ່ານບໍ່?" +Basic.PropertiesView.UrlButton.OpenUrl="ເປີດ URL" +Basic.InteractionWindow="ກຳລັງໂຕ້ຕອບກັບ '%1'" +Basic.StatusBar.Reconnecting="ຕັດການເຊື່ອມຕໍ່, ກຳລັງເຊື່ອມຕໍ່ໃໝ່ໃນ %2 ວິນາທີ (ພະຍາຍາມຄັ້ງທີ %1)" +Basic.StatusBar.AttemptingReconnect="ກຳລັງພະຍາຍາມເຊື່ອມຕໍ່ໃໝ່... (ພະຍາຍາມຄັ້ງທີ %1)" +Basic.StatusBar.ReconnectSuccessful="ເຊື່ອມຕໍ່ໃໝ່ສຳເລັດ" +Basic.StatusBar.Delay="ດີເລ (%1 ວິນາທີ)" +Basic.StatusBar.DelayStartingIn="ດີເລ (ຈະເລີ່ມໃນ %1 ວິນາທີ)" +Basic.StatusBar.DelayStoppingIn="ດີເລ (ຈະຢຸດໃນ %1 ວິນາທີ)" +Basic.StatusBar.DelayStartingStoppingIn="ດີເລ (ຈະຢຸດໃນ %1 ວິນາທີ, ຈະເລີ່ມໃນ %2 ວິນາທີ)" +Basic.StatusBar.RecordingSavedTo="ບັນທຶກໄວ້ທີ່ '%1'" +Basic.StatusBar.ReplayBufferSavedTo="Replay buffer ບັນທຶກໄວ້ທີ່ '%1'" +Basic.StatusBar.ScreenshotSavedTo="ພາບໜ້າຈໍບັນທຶກໄວ້ທີ່ '%1'" +Basic.StatusBar.AutoRemuxedTo="Auto remux ການບັນທຶກໄປທີ່ '%1'" +Basic.Filters="ຟິວເຕີ" +Basic.Filters.AsyncFilters="ຟິວເຕີ ສຽງ/ວິດີໂອ" +Basic.Filters.AudioFilters="ຟິວເຕີ ສຽງ" +Basic.Filters.EffectFilters="ຟິວເຕີ ເອັບເຟັກ" +Basic.Filters.Title="ຟິວເຕີ ສຳລັບ '%1'" +Basic.Filters.AddFilter.Title="ຊື່ຟິວເຕີ" +Basic.Filters.AddFilter.Text="ກະລຸນາລະບຸຊື່ຂອງຟິວເຕີ" +Basic.TransformWindow="ການປັບແຕ່ງສາກ (Scene Item Transform)" +Basic.TransformWindow.Position="ຕຳແໜ່ງ" +Basic.TransformWindow.PositionX="ຕຳແໜ່ງ X" +Basic.TransformWindow.PositionY="ຕຳແໜ່ງ Y" +Basic.TransformWindow.Rotation="ການໝຸນ" +Basic.TransformWindow.Size="ຂະໜາດ" +Basic.TransformWindow.Width="ຄວາມກວ້າງ" +Basic.TransformWindow.Height="ຄວາມສູງ" +Basic.TransformWindow.Alignment="ການຈັດຕຳແໜ່ງ" +Basic.TransformWindow.BoundsType="ປະເພດ Bounding Box" +Basic.TransformWindow.BoundsAlignment="ການຈັດຕຳແໜ່ງໃນ Bounding Box" +Basic.TransformWindow.Bounds="ຂະໜາດ Bounding Box" +Basic.TransformWindow.BoundsWidth="ຄວາມກວ້າງ Bounding Box" +Basic.TransformWindow.BoundsHeight="ຄວາມສູງ Bounding Box" +Basic.TransformWindow.CropToBounds="ຕັດຂອບ (Crop) ຕາມ Bounding Box" +Basic.TransformWindow.Crop="ຕັດຂອບ (Crop)" +Basic.TransformWindow.CropLeft="ຕັດຂອບ ຊ້າຍ" +Basic.TransformWindow.CropRight="ຕັດຂອບ ຂວາ" +Basic.TransformWindow.CropTop="ຕັດຂອບ ເທິງ" +Basic.TransformWindow.CropBottom="ຕັດຂອບ ລຸ່ມ" +Basic.TransformWindow.Alignment.TopLeft="ເທິງ ຊ້າຍ" +Basic.TransformWindow.Alignment.TopCenter="ເທິງ ເຄິ່ງກາງ" +Basic.TransformWindow.Alignment.TopRight="ເທິງ ຂວາ" +Basic.TransformWindow.Alignment.CenterLeft="ເຄິ່ງກາງ ຊ້າຍ" +Basic.TransformWindow.Alignment.Center="ເຄິ່ງກາງ" +Basic.TransformWindow.Alignment.CenterRight="ເຄິ່ງກາງ ຂວາ" +Basic.TransformWindow.Alignment.BottomLeft="ລຸ່ມ ຊ້າຍ" +Basic.TransformWindow.Alignment.BottomCenter="ລຸ່ມ ເຄິ່ງກາງ" +Basic.TransformWindow.Alignment.BottomRight="ລຸ່ມ ຂວາ" +Basic.TransformWindow.BoundsType.None="ບໍ່ມີຂອບເຂດ" +Basic.TransformWindow.BoundsType.MaxOnly="ຂະໜາດສູງສຸດເທົ່ານັ້ນ" +Basic.TransformWindow.BoundsType.ScaleInner="Scale ຕາມຂອບເຂດດ້ານໃນ" +Basic.TransformWindow.BoundsType.ScaleOuter="Scale ຕາມຂອບເຂດດ້ານນອກ" +Basic.TransformWindow.BoundsType.ScaleToWidth="Scale ຕາມຄວາມກວ້າງຂອງຂອບເຂດ" +Basic.TransformWindow.BoundsType.ScaleToHeight="Scale ຕາມຄວາມສູງຂອງຂອບເຂດ" +Basic.TransformWindow.BoundsType.Stretch="ຢືດ (Stretch) ຕາມຂອບເຂດ" +Basic.TransformWindow.Title="ແກ້ໄຂ Transform ສຳລັບ '%1'" +Basic.TransformWindow.NoSelectedSource="ບໍ່ໄດ້ເລືອກແຫຼ່ງທີ່ມາ" +Basic.Main.AddSourceHelp.Title="ບໍ່ສາມາດເພີ່ມແຫຼ່ງທີ່ມາ" +Basic.Main.AddSourceHelp.Text="ທ່ານຈຳເປັນຕ້ອງມີຢ່າງໜ້ອຍ 1 ສາກ ເພື່ອເພີ່ມແຫຼ່ງທີ່ມາ." +Basic.Main.Scenes="ສາກ (Scenes)" +Basic.Main.Sources="ແຫຼ່ງທີ່ມາ (Sources)" +Basic.Main.Source="ແຫຼ່ງທີ່ມາ" +Basic.Main.Controls="ການຄວບຄຸມ" +Basic.Main.PreparingStream="ກຳລັງກະກຽມ..." +Basic.Main.Connecting="ກຳລັງເຊື່ອມຕໍ່..." +Basic.Main.StartRecording="ເລີ່ມບັນທຶກ" +Basic.Main.StartReplayBuffer="ເລີ່ມ Replay Buffer" +Basic.Main.SaveReplay="ບັນທຶກ Replay" +Basic.Main.StartStreaming="ເລີ່ມສະຕຣີມ" +Basic.Main.StartBroadcast="ອອກອາກາດສົດ" +Basic.Main.StartVirtualCam="ເລີ່ມ ກ້ອງສະເໝືອນ (Virtual Camera)" +Basic.Main.StopRecording="ຢຸດບັນທຶກ" +Basic.Main.PauseRecording="ຢຸດບັນທຶກຊົ່ວຄາວ" +Basic.Main.UnpauseRecording="ກັບມາບັນທຶກຕໍ່" +Basic.Main.SplitFile="ແຍກໄຟລ໌ບັນທຶກ" +Basic.Main.AddChapterMarker="ເພີ່ມ Chapter Marker (Hybrid MP4/MOV ເທົ່ານັ້ນ)" +Basic.Main.StoppingRecording="ກຳລັງຢຸດບັນທຶກ..." +Basic.Main.StopReplayBuffer="ຢຸດ Replay Buffer" +Basic.Main.StoppingReplayBuffer="ກຳລັງຢຸດ Replay Buffer..." +Basic.Main.SetupBroadcast="ຈັດການການອອກອາກາດ" +Basic.Main.StopStreaming="ຢຸດສະຕຣີມ" +Basic.Main.StopBroadcast="ຈົບການອອກອາກາດ" +Basic.Main.AutoStopEnabled="(ຢຸດອັດຕະໂນມັດ)" +Basic.Main.StoppingStreaming="ກຳລັງຢຸດສະຕຣີມ..." +Basic.Main.ForceStopStreaming="ຢຸດສະຕຣີມ (ຖິ້ມ delay)" +Basic.Main.ShowContextBar="ສະແດງ Source Toolbar" +Basic.Main.HideContextBar="ເຊື່ອງ Source Toolbar" +Basic.Main.StopVirtualCam="ຢຸດ ກ້ອງສະເໝືອນ (Virtual Camera)" +Basic.Main.Group="ກຸ່ມ %1" +Basic.Main.GroupItems="ຈັດກຸ່ມລາຍການທີ່ເລືອກ" +Basic.Main.Ungroup="ຍົກເລີກການຈັດກຸ່ມ" +Basic.Main.GridMode="ໂໝດຕາຕະລາງ" +Basic.Main.ListMode="ໂໝດລາຍການ" +Basic.Main.VirtualCamConfig="ຕັ້ງຄ່າ ກ້ອງສະເໝືອນ (Virtual Camera)" +Basic.VCam.VirtualCamera="ກ້ອງສະເໝືອນ (Virtual Camera)" +Basic.VCam.OutputType="ປະເພດ Output" +Basic.VCam.OutputSelection="ການເລືອກ Output" +Basic.VCam.OutputType.Program="ໂປຣແກຣມ (ຄ່າເລີ່ມຕົ້ນ)" +Basic.VCam.OutputSelection.NoSelection="ບໍ່ມີການເລືອກສຳລັບປະເພດ output ນີ້" +Basic.VCam.RestartWarning="ກ້ອງສະເໝືອນຈະຖືກຣີສະຕາດເພື່ອນຳໃຊ້ການປ່ຽນແປງນີ້" +Basic.MainMenu.File="&ໄຟລ໌" +Basic.MainMenu.File.Export="&ສົ່ງອອກ" +Basic.MainMenu.File.Import="&ນຳເຂົ້າ" +Basic.MainMenu.File.ShowRecordings="ສະແດງ &ການບັນທຶກ" +Basic.MainMenu.File.Remux="ຣີ&ມັກສ໌ (Remux) ການບັນທຶກ" +Basic.MainMenu.File.Settings="&ການຕັ້ງຄ່າ" +Basic.MainMenu.File.ShowSettingsFolder="ສະແດງໂຟນເດີການຕັ້ງຄ່າ" +Basic.MainMenu.File.ShowProfileFolder="ສະແດງໂຟນເດີໂປຣໄຟລ໌" +Basic.MainMenu.File.ShowMissingFiles="ກວດສອບໄຟລ໌ທີ່ຫາຍໄປ" +Basic.MainMenu.File.Exit="&ອອກ" +Basic.MainMenu.Edit="&ແກ້ໄຂ" +Basic.MainMenu.Edit.LockPreview="&ລັອກຕົວຢ່າງ (Preview)" +Basic.MainMenu.Edit.Scale="&Scaling ຕົວຢ່າງ" +Basic.MainMenu.Edit.Scale.Window="Scale ຕາມໜ້າຕ່າງ" +Basic.MainMenu.Edit.Scale.ZoomIn="ຊູມເຂົ້າ" +Basic.MainMenu.Edit.Scale.ZoomOut="ຊູມອອກ" +Basic.MainMenu.Edit.Scale.ResetZoom="ຣີເຊັດການຊູມ" +Basic.MainMenu.Edit.Transform.EditTransform="&ແກ້ໄຂ Transform" +Basic.MainMenu.Edit.Transform.CopyTransform="ສຳເນົາ Transform" +Basic.MainMenu.Edit.Transform.PasteTransform="ວາງ Transform" +Basic.MainMenu.Edit.Transform.ResetTransform="&ຣີເຊັດ Transform" +Basic.MainMenu.Edit.Transform.Rotate90CW="ໝຸນ 90 ອົງສາ ຕາມເຂັມໂມງ" +Basic.MainMenu.Edit.Transform.Rotate90CCW="ໝຸນ 90 ອົງສາ ທວນເຂັມໂມງ" +Basic.MainMenu.Edit.Transform.Rotate180="ໝຸນ 180 ອົງສາ" +Basic.MainMenu.Edit.Transform.FlipHorizontal="ພິກ &ແນວນອນ" +Basic.MainMenu.Edit.Transform.FlipVertical="ພິກ &ແນວຕັ້ງ" +Basic.MainMenu.Edit.Transform.FitToScreen="&ປັບໃຫ້ພໍດີໜ້າຈໍ" +Basic.MainMenu.Edit.Transform.StretchToScreen="&ຢືດໃຫ້ເຕັມໜ້າຈໍ" +Basic.MainMenu.Edit.Transform.CenterToScreen="&ຈັດເຄິ່ງກາງໜ້າຈໍ" +Basic.MainMenu.Edit.Transform.VerticalCenter="ຈັດເຄິ່ງກາງແນວຕັ້ງ" +Basic.MainMenu.Edit.Transform.HorizontalCenter="ຈັດເຄິ່ງກາງແນວນອນ" +Basic.MainMenu.Edit.Order="&ລຳດັບ" +Basic.MainMenu.Edit.Order.MoveUp="ຍັບ &ຂຶ້ນ" +Basic.MainMenu.Edit.Order.MoveDown="ຍັບ &ລົງ" +Basic.MainMenu.Edit.Order.MoveToTop="ຍັບໄປ &ເທິງສຸດ" +Basic.MainMenu.Edit.Order.MoveToBottom="ຍັບໄປ &ລຸ່ມສຸດ" +Basic.MainMenu.Edit.AdvAudio="&ຄຸນສົມບັດສຽງຂັ້ນສູງ" +Basic.MainMenu.View="&ມຸມມອງ" +Basic.MainMenu.View.Toolbars="&ແຖບເຄື່ອງມື" +Basic.MainMenu.View.ListboxToolbars="ແຖບເຄື່ອງມື Dock" +Basic.MainMenu.View.ContextBar="ແຖບເຄື່ອງມື Source" +Basic.MainMenu.View.SourceIcons="&ໄອຄອນ Source" +Basic.MainMenu.View.StatusBar="&ແຖບສະຖານະ" +Basic.MainMenu.View.Fullscreen.Interface="ອິນເຕີເຟດແບບເຕັມຈໍ" +Basic.MainMenu.View.ResetUI="&ຣີເຊັດ UI" +Basic.MainMenu.View.AlwaysOnTop="&ຢູ່ເທິງສຸດສະເໝີ" +Basic.MainMenu.View.SceneListMode="ໂໝດລາຍການສາກ" +Basic.MainMenu.Docks.ResetDocks="&ຣີເຊັດ Docks" +Basic.MainMenu.Docks.LockDocks="&ລັອກ Docks" +Basic.MainMenu.Docks.SideDocks="&Docks ຄວາມສູງເຕັມ" +Basic.MainMenu.Import="ນຳເຂົ້າ..." +Basic.MainMenu.Export="ສົ່ງອອກ..." +Basic.MainMenu.Profile="&ໂປຣໄຟລ໌" +Basic.MainMenu.Profile.Import="ນຳເຂົ້າໂປຣໄຟລ໌" +Basic.MainMenu.Profile.Export="ສົ່ງອອກໂປຣໄຟລ໌" +Basic.MainMenu.SceneCollection.Import="ນຳເຂົ້າ Scene Collection" +Basic.MainMenu.SceneCollection.Export="ສົ່ງອອກ Scene Collection" +Basic.MainMenu.SceneCollection.Remigrate="ຣີເຊັດ Base Resolution" +Basic.MainMenu.SceneCollection.Migrate="ຕັ້ງຄ່າ Base Resolution" +Basic.MainMenu.Profile.Exists="ໂປຣໄຟລ໌ນີ້ມີຢູ່ແລ້ວ" +Basic.MainMenu.Tools="&ເຄື່ອງມື" +Basic.MainMenu.Help="&ວິທີໃຊ້" +Basic.MainMenu.Help.HelpPortal="&ສູນຊ່ວຍເຫຼືອ" +Basic.MainMenu.Help.Website="ເຂົ້າເບິ່ງ &ເວັບໄຊ" +Basic.MainMenu.Help.Discord="ເຂົ້າຮ່ວມເຊີບເວີ &Discord" +Basic.MainMenu.Help.WhatsNew="ມີຫຍັງໃໝ່" +Basic.MainMenu.Help.Logs="&ໄຟລ໌ Log" +Basic.MainMenu.Help.Logs.ShowLogs="&ສະແດງໄຟລ໌ Log" +Basic.MainMenu.Help.Logs.UploadCurrentLog="ອັບໂຫຼດໄຟລ໌ Log &ປັດຈຸບັນ" +Basic.MainMenu.Help.Logs.UploadLastLog="ອັບໂຫຼດໄຟລ໌ Log &ກ່ອນໜ້າ" +Basic.MainMenu.Help.Logs.ViewCurrentLog="&ເບິ່ງ Log ປັດຈຸບັນ" +Basic.MainMenu.Help.ReleaseNotes="ບັນທຶກເວີຊັນ (Release Notes)" +Basic.MainMenu.Help.CheckForUpdates="ກວດຫາການອັບເດດ" +Basic.MainMenu.Help.Repair="ກວດສອບຄວາມສົມບູນຂອງໄຟລ໌" +Basic.MainMenu.Help.RestartSafeMode="ຣີສະຕາດໃນ ໂໝດປອດໄພ (Safe Mode)" +Basic.MainMenu.Help.RestartNormal="ຣີສະຕາດໃນ ໂໝດປົກກະຕິ" +Basic.MainMenu.Help.CrashLogs="&ລາຍງານການ Crash" +Basic.MainMenu.Help.CrashLogs.ShowLogs="&ສະແດງລາຍງານການ Crash" +Basic.MainMenu.Help.CrashLogs.UploadLastLog="ອັບໂຫຼດລາຍງານການ Crash &ກ່ອນໜ້າ" +Basic.MainMenu.Help.About="&ກ່ຽວກັບ" +Basic.Settings.ProgramRestart="ໂປຣແກຣມຕ້ອງຖືກຣີສະຕາດ ເພື່ອໃຫ້ການຕັ້ງຄ່າເຫຼົ່ານີ້ມີຜົນ." +Basic.Settings.ConfirmTitle="ຢືນຢັນການປ່ຽນແປງ" +Basic.Settings.Confirm="ທ່ານມີການປ່ຽນແປງທີ່ຍັງບໍ່ໄດ້ບັນທຶກ. ບັນທຶກການປ່ຽນແປງບໍ່?" +Basic.Settings.MultitrackVideoDisabledSettings="%1 %2 ກຳລັງຄວບຄຸມການຕັ້ງຄ່າການສະຕຣີມບາງຢ່າງຂອງທ່ານ" +Basic.Settings.General="ທົ່ວໄປ" +Basic.Settings.General.Language="ພາສາ" +Basic.Settings.General.Updater="ການອັບເດດ" +Basic.Settings.General.UpdateChannel="ຊ່ອງທາງການອັບເດດ" +Basic.Settings.General.UpdateChannelDisabled="(ປິດໃຊ້ງານ)" +Basic.Settings.General.UpdateChannelDefault="(ຄ່າເລີ່ມຕົ້ນ)" +Basic.Settings.General.EnableAutoUpdates="ກວດຫາການອັບເດດອັດຕະໂນມັດເມື່ອເປີດໂປຣແກຣມ" +Basic.Settings.General.OpenStatsOnStartup="ເປີດໜ້າຕ່າງສະຖິຕິເມື່ອເປີດໂປຣແກຣມ" +Basic.Settings.General.HideOBSWindowsFromCapture="ເຊື່ອງໜ້າຕ່າງ OBS ຈາກການບັນທຶກໜ້າຈໍ (Screen capture)" +Basic.Settings.General.HideOBSWindowsFromCapture.Tooltip="ການຕັ້ງຄ່ານີ້ຈະເຊື່ອງໜ້າຕ່າງ OBS Studio ທັງໝົດ (ຍົກເວັ້ນໂປຣເຈັກເຕີ) ຈາກການຖືກບັນທຶກໂດຍ OBS ແລະ ມີຜົນກັບ \nແອັບພລິເຊຊັນອື່ນໆ ເຊັ່ນ: ການປະຊຸມ, ການແບ່ງປັນໜ້າຈໍ, ການ Support ທາງໄກ, ການຖ່າຍພາບໜ້າຈໍ ແລະ ຊອບແວການບັນທຶກອື່ນໆ." +Basic.Settings.General.HideOBSWindowsFromCapture.Message="ການເປີດໃຊ້ຕົວເລືອກນີ້ ຈະເຊື່ອງໜ້າຕ່າງ OBS Studio ທັງໝົດ (ຍົກເວັ້ນໂປຣເຈັກເຕີ) ຈາກການຖືກບັນທຶກໂດຍ OBS ແລະ ມີຜົນກັບແອັບພລິເຄຊັນອື່ນໆ ເຊັ່ນ: ການປະຊຸມ, ການແບ່ງປັນໜ້າຈໍ, ການ Support ທາງໄກ, ການຖ່າຍພາບໜ້າຈໍ ແລະ ຊອບແວການບັນທຶກອື່ນໆ." +Basic.Settings.General.WarnBeforeStartingStream="ສະແດງກ່ອງຢືນຢັນເມື່ອເລີ່ມສະຕຣີມ" +Basic.Settings.General.WarnBeforeStoppingStream="ສະແດງກ່ອງຢືນຢັນເມື່ອຢຸດສະຕຣີມ" +Basic.Settings.General.WarnBeforeStoppingRecord="ສະແດງກ່ອງຢືນຢັນເມື່ອຢຸດບັນທຶກ" +Basic.Settings.General.Projectors="ໂປຣເຈັກເຕີ" +Basic.Settings.General.HideProjectorCursor="ເຊື່ອງເຄີເຊີເທິງໂປຣເຈັກເຕີ" +Basic.Settings.General.ProjectorAlwaysOnTop="ໃຫ້ໂປຣເຈັກເຕີຢູ່ເທິງສຸດສະເໝີ" +Basic.Settings.General.ScreenSnapping="Snap Sources ໃສ່ຂອບຂອງໜ້າຈໍ" +Basic.Settings.General.CenterSnapping="Snap Sources ໃສ່ເຄິ່ງກາງແນວນອນ ແລະ ແນວຕັ້ງ" +Basic.Settings.General.SourceSnapping="Snap Sources ໃສ່ Source ອື່ນໆ" +Basic.Settings.General.SnapDistance="ຄວາມໄວໃນການ Snap" +Basic.Settings.General.SpacingHelpers="ສະແດງເສັ້ນບອກແນວການຈັດວາງ (Pixel alignment guides)" +Basic.Settings.General.RecordWhenStreaming="ບັນທຶກອັດຕະໂນມັດເມື່ອສະຕຣີມ" +Basic.Settings.General.KeepRecordingWhenStreamStops="ບັນທຶກຕໍ່ໄປເມື່ອຢຸດສະຕຣີມ" +Basic.Settings.General.ReplayBufferWhileStreaming="ເລີ່ມ Replay buffer ອັດຕະໂນມັດເມື່ອສະຕຣີມ" +Basic.Settings.General.KeepReplayBufferStreamStops="ໃຫ້ Replay buffer ເຮັດວຽກຕໍ່ໄປເມື່ອຢຸດສະຕຣີມ" +Basic.Settings.General.SysTrayWhenStarted="ຫຍໍ້ລົງ System tray ເມື່ອເປີດໂປຣແກຣມ" +Basic.Settings.General.SystemTrayHideMinimize="ຫຍໍ້ລົງ System tray ສະເໝີແທນ Task bar" +Basic.Settings.General.SaveProjectors="ບັນທຶກໂປຣເຈັກເຕີເມື່ອອອກ" +Basic.Settings.General.CloseExistingProjectors="ຈຳກັດໂປຣເຈັກເຕີເຕັມຈໍ ໜຶ່ງອັນຕໍ່ໜຶ່ງໜ້າຈໍ" +Basic.Settings.General.Preview="ຕົວຢ່າງ (Preview)" +Basic.Settings.General.OverflowHidden="ເຊື່ອງສ່ວນເກີນ (Overflow)" +Basic.Settings.General.OverflowAlwaysVisible="ສະແດງສ່ວນເກີນສະເໝີ" +Basic.Settings.General.OverflowSelectionHidden="ສະແດງສ່ວນເກີນແມ້ວ່າ source ຈະເບິ່ງບໍ່ເຫັນກໍຕາມ" +Basic.Settings.General.Importers="ຕົວນຳເຂົ້າ (Importers)" +Basic.Settings.General.AutomaticCollectionSearch="ຄົ້ນຫາ scene collections ໃນຕຳແໜ່ງທີ່ຮູ້ຈັກ ເມື່ອນຳເຂົ້າ" +Basic.Settings.General.SwitchOnDoubleClick="ປ່ຽນສາກເມື່ອດັບເບິນຄລິກ" +Basic.Settings.General.StudioPortraitLayout="ເປີດໃຊ້ການຈັດວາງແນວຕັ້ງ/Portrait" +Basic.Settings.General.TogglePreviewProgramLabels="ສະແດງປ້າຍຊື່ ຕົວຢ່າງ/ໂປຣແກຣມ" +Basic.Settings.General.Multiview="ມຸມມອງລວມ (Multiview)" +Basic.Settings.General.Multiview.MouseSwitch="ຄລິກເພື່ອສະລັບລະຫວ່າງສາກ" +Basic.Settings.General.Multiview.DrawSourceNames="ສະແດງຊື່ສາກ" +Basic.Settings.General.Multiview.DrawSafeAreas="ແຕ້ມພື້ນທີ່ປອດໄພ (EBU R 95)" +Basic.Settings.General.MultiviewLayout="ການຈັດວາງ ມຸມມອງລວມ" +Basic.Settings.General.MultiviewLayout.Horizontal.Top="ແນວນອນ, ເທິງ (8 ສາກ)" +Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="ແນວນອນ, ລຸ່ມ (8 ສາກ)" +Basic.Settings.General.MultiviewLayout.Vertical.Left="ແນວຕັ້ງ, ຊ້າຍ (8 ສາກ)" +Basic.Settings.General.MultiviewLayout.Vertical.Right="ແນວຕັ້ງ, ຂວາ (8 ສາກ)" +Basic.Settings.General.MultiviewLayout.Horizontal.18Scene.Top="ແນວນອນ, ເທິງ (18 ສາກ)" +Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="ແນວນອນ, ເທິງ (24 ສາກ)" +Basic.Settings.General.MultiviewLayout.4Scene="ສາກເທົ່ານັ້ນ (4 ສາກ)" +Basic.Settings.General.MultiviewLayout.9Scene="ສາກເທົ່ານັ້ນ (9 ສາກ)" +Basic.Settings.General.MultiviewLayout.16Scene="ສາກເທົ່ານັ້ນ (16 ສາກ)" +Basic.Settings.General.MultiviewLayout.25Scene="ສາກເທົ່ານັ້ນ (25 ສາກ)" +Basic.Settings.General.ChannelDescription.stable="ເວີຊັນ Stable ຫຼ້າສຸດ" +Basic.Settings.General.ChannelDescription.beta="ເວີຊັນກ່ອນປ່ອຍຈິງທີ່ອາດບໍ່ສະຖຽນ" +Basic.Settings.Appearance="ຮູບລັກສະນະ" +Basic.Settings.Appearance.General="ທົ່ວໄປ" +Basic.Settings.Appearance.General.Variant="ຮູບແບບ" +Basic.Settings.Appearance.General.NoVariant="ບໍ່ມີຮູບແບບໃຫ້ເລືອກ" +Basic.Settings.Appearance.FontScale="ຂະໜາດຟອນ" +Basic.Settings.Appearance.Density="ຄວາມໜາແໜ້ນ" +Basic.Settings.Appearance.OptionsWarning="ບາງຕົວເລືອກຮູບລັກສະນະບໍ່ສາມາດໃຊ້ໄດ້ກັບຮູບແບບນີ້." +Basic.Settings.Stream="ສະຕຣີມ" +Basic.Settings.Stream.Destination="ປາຍທາງ" +Basic.Settings.Stream.Custom.UseAuthentication="ໃຊ້ການຢືນຢັນຕົວຕົນ" +Basic.Settings.Stream.Custom.Username="ຊື່ຜູ້ໃຊ້" +Basic.Settings.Stream.Custom.Password="ລະຫັດຜ່ານ" +Basic.Settings.Stream.Custom.Username.ToolTip="RIST: ໃສ່ srp_username.\nRTMP: ໃສ່ຊື່ຜູ້ໃຊ້.\nSRT: ບໍ່ໄດ້ໃຊ້." +Basic.Settings.Stream.Custom.Password.ToolTip="RIST: ໃສ່ srp_password.\nRTMP: ໃສ່ລະຫັດຜ່ານ.\nSRT: ໃສ່ encryption passphrase." +Basic.Settings.Stream.BandwidthTestMode="ເປີດໃຊ້ໂໝດທົດສອບແບນວິດ" +Basic.Settings.Stream.TTVAddon.None="ບໍ່ມີ" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV ແລະ FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="ການຕັ້ງຄ່າສະຕຣີມບໍ່ຄົບຖ້ວນ" +Basic.Settings.Stream.StreamSettingsWarning="ເປີດການຕັ້ງຄ່າ" +Basic.Settings.Stream.MissingUrlAndApiKey="URL ແລະ Stream Key ຂາດຫາຍໄປ.\n\nເປີດການຕັ້ງຄ່າເພື່ອໃສ່ URL ແລະ Stream Key ໃນແຖບ 'ສະຕຣີມ'." +Basic.Settings.Stream.MissingUrl="Stream URL ຂາດຫາຍໄປ.\n\nເປີດການຕັ້ງຄ່າເພື່ອໃສ່ URL ໃນແຖບ 'ສະຕຣີມ'." +Basic.Settings.Stream.MissingStreamKey="Stream key ຂາດຫາຍໄປ.\n\nເປີດການຕັ້ງຄ່າເພື່ອໃສ່ stream key ໃນແຖບ 'ສະຕຣີມ'." +Basic.Settings.Stream.IgnoreRecommended="ບໍ່ສົນໃຈຄຳແນະນຳການຕັ້ງຄ່າບໍລິການສະຕຣີມ" +Basic.Settings.Stream.IgnoreRecommended.Warn.Title="ລົບລ້າງການຕັ້ງຄ່າທີ່ແນະນຳ" +Basic.Settings.Stream.IgnoreRecommended.Warn.Text="ຄຳເຕືອນ: ການບໍ່ສົນໃຈຂໍ້ຈຳກັດຂອງບໍລິການ ອາດສົ່ງຜົນໃຫ້ຄຸນນະພາບການສະຕຣີມຫຼຸດລົງ ຫຼື ປ້ອງກັນບໍ່ໃຫ້ທ່ານສະຕຣີມໄດ້.\n\nດຳເນີນການຕໍ່?" +Basic.Settings.Stream.Recommended.MaxVideoBitrate="Video Bitrate ສູງສຸດ: %1 kbps" +Basic.Settings.Stream.Recommended.MaxAudioBitrate="Audio Bitrate ສູງສຸດ: %1 kbps" +Basic.Settings.Stream.Recommended.MaxResolution="ຄວາມລະອຽດສູງສຸດ: %1" +Basic.Settings.Stream.Recommended.MaxFPS="FPS ສູງສຸດ: %1" +Basic.Settings.Stream.SpecifyCustomServer="ລະບຸເຊີບເວີກຳນົດເອງ..." +Basic.Settings.Stream.ServiceCustomServer="ເຊີບເວີກຳນົດເອງ" +Basic.Settings.Stream.EnableMultitrackVideo="ເປີດໃຊ້ %1" +Basic.Settings.Stream.MultitrackVideoMaximumAggregateBitrate="Streaming Bandwidth ສູງສຸດ" +Basic.Settings.Stream.MultitrackVideoMaximumAggregateBitrateAuto="ອັດຕະໂນມັດ" +Basic.Settings.Stream.MultitrackVideoMaximumVideoTracks="Video Tracks ສູງສຸດ" +Basic.Settings.Stream.MultitrackVideoMaximumVideoTracksAuto="ອັດຕະໂນມັດ" +Basic.Settings.Stream.MultitrackVideoStreamDumpEnable="ເປີດໃຊ້ stream dump ເປັນ FLV (ໃຊ້ການຕັ້ງຄ່າໄຟລ໌ບັນທຶກແບບ Simple)" +Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="ເປີດໃຊ້ Config Override" +Basic.Settings.Stream.MultitrackVideoExtraCanvas="Canvas ເເພີ່ມເຕີມ" +Basic.Settings.Stream.WHIPSimulcastInfo="Simulcast ຊ່ວຍໃຫ້ທ່ານສາມາດເຂົ້າລະຫັດ ແລະ ສົ່ງວິດີໂອໄດ້ຫຼາຍລະດັບຄຸນນະພາບ. <a href='https://obsproject.com/kb/whip-streaming-guide'>ຮຽນຮູ້ເພີ່ມເຕີມ</a>" +Basic.Settings.Stream.AdvancedOptions="ຕົວເລືອກຂັ້ນສູງ" +Basic.Settings.Output="ສົ່ງອອກ (Output)" +Basic.Settings.Output.Format="ຮູບແບບການບັນທຶກ" +Basic.Settings.Output.Format.TT.fragmented_mov="Fragmented MOV ຂຽນການບັນທຶກເປັນກ້ອນ ແລະ ບໍ່ຈຳເປັນຕ້ອງມີການ Finalize ຄືກັບໄຟລ໌ MOV ທົ່ວໄປ.\nສິ່ງນີ້ຮັບປະກັນວ່າໄຟລ໌ຈະຍັງສາມາດຫຼິ້ນໄດ້ ແມ້ວ່າການຂຽນລົງດິສກ໌ຈະຖືກຂັດຈັງຫວະ, ຕົວຢ່າງ: ຜົນຈາກ BSOD ຫຼື ໄຟມອດ.\n\nອາດຈະບໍ່ເຂົ້າກັນໄດ້ກັບເຄື່ອງຫຼິ້ນ ແລະ ໂປຣແກຣມຕັດຕໍ່ທັງໝົດ. ໃຊ້ ໄຟລ໌ → Remux ການບັນທຶກ ເພື່ອແປງໄຟລ໌ເປັນຮູບແບບທີ່ເຂົ້າກັນໄດ້ຫຼາຍຂຶ້ນ ຫາກຈຳເປັນ." +Basic.Settings.Output.Format.TT.fragmented_mp4="Fragmented MP4 ຂຽນການບັນທຶກເປັນກ້ອນ ແລະ ບໍ່ຈຳເປັນຕ້ອງມີການ Finalize ຄືກັບໄຟລ໌ MP4 ທົ່ວໄປ.\nສິ່ງນີ້ຮັບປະກັນວ່າໄຟລ໌ຈະຍັງສາມາດຫຼິ້ນໄດ້ ແມ້ວ່າການຂຽນລົງດິສກ໌ຈະຖືກຂັດຈັງຫວະ, ຕົວຢ່າງ: ຜົນຈາກ BSOD ຫຼື ໄຟມອດ.\n\nອາດຈະບໍ່ເຂົ້າກັນໄດ້ກັບເຄື່ອງຫຼິ້ນ ແລະ ໂປຣແກຣມຕັດຕໍ່ທັງໝົດ. ໃຊ້ ໄຟລ໌ → Remux ການບັນທຶກ ເພື່ອແປງໄຟລ໌ເປັນຮູບແບບທີ່ເຂົ້າກັນໄດ້ຫຼາຍຂຶ້ນ ຫາກຈຳເປັນ." +Basic.Settings.Output.Encoder.Video="ຕົວເຂົ້າລະຫັດວິດີໂອ" +Basic.Settings.Output.Encoder.Audio="ຕົວເຂົ້າລະຫັດສຽງ" +Basic.Settings.Output.SelectDirectory="ເລືອກ ໄດເຣັກທໍຣີ ການບັນທຶກ" +Basic.Settings.Output.DynamicBitrate="ປ່ຽນບິດເຣດແບບໄດນາມິກ ເພື່ອຈັດການຄວາມແອອັດຂອງເຄືອຂ່າຍ" +Basic.Settings.Output.DynamicBitrate.Beta="ປ່ຽນບິດເຣດແບບໄດນາມິກ ເພື່ອຈັດການຄວາມແອອັດຂອງເຄືອຂ່າຍ (Beta)" +Basic.Settings.Output.DynamicBitrate.TT="ແທນທີ່ຈະຖິ້ມເຟຣມເພື່ອຫຼຸດຄວາມແອອັດ, ຈະປ່ຽນບິດເຣດທັນທີໃນຂະນະນັ້ນເລີຍ.\n\nໝາຍເຫດ: ສິ່ງນີ້ອາດເພີ່ມ Delay ໃຫ້ກັບຜູ້ຊົມ ຫາກມີຄວາມແອອັດຢ່າງກະທັນຫັນ.\nເມື່ອບິດເຣດຫຼຸດລົງ, ອາດໃຊ້ເວລາສອງສາມນາທີໃນການກູ້ຄືນ.\n\nປັດຈຸບັນຮອງຮັບສະເພາະ RTMP." +Basic.Settings.Output.Mode="ໂໝດ Output" +Basic.Settings.Output.Mode.Simple="ແບບງ່າຍ (Simple)" +Basic.Settings.Output.Mode.Adv="ຂັ້ນສູງ (Advanced)" +Basic.Settings.Output.UseReplayBuffer="ເປີດໃຊ້ Replay Buffer" +Basic.Settings.Output.ReplayBuffer.SecondsMax="ເວລາ Replay ສູງສຸດ" +Basic.Settings.Output.ReplayBuffer.MegabytesMax="Memory ສູງສຸດ" +Basic.Settings.Output.ReplayBuffer.Estimate="ການໃຊ້ Memory ໂດຍປະມານ: %1 MB" +Basic.Settings.Output.ReplayBuffer.EstimateTooLarge="ຄຳເຕືອນ: ການໃຊ້ Memory ໂດຍປະມານ %1 MiB ໃຫຍ່ກວ່າຄ່າສູງສຸດທີ່ແນະນຳ %2 MiB" +Basic.Settings.Output.ReplayBuffer.EstimateUnknown="ບໍ່ສາມາດປະເມີນການໃຊ້ Memory ໄດ້. ກະລຸນາຕັ້ງຄ່າຈຳກັດ Memory ສູງສຸດ." +Basic.Settings.Output.ReplayBuffer.Prefix="ຄຳນຳໜ້າຊື່ໄຟລ໌ Replay Buffer" +Basic.Settings.Output.ReplayBuffer.Suffix="ຄຳຕໍ່ທ້າຍ" +Basic.Settings.Output.ReplayBuffer.UnavailableCustomFFmpeg="Replay Buffer ບໍ່ສາມາດໃຊ້ໄດ້ເມື່ອປະເພດການບັນທຶກຖືກຕັ້ງເປັນ Custom Output (FFmpeg)." +Basic.Settings.Output.Simple.SavePath="Path ການບັນທຶກ" +Basic.Settings.Output.Simple.RecordingQuality="ຄຸນນະພາບການບັນທຶກ" +Basic.Settings.Output.Simple.RecordingQuality.Stream="ຄືກັບສະຕຣີມ" +Basic.Settings.Output.Simple.RecordingQuality.Small="ຄຸນນະພາບສູງ, ຂະໜາດໄຟລ໌ປານກາງ" +Basic.Settings.Output.Simple.RecordingQuality.HQ="ຄຸນນະພາບແຍກບໍ່ອອກ, ຂະໜາດໄຟລ໌ໃຫຍ່" +Basic.Settings.Output.Simple.RecordingQuality.Lossless="ຄຸນນະພາບ Lossless, ຂະໜາດໄຟລ໌ໃຫຍ່ຫຼາຍ" +Basic.Settings.Output.Simple.Warn.VideoBitrate="ຄຳເຕືອນ: Video bitrate ການສະຕຣີມຈະຖືກຕັ້ງເປັນ %1, ເຊິ່ງເປັນຂີດຈຳກັດສູງສຸດສຳລັບບໍລິການສະຕຣີມປັດຈຸບັນ." +Basic.Settings.Output.Simple.Warn.AudioBitrate="ຄຳເຕືອນ: Audio bitrate ການສະຕຣີມຈະຖືກຕັ້ງເປັນ %1, ເຊິ່ງເປັນຂີດຈຳກັດສູງສຸດສຳລັບບໍລິການສະຕຣີມປັດຈຸບັນ." +Basic.Settings.Output.Simple.Warn.CannotPause="ຄຳເຕືອນ: ການບັນທຶກບໍ່ສາມາດຢຸດຊົ່ວຄາວໄດ້ ຫາກຄຸນນະພາບການບັນທຶກຖືກຕັ້ງເປັນ \"ຄືກັບສະຕຣີມ\"." +Basic.Settings.Output.Simple.Warn.IncompatibleContainer="ຄຳເຕືອນ: ຮູບແບບການບັນທຶກທີ່ເລືອກຢູ່ ບໍ່ເຂົ້າກັນກັບຕົວເຂົ້າລະຫັດສະຕຣີມທີ່ເລືອກ." +Basic.Settings.Output.Simple.Warn.Encoder="ຄຳເຕືອນ: ການບັນທຶກດ້ວຍຕົວເຂົ້າລະຫັດຊອບແວ (Software encoder) ໃນຄຸນນະພາບທີ່ຕ່າງຈາກສະຕຣີມ ຈະຕ້ອງການການໃຊ້ງານ CPU ເພີ່ມເຕີມ ຫາກທ່ານສະຕຣີມ ແລະ ບັນທຶກໃນເວລາດຽວກັນ." +Basic.Settings.Output.Simple.Warn.Lossless="ຄຳເຕືອນ: ຄຸນນະພາບ Lossless ສ້າງຂະໜາດໄຟລ໌ທີ່ໃຫຍ່ຫຼາຍ! ຄຸນນະພາບ Lossless ສາມາດໃຊ້ພື້ນທີ່ດິສກ໌ສູງເຖິງ 7 ກິກະໄບຕໍ່ນາທີ ໃນຄວາມລະອຽດ ແລະ ເຟຣມເຣດສູງ. ບໍ່ແນະນຳ Lossless ສຳລັບການບັນທຶກຍາວໆ ເວັ້ນແຕ່ທ່ານຈະມີພື້ນທີ່ດິສກ໌ຈຳນວນຫຼາຍ. Replay buffer ບໍ່ສາມາດໃຊ້ໄດ້ເມື່ອໃຊ້ຄຸນນະພາບ Lossless." +Basic.Settings.Output.Simple.Warn.Lossless.Msg="ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການໃຊ້ຄຸນນະພາບ Lossless?" +Basic.Settings.Output.Simple.Warn.Lossless.Title="ຄຳເຕືອນຄຸນນະພາບ Lossless!" +Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Software (x264 low CPU usage preset, ເພີ່ມຂະໜາດໄຟລ໌)" +Basic.Settings.Output.Simple.Codec.AAC.Default="AAC (ຄ່າເລີ່ມຕົ້ນ)" +Basic.Settings.Output.Simple.TwitchVodTrack="Twitch VOD Track (ໃຊ້ Track 2)" +Basic.Settings.Output.Warn.EnforceResolutionFPS.Title="ຄວາມລະອຽດ/ເຟຣມເຣດ ບໍ່ເຂົ້າກັນ" +Basic.Settings.Output.Warn.EnforceResolutionFPS.Msg="ບໍລິການສະຕຣີມນີ້ ບໍ່ຮອງຮັບຄວາມລະອຽດ output ແລະ/ຫຼື ເຟຣມເຣດປັດຈຸບັນຂອງທ່ານ. ພວກມັນຈະຖືກປ່ຽນເປັນຄ່າທີ່ເຂົ້າກັນໄດ້ທີ່ໃກ້ຄາມທີ່ສຸດ:\n\n%1\n\nທ່ານຕ້ອງການດຳເນີນການຕໍ່ບໍ່?" +Basic.Settings.Output.Warn.EnforceResolutionFPS.Resolution="ຄວາມລະອຽດ: %1" +Basic.Settings.Output.Warn.ServiceCodecCompatibility.Title="ຕົວເຂົ້າລະຫັດບໍ່ເຂົ້າກັນ" +Basic.Settings.Output.Warn.ServiceCodecCompatibility.Msg="ບໍລິການສະຕຣີມ \"%1\" ບໍ່ຮອງຮັບຕົວເຂົ້າລະຫັດ \"%2\". ຕົວເຂົ້າລະຫັດຈະຖືກປ່ຽນເປັນ \"%3\".\n\nທ່ານຕ້ອງການດຳເນີນການຕໍ່ບໍ່?" +Basic.Settings.Output.Warn.ServiceCodecCompatibility.Msg2="ບໍລິການສະຕຣີມ \"%1\" ບໍ່ຮອງຮັບຕົວເຂົ້າລະຫັດ \"%2\" ແລະ \"%3\". ຕົວເຂົ້າລະຫັດເຫຼົ່ານີ້ຈະຖືກປ່ຽນເປັນ \"%4\" ແລະ \"%5\".\n\nທ່ານຕ້ອງການດຳເນີນການຕໍ່ບໍ່?" +Basic.Settings.Output.Reconnect="ເຊື່ອມຕໍ່ໃໝ່ອັດຕະໂນມັດ" +Basic.Settings.Output.RetryDelay="ດີເລການລອງໃໝ່" +Basic.Settings.Output.MaxRetries="ຈຳນວນລອງໃໝ່ສູງສຸດ" +Basic.Settings.Output.Advanced="ເປີດໃຊ້ການຕັ້ງຄ່າຕົວເຂົ້າລະຫັດແບບກຳນົດເອງ (ຂັ້ນສູງ)" +Basic.Settings.Output.EncoderPreset.ultrafast="%1 (low CPU usage, ຄຸນນະພາບຕໍ່າສຸດ)" +Basic.Settings.Output.EncoderPreset.veryfast="%1 (default) (medium CPU usage, ຄຸນນະພາບມາດຕະຖານ)" +Basic.Settings.Output.EncoderPreset.fast="%1 (high CPU usage, ຄຸນນະພາບສູງ)" +Basic.Settings.Output.CustomEncoderSettings="ການຕັ້ງຄ່າຕົວເຂົ້າລະຫັດແບບກຳນົດເອງ" +Basic.Settings.Output.CustomMuxerSettings="ການຕັ້ງຄ່າ Muxer ແບບກຳນົດເອງ" +Basic.Settings.Output.NoSpaceFileName="ສ້າງຊື່ໄຟລ໌ໂດຍບໍ່ມີຍະຫວ່າງ" +Basic.Settings.Output.Adv.Rescale.Disabled="ປິດໃຊ້ງານ" +Basic.Settings.Output.Adv.Streaming="ສະຕຣີມ" +Basic.Settings.Output.Adv.Streaming.Settings="ການຕັ້ງຄ່າສະຕຣີມ" +Basic.Settings.Output.Adv.Encoder="ການຕັ້ງຄ່າຕົວເຂົ້າລະຫັດ" +Basic.Settings.Output.Adv.Recording="ການບັນທຶກ" +Basic.Settings.Output.Adv.Recording.Settings="ການຕັ້ງຄ່າການບັນທຶກ" +Basic.Settings.Output.Adv.Recording.RecType="ປະເພດການບັນທຶກ" +Basic.Settings.Output.Adv.Recording.Type="ປະເພດ" +Basic.Settings.Output.Adv.Recording.Type.Standard="ມາດຕະຖານ (Standard)" +Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(ໃຊ້ຕົວເຂົ້າລະຫັດສະຕຣີມ)" +Basic.Settings.Output.Adv.Recording.Filename="ຮູບແບບຊື່ໄຟລ໌" +Basic.Settings.Output.Adv.Recording.OverwriteIfExists="ຂຽນທັບຖ້າມີໄຟລ໌ຢູ່ແລ້ວ" +Basic.Settings.Output.Adv.FFmpeg.CustomModeWarning="Custom Output (FFmpeg) ບໍ່ມີລະບົບປ້ອງກັນ.\nພິຈາລະນາໃຊ້ປະເພດການບັນທຶກ \"Standard\"." +Basic.Settings.Output.Adv.FFmpeg.Type="ປະເພດ FFmpeg Output" +Basic.Settings.Output.Adv.FFmpeg.Type.URL="Output ໄປທີ່ URL" +Basic.Settings.Output.Adv.FFmpeg.Type.RecordToFile="Output ໄປທີ່ ໄຟລ໌" +Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="ຮູບແບບການບັນທຶກທົ່ວໄປ" +Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="ໄຟລ໌ທັງໝົດ" +Basic.Settings.Output.Adv.FFmpeg.SavePathURL="File path ຫຼື URL" +Basic.Settings.Output.Adv.FFmpeg.FormatAudio="ສຽງ" +Basic.Settings.Output.Adv.FFmpeg.FormatVideo="ວິດີໂອ" +Basic.Settings.Output.Adv.FFmpeg.FormatDefault="ຮູບແບບເລີ່ມຕົ້ນ" +Basic.Settings.Output.Adv.FFmpeg.FormatDesc="ຄຳອະທິບາຍ Container Format" +Basic.Settings.Output.Adv.FFmpeg.FormatDescDef="Audio/Video Codec ຄາດເດົາຈາກ File path ຫຼື URL" +Basic.Settings.Output.Adv.FFmpeg.AVEncoderDefault="ຕົວເຂົ້າລະຫັດເລີ່ມຕົ້ນ" +Basic.Settings.Output.Adv.FFmpeg.AVEncoderDisable="ປິດໃຊ້ງານຕົວເຂົ້າລະຫັດ" +Basic.Settings.Output.Adv.FFmpeg.VEncoder="ຕົວເຂົ້າລະຫັດວິດີໂອ" +Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="ການຕັ້ງຄ່າຕົວເຂົ້າລະຫັດວິດີໂອ (ຖ້າມີ)" +Basic.Settings.Output.Adv.FFmpeg.AEncoder="ຕົວເຂົ້າລະຫັດສຽງ" +Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="ການຕັ້ງຄ່າຕົວເຂົ້າລະຫັດສຽງ (ຖ້າມີ)" +Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="ການຕັ້ງຄ່າ Muxer (ຖ້າມີ)" +Basic.Settings.Output.Adv.FFmpeg.GOPSize="Keyframe interval (ເຟຣມ)" +Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="ສະແດງ codecs ທັງໝົດ (ແມ້ວ່າອາດຈະບໍ່ເຂົ້າກັນ)" +Basic.Settings.Output.Adv.FFmpeg.Settings="ການຕັ້ງຄ່າ FFmpeg" +Basic.Settings.Output.EnableSplitFile="ແບ່ງໄຟລ໌ອັດຕະໂນມັດ" +Basic.Settings.Output.SplitFile.TypeTime="ແບ່ງຕາມເວລາ" +Basic.Settings.Output.SplitFile.TypeSize="ແບ່ງຕາມຂະໜາດ" +Basic.Settings.Output.SplitFile.TypeManual="ແບ່ງດ້ວຍຕົນເອງເທົ່ານັ້ນ" +Basic.Settings.Output.SplitFile.Time="ເວລາແບ່ງ" +Basic.Settings.Output.SplitFile.Size="ຂະໜາດແບ່ງ" +Screenshot="Output ພາບໜ້າຈໍ" +Screenshot.SourceHotkey="ຖ່າຍພາບໜ້າຈໍ ແຫຼ່ງທີ່ມາທີ່ເລືອກ" +Screenshot.StudioProgram="ບັນທຶກພາບໜ້າຈໍ Program" +Screenshot.Preview="ບັນທຶກພາບໜ້າຈໍ Preview" +Screenshot.Scene="ບັນທຶກພາບໜ້າຈໍ Scene" +Screenshot.Source="ບັນທຶກພາບໜ້າຈໍ Source" +FilenameFormatting.TT.CCYY="ປີ, ຕົວເລກສີ່ຫຼັກ" +FilenameFormatting.TT.YY="ປີ, ສອງຫຼັກສຸດທ້າຍ (00-99)" +FilenameFormatting.TT.MM="ເດືອນ ເປັນຕົວເລກ (01-12)" +FilenameFormatting.TT.DD="ວັນທີຂອງເດືອນ, ມີສູນນຳໜ້າ (01-31)" +FilenameFormatting.TT.hh="ຊົ່ວໂມງ ໃນຮູບແບບ 24h (00-23)" +FilenameFormatting.TT.mm="ນາທີ (00-59)" +FilenameFormatting.TT.ss="ວິນາທີ (00-59)" +FilenameFormatting.TT.Percent="ເຄື່ອງໝາຍ %" +FilenameFormatting.TT.a="ຊື່ວັນຫຍໍ້" +FilenameFormatting.TT.A="ຊື່ວັນເຕັມ" +FilenameFormatting.TT.b="ຊື່ເດືອນຫຍໍ້" +FilenameFormatting.TT.B="ຊື່ເດືອນເຕັມ" +FilenameFormatting.TT.d="ວັນທີຂອງເດືອນ, ມີສູນນຳໜ້າ (01-31)" +FilenameFormatting.TT.H="ຊົ່ວໂມງ ໃນຮູບແບບ 24h (00-23)" +FilenameFormatting.TT.I="ຊົ່ວໂມງ ໃນຮູບແບບ 12h (01-12)" +FilenameFormatting.TT.m="ເດືອນ ເປັນຕົວເລກ (01-12)" +FilenameFormatting.TT.M="ນາທີ (00-59)" +FilenameFormatting.TT.p="AM ຫຼື PM" +FilenameFormatting.TT.s="ເວລາເປັນວິນາທີ ຕັ້ງແຕ່ UNIX epoch" +FilenameFormatting.TT.S="ວິນາທີ (00-59)" +FilenameFormatting.TT.y="ປີ, ສອງຫຼັກສຸດທ້າຍ (00-99)" +FilenameFormatting.TT.Y="ປີ" +FilenameFormatting.TT.z="ISO 8601 offset ຈາກ UTC ໃນເຂດເວລາ" +FilenameFormatting.TT.Z="ຊື່ເຂດເວລາ ຫຼື ຕົວຫຍໍ້" +FilenameFormatting.TT.FPS="ເຟຣມຕໍ່ວິນາທີ" +FilenameFormatting.TT.VF="ຮູບແບບວິດີໂອ" +Basic.Settings.Video="ວິດີໂອ" +Basic.Settings.Video.DownscaleFilter.Unavailable="Resolutions ກົງກັນ, ບໍ່ຈຳເປັນຕ້ອງ downscale" +Basic.Settings.Video.FPSCommon="ຄ່າ FPS ທົ່ວໄປ" +Basic.Settings.Video.FPSInteger="ຄ່າ FPS ຈຳນວນເຕັມ" +Basic.Settings.Video.FPSFraction="ຄ່າ FPS ເສດສ່ວນ" +Basic.Settings.Video.Renderer.Experimental="%1 (ທົດລອງ)" +Basic.Settings.Video.InvalidResolution="ຄ່າຄວາມລະອຽດບໍ່ຖືກຕ້ອງ. ຕ້ອງເປັນ widthxheight (ເຊັ່ນ: 1920x1080)" +Basic.Settings.Video.CurrentlyActive="Video output ກຳລັງເຮັດວຽກຢູ່. ກະລຸນາປິດ output ໃດໆກ່ອນທີ່ຈະປ່ຽນການຕັ້ງຄ່າວິດີໂອ." +Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (ໄວທີ່ສຸດ, ແຕ່ມົວຖ້າ scaling)" +Basic.Settings.Audio="ສຽງ" +Basic.Settings.Audio.PeakMeterType.TruePeak="True Peak (ໃຊ້ CPU ສູງກວ່າ)" +Basic.Settings.Audio.MultichannelWarning.Enabled="ຄຳເຕືອນ: ສຽງ Surround sound ເປີດໃຊ້ງານຢູ່." +Basic.Settings.Audio.MultichannelWarning="ຫາກກຳລັງສະຕຣີມ, ກວດເບິ່ງວ່າບໍລິການສະຕຣີມຂອງທ່ານຮອງຮັບທັງການຮັບ surround sound ແລະ ການຫຼິ້ນ surround sound ຫຼື ບໍ່. ຕົວຢ່າງເຊັ່ນ Facebook 360 Live ຮອງຮັບ surround sound ຢ່າງເຕັມທີ່; YouTube Live ຮອງຮັບການຮັບສຽງ 5.1 (ແລະ ຫຼິ້ນໃນ TVs).\n\nOBS audio filters ເຂົ້າກັນໄດ້ກັບ surround sound, ແຕ່ບໍ່ຮັບປະກັນການຮອງຮັບປັກອິນ VST." +Basic.Settings.Audio.MultichannelWarning.Title="ເປີດໃຊ້ສຽງ surround sound?" +Basic.Settings.Audio.MultichannelWarning.Confirm="ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການເປີດໃຊ້ສຽງ surround sound?" +Basic.Settings.Audio.DesktopDevice="ສຽງເດັສທັອບ (Desktop Audio)" +Basic.Settings.Audio.DesktopDevice2="ສຽງເດັສທັອບ 2" +Basic.Settings.Audio.EnablePushToMute="ເປີດໃຊ້ Push-to-mute" +Basic.Settings.Audio.EnablePushToTalk="ເປີດໃຊ້ Push-to-talk" +Basic.Settings.Audio.UnknownAudioDevice="ບໍ່ໄດ້ເຊື່ອມຕໍ່ອຸປະກອນ ຫຼື ບໍ່ສາມາດໃຊ້ໄດ້" +Basic.Settings.Audio.Disabled="ປິດໃຊ້ງານ" +Basic.Settings.Audio.LowLatencyBufferingMode="Low Latency Audio Buffering Mode (ສຳລັບ output Decklink/NDI)" +Basic.Settings.Audio.LowLatencyBufferingWarning.Enabled="ຄຳເຕືອນ: Low latency audio buffering ເປີດໃຊ້ງານຢູ່." +Basic.Settings.Audio.LowLatencyBufferingWarning="Low latency audio buffering mode ອາດເຮັດໃຫ້ສຽງຂາດຫາຍ ຫຼື ຢຸດຫຼິ້ນຈາກບາງແຫຼ່ງ." +Basic.Settings.Audio.LowLatencyBufferingWarning.Title="ເປີດໃຊ້ low latency audio buffering mode?" +Basic.Settings.Audio.LowLatencyBufferingWarning.Confirm="ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການເປີດໃຊ້ low latency audio buffering mode?" +Basic.Settings.Accessibility="ການເຂົ້າເຖິງ (Accessibility)" +Basic.Settings.Accessibility.ColorOverrides="ໃຊ້ສີທີ່ແຕກຕ່າງ" +Basic.Settings.Accessibility.ColorOverrides.SelectRed="ຂອບ Source (Selection)" +Basic.Settings.Accessibility.ColorOverrides.SelectGreen="ຂອບ Source (Crop)" +Basic.Settings.Accessibility.ColorOverrides.SelectBlue="ຂອບ Source (Hover)" +Basic.Settings.Accessibility.ColorOverrides.MixerGreen="Mixer Volume Band (-60 ຫາ -20dB)" +Basic.Settings.Accessibility.ColorOverrides.MixerYellow="Mixer Volume Band (-20 ຫາ -9dB)" +Basic.Settings.Accessibility.ColorOverrides.MixerRed="Mixer Volume Band (-9 ຫາ 0dB)" +Basic.Settings.Accessibility.ColorOverrides.MixerGreenActive="Mixer Volume Band (-60 ຫາ -20dB) (active)" +Basic.Settings.Accessibility.ColorOverrides.MixerYellowActive="Mixer Volume Band (-20 ຫາ -9dB) (active)" +Basic.Settings.Accessibility.ColorOverrides.MixerRedActive="Mixer Volume Band (-9 ຫາ 0dB) (active)" +Basic.Settings.Advanced="ຂັ້ນສູງ" +Basic.Settings.Advanced.General.ConfirmOnExit="ສະແດງຄຳເຕືອນ output ທີ່ຍັງເຮັດວຽກຢູ່ ເມື່ອອອກ" +Basic.Settings.Advanced.FormatWarning="ຄຳເຕືອນ: ຮູບແບບສີ (Color formats) ອື່ນໆນອກຈາກ NV12/P010 ມີຈຸດປະສົງຫຼັກສຳລັບການບັນທຶກ, ແລະ ບໍ່ແນະນຳເມື່ອສະຕຣີມ. ການສະຕຣີມອາດເຮັດໃຫ້ເກີດການໃຊ້ CPU ເພີ່ມຂຶ້ນ ເນື່ອງຈາກການແປງຮູບແບບສີ." +Basic.Settings.Advanced.FormatWarningPreciseSdr="ຄຳເຕືອນ: High-precision formats ມັກຈະໃຊ້ກັບ HDR color spaces." +Basic.Settings.Advanced.FormatWarning2100="ຄຳເຕືອນ: Rec. 2100 ຄວນໃຊ້ຮູບແບບທີ່ມີຄວາມລະອຽດຫຼາຍກວ່າ." +Basic.Settings.Advanced.Audio.MonitoringDevice="ອຸປະກອນ Monitoring" +Basic.Settings.Advanced.Audio.MonitoringDevice.Default="ຄ່າເລີ່ມຕົ້ນ" +Basic.Settings.Advanced.Audio.DisableAudioDucking="ປິດໃຊ້ Windows audio ducking" +Basic.Settings.Advanced.StreamDelay="ສະຕຣີມ Delay" +Basic.Settings.Advanced.StreamDelay.Duration="ໄລຍະເວລາ" +Basic.Settings.Advanced.StreamDelay.Preserve="ຮັກສາ cutoff point (ເພີ່ມ delay) ເມື່ອເຊື່ອມຕໍ່ໃໝ່" +Basic.Settings.Advanced.StreamDelay.MemoryUsage="ການໃຊ້ Memory ໂດຍປະມານ: %1 MB" +Basic.Settings.Advanced.Network="ເຄືອຂ່າຍ" +Basic.Settings.Advanced.Network.Disabled="ໂປຣໂຕຄໍສະຕຣີມທີ່ເລືອກໃນປັດຈຸບັນ ບໍ່ຮອງຮັບການປ່ຽນການຕັ້ງຄ່າເຄືອຂ່າຍ." +Basic.Settings.Advanced.Network.EnableNewSocketLoop="ເປີດໃຊ້ການເພີ່ມປະສິດທິພາບເຄືອຂ່າຍ" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="ເປີດໃຊ້ TCP pacing" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="ພະຍາຍາມເຮັດໃຫ້ RTMP output ເປັນມິດກັບແອັບພລິເຄຊັນອື່ນທີ່ອ່ອນໄຫວກັບ latency ໃນເຄືອຂ່າຍ ໂດຍການຄວບຄຸມອັດຕາການສົ່ງ.\nມັນອາດຈະເພີ່ມຄວາມສ່ຽງຂອງ dropped frames ໃນການເຊື່ອມຕໍ່ທີ່ບໍ່ສະຖຽນ." +Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="ພຶດຕິກຳ Focus ຂອງຄີລັດ" +Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="ບໍ່ປິດໃຊ້ງານຄີລັດ" +Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="ປິດໃຊ້ງານຄີລັດ ເມື່ອໜ້າຕ່າງຫຼັກຖືກ Focus" +Basic.Settings.Advanced.Hotkeys.DisableHotkeysOutOfFocus="ປິດໃຊ້ງານຄີລັດ ເມື່ອໜ້າຕ່າງຫຼັກບໍ່ຖືກ Focus" +Basic.Settings.Advanced.AutoRemux="Remux ອັດຕະໂນມັດເປັນ %1" +Basic.Settings.Advanced.AutoRemux.MP4="(ບັນທຶກເປັນ mkv)" +Basic.AdvAudio="ຄຸນສົມບັດສຽງຂັ້ນສູງ" +Basic.AdvAudio.ActiveOnly="ສະເພາະແຫຼ່ງທີ່ມາທີ່ເຮັດວຽກຢູ່" +Basic.AdvAudio.Name="ຊື່" +Basic.AdvAudio.Volume="ລະດັບສຽງ" +Basic.AdvAudio.VolumeSource="ລະດັບສຽງສຳລັບ '%1'" +Basic.AdvAudio.Mono="ໂມໂນ" +Basic.AdvAudio.MonoSource="Mono Downmix ສຳລັບ '%1'" +Basic.AdvAudio.BalanceSource="Balance ສຳລັບ '%1'" +Basic.AdvAudio.SyncOffsetSource="Sync Offset ສຳລັບ '%1'" +Basic.AdvAudio.Monitoring.Both="Monitor ແລະ Output" +Basic.AdvAudio.MonitoringSource="Audio Monitoring ສຳລັບ '%1'" +Basic.Settings.Hotkeys="ຄີລັດ (Hotkeys)" +Basic.Settings.Hotkeys.Pair="Key combinations ທີ່ແບ່ງປັນກັບ '%1' ຈະເຮັດໜ້າທີ່ເປັນຕົວສະລັບ" +Basic.Settings.Hotkeys.Filter="ຟິວເຕີ" +Basic.Settings.Hotkeys.FilterByHotkey="ກອງຕາມ ຄີລັດ" +Basic.Settings.Hotkeys.DuplicateWarning="ຄີລັດນີ້ຖືກໃຊ້ຮ່ວມກັນກັບການກະທຳອື່ນໜຶ່ງຢ່າງ ຫຼື ຫຼາຍກວ່າ, ຄລິກເພື່ອສະແດງຂໍ້ຂັດແຍ່ງ" +Basic.Settings.Hotkeys.PleaseWait="ກຳລັງໂຫຼດຄີລັດ, ກະລຸນາລໍຖ້າ..." +Basic.Hotkeys.SelectScene="ສະລັບໄປສາກ" +Basic.SystemTray.Show="ສະແດງ" +Basic.SystemTray.Hide="ເຊື່ອງ" +Basic.SystemTray.Message.Reconnecting="ຕັດການເຊື່ອມຕໍ່. ກຳລັງເຊື່ອມຕໍ່ໃໝ່..." +Mute="ປິດສຽງ" +Unmute="ເປີດສຽງ" +SceneItemShow="ສະແດງ '%1'" +SceneItemHide="ເຊື່ອງ '%1'" +OutputWarnings.NoTracksSelected="ທ່ານຕ້ອງເລືອກຢ່າງໜ້ອຍໜຶ່ງແທຣັກ" +OutputWarnings.NoTracksSelectedOnExit.Title="ຂໍ້ຜິດພາດການຕັ້ງຄ່າ Output" +OutputWarnings.NoTracksSelectedOnExit.Text="ທຸກ Output ຕ້ອງມີ audio track ຢ່າງໜ້ອຍໜຶ່ງແທຣັກທີ່ຖືກເລືອກ." +OutputWarnings.MP4Recording="ຄຳເຕືອນ: ການບັນທຶກທີ່ບັນທຶກເປັນ MP4/MOV ຈະບໍ່ສາມາດກູ້ຄືນໄດ້ ຫາກໄຟລ໌ບໍ່ສາມາດ finalize ໄດ້ (ເຊັ່ນ: ຜົນມາຈາກ BSODs, ໄຟມອດ, ແລະອື່ນໆ). ຫາກທ່ານຕ້ອງການບັນທຶກ audio tracks ຫຼາຍແທຣັກ ພິຈາລະນາໃຊ້ MKV ແລະ remux ການບັນທຶກເປັນ MP4/MOV ຫຼັງຈາກມັນສຳເລັດ (ໄຟລ໌ → Remux ການບັນທຶກ)" +OutputWarnings.CannotPause="ຄຳເຕືອນ: ການບັນທຶກບໍ່ສາມາດຢຸດຊົ່ວຄາວໄດ້ ຫາກຕົວເຂົ້າລະຫັດການບັນທຶກຖືກຕັ້ງເປັນ \"(Use stream encoder)\"" +OutputWarnings.CodecIncompatible="ການເລືອກຕົວເຂົ້າລະຫັດສຽງ ຫຼື ວິດີໂອ ຖືກຣີເຊັດເນື່ອງຈາກຄວາມບໍ່ເຂົ້າກັນ. ກະລຸນາເລືອກຕົວເຂົ້າລະຫັດທີ່ເຂົ້າກັນໄດ້ຈາກລາຍການ." +CodecCompat.Incompatible="(ບໍ່ເຂົ້າກັນກັບ %1)" +CodecCompat.CodecPlaceholder="ເລືອກຕົວເຂົ້າລະຫັດ..." +CodecCompat.ContainerPlaceholder="ເລືອກຮູບແບບ..." +CodecCompat.CodecMissingOnExit.Title="ບໍ່ໄດ້ເລືອກຕົວເຂົ້າລະຫັດ" +CodecCompat.CodecMissingOnExit.Text="ບໍ່ໄດ້ຕັ້ງຄ່າຕົວເຂົ້າລະຫັດວິດີໂອ ຫຼື ສຽງ ຢ່າງໜ້ອຍໜຶ່ງຕົວ. ກະລຸນາກວດສອບໃຫ້ແນ່ໃຈວ່າໄດ້ເລືອກຕົວເຂົ້າລະຫັດສຳລັບທັງການບັນທຶກ ແລະ ການສະຕຣີມ." +CodecCompat.ContainerMissingOnExit.Title="ບໍ່ໄດ້ເລືອກຮູບແບບ" +CodecCompat.ContainerMissingOnExit.Text="ບໍ່ໄດ້ເລືອກຮູບແບບການບັນທຶກ. ກະລຸນາເລືອກຮູບແບບການບັນທຶກທີ່ເຂົ້າກັນໄດ້ກັບຕົວເຂົ້າລະຫັດສະຕຣີມທີ່ເລືອກ." +FinalScene.Title="ລຶບສາກ" +FinalScene.Text="ຈຳເປັນຕ້ອງມີຢ່າງໜ້ອຍໜຶ່ງສາກ." +NoSources.Title="ບໍ່ມີແຫຼ່ງທີ່ມາ" +NoSources.Text="ເບິ່ງຄືວ່າທ່ານຍັງບໍ່ໄດ້ເພີ່ມແຫຼ່ງວິດີໂອໃດໆ, ດັ່ງນັ້ນທ່ານຈະສົ່ງອອກໄດ້ພຽງໜ້າຈໍຫວ່າງເປົ່າ. ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການເຮັດແບບນີ້?" +NoSources.Text.AddSource="ທ່ານສາມາດເພີ່ມແຫຼ່ງທີ່ມາໄດ້ ໂດຍການຄລິກໄອຄອນ + ພາຍໃຕ້ກ່ອງ Sources ໃນໜ້າຕ່າງຫຼັກໄດ້ທຸກເວລາ." +NoSources.Label="ທ່ານບໍ່ມີແຫຼ່ງທີ່ມາໃດໆ.\nຄລິກປຸ່ມ + ດ້ານລຸ່ມ,\nຫຼື ຄລິກຂວາບ່ອນນີ້ເພື່ອເພີ່ມ." +ChangeBG="ຕັ້ງຄ່າສີ" +CustomColor="ສີກຳນົດເອງ" +BrowserSource.EnableHardwareAcceleration="ເປີດໃຊ້ Browser Source Hardware Acceleration" +About="ກ່ຽວກັບ" +About.Info="OBS Studio ເປັນຊອບແວການບັນທຶກວິດີໂອ ແລະ ຖ່າຍທອດສົດແບບຟຣີ ແລະ ໂອເພນຊອດ." +About.Donate="ຮ່ວມບໍລິຈາກ" +About.GetInvolved="ມີສ່ວນຮ່ວມ" +About.Authors="ຜູ້ຂຽນ" +About.License="ໃບອະນຸຍາດ" +About.Error="ຜິດພາດ! ບໍ່ສາມາດອ່ານໄຟລ໌ໄດ້.\n\nໄປທີ່: %1" +About.Contribute="ສະໜັບສະໜູນໂຄງການ OBS" +AddUrl.Title="ເພີ່ມແຫຼ່ງທີ່ມາຜ່ານ URL" +AddUrl.Text="ທ່ານໄດ້ລາກ URL ເຂົ້າໄປໃນ OBS. ສິ່ງນີ້ຈະເພີ່ມລິງກ໌ເປັນແຫຼ່ງທີ່ມາໂດຍອັດຕະໂນມັດ. ດຳເນີນການຕໍ່?" +ResizeOutputSizeOfSource="ປັບຂະໜາດ output (ຂະໜາດ source)" +ResizeOutputSizeOfSource.Text="Base ແລະ output resolutions ຈະຖືກປັບຂະໜາດໃຫ້ເທົ່າກັບຂະໜາດຂອງ source ປັດຈຸບັນ." +ResizeOutputSizeOfSource.Continue="ທ່ານຕ້ອງການດຳເນີນການຕໍ່ບໍ່?" +Importer="ນຳເຂົ້າ Scene Collection" +Importer.SelectCollection="ເລືອກ Scene Collection" +Importer.HelpText="ເພີ່ມໄຟລ໌ໃສ່ໜ້າຕ່າງນີ້ ເພື່ອນຳເຂົ້າ collections ຈາກ OBS ຫຼື ໂປຣແກຣມອື່ນໆທີ່ຮອງຮັບ." +Importer.Program="ແອັບພລິເຄຊັນທີ່ກວດພົບ" +Importer.AutomaticCollectionPrompt="ຄົ້ນຫາ Scene Collections ໂດຍອັດຕະໂນມັດ" +Importer.AutomaticCollectionText="OBS ສາມາດຄົ້ນຫາ scene collections ທີ່ນຳເຂົ້າໄດ້ ຈາກໂປຣແກຣມພາຍນອກທີ່ຮອງຮັບ ໂດຍອັດຕະໂນມັດ. ທ່ານຕ້ອງການໃຫ້ OBS ຄົ້ນຫາ collections ໃຫ້ທ່ານອັດຕະໂນມັດບໍ່?\n\nທ່ານສາມາດປ່ຽນຄ່ານີ້ພາຍຫຼັງໄດ້ໃນ ການຕັ້ງຄ່າ > ທົ່ວໄປ > Importers." +Importer.SelectFile="ເປີດຫາ..." +Restart="ຣີສະຕາດ" +NeedsRestart="OBS Studio ຈຳເປັນຕ້ອງຖືກຣີສະຕາດ. ທ່ານຕ້ອງການຣີສະຕາດດຽວນີ້ເລີຍບໍ່?" +LoadProfileNeedsRestart="ໂປຣໄຟລ໌ມີການຕັ້ງຄ່າທີ່ຕ້ອງການການຣີສະຕາດ OBS:\n%1\n\nທ່ານຕ້ອງການຣີສະຕາດ OBS ເພື່ອໃຫ້ການຕັ້ງຄ່າເຫຼົ່ານີ້ມີຜົນບໍ່?" +ContextBar.NoSelectedSource="ບໍ່ໄດ້ເລືອກແຫຼ່ງທີ່ມາ" +ContextBar.MediaControls.PlayMedia="ຫຼິ້ນສື່" +ContextBar.MediaControls.PauseMedia="ຢຸດສື່ຊົ່ວຄາວ" +ContextBar.MediaControls.StopMedia="ຢຸດສື່" +ContextBar.MediaControls.RestartMedia="ຣີສະຕາດສື່" +ContextBar.MediaControls.PlaylistNext="ຕໍ່ໄປໃນ Playlist" +ContextBar.MediaControls.PlaylistPrevious="ກ່ອນໜ້າໃນ Playlist" +YouTube.Auth.Ok="ການຢືນຢັນຕົວຕົນສຳເລັດແລ້ວ.\nຕອນນີ້ທ່ານສາມາດປິດໜ້ານີ້ໄດ້." +YouTube.Auth.NoCode="ຂັ້ນຕອນການຢືນຢັນຕົວຕົນບໍ່ສຳເລັດ." +YouTube.Auth.NoChannels="ບໍ່ມີຊ່ອງທີ່ສາມາດໃຊ້ໄດ້ໃນບັນຊີທີ່ເລືອກ" +YouTube.Auth.WaitingAuth.Title="ການຢືນຢັນຕົວຕົນຜູ້ໃຊ້ YouTube" +YouTube.Auth.WaitingAuth.Text="ກະລຸນາສຳເລັດການຢືນຢັນຕົວຕົນໃນໂປຣແກຣມທ່ອງເວັບພາຍນອກຂອງທ່ານ.<br>ຖ້າໂປຣແກຣມທ່ອງເວັບພາຍນອກບໍ່ເປີດ, ໃຫ້ໄປທີ່ລິ້ງນີ້ ແລະ ສຳເລັດການຢືນຢັນຕົວຕົນ:<br>%1" +YouTube.AuthError.Text="ການດຶງຂໍ້ມູນຊ່ອງລົ້ມເຫຼວ: %1." +YouTube.Actions.WindowTitle="ຕັ້ງຄ່າການອອກອາກາດ YouTube - ຊ່ອງ: %1" +YouTube.Actions.CreateNewEvent="ສ້າງການອອກອາກາດໃໝ່" +YouTube.Actions.ChooseEvent="ເລືອກການອອກອາກາດທີ່ມີຢູ່" +YouTube.Actions.Title="ຫົວຂໍ້*" +YouTube.Actions.MyBroadcast="ການອອກອາກາດຂອງຂ້ອຍ" +YouTube.Actions.Description="ຄຳອະທິບາຍ" +YouTube.Actions.Privacy="ຄວາມເປັນສ່ວນຕົວ*" +YouTube.Actions.Privacy.Private="ສ່ວນຕົວ" +YouTube.Actions.Privacy.Public="ສາທາລະນະ" +YouTube.Actions.Privacy.Unlisted="ບໍ່ສະແດງໃນລາຍການ" +YouTube.Actions.Category="ໝວດໝູ່" +YouTube.Actions.Thumbnail="ຮູບຕົວຢ່າງ" +YouTube.Actions.Thumbnail.SelectFile="ເລືອກໄຟລ໌..." +YouTube.Actions.Thumbnail.NoFileSelected="ບໍ່ໄດ້ເລືອກໄຟລ໌" +YouTube.Actions.Thumbnail.ClearFile="ລ້າງ" +YouTube.Actions.MadeForKids="ວິດີໂອນີ້ສ້າງມາເພື່ອເດັກນ້ອຍບໍ່?*" +YouTube.Actions.MadeForKids.Yes="ແມ່ນ, ມັນສ້າງມາເພື່ອເດັກນ້ອຍ" +YouTube.Actions.MadeForKids.No="ບໍ່, ມັນບໍ່ໄດ້ສ້າງມາເພື່ອເດັກນ້ອຍ" +YouTube.Actions.AdditionalSettings="ການຕັ້ງຄ່າເພີ່ມເຕີມ" +YouTube.Actions.Latency="ຄວາມຊັກຊ້າ" +YouTube.Actions.Latency.Normal="ປົກກະຕິ" +YouTube.Actions.Latency.Low="ຕ່ຳ" +YouTube.Actions.Latency.UltraLow="ຕ່ຳສຸດ" +YouTube.Actions.EnableAutoStart="ເປີດໃຊ້ການເລີ່ມຕົ້ນອັດຕະໂນມັດ" +YouTube.Actions.EnableAutoStop="ເປີດໃຊ້ການຢຸດອັດຕະໂນມັດ" +YouTube.Actions.AutoStartStop.TT="ບົ່ງບອກວ່າການອອກອາກາດທີ່ກຳນົດເວລານີ້ຄວນຈະເລີ່ມຕົ້ນໂດຍອັດຕະໂນມັດຫຼືບໍ່" +YouTube.Actions.EnableDVR="ເປີດໃຊ້ DVR" +YouTube.Actions.360Video="ວິດີໂອ 360 ອົງສາ" +YouTube.Actions.ScheduleForLater="ກຳນົດເວລາໄວ້ພາຍຫຼັງ" +YouTube.Actions.RememberSettings="ຈື່ການຕັ້ງຄ່ານີ້ໄວ້" +YouTube.Actions.Create_Ready="ສ້າງການອອກອາກາດ" +YouTube.Actions.Create_GoLive="ສ້າງການອອກອາກາດ ແລະ ເລີ່ມສະຕຣີມ" +YouTube.Actions.Choose_Ready="ເລືອກການອອກອາກາດ" +YouTube.Actions.Choose_GoLive="ເລືອກການອອກອາກາດ ແລະ ເລີ່ມສະຕຣີມ" +YouTube.Actions.Create_Schedule="ກຳນົດເວລາການອອກອາກາດ" +YouTube.Actions.Create_Schedule_Ready="ກຳນົດເວລາ ແລະ ເລືອກການອອກອາກາດ" +YouTube.Actions.Dashboard="ເປີດ YouTube Studio" +YouTube.Actions.Error.Title="ຂໍ້ຜິດພາດໃນການສ້າງການອອກອາກາດສົດ" +YouTube.Actions.Error.Text="ຂໍ້ຜິດພາດການເຂົ້າເຖິງ YouTube '%1'.<br/>ສາມາດເບິ່ງລາຍລະອຽດຂໍ້ຜິດພາດໄດ້ທີ່ <a href='https://developers.google.com/youtube/v3/live/docs/errors'>https://developers.google.com/youtube/v3/live/docs/errors</a>" +YouTube.Actions.Error.General="ຂໍ້ຜິດພາດການເຂົ້າເຖິງ YouTube. ກະລຸນາກວດສອບການເຊື່ອມຕໍ່ເຄືອຂ່າຍ ຫຼື ການເຂົ້າເຖິງເຊີບເວີ YouTube ຂອງທ່ານ." +YouTube.Actions.Error.NoBroadcastCreated="ຂໍ້ຜິດພາດການສ້າງການອອກອາກາດ '%1'.<br/>ສາມາດເບິ່ງລາຍລະອຽດຂໍ້ຜິດພາດໄດ້ທີ່ <a href='https://developers.google.com/youtube/v3/live/docs/errors'>https://developers.google.com/youtube/v3/live/docs/errors</a>" +YouTube.Actions.Error.NoStreamCreated="ບໍ່ມີການສ້າງສະຕຣີມ. ກະລຸນາເຊື່ອມຕໍ່ບັນຊີຂອງທ່ານໃໝ່." +YouTube.Actions.Error.YouTubeApi="ຂໍ້ຜິດພາດ YouTube API. ກະລຸນາເບິ່ງໄຟລ໌ບັນທຶກສຳລັບຂໍ້ມູນເພີ່ມເຕີມ." +YouTube.Actions.Error.BroadcastNotFound="ບໍ່ພົບການອອກອາກາດທີ່ເລືອກ." +YouTube.Actions.Error.FileMissing="ບໍ່ມີໄຟລ໌ທີ່ເລືອກຢູ່." +YouTube.Actions.Error.FileOpeningFailed="ລົ້ມເຫຼວໃນການເປີດໄຟລ໌ທີ່ເລືອກ." +YouTube.Actions.Error.FileTooLarge="ໄຟລ໌ທີ່ເລືອກມີຂະໜາດໃຫຍ່ເກີນໄປ (ຈຳກັດ: 2 MiB)." +YouTube.Actions.Error.BroadcastTransitionFailed="ການປ່ຽນສະຖານະການຖ່າຍທອດລົ້ມເຫຼວ: %1<br/><br/>ຖ້າຂໍ້ຜິດພາດນີ້ຍັງເກີດຂຶ້ນຢູ່ ໃຫ້ໄປທີ່ YouTube Studio ແລະ ລອງເຮັດດ້ວຍຕົນເອງ." +YouTube.Actions.Error.BroadcastTestStarting="ການຖ່າຍທອດກຳລັງປ່ຽນໄປສູ່ຂັ້ນຕອນການທົດສອບ, ອາດໃຊ້ເວລາຈັກໜ້ອຍ. ກະລຸນາລອງໃໝ່ອີກຄັ້ງໃນ 10-30 ວິນາທີ." +YouTube.Actions.EventsLoading="ກຳລັງໂຫຼດລາຍການເຫດການ..." +YouTube.Actions.EventCreated.Title="ສ້າງເຫດການແລ້ວ" +YouTube.Actions.EventCreated.Text="ສ້າງເຫດການສຳເລັດແລ້ວ." +YouTube.Actions.Stream="ສະຕຣີມ" +YouTube.Actions.Stream.ScheduledFor="ກຳນົດເວລາໄວ້ສຳລັບ %1" +YouTube.Actions.Stream.Resume="ສືບຕໍ່ການສະຕຣີມທີ່ຖືກຂັດຈັງຫວະ" +YouTube.Actions.Stream.YTStudio="ສ້າງໂດຍອັດຕະໂນມັດໂດຍ YouTube Studio" +YouTube.Actions.Notify.CreatingBroadcast="ກຳລັງສ້າງການຖ່າຍທອດສົດໃໝ່, ກະລຸນາລໍຖ້າ..." +YouTube.Actions.AutoStartStreamingWarning.Title="ຕ້ອງການການເລີ່ມຕົ້ນດ້ວຍຕົນເອງ" +YouTube.Actions.AutoStartStreamingWarning="ການເລີ່ມຕົ້ນອັດຕະໂນມັດຖືກປິດໄວ້ສຳລັບເຫດການນີ້, ກົດ \"ຖ່າຍທອດສົດ\" ເພື່ອເລີ່ມການຖ່າຍທອດຂອງທ່ານ." +YouTube.Actions.AutoStopStreamingWarning="ທ່ານຈະບໍ່ສາມາດເຊື່ອມຕໍ່ກັບຄືນໄດ້.<br>ການສະຕຣີມຂອງທ່ານຈະຢຸດ ແລະ ທ່ານຈະບໍ່ໄດ້ຖ່າຍທອດສົດອີກຕໍ່ໄປ." +YouTube.Errors.liveStreamingNotEnabled="ການຖ່າຍທອດສົດບໍ່ໄດ້ເປີດໃຊ້ງານໃນຊ່ອງ YouTube ທີ່ເລືອກໄວ້.<br/><br/>ເບິ່ງຂໍ້ມູນເພີ່ມຕື່ມໃນການຕັ້ງຄ່າຊ່ອງ." +YouTube.Errors.livePermissionBlocked="ການຖ່າຍທອດສົດບໍ່ສາມາດໃຊ້ງານໄດ້ໃນຊ່ອງ YouTube ທີ່ເລືອກ.<br/>ກະລຸນາຮັບຊາບວ່າ ອາດຈະໃຊ້ເວລາເຖິງ 24 ຊົ່ວໂມງ ເພື່ອໃຫ້ການຖ່າຍທອດສົດສາມາດໃຊ້ງານໄດ້ ຫຼັງຈາກເປີດໃຊ້ງານໃນການຕັ້ງຄ່າຊ່ອງຂອງທ່ານ." +YouTube.Errors.errorExecutingTransition="ການປ່ຽນສາກຫຼົ້ມເຫຼວເນື່ອງຈາກຂໍ້ຜິດພາດຂອງ backend. ກະລຸນາລອງໃໝ່ໃນອີກບໍ່ເທົ່າໃດວິນາທີ." +YouTube.Errors.errorStreamInactive="YouTube ບໍ່ໄດ້ຮັບຂໍ້ມູນສຳລັບການສະຕຣີມຂອງທ່ານ. ກະລຸນາກວດສອບການຕັ້ງຄ່າ ແລ້ວລອງໃໝ່ອີກຄັ້ງ." +YouTube.Errors.invalidTransition="ການປ່ຽນສາກທີ່ພະຍາຍາມຢູ່ນັ້ນບໍ່ຖືກຕ້ອງ. ອາດເປັນຍ້ອນການສະຕຣີມຍັງເຮັດວຽກການປ່ຽນສາກກ່ອນໜ້າບໍ່ສຳເລັດ. ກະລຸນາລໍຖ້າຈັກໜ້ອຍ ແລ້ວລອງໃໝ່." +YouTube.DocksRemoval.Title="ລ້າງ Dock ຂອງ Browser YouTube ແບບເກົ່າ" +YouTube.DocksRemoval.Text="Dock ຂອງ Browser ເຫຼົ່ານີ້ຈະຖືກລຶບອອກເນື່ອງຈາກບໍ່ໃຊ້ແລ້ວ (deprecated):\n\n%1\nໃຫ້ໃຊ້ \"Docks/YouTube Live Control Room\" ແທນ." +ConfigDownload.WarningMessageTitle="ຄຳເຕືອນ" +FailedToStartStream.MissingConfigURL="ບໍ່ມີ URL ການຕັ້ງຄ່າສຳລັບບໍລິການປັດຈຸບັນ" +FailedToStartStream.NoCustomRTMPURLInSettings="ບໍ່ໄດ້ລະບຸ URL RTMP ແບບກຳນົດເອງ" +FailedToStartStream.InvalidCustomConfig="ການຕັ້ງຄ່າກຳນົດເອງບໍ່ຖືກຕ້ອງ" +FailedToStartStream.MissingCanvas="ຂາດ Canvas ເພີ່ມເຕີມທີ່ຕັ້ງຄ່າໄວ້" +FailedToStartStream.FailedToCreateMultitrackVideoService="ສ້າງບໍລິການວິດີໂອຫຼາຍແທຣັກລົ້ມເຫຼວ" +FailedToStartStream.FailedToCreateMultitrackVideoOutput="ສ້າງຜົນຜະລິດ RTMP ວິດີໂອຫຼາຍແທຣັກລົ້ມເຫຼວ" +FailedToStartStream.EncoderNotAvailable="NVENC ບໍ່ພ້ອມໃຊ້ງານ.\n\nຄົ້ນຫາປະເພດຕົວເຂົ້າລະຫັດ '%1' ບໍ່ພົບ" +FailedToStartStream.FailedToCreateVideoEncoder="ສ້າງຕົວເຂົ້າລະຫັດວິດີໂອ '%1' ລົ້ມເຫຼວ (ປະເພດ: '%2')" +FailedToStartStream.FailedToGetOBSVideoInfo="ດຶງຂໍ້ມູນວິດີໂອ OBS ລົ້ມເຫຼວ ໃນຂະນະສ້າງຕົວເຂົ້າລະຫັດ '%1' (ປະເພດ: '%2')" +FailedToStartStream.FailedToCreateAudioEncoder="ສ້າງຕົວເຂົ້າລະຫັດສຽງລົ້ມເຫຼວ" +FailedToStartStream.NoRTMPURLInConfig="ການຕັ້ງຄ່າບໍ່ມີ URL ເປົ້າໝາຍການສະຕຣີມ RTMP(S)" +FailedToStartStream.FallbackToDefault="ການເລີ່ມຕົ້ນສະຕຣີມໂດຍໃຊ້ %1 ລົ້ມເຫຼວ; ທ່ານຕ້ອງການລອງໃໝ່ໂດຍໃຊ້ການຕັ້ງຄ່າເຂົ້າລະຫັດດຽວບໍ່?" +FailedToStartStream.ConfigRequestFailed="ບໍ່ສາມາດດຶງການຕັ້ງຄ່າຈາກ %1<br><br>ຂໍ້ຜິດພາດ HTTP: %2" +FailedToStartStream.WarningUnknownStatus="ໄດ້ຮັບຄ່າສະຖານະທີ່ບໍ່ຮູ້ຈັກ '%1'" +FailedToStartStream.WarningRetryNonMultitrackVideo="\n<br><br>\nທ່ານຕ້ອງການສະຕຣີມຕໍ່ໂດຍບໍ່ມີ %1 ບໍ່?" +FailedToStartStream.WarningRetry="\n<br><br>\nທ່ານຕ້ອງການສະຕຣີມຕໍ່ບໍ່?" +FailedToStartStream.MissingEncoderConfigs="ການຕັ້ງຄ່າ Go live ບໍ່ລວມເອົາການຕັ້ງຄ່າຕົວເຂົ້າລະຫັດ" +FailedToStartStream.InvalidEncoderConfig="ການຕັ້ງຄ່າ Go live ມີການຕັ້ງຄ່າຕົວເຂົ້າລະຫັດທີ່ບໍ່ຖືກຕ້ອງ" +FailedToStartStream.StatusMissingHTML="ຄຳຮ້ອງຂໍ Go live ສົ່ງຄືນຂໍ້ຜິດພາດທີ່ບໍ່ລະບຸ" +FailedToStartStream.NoConfigSupplied="ຂາດການຕັ້ງຄ່າ" +MultitrackVideo.Info="%1 ຈະປັບແຕ່ງການຕັ້ງຄ່າຂອງທ່ານໂດຍອັດຕະໂນມັດ ເພື່ອເຂົ້າລະຫັດ ແລະ ສົ່ງວິດີໂອຫຼາຍລະດັບຄຸນນະພາບ. ການເລືອກຕົວເລືອກນີ້ຈະສົ່ງຂໍ້ມູນ %2 ກ່ຽວກັບຄອມພິວເຕີ ແລະ ການຕັ້ງຄ່າຊອບແວຂອງທ່ານ." +MultitrackVideo.IncompatibleSettings.Title="ການຕັ້ງຄ່າທີ່ບໍ່ເຂົ້າກັນ" +MultitrackVideo.IncompatibleSettings.Text="ປັດຈຸບັນ %1 ບໍ່ເຂົ້າກັນກັບ:\n\n%2\nເພື່ອສະຕຣີມຕໍ່ດ້ວຍ %1, ໃຫ້ປິດການຕັ້ງຄ່າທີ່ບໍ່ເຂົ້າກັນ:\n\n%3\nແລ້ວເລີ່ມສະຕຣີມອີກຄັ້ງ." +MultitrackVideo.IncompatibleSettings.DisableAndStartStreaming="ປິດໃຊ້ງານສຳລັບການສະຕຣີມນີ້ ແລະ ເລີ່ມສະຕຣີມ" +MultitrackVideo.IncompatibleSettings.UpdateAndStartStreaming="ອັບເດດການຕັ້ງຄ່າ ແລະ ເລີ່ມສະຕຣີມ" +MultitrackVideo.IncompatibleSettings.AudioChannels="ປັດຈຸບັນ %1 ບໍ່ເຂົ້າກັນກັບການຕັ້ງຄ່າ ສຽງ → ທົ່ວໄປ → ຊ່ອງສຽງ ທີ່ຕັ້ງເປັນ '%2', %3" +MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="ສຽງ → ທົ່ວໄປ → ຊ່ອງສຽງ ຈຳເປັນຕ້ອງຕັ້ງເປັນ '%1'" +MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 ຕ້ອງການການຕັ້ງຄ່າທີ່ແຕກຕ່າງກັນຫຼາຍອັນສຳລັບ ສຽງ → ທົ່ວໄປ → ຊ່ອງສຽງ" +Basic.OpenPluginManager="ຕົວຈັດການປັກອິນ" +PluginManager="ຕົວຈັດການປັກອິນ" +PluginManager.Restart="ຕ້ອງເລີ່ມ OBS Studio ໃໝ່ເພື່ອໃຫ້ນຳໃຊ້ການປ່ຽນແປງຂອງປັກອິນ" +PluginManager.MissingPlugin="ບໍ່ພົບປັກອິນ" +PluginManager.Section.Discover="ເລືອກເບິ່ງ" +PluginManager.Section.Manage="ຕິດຕັ້ງແລ້ວ" +PluginManager.Section.Updates="ການອັບເດດ" +PluginManager.Section.Manage.Title="ຈັດການປັກອິນທີ່ເປີດໃຊ້ງານ"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/lt-LT.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/lt-LT.ini
Changed
@@ -260,8 +260,6 @@ ConfirmStart.Text="Ar esate įsitikinęs, kad norite pradėti transliavimą?" ConfirmStop.Title="Stabdyti transliaciją?" ConfirmStop.Text="Ar esate įsitikinęs, kad norite stabdyti transliavimą?" -ConfirmExit.Title="Išeiti iš OBS?" -ConfirmExit.Text="OBS metu yra aktyvus. Visos transliacijos/įrašymai bus išjungti. Ar tikrai norite išeiti?" ConfirmRemove.Title="Pašalinimo patvirtinimas" Output.StartStreamFailed="Nepavyko pradėti transliuoti" Output.StartRecordingFailed="Nepavyko pradėti įrašyti"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/lv-LV.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/lv-LV.ini
Changed
@@ -108,11 +108,20 @@ List="Saraksts" Grid="Režģis" Automatic="Automātiski" +ComingSoon="Drīzumā" PluginsFailedToLoad.Title="Spraudņu ielādes kļūda" PluginsFailedToLoad.Text="Sekojošie OBS spraudņi neizdevās ielādēt:\n\n%1\nLūdzu, atjauniniet vai noņemiet šos spraudņus." AlreadyRunning.Title="OBS jau tiek palaists" AlreadyRunning.Text="OBS jau darbojas! Ja nevēlaties vairākas paralēli darbojošās OBS kopijas, lūdzu, aiztaisiet/izslēdziet pašreiz darbojošās. Ja jums iestatīts, ka OBS tiek minimizēts sistēmas teknē, lūdzu, pārbaudiet, vai tas tur joprojām darbojas." AlreadyRunning.LaunchAnyway="Palaist jebkurā gadījumā" +CrashHandling.Dialog.Title="Konstatēta OBS Studio Avārija" +CrashHandling.Labels.Text="OBS Studio neizslēdzās pareizi.\n\nVai palaist Drošajā Režīmā (trešo pušu spraudņi, skriptēšana un WebSockets ir atspējoti)?" +CrashHandling.Labels.PrivacyNotice="Jūs varat arī izvēlēties automātiski augšupielādēt jaunāko avārijas ziņojumu pakalpojumā OBSProject.<br /><br />Lūdzu, izlasiet <a href='https://obsproject.com/privacy-policy'>konfidencialitātes politiku</a> pirms jebkuru failu augšupielādes un pievērsiet īpašu uzmanību sadaļām par failu augšupielādi." +CrashHandling.Checkbox.SendReport="Esmu izlasījis privātuma politiku un piekrītu augšupielādei." +CrashHandling.Buttons.LaunchSafe="Palaist Drošajā Režīmā" +CrashHandling.Buttons.LaunchNormal="Palaist Normālā Režīmā" +CrashHandling.Errors.UploadJSONError="Mēģinot augšupielādēt jaunāko avārijas žurnālu, radās kļūda. Lūdzu, mēģiniet vēlreiz vēlāk." +CrashHandling.Errors.Title="Avārijas žurnāla Augšupielādes Kļūda" SafeMode.Restart="Vai vēlies restartēt OBS Drošajā Režīmā (trešo pušu spraudņi, skripti un WebSockets atspējoti)?" SafeMode.RestartNormal="Vai vēlies restartēt OBS Normālajā Režīmā?" ChromeOS.Title="Neatbalstīta operētājsistēma" @@ -318,8 +327,6 @@ ConfirmStopRecord.Text="Vēlaties beigt ierakstīt?" ConfirmBWTest.Title="Sākt interneta ātruma testu?" ConfirmBWTest.Text="OBS ir konfigurēts interneta ātruma pārbaudes režīmam. Šis režīms ļauj veikt tīkla testēšanu, jūsu kanālam neejot tiešraidē. Kad būsiet pabeidzis testēšanu, jums šis režīms būs jāatspējo, lai skatītāji varētu redzēt jūsu straumi.\n\nVēlaties turpināt?" -ConfirmExit.Title="Aizvērt OBS?" -ConfirmExit.Text="OBS pašlaik ir aktīvs. Visas straumes/ieraksti tiks beigti. Tiešām vēlaties OBS aizvērt?" ConfirmRemove.Title="Dzēšanas apstiprinājums" ConfirmRemove.Text="Vai tiešām vēlies noņemt '%1'?" ConfirmRemove.TextMultiple="Tiešām vēlaties noņemt %1 gabalus?" @@ -351,6 +358,15 @@ Output.RecordError.EncodeErrorMsg="Ieraksta laikā radās enkodera kļūda." Output.RecordError.EncodeErrorMsg.LastError="Ierakstīšanas laikā radās kodētāja kļūda:<br><br>%1" Output.BadPath.Title="Nederīgs faila ceļš" +LogUploadDialog.Labels.Progress="Notiek žurnāla augšupielāde. Lūdzu, uzgaidiet..." +LogUploadDialog.Labels.Description.AppLog="Jūsu žurnālfails ir augšuplādēts. Tagad jūs varat koplietot tā URL atkļūdošanas vai atbalsta nolūkiem." +LogUploadDialog.Labels.Description.CrashLog="Jūsu avārijas ziņojums ir augšuplādēts. Tagad jūs varat koplietot tā URL atkļūdošanas nolūkiem." +LogUploadDialog.Buttons.ConfirmUpload="Augšupielādēt" +LogUploadDialog.Buttons.CopyURL="Kopēt Žurnāla URL" +LogUploadDialog.Buttons.AnalyzeURL="Analizēt Žurnālfailu" +LogUploadDialog.Buttons.RetryButton="Mēģināt Vēlreiz" +LogUploadDialog.Errors.Template="Mēģinot augšupielādēt failu, radās kļūda:\n\n%1" +LogUploadDialog.Errors.NoLogFile="Nav atrasts augšupielādējams fails vai fails ir tukšs." Remux.SourceFile="OBS ieraksts" Remux.TargetFile="Mērķa (izvada) fails" Remux.Remux="Remux-ēt" @@ -385,15 +401,21 @@ MissingFiles.AutoSearch="Atrastas papildu failu atbilstības" MissingFiles.AutoSearchText="OBS šajā mapē ir atradis papildu atbilstības trūkstošajiem failiem. Vai vēlaties tās pievienot?" MacPermissions.Description.OpenDialog="Šo dialoglodziņu var atkārtoti atvērt, izmantojot OBS Studio izvēlni." +MacPermissions.AccessGranted="Pieeja Atļauta" MacPermissions.RequestAccess="Pieprasīt Piekļuvi" MacPermissions.OpenPreferences="Atvērt %1 Preferences" +MacPermissions.Item.ScreenRecording="Ekrāna Ierakstīšana" MacPermissions.Item.ScreenRecording.Details="OBs vajadzīga Jūsu atļauja, lai varētu tvert ekrānu." MacPermissions.Item.Camera="Kamera" MacPermissions.Item.Camera.Details="Šī atļauja ir vajadzīga, lai varētu tvert saturu no tīmekļa kamera vai tveršanas kartes." MacPermissions.Item.Microphone="Mikrofons" MacPermissions.Item.Microphone.Details="OBS ir nepieciešama šī atļauja, ja vēlaties ierakstīt mikrofonu vai ārēju audioierīci." +MacPermissions.Item.InputMonitoring="Ievades Monitorings" +MacPermissions.Item.InputMonitoring.Details="Šī atļauja ir nepieciešama, lai karstie taustiņi darbotos, kamēr OBS darbojas fonā." MacPermissions.Item.Accessibility="Pieejamība" +MacPermissions.Item.Accessibility.Details="Vecākās instalācijās OBS var būt norādīts sadaļā “Pieejamība”, nevis “Ievades Monitorings”." MacPermissions.Continue="Turpināt" +SourceLeak.Title="Avota Tīrīšanas Kļūda" Basic.DesktopDevice1="Darbvirsmas audio" Basic.DesktopDevice2="Darbvirsmas audio 2" Basic.AuxDevice1="Mic/Aux (mikrofons/papildu)" @@ -409,12 +431,17 @@ ScaleFiltering.Bilinear="Bilineāra" ScaleFiltering.Bicubic="Bikubiska" ScaleFiltering.Area="Apgabals" +BlendingMethod="Sajaukšanas Metode" BlendingMethod.Default="Noklusējums" BlendingMethod.SrgbOff="SRGB izslēgts" +BlendingMode="Sajaukšanas Režīms" BlendingMode.Normal="Normāls" BlendingMode.Additive="Pievienot" BlendingMode.Subtract="Atņemt" BlendingMode.Screen="Ekrāns" +BlendingMode.Multiply="Reizināšana" +BlendingMode.Lighten="Apgaismojums" +BlendingMode.Darken="Aptumšošana" Deinterlacing="Deinterleisings" Deinterlacing.Discard="Atmest" Deinterlacing.TopFieldFirst="Augšējais lauks vispirms" @@ -423,6 +450,7 @@ VolControl.SliderMuted="Skaļuma slīdnis priekš '%1': (pašreiz noklusināts)" VolControl.Mute="Noklusināt '%1'" VolControl.Properties="Rekvizīti '%1'" +VolControl.UnassignedWarning.Title="Nepiešķirts Audio Avots" Basic.Main.AddSceneDlg.Title="Pievienot ainu" Basic.Main.AddSceneDlg.Text="Lūdzu ievadiet ainas nosaukumu" Basic.Main.DefaultSceneName.Text="Aina %1" @@ -537,6 +565,7 @@ Basic.Main.StopReplayBuffer="Beigt 'replay' bufera darbību" Basic.Main.StoppingReplayBuffer="Tiek apturēts 'replay' bufferis" Basic.Main.StopStreaming="Beigt straumēt" +Basic.Main.AutoStopEnabled="(Automātiska Apturēšana)" Basic.Main.StoppingStreaming="Aptur straumi..." Basic.Main.ForceStopStreaming="Pārtraukt Straumēšanu (atmešanas aizkave)" Basic.Main.ShowContextBar="Rādīt Avotu rīkjoslu" @@ -558,6 +587,7 @@ Basic.MainMenu.File.Settings="Ie&statījumi" Basic.MainMenu.File.ShowSettingsFolder="Parādīt iestatījumu mapi" Basic.MainMenu.File.ShowProfileFolder="Parādīt profila mapi" +Basic.MainMenu.File.ShowMissingFiles="Pārbaudīt Trūkstošos Failus" Basic.MainMenu.File.Exit="Aizvērt" Basic.MainMenu.Edit="R&ediģēt" Basic.MainMenu.Edit.Undo="Atgriezt (&undo)" @@ -620,12 +650,17 @@ Basic.MainMenu.Help.Logs.ShowLogs="Parādīt žurnālfailus (&S)" Basic.MainMenu.Help.Logs.UploadCurrentLog="Augšuplādēt tekošo žurnālfailu" Basic.MainMenu.Help.CheckForUpdates="Pārbaudīt Atjauninājumus" +Basic.MainMenu.Help.Repair="Pārbaudīt Failu Integritāti" Basic.MainMenu.Help.RestartSafeMode="Restartēt Drošajā Režīmā" Basic.MainMenu.Help.RestartNormal="Restartēt Normālā Režīmā" +Basic.MainMenu.Help.CrashLogs="Avāriju Ziņojumi (&R)" +Basic.MainMenu.Help.CrashLogs.ShowLogs="Rādīt Avāriju Ziņojumus (&S)" +Basic.MainMenu.Help.CrashLogs.UploadLastLog="Augšupielādēt Iepriekšējo Avārijas Ziņojumu (&P)" Basic.MainMenu.Help.About="&Par" Basic.Settings.ProgramRestart="Lai šie iestatījumi stātos spēkā, programma ir jārestartē." Basic.Settings.ConfirmTitle="Apstiprināt izmaiņas" Basic.Settings.Confirm="Jums ir nesaglabātās izmaiņas. Saglabās tos?" +Basic.Settings.MultitrackVideoDisabledSettings="%1 %2 kontrolē dažus jūsu straumes iestatījumus" Basic.Settings.General="Vispārīgi" Basic.Settings.General.Language="Valoda" Basic.Settings.General.Updater="Atjauninājumi" @@ -633,10 +668,16 @@ Basic.Settings.General.UpdateChannelDisabled="(Atslēgts)" Basic.Settings.General.UpdateChannelDefault="(Noklusējums)" Basic.Settings.General.EnableAutoUpdates="Automātiski pārbaudīt atjauninājumus startēšanas laikā" +Basic.Settings.General.OpenStatsOnStartup="Atvērt statistikas logu startēšanas laikā" Basic.Settings.General.Projectors="Projektori" Basic.Settings.General.HideProjectorCursor="Nerādīt kursoru virs projektoriem" Basic.Settings.General.SaveProjectors="Saglabāt projektorus izejot" Basic.Settings.General.CloseExistingProjectors="Ierobežojums līdz vienam pilnekrāna projektoram uz ekrāna" +Basic.Settings.General.Preview="Priekšskats" +Basic.Settings.General.OverflowHidden="Slēpt pārplūdi" +Basic.Settings.General.OverflowAlwaysVisible="Pārplūde vienmēr redzama" +Basic.Settings.General.OverflowSelectionHidden="Rādīt pārpildi pat tad, ja avots nav redzams" +Basic.Settings.General.Importers="Importētāji" Basic.Settings.General.Multiview="Multiskats" Basic.Settings.General.MultiviewLayout="Multiskata Izkārtojums" Basic.Settings.General.ChannelName.stable="Stabīlie" @@ -644,6 +685,8 @@ Basic.Settings.General.ChannelName.beta="Beta / Izlaiduma kandidāti" Basic.Settings.General.ChannelDescription.beta="Potenciāli nestabilas pirmsizlaides versijas" Basic.Settings.Appearance="Izskats" +Basic.Settings.Appearance.General="Vispārīgi" +Basic.Settings.Appearance.General.Theme="Motīvs" Basic.Settings.Appearance.General.Variant="Stils" Basic.Settings.Appearance.General.NoVariant="Nav Pieejamu Stilu" Basic.Settings.Appearance.FontScale="Fonta Izmērs" @@ -653,6 +696,7 @@ Basic.Settings.Appearance.Normal="Normāls" Basic.Settings.Appearance.Comfortable="Komfortabls" Basic.Settings.Appearance.OptionsWarning="Dažas izskata opcijas šim stilam nav pieejamas." +Basic.Settings.Stream="Straume" Basic.Settings.Stream.Destination="Galamērķis" Basic.Settings.Stream.Custom.UseAuthentication="Izmantot autentifikāciju" Basic.Settings.Stream.Custom.Username="Lietotājvārds" @@ -664,8 +708,14 @@ Basic.Settings.Stream.Recommended.MaxAudioBitrate="Maksimālais audio bitreits: %1 kbps" Basic.Settings.Stream.Recommended.MaxResolution="Maksimālā izšķirtspēja: %1" Basic.Settings.Stream.Recommended.MaxFPS="Maksimālais FPS: %1" +Basic.Settings.Stream.EnableMultitrackVideo="Iespējot %1" +Basic.Settings.Stream.AdvancedOptions="Paplašinātās Opcijas" Basic.Settings.Output="Izvads" Basic.Settings.Output.Format="Ieraksta formāts" +Basic.Settings.Output.Format.hMP4="Hibrīds MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="Hibrīds MOV (.mov)" +Basic.Settings.Output.Format.fMP4="Fragmentēts MP4 (.mp4)" +Basic.Settings.Output.Format.fMOV="Fragmentēts MOV (.mov)" Basic.Settings.Output.Encoder.Video="Video Enkoders" Basic.Settings.Output.Encoder.Audio="Audio Enkoders" Basic.Settings.Output.SelectDirectory="Norādiet ierakstu mapi" @@ -808,6 +858,7 @@ Basic.Settings.Video.Numerator="Skaitītājs" Basic.Settings.Video.Denominator="Denominators/saucējs" Basic.Settings.Video.Renderer="Rendereris" +Basic.Settings.Video.Renderer.Experimental="%1 (Eksperimentāls)" Basic.Settings.Video.InvalidResolution="Nederīga izšķirtspējas vērtība. Jābūt platumsxaugstums (piemēram, 1920x1080)" Basic.Settings.Video.CurrentlyActive="Video izvads pašlaik ir aktīvs. Lai mainītu video iestatījumus, izslēdziet visus izvadus." Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (ātrākais, bet izplūdis, ja mērogo)" @@ -840,6 +891,8 @@ Basic.Settings.Audio.PushToTalkDelay="“Nospiest, lai runātu” funkcijas aizture" Basic.Settings.Audio.UnknownAudioDevice="Ierīce nav pievienota vai nav pieejama" Basic.Settings.Audio.Disabled="Atspējots" +Basic.Settings.Audio.LowLatencyBufferingWarning.Title="Iespējot zema latentuma audio buferizācijas režīmu?" +Basic.Settings.Audio.LowLatencyBufferingWarning.Confirm="Vai tiešām vēlaties iespējot zema latentuma audio buferizācijas režīmu?" Basic.Settings.Accessibility="Pieejamība" Basic.Settings.Accessibility.ColorOverrides="Izmantot Citas Krāsas" Basic.Settings.Accessibility.ColorOverrides.Preset.Default="Noklusējums" @@ -852,9 +905,12 @@ Basic.Settings.Advanced.General.ProcessPriority.BelowNormal="Zem vidējā" Basic.Settings.Advanced.General.ProcessPriority.Idle="Zema" Basic.Settings.Advanced.Video.ColorFormat="Krāsu formāts" +Basic.Settings.Advanced.Video.ColorFormat.BGRA="BGRA (8-bitu)" Basic.Settings.Advanced.Video.ColorSpace="Krāsu telpa" Basic.Settings.Advanced.Video.ColorRange="Krāsu diapazons" +Basic.Settings.Advanced.Video.ColorRange.Partial="Ierobežots" Basic.Settings.Advanced.Video.ColorRange.Full="Pilns" +Basic.Settings.Advanced.Video.SdrWhiteLevel="SDR Baltais Līmenis" Basic.Settings.Advanced.Audio.MonitoringDevice="Monitoringa/noklausīšanās ierīce" Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Noklusējuma" Basic.Settings.Advanced.Audio.DisableAudioDucking="Atspējot nejēdzīgā Windows audio savienošanu" @@ -962,6 +1018,15 @@ YouTube.Auth.NoCode="Autorizācijas process netika pabeigts." YouTube.Auth.WaitingAuth.Title="YouTube Lietotāja Autorizācija" YouTube.AuthError.Text="Neizdevās iegūt kanāla informāciju: %1." +YouTube.Actions.Description="Apraksts" +YouTube.Actions.Category="Kategorija" +YouTube.Actions.Thumbnail="Sīktēls" +YouTube.Actions.Thumbnail.SelectFile="Izvēlēties failu..." +YouTube.Actions.Thumbnail.NoFileSelected="Neviens fails nav izvēlēts" +YouTube.Actions.Thumbnail.ClearFile="Attīrīt" +YouTube.Actions.MadeForKids="Vai šis video ir paredzēts bērniem?*" +YouTube.Actions.MadeForKids.Yes="Jā, tas ir paredzēts bērniem" +YouTube.Actions.MadeForKids.No="Nē, tas nav paredzēts bērniem" YouTube.Actions.Latency="Latentums" YouTube.Actions.Latency.Normal="Normāls" YouTube.Actions.Latency.Low="Zems" @@ -971,13 +1036,23 @@ YouTube.Actions.EnableDVR="Iespējot DVR" YouTube.Actions.ScheduleForLater="Ieplānot spēlēt vēlāk" YouTube.Actions.RememberSettings="Atcerēties šos iestatījumus" +YouTube.Actions.Dashboard="Atvērt Youtube Studio" YouTube.Actions.Error.Title="Tiešraides izveides kļūme" YouTube.Actions.Error.Text="YouTube piekļuves kļūme '%1'. <br/> Detalizētu kļūdas aprakstu var atrast vietnē <a href='https://developers.google.com/youtube/v3/live/docs/errors'>https://developers.google.com/youtube/v3/live/docs/errors</a>" +YouTube.Actions.Error.General="YouTube piekļuves kļūda. Lūdzu, pārbaudiet tīkla savienojumu vai YouTube servera piekļuvi." YouTube.Actions.Error.NoBroadcastCreated="Apraides izveides kļūme '%1'. <br/> Detalizētu kļūmes aprakstu var atrast vietnē <a href='https://developers.google.com/youtube/v3/live/docs/errors'>https://developers.google.com/youtube/v3/live/docs/errors</a>" +YouTube.Actions.Error.NoStreamCreated="Nav izveidota straume. Lūdzu atkārtoti piesaistiet kontu." +YouTube.Actions.Error.YouTubeApi="YouTube API kļūda. Lūdzu, skatiet žurnālfailu, lai iegūtu plašāku informāciju." +YouTube.Actions.Error.FileMissing="Atlasītais fails neeksistē." +YouTube.Actions.Error.FileTooLarge="Atlasītais fails ir pārāk liels (ierobežojums: 2 MiB)." YouTube.Actions.EventCreated.Title="Notikums izveidots" YouTube.Actions.EventCreated.Text="Notikums sekmīgi izveidots." YouTube.Actions.Stream="Straumi" YouTube.Actions.Stream.ScheduledFor="Ieplānots %1" +YouTube.Actions.Stream.YTStudio="Automātiski izveidots YouTube Studio" YouTube.Actions.Notify.CreatingBroadcast="Notiek jaunas tiešraides izveide, lūdzu, uzgaidiet ..." ConfigDownload.WarningMessageTitle="Brīdinājums" MultitrackVideo.IncompatibleSettings.Title="Nesaderīgi Iestatījumi" +PluginManager="Spraudņu Pārvaldnieks" +PluginManager.MissingPlugin="SPRAUDNIS NAV ATRASTS" +PluginManager.Section.Updates="Atjauninājumi"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/mn-MN.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/mn-MN.ini
Changed
@@ -177,7 +177,6 @@ ConfirmStart.Title="Цацаж эхлэх үү?" ConfirmStop.Title="Цацалтыг зогсоох?" ConfirmStopRecord.Title="Бичлэгийг зогсоох?" -ConfirmExit.Title="OBS-ийг хаах" ConfirmRemove.Title="Хасалтыг батлах" Output.StartStreamFailed="Цацалт хийж эхлэхгээд амжилтгүй болсон" Output.StartRecordingFailed="Бичлэг хийж эхэлсэнгүй"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/ms-MY.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/ms-MY.ini
Changed
@@ -104,6 +104,7 @@ SceneFilters="Buka Penapis Adegan" List="Senarai" Automatic="Automatik" +ComingSoon="Akan Datang" PluginsFailedToLoad.Title="Ralat Muat Pemalam" PluginsFailedToLoad.Text="Pemalam OBS berikut gagal dimuatkan:\n\n%1\nSila kemas kini atau buang pemalam tersebut." AlreadyRunning.Title="OBS sedang dijalankan" @@ -327,8 +328,8 @@ ConfirmStopRecord.Text="Anda pasti mahu menghentikan rakaman?" ConfirmBWTest.Title="Mula Ujian Lebar Jalur?" ConfirmBWTest.Text="OBS anda telah dikonfigur dalam mod ujian lebar jalur. Mod ini membolehkan pengujian rangkaian tanpa saluran anda bersiaran langsung. Setelah selesai menguji, anda perlu lumpuhkannya supaya para penonton dapat melihat strim anda.\n\nAnda pasti mahu teruskan?" -ConfirmExit.Title="Keluar dari OBS?" -ConfirmExit.Text="OBS buat masa ini masih aktif. Semua stri/rakaman akan dimatikan. Anda pasti mahu keluar?" +ConfirmExit.Title="Output Aktif" +ConfirmExit.Text="OBS masih aktif pada masa ini. Semua strim/rakaman akan ditutup." ConfirmRemove.Title="Sahkan Pembuangan" ConfirmRemove.Text="Anda pasti mahu membuang '%1'?" ConfirmRemove.TextMultiple="Anda pasti mahu membuang %1 item?" @@ -804,11 +805,13 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Benarkan Tetapan Dilapik" Basic.Settings.Stream.MultitrackVideoLabel="Video Pelbagai-trek" Basic.Settings.Stream.MultitrackVideoExtraCanvas="Kanvas Tambahan" +Basic.Settings.Stream.WHIPSimulcastLabel="Siaran-Serentak" +Basic.Settings.Stream.WHIPSimulcastInfo="Siaran-Serentak membolehkan anda mengekod dan menghantar berbilang kualiti video. <a href='https://obsproject.com/kb/whip-streaming-guide'>Lebih Lanjut</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Jumlah Lapisan" Basic.Settings.Stream.AdvancedOptions="Tetapan Lanjutan" Basic.Settings.Output.Format="Format Rakaman" Basic.Settings.Output.Format.MKV="Video Matroska (.mkv)" -Basic.Settings.Output.Format.hMP4="MP4 Hibrid BETA (.mp4)" -Basic.Settings.Output.Format.hMOV="MOV Hibrid BETA (.mov)" +Basic.Settings.Output.Format.hMP4="MP4 Hybrid (.mp4)" Basic.Settings.Output.Format.fMP4="MP4 Terserpih (.mp4)" Basic.Settings.Output.Format.fMOV="MOV Terserpih (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="MOV yang difragment menulis rakaman dalam ketulan dan tidak memerlukan pengakhiran yang sama seperti fail MOV tradisional.\nIni memastikan fail kekal boleh dimainkan walaupun menulis ke cakera terganggu, contohnya, akibat BSOD atau kehilangan kuasa.\n\nIni mungkin tidak serasi dengan semua pemain dan editor. Gunakan Fail → Remux Recordings untuk menukar fail kepada format yang lebih serasi jika perlu." @@ -974,6 +977,7 @@ Basic.Settings.Video.Numerator="Pengangka" Basic.Settings.Video.Denominator="Penyebut" Basic.Settings.Video.Renderer="Pengemas Gabung" +Basic.Settings.Video.Renderer.Experimental="%1 (Percubaan)" Basic.Settings.Video.InvalidResolution="Nilai resolusi tidak sah. Mestilah widthxheight (iaitu 1920x1080)" Basic.Settings.Video.CurrentlyActive="Output video buat masa ini masih aktif. Sila matikan mana-mana output untuk mengubah tetapan video." Basic.Settings.Video.DownscaleFilter.Bilinear="Dwi-linear (Terpantas, tetapi kabur jika diskalakan)" @@ -1280,7 +1284,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 memerlukan berbilang tetapan berbeza untuk Audio → Umum → Saluran" Basic.OpenPluginManager="Pengurus Plugin" PluginManager="Pengurus Plugin" -PluginManager.HelpText="Pengurus Plugin" -PluginManager.Restart="Mula Semula OBS?" -PluginManager.NeedsRestart="Untuk menggunakan perubahan ini, OBS perlu dimulakan semula. Adakah anda mahu memulakan semula sekarang?" +PluginManager.Restart="OBS Studio mesti dimulakan semula untuk menggunakan perubahan pemalam" PluginManager.MissingPlugin="PLUGIN TIDAK DITEMUI" +PluginManager.Section.Discover="Layari" +PluginManager.Section.Manage="Dipasang" +PluginManager.Section.Updates="Kemaskini" +PluginManager.Section.Manage.Title="Urus Pemalam Yang Dihidupkan"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/nb-NO.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/nb-NO.ini
Changed
@@ -304,8 +304,6 @@ ConfirmStopRecord.Text="Er du sikker på at du vil stoppe innspillingen?" ConfirmBWTest.Title="Start bredbåndstest?" ConfirmBWTest.Text="Du har konfigurert OBS i bredbåndstest-modus. Denne modusen tillater nettverkstesting uten at din kanal går live. Du må deaktivere modusen når du er ferdig å teste for at seere vil kunne se din strøm. \n\nVil du fortsette?" -ConfirmExit.Title="Avslutt OBS?" -ConfirmExit.Text="OBS-aktiviteter pågår akkurat nå. Alle sendinger og opptak vil bli stoppet. Er du sikker på at du vil avslutte?" ConfirmRemove.Title="Bekreft Fjerning" ConfirmRemove.Text="Er du sikker på at du vil fjerne '%1'?" ConfirmRemove.TextMultiple="Er du sikker du ønsker å fjerne %1 filer?" @@ -627,6 +625,7 @@ Basic.MainMenu.Docks.LockDocks="&Lås dokker" Basic.MainMenu.Docks.SideDocks="&Fullhøydedokker" Basic.MainMenu.Docks.CustomBrowserDocks="Tilpassede &nettleserdokker …" +Basic.MainMenu.Export="Eksporter..." Basic.MainMenu.SceneCollection="&Scenesamling" Basic.MainMenu.Profile="&Profil" Basic.MainMenu.Profile.Import="Importer profil"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/nl-NL.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/nl-NL.ini
Changed
@@ -103,6 +103,7 @@ List="Lijst" Grid="Raster" Automatic="Automatisch" +ComingSoon="Binnenkort beschikbaar" PluginsFailedToLoad.Title="Plugin laad fout" PluginsFailedToLoad.Text="De volgende OBS plugins konden niet laden:\n\n%1\nGelieve deze plugins bij te werken of te verwijderen." AlreadyRunning.Title="OBS is al actief" @@ -321,8 +322,8 @@ ConfirmStopRecord.Text="Weet je zeker dat je het opnemen wilt stoppen?" ConfirmBWTest.Title="Bandbreedte-test starten?" ConfirmBWTest.Text="Je hebt OBS geconfigureerd in bandbreedte-testmodus; deze modus maakt het mogelijk het netwerk te testen zonder live te gaan. Zodra je klaar bent met testen, moet je hem uitschakelen om de kijkers in staat te stellen de stream te bekijken.\n\nWil je doorgaan?" -ConfirmExit.Title="OBS afsluiten?" -ConfirmExit.Text="OBS is momenteel actief. Alle streams/opnames zullen worden afgebroken. Weet je zeker dat je wil afsluiten?" +ConfirmExit.Title="Actieve outputs" +ConfirmExit.Text="OBS is nog steeds actief. Alle streams/opnames worden stopgezet." ConfirmRemove.Title="Verwijderen bevestigen" ConfirmRemove.Text="Weet je zeker dat je '%1' wil verwijderen?" ConfirmRemove.TextMultiple="Weet je zeker dat je %1 elementen wil verwijderen?" @@ -339,7 +340,7 @@ Output.ConnectFail.BadPath="Ongeldig pad of verbindings-url. Controleer a.u.b. of je instellingen geldig zijn." Output.ConnectFail.ConnectFailed="Kan geen verbinding maken met de server" Output.ConnectFail.InvalidStream="Kon het gespecificeerde kanaal of streamkey niet openen. Mogelijk is het kanaal of de key ongeldig of denkt de server dat je nog steeds aangemeld bent." -Output.ConnectFail.HdrDisabled="HDR output is op dit moment uitgeschakeld voor deze output.)" +Output.ConnectFail.HdrDisabled="HDR output is op dit moment uitgeschakeld voor deze output." Output.ConnectFail.Error="Er is een onverwachte fout opgetreden bij het verbinden met de server. Meer informatie in het logbestand." Output.ConnectFail.Disconnected="Verbinding met de server is gesloten." Output.StreamEncodeError.Title="Coderingsfout" @@ -784,12 +785,14 @@ Basic.Settings.Stream.MultitrackVideoConfigOverride="Configuratie overschrijven (JSON)" Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Configuratie overschrijven inschakelen" Basic.Settings.Stream.MultitrackVideoLabel="Multitrack video" -Basic.Settings.Stream.MultitrackVideoExtraCanvas="Extra canvas" +Basic.Settings.Stream.MultitrackVideoExtraCanvas="Extra canvas"\nBasic.Settings.Stream.WHIPSimulcastLabel="\nSimulcast" +Basic.Settings.Stream.WHIPSimulcastInfo="Simulcast biedt de mogelijkheid om meerdere videokwaliteiten te coderen en te verzenden. <a href='https://obsproject.com/kb/whip-streaming-guide'>Meer informatie</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Totaal aantal lagen" Basic.Settings.Stream.AdvancedOptions="Geavanceerde opties" Basic.Settings.Output="Uitvoer" Basic.Settings.Output.Format="Opnameformaat" -Basic.Settings.Output.Format.hMP4="Hybride MP4 BETA (.mp4)" -Basic.Settings.Output.Format.hMOV="Hybride MOV BETA (.mov)" +Basic.Settings.Output.Format.hMP4="Hybride MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="Hybride MOV (.mov)" Basic.Settings.Output.Format.fMP4="Gefragmenteerde MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="Gefragmenteerde MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="Gefragmenteerde MOV schrijft de opname in delen en vereist niet dezelfde afsluiting als de traditionele MOV bestanden.\nDit zorgt ervoor dat het bestand speelbaar blijft, zelfs als het schrijven naar schijf wordt onderbroken, bijvoorbeeld als gevolg van een BSOD of stroomverlies.\n\nDit is mogelijk niet compatibel met alle spelers en editors. Gebruik Bestand → Remux opnamen om het bestand indien nodig in een meer compatibele indeling om te zetten." @@ -936,6 +939,7 @@ Basic.Settings.Video.FPSFraction="Breuk FPS-waarde" Basic.Settings.Video.Numerator="Teller" Basic.Settings.Video.Denominator="Noemer" +Basic.Settings.Video.Renderer.Experimental="%1 (Experimenteel)" Basic.Settings.Video.InvalidResolution="Ongeldige resolutiewaarde. Moet breedte x hoogte zijn (bijv. 1920 x 1080)" Basic.Settings.Video.CurrentlyActive="Video-uitvoer is momenteel actief. Schakel a.u.b. alle uitvoeren uit om video-instellingen aan te passen." Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (Snelste, maar wazig bij schalen)" @@ -1211,6 +1215,8 @@ MultitrackVideo.IncompatibleSettings.AudioChannels="%1 is op dit moment niet compatible met Audio → Algemeen → kanalen ingesteld op '%2', %3" MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="Audio → Algemeen → kanalen moet ingesteld staan op '%1'" MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 vereist meerdere andere instellingen voor Audio → Algemeen → kanalen " -PluginManager.Restart="OBS herstarten?" -PluginManager.NeedsRestart="Om deze wijzigingen toe te passen, moet OBS opnieuw opstarten. Wilt u nu opnieuw opstarten?" +PluginManager.Restart="OBS Studio moet opnieuw worden opgestart om de plugin wijzigingen toe te passen" PluginManager.MissingPlugin="PLUGIN NIET GEVONDEN" +PluginManager.Section.Discover="Bladeren" +PluginManager.Section.Manage="Geïnstalleerd" +PluginManager.Section.Manage.Title="Beheer ingeschakelde plugins"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/nn-NO.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/nn-NO.ini
Changed
@@ -119,7 +119,6 @@ ConfirmStop.Title="Stoppe straumen?" ConfirmStopRecord.Title="Stoppe opptak?" ConfirmBWTest.Title="Starte bandbreiddetest?" -ConfirmExit.Title="Avslutt OBS?" ConfirmRemove.Title="Stadfest fjerning" Remux.SourceFile="OBS-opptak" Remux.TargetFile="Målfil"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/pl-PL.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/pl-PL.ini
Changed
@@ -107,6 +107,7 @@ List="Lista" Grid="Siatka" Automatic="Automatycznie" +ComingSoon="Już wkrótce" PluginsFailedToLoad.Title="Błąd ładowania wtyczki" PluginsFailedToLoad.Text="Poniższe wtyczki OBS nie załadowały się:\n\n%1\n Proszę zaktualizuj lub usuń te wtyczki." AlreadyRunning.Title="OBS jest już uruchomiony" @@ -329,8 +330,8 @@ ConfirmStopRecord.Text="Czy na pewno chcesz zatrzymać nagrywanie?" ConfirmBWTest.Title="Nadawanie w trybie testu przepustowości" ConfirmBWTest.Text="OBS skonfigurowany jest w trybie testu przepustowości. Tryb ten pozwala na test połączenia sieciowego bez streamowania \"na żywo\". Po zakończeniu testów wyłącz tryb, aby móc streamować \"na żywo\".\n\nCzy chcesz kontynuować?" -ConfirmExit.Title="Wyjść z OBS?" -ConfirmExit.Text="OBS jest uruchomiony. Wszelkie transmisje czy nagrania zostaną wyłączone. Czy na pewno chcesz zakończyć?" +ConfirmExit.Title="Aktywne wyjścia" +ConfirmExit.Text="OBS jest wciąż aktywny. Wszystkie transmisje/nagrania zostaną zakończone." ConfirmRemove.Title="Potwierdź usunięcie" ConfirmRemove.Text="Czy na pewno chcesz usunąć '%1'?" ConfirmRemove.TextMultiple="Liczba elementów do usunięcia: %1. Czy na pewno chcesz je usunąć?" @@ -814,11 +815,13 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Włącz nadpisywanie konfiguracji" Basic.Settings.Stream.MultitrackVideoLabel="Wideo z wieloma ścieżkami" Basic.Settings.Stream.MultitrackVideoExtraCanvas="Dodatkowe widoki" +Basic.Settings.Stream.WHIPSimulcastInfo="Simulcast umożliwia enkodowanie i przesyłanie materiału wideo o różnej jakości. <a href='https://obsproject.com/kb/whip-streaming-guide'>Dowiedz się więcej</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Liczba warstw" Basic.Settings.Stream.AdvancedOptions="Opcje zaawansowane" Basic.Settings.Output="Wyjście" Basic.Settings.Output.Format="Format nagrywania" -Basic.Settings.Output.Format.hMP4="Hybrydowy MP4 Beta (.mp4)" -Basic.Settings.Output.Format.hMOV="Hybrydowy MOV BETA (.mov)" +Basic.Settings.Output.Format.hMP4="Hybrydowy MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="Hybrydowy MOV (.mov)" Basic.Settings.Output.Format.fMP4="Fragmentowane MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="Fragmentowane MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="Fragmentaryczny MOV zapisuje nagranie w kawałkach i nie wymaga takiej samej finalizacji jak tradycyjne pliki MOV.\nDzięki temu plik pozostaje odtwarzalny nawet wtedy, gdy zapis na dysku zostanie przerwany, na przykład w wyniku wystąpienia \"niebieskiego ekranu\" lub utraty zasilania.\n\nMoże nie być kompatybilny ze wszystkimi odtwarzaczami i edytorami. Użyj opcji Plik → Przepakuj nagrania, aby w razie potrzeby przekonwertować plik na bardziej kompatybilny format." @@ -989,6 +992,7 @@ Basic.Settings.Video.Numerator="Licznik" Basic.Settings.Video.Denominator="Mianownik" Basic.Settings.Video.Renderer="Renderowanie" +Basic.Settings.Video.Renderer.Experimental="%1 (eksperymentalny)" Basic.Settings.Video.InvalidResolution="Nieprawidłowa rozdzielczość. Wartość powinna mieć format szerokośćxwysokość (np. 1920x1080)" Basic.Settings.Video.CurrentlyActive="Wyjście wideo jest aktywne. Należy wyłączyć wszelkie wyjścia, aby zmienić ustawienia wideo." Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (najszybsze, obraz rozmazany w przypadku skalowania)" @@ -1292,7 +1296,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 wymaga wielu różnych ustawień w Dźwięk → Główne → Kanały" Basic.OpenPluginManager="Menedżer wtyczek" PluginManager="Menedżer wtyczek" -PluginManager.HelpText="Menedżer wtyczek" -PluginManager.Restart="Uruchomić ponownie OBS?" -PluginManager.NeedsRestart="Aby zastosować te zmiany, należy ponownie uruchomić OBS. Czy chcesz teraz uruchomić ponownie?" +PluginManager.Restart="Aby zastosować zmiany wtyczki, należy ponownie uruchomić OBS Studio" PluginManager.MissingPlugin="NIE ZNALEZIONO WTYCZKI" +PluginManager.Section.Discover="Przeglądaj" +PluginManager.Section.Manage="Zainstalowana" +PluginManager.Section.Updates="Aktualizacje" +PluginManager.Section.Manage.Title="Zarządzaj włączonymi wtyczkami"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/pt-BR.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/pt-BR.ini
Changed
@@ -23,12 +23,12 @@ Browse="Explorar" Stereo="Estéreo" DroppedFrames="Quadros perdidos %1 (%2%)" -Projector.Open.Program="Abrir projetor" -Projector.Open.Preview="Abrir projetor de prévia" -Projector.Open.Scene="Abrir projetor de cena" -Projector.Open.Source="Abrir projetor-fonte" +Projector.Open.Program="Projetar programa" +Projector.Open.Preview="Projetar prévia" +Projector.Open.Scene="Projetar cena" +Projector.Open.Source="Projetar fonte" Projector.Open.Multiview="Abrir visualização múltipla" -Projector.Display="Exibição: %1" +Projector.Display="Monitor: %1" Projector.Window="Nova janela" Projector.Title="Projetor" Projector.Title.Scene="Cena: %1" @@ -109,6 +109,7 @@ List="Lista" Grid="Grade" Automatic="Automático" +ComingSoon="Em breve" PluginsFailedToLoad.Title="Erro ao carregar o plugin" PluginsFailedToLoad.Text="Não foi possível carregar os seguintes plugins do OBS:\n\n%1\nPor favor, atualize ou remova estes plugins." AlreadyRunning.Title="OBS já está em execução" @@ -118,9 +119,9 @@ CrashHandling.Labels.Text="O OBS Studio não foi fechado corretamente.\n\nDeseja executá-lo no Modo Seguro (plugins de terceiros, scripts e WebSockets desativados)?" CrashHandling.Labels.PrivacyNotice="Você também pode enviar automaticamente o mais recente relatório de falha para o OBSProject.<br /><br />Leia a <a href='https://obsproject.com/privacy-policy'>Política de Privacidade</a> antes de enviar qualquer arquivo e preste atenção nas partes referentes ao envio de arquivos." CrashHandling.Checkbox.SendReport="Eu li a Política de Privacidade e permito o envio." -CrashHandling.Buttons.LaunchSafe="Executar no Modo Seguro" -CrashHandling.Buttons.LaunchNormal="Executar no Modo Normal" -CrashHandling.Errors.UploadJSONError="Ocorreu um erro ao tentar enviar o mais recente registro de falha. Por favor, tente de novo mais tarde." +CrashHandling.Buttons.LaunchSafe="Executar no modo de segurança" +CrashHandling.Buttons.LaunchNormal="Executar no modo normal" +CrashHandling.Errors.UploadJSONError="Houve um erro ao tentar enviar o registro de falha mais recente. Por favor, tente de novo mais tarde." CrashHandling.Errors.Title="Erro no envio do registro de falha" SafeMode.Restart="Deseja reiniciar o OBS no modo de segurança (plugins de terceiros, scripts e WebSockets desativados)?" SafeMode.RestartNormal="Deseja reiniciar o OBS no modo normal?" @@ -173,7 +174,7 @@ Basic.AutoConfig.VideoPage.FPS.UseCurrent="Usar atual (%1)" Basic.AutoConfig.VideoPage.FPS.PreferHighFPS="60 ou 30, mas prefiro 60 quando possível" Basic.AutoConfig.VideoPage.FPS.PreferHighRes="60 ou 30, mas prefiro alta resolução" -Basic.AutoConfig.VideoPage.CanvasExplanation="Nota: A resolução da tela (base) não é necessariamente a mesma resolução que você transmitirá ou gravará. Sua resolução final da transmissão/gravação pode ser redimensionada da resolução da tela para reduzir o uso de recursos ou taxa de bits necessários." +Basic.AutoConfig.VideoPage.CanvasExplanation="Nota: A resolução da área de edição (base) não é necessariamente a mesma resolução que você transmitirá ou gravará. A resolução final da sua transmissão ou gravação pode ser reduzida em relação à resolução da tela para reduzir o uso de recursos ou taxa de bits necessários." Basic.AutoConfig.StreamPage="Informações da transmissão" Basic.AutoConfig.StreamPage.SubTitle="Por favor, digite suas informações de transmissão" Basic.AutoConfig.StreamPage.ConnectAccount="Conectar conta (recomendado)" @@ -333,8 +334,8 @@ ConfirmStopRecord.Text="Deseja mesmo interromper a gravação?" ConfirmBWTest.Title="Iniciar teste de largura de banda?" ConfirmBWTest.Text="Você está com o OBS configurado no modo de teste de largura de banda. Este modo permite o teste de rede sem que o seu canal entre em funcionamento. Uma vez terminado o teste, você precisará desativá-lo para que os espectadores possam ver sua transmissão.\n\nVocê quer continuar?" -ConfirmExit.Title="Encerrar OBS?" -ConfirmExit.Text="OBS está ativo no momento. Todas as transmissões e/ou gravações serão interrompidas. Deseja mesmo encerrar o programa?" +ConfirmExit.Title="Saídas ativas" +ConfirmExit.Text="O OBS ainda está ativo. Todas as transmissões e gravações serão encerradas." ConfirmRemove.Title="Confirmar a remoção" ConfirmRemove.Text="Deseja mesmo remover '%1'?" ConfirmRemove.TextMultiple="Deseja mesmo remover %1 itens?" @@ -352,19 +353,19 @@ Output.ConnectFail.ConnectFailed="Não foi possível conectar ao servidor" Output.ConnectFail.InvalidStream="Não foi possível acessar o canal especificado ou a chave de transmissão, verifique a sua chave de transmissão. Se estiver correta, pode haver um problema de conexão com o servidor." Output.ConnectFail.HdrDisabled="Saída HDR está atualmente desativada para esta saída." -Output.ConnectFail.Error="Ocorreu um erro inesperado ao tentar conectar-se ao servidor. Verifique o arquivo de registro para mais informações." +Output.ConnectFail.Error="Houve um erro inesperado ao tentar conexão com o servidor. Verifique o arquivo de registro para mais informações." Output.ConnectFail.Disconnected="Desconectado do servidor." Output.StreamEncodeError.Title="Erro de codificação" -Output.StreamEncodeError.Msg="Ocorreu um erro de codificação durante a transmissão." -Output.StreamEncodeError.Msg.LastError="Um erro de codificador ocorreu durante a transmissão:<br><br>%1" +Output.StreamEncodeError.Msg="Houve um erro de codificação durante a transmissão." +Output.StreamEncodeError.Msg.LastError="Houve um erro de codificação durante a transmissão:<br><br>%1" Output.RecordFail.Title="Falha ao iniciar a gravação" Output.RecordFail.Unsupported="O formato de saída ou não é compatível ou não suporta mais do que uma faixa de áudio. Por favor, verifique suas configurações e tente novamente." Output.RecordNoSpace.Title="Espaço em disco insuficiente" Output.RecordNoSpace.Msg="Não há espaço em disco suficiente para continuar a gravação." Output.RecordError.Title="Erro de gravação" -Output.RecordError.Msg="Ocorreu um erro não especificado durante a gravação." -Output.RecordError.EncodeErrorMsg="Ocorreu um erro de codificação durante a gravação." -Output.RecordError.EncodeErrorMsg.LastError="Um erro de codificador ocorreu durante a gravação:<br><br>%1" +Output.RecordError.Msg="Houve um erro não especificado durante a gravação." +Output.RecordError.EncodeErrorMsg="Houve um erro de codificação durante a gravação." +Output.RecordError.EncodeErrorMsg.LastError="Houve um erro de codificação durante a gravação:<br><br>%1" Output.BadPath.Title="Caminho de arquivo inválido" Output.BadPath.Text="O caminho de gravação configurado não pode ser aberto. Por favor, verifique o caminho de gravação em Configurações → Saída → Gravação." Output.NoBroadcast.Title="Nenhuma transmissão configurada" @@ -380,8 +381,8 @@ LogUploadDialog.Buttons.CopyURL="Copiar URL do registro" LogUploadDialog.Buttons.AnalyzeURL="Analisar arquivo de registro" LogUploadDialog.Buttons.RetryButton="Repetir" -LogUploadDialog.Errors.Template="Ocorreu um erro ao tentar enviar o arquivo:\n\n%1" -LogUploadDialog.Errors.NoLogFile="Nenhum arquivo encontrado para enviar ou o arquivo está vazio." +LogUploadDialog.Errors.Template="Houve um erro ao tentar enviar o arquivo:\n\n%1" +LogUploadDialog.Errors.NoLogFile="O arquivo para envio não foi encontrado ou está vazio." Remux.SourceFile="Gravação do OBS" Remux.TargetFile="Arquivo de destino" Remux.Remux="Converter" @@ -391,7 +392,7 @@ Remux.OBSRecording="Gravação do OBS" Remux.FinishedTitle="Conversão concluída" Remux.Finished="Gravação convertida" -Remux.FinishedError="Gravação convertida, mas o arquivo pode estar incompleto" +Remux.FinishedError="A gravação foi convertida, mas o arquivo pode estar incompleto" Remux.SelectRecording="Selecione uma gravação do OBS..." Remux.SelectTarget="Selecione o arquivo de destino..." Remux.FileExistsTitle="O arquivo de destino já existe" @@ -432,10 +433,10 @@ MacPermissions.Item.Camera.Details="Ative esta permissão para capturar conteúdo de uma câmera conectada ou placa de captura." MacPermissions.Item.Microphone="Microfone" MacPermissions.Item.Microphone.Details="Ative esta permissão se você deseja capturar seu microfone ou um dispositivo de áudio externo." -MacPermissions.Item.InputMonitoring="Monitoramento de Entrada" +MacPermissions.Item.InputMonitoring="Monitoração de Entrada" MacPermissions.Item.InputMonitoring.Details="Essa permissão é necessária para que as teclas de atalho funcionem enquanto o OBS estiver em segundo plano." MacPermissions.Item.Accessibility="Acessibilidade" -MacPermissions.Item.Accessibility.Details="Em instalações mais antigas, o OBS pode ser listado em \"Acessibilidade\" em vez de \"Monitoramento de Entrada\"." +MacPermissions.Item.Accessibility.Details="Em instalações mais antigas, o OBS pode ser listado em \"Acessibilidade\" em vez de \"Monitoração de Entrada\"." MacPermissions.Continue="Continuar" SourceLeak.Title="Erro de limpeza de fonte(s)" SourceLeak.Text="Não foi possível alterar as coleções de cenas e algumas fontes não puderam ser descarregadas. Esse problema geralmente é causado por plug-ins que não estão liberando os recursos corretamente. Por favor, certifique-se de que todos os plug-ins que você está usando estão atualizados.\n\nO OBS Studio agora será encerrado para evitar qualquer possível corrupção de dados." @@ -476,7 +477,7 @@ Basic.Main.AddSceneCollection.Text="Por favor, insira o nome da coleção de cenas" Basic.Main.RenameSceneCollection.Title="Renomear coleção de cenas" Basic.Main.RemigrateSceneCollection.Title="Atualizar resolução da coleção de cenas" -Basic.Main.RemigrateSceneCollection.Text="Você deseja atualizar a resolução da coleção de cenas de \"%1\" para corresponder à resolução da tela do perfil atual que é de %2x%3?" +Basic.Main.RemigrateSceneCollection.Text="Você deseja atualizar a resolução da coleção de cenas de \"%1\" para corresponder à resolução da área de edição do perfil atual, que é de %2x%3?" Basic.Main.RemigrateSceneCollection.CannotMigrate.Active="Não é possível atualizar a resolução da coleção de cenas enquanto as saídas estão ativas." Basic.Main.RemigrateSceneCollection.CannotMigrate.UnknownBaseResolution="Não foi possível atualizar a resolução da coleção de cenas. A resolução original é desconhecida." Basic.Main.RemigrateSceneCollection.CannotMigrate.FailedVideoReset="Não foi possível redefinir: houve uma falha ao alterar a resolução do OBS." @@ -493,9 +494,9 @@ Basic.SourceSelect.AddExisting="Reutilizar existente" Basic.SourceSelect.AddVisible="Tornar a fonte visível" Basic.Main.Sources.Visibility="Visibilidade" -Basic.Main.Sources.VisibilityDescription="Controla a visibilidade de '%1' na tela" +Basic.Main.Sources.VisibilityDescription="Controla a visibilidade de '%1' na área de edição" Basic.Main.Sources.Lock="Bloquear" -Basic.Main.Sources.LockDescription="Bloqueia a posição e a escala de '%1' na tela" +Basic.Main.Sources.LockDescription="Bloqueia a posição e a escala de '%1' na área de edição" Basic.PropertiesWindow="Propriedades de '%1'" Basic.PropertiesWindow.AutoSelectFormat="%1 (seleção automática: %2)" Basic.PropertiesWindow.SelectColor="Escolher cor" @@ -632,12 +633,12 @@ Basic.MainMenu.Edit.LockPreview="B&loquear pré-visualização" Basic.MainMenu.Edit.Scale="Tamanho da pré-vi&sualização" Basic.MainMenu.Edit.Scale.Window="Dimensionar à janela" -Basic.MainMenu.Edit.Scale.Canvas="Tela (%1x%2)" +Basic.MainMenu.Edit.Scale.Canvas="Área de edição (%1x%2)" Basic.MainMenu.Edit.Scale.Output="Saída (%1x%2)" Basic.MainMenu.Edit.Scale.Manual="Dimensionado (%1x%2)" Basic.MainMenu.Edit.Scale.ZoomIn="Ampliar" Basic.MainMenu.Edit.Scale.ZoomOut="Reduzir" -Basic.MainMenu.Edit.Scale.ResetZoom="Redefinir Zoom" +Basic.MainMenu.Edit.Scale.ResetZoom="Redefinir zoom" Basic.MainMenu.Edit.Transform="&Transformar" Basic.MainMenu.Edit.Transform.EditTransform="&Editar transformação..." Basic.MainMenu.Edit.Transform.CopyTransform="Copiar transformação" @@ -774,10 +775,10 @@ Basic.Settings.Appearance.General.Theme="Tema" Basic.Settings.Appearance.General.Variant="Estilo" Basic.Settings.Appearance.General.NoVariant="Nenhum estilo disponível" -Basic.Settings.Appearance.FontScale="Tamanho da Fonte" +Basic.Settings.Appearance.FontScale="Tamanho da letra" Basic.Settings.Appearance.Density="Densidade" -Basic.Settings.Appearance.Classic="Clássico" -Basic.Settings.Appearance.Compact="Compacto" +Basic.Settings.Appearance.Classic="Clássica" +Basic.Settings.Appearance.Compact="Compacta" Basic.Settings.Appearance.Comfortable="Confortável" Basic.Settings.Appearance.OptionsWarning="Algumas opções de aparência não estão disponíveis para este estilo." Basic.Settings.Stream="Transmissão" @@ -810,16 +811,19 @@ Basic.Settings.Stream.MultitrackVideoMaximumAggregateBitrateAuto="Automático" Basic.Settings.Stream.MultitrackVideoMaximumVideoTracks="Máximo de faixas de vídeo" Basic.Settings.Stream.MultitrackVideoMaximumVideoTracksAuto="Automático" -Basic.Settings.Stream.MultitrackVideoStreamDumpEnable="Habilitar descarga de transmissão para FLV (usa configurações simples de arquivo de gravação)" +Basic.Settings.Stream.MultitrackVideoStreamDumpEnable="Descarregar transmissão para FLV (usando configs. simples para o arquivo)" Basic.Settings.Stream.MultitrackVideoConfigOverride="Sobreposição de configs. (JSON)" Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Ativar sobreposição de configurações" Basic.Settings.Stream.MultitrackVideoLabel="Vídeo multifaixa" -Basic.Settings.Stream.MultitrackVideoExtraCanvas="Tela Adicional" +Basic.Settings.Stream.MultitrackVideoExtraCanvas="Área de edição adicional" +Basic.Settings.Stream.WHIPSimulcastLabel="Transmissão simultânea" +Basic.Settings.Stream.WHIPSimulcastInfo="A transmissão simultânea permite codificar e enviar vídeo em várias qualidades. <a href='https://obsproject.com/kb/whip-streaming-guide'>Saiba mais</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Quantidade de camadas" Basic.Settings.Stream.AdvancedOptions="Opções avançadas" Basic.Settings.Output="Saída" Basic.Settings.Output.Format="Formato de gravação" -Basic.Settings.Output.Format.hMP4="MP4 híbrido BETA (.mp4)" -Basic.Settings.Output.Format.hMOV="MOV híbrido BETA (.mov)" +Basic.Settings.Output.Format.hMP4="MP4 híbrido (.mp4)" +Basic.Settings.Output.Format.hMOV="MOV híbrido (.mov)" Basic.Settings.Output.Format.fMP4="MP4 fragmentado (.mp4)" Basic.Settings.Output.Format.fMOV="MOV fragmentado (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="O MOV fragmentado efetua a gravação em partes e não requer a mesma finalização que os arquivos MOV tradicionais.\nIsso garante que o arquivo permaneça reproduzível mesmo que a gravação no disco seja interrompida, por exemplo, como resultado de uma tela azul ou falta de energia.\n\nIsso pode não ser compatível com todos os reprodutores e editores. Use \"Arquivo\" → \"Converter gravações\" para converter o arquivo em um formato mais compatível, se necessário." @@ -963,12 +967,12 @@ FilenameFormatting.TT.z="Compensação ISO 8601 do fuso horário UTC" FilenameFormatting.TT.Z="Nome ou abreviação do fuso horário" FilenameFormatting.TT.FPS="Taxa de quadros" -FilenameFormatting.TT.CRES="Resolução base (tela)" +FilenameFormatting.TT.CRES="Resolução base (área de edição)" FilenameFormatting.TT.ORES="Resolução de saída (escala)" FilenameFormatting.TT.VF="Formato de vídeo" Basic.Settings.Video="Vídeo" Basic.Settings.Video.Adapter="Adaptador de vídeo" -Basic.Settings.Video.BaseResolution="Resolução de base (tela)" +Basic.Settings.Video.BaseResolution="Resolução base (área de edição)" Basic.Settings.Video.ScaledResolution="Resolução de saída (escala)" Basic.Settings.Video.DownscaleFilter="Filtro de redução" Basic.Settings.Video.DownscaleFilter.Unavailable="Resoluções correspondem, não é necessário reduzir" @@ -1088,7 +1092,7 @@ Basic.AdvAudio.SyncOffsetSource="Atraso na sincronização de '%1'" Basic.AdvAudio.Monitoring="Monitoramento de áudio" Basic.AdvAudio.Monitoring.None="Não monitorar" -Basic.AdvAudio.Monitoring.MonitorOnly="Apenas monitor (saída sem áudio)" +Basic.AdvAudio.Monitoring.MonitorOnly="Só monitorar (saída muda)" Basic.AdvAudio.Monitoring.Both="Monitorar e enviar áudio" Basic.AdvAudio.MonitoringSource="Monitoramento de áudio de '%1'" Basic.AdvAudio.AudioTracks="Faixas" @@ -1171,7 +1175,7 @@ Importer.Program="Aplicação detectada" Importer.AutomaticCollectionPrompt="Procurar automaticamente por coleções de cenas" Importer.AutomaticCollectionText="O OBS pode encontrar automaticamente coleções de cena importáveis de programas de terceiros suportados. Você gostaria que o OBS encontrasse automaticamente coleções para você?\n\nVocê pode alterar isso mais tarde em Configurações > Geral > Importadores." -Importer.SelectFile="Procurar..." +Importer.SelectFile="Explorar..." Restart="Reiniciar" NeedsRestart="OBS Studio precisa ser reiniciado. Deseja reiniciá-lo agora?" LoadProfileNeedsRestart="O perfil contém configurações que precisam que o OBS seja reiniciado:\n%1\n\nVocê deseja reiniciar o OBS para que essas configurações sejam aplicadas?" @@ -1259,7 +1263,7 @@ FailedToStartStream.MissingConfigURL="Nenhuma URL de configuração disponível para o serviço atual" FailedToStartStream.NoCustomRTMPURLInSettings="URL RTMP personalizada não especificada" FailedToStartStream.InvalidCustomConfig="Configuração personalizada inválida" -FailedToStartStream.MissingCanvas="Uma tela extra configurada está faltando" +FailedToStartStream.MissingCanvas="Uma área extra de edição está faltando" FailedToStartStream.FailedToCreateMultitrackVideoService="Falha ao criar serviço de vídeo multifaixa" FailedToStartStream.FailedToCreateMultitrackVideoOutput="Falha ao criar saída RTMP de vídeo multifaixa" FailedToStartStream.EncoderNotAvailable="NVENC não disponível.\n\nNão foi possível encontrar o tipo de codificador '%1'" @@ -1273,7 +1277,7 @@ FailedToStartStream.WarningRetryNonMultitrackVideo="\n<br><br>\nVocê deseja continuar transmitindo sem %1?" FailedToStartStream.WarningRetry="\n<br><br>\nVocê deseja continuar transmitindo?" FailedToStartStream.MissingEncoderConfigs="A configuração de transmissão ao vivo não incluiu as configurações do codificador" -FailedToStartStream.InvalidEncoderConfig="A configuração de transmissão ao vivo incluiu uma configuração de codificador inválida" +FailedToStartStream.InvalidEncoderConfig="A configuração de transmissão ao vivo incluiu uma configuração inválida do codificador" FailedToStartStream.StatusMissingHTML="Solicitação de transmissão ao vivo retornou um erro não especificado" FailedToStartStream.NoConfigSupplied="Configuração ausente" MultitrackVideo.Info="%1 otimiza automaticamente suas configurações para codificar e enviar video em múltiplas qualidades. Selecionar esta opção enviará %2 informações sobre a configuração do seu computador e software." @@ -1284,9 +1288,11 @@ MultitrackVideo.IncompatibleSettings.AudioChannels="%1 atualmente não é compatível com Áudio → Geral → Canais definido para '%2', %3" MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="Áudio → Geral → Canais precisa ser definido para '%1'" MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 requer múltiplas configurações diferentes para Áudio → Geral → Canais" -Basic.OpenPluginManager="Gerenciador de Plugins" -PluginManager="Gerenciador de Plugins" -PluginManager.HelpText="Gerenciador de Plugins" -PluginManager.Restart="Reiniciar o OBS?" -PluginManager.NeedsRestart="Para aplicar as alterações, o OBS precisa ser reiniciado. Deseja reiniciar agora?" +Basic.OpenPluginManager="Gerenciador de plugins" +PluginManager="Gerenciador de plugins" +PluginManager.Restart="O OBS Studio precisa ser reiniciado para aplicar as alterações de plugin" PluginManager.MissingPlugin="PLUGIN NÃO ENCONTRADO" +PluginManager.Section.Discover="Explorar" +PluginManager.Section.Manage="Instalados" +PluginManager.Section.Updates="Atualizações" +PluginManager.Section.Manage.Title="Gerenciar plugins ativos"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/pt-PT.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/pt-PT.ini
Changed
@@ -110,6 +110,7 @@ List="Lista" Grid="Grelha" Automatic="Automático" +ComingSoon="Brevemente" PluginsFailedToLoad.Title="Erro ao carregar o plugin" PluginsFailedToLoad.Text="Falha ao carregar os seguintes plugins do OBS:\n\n%1\nPor favor, atualize ou remova estes plugins." AlreadyRunning.Title="O OBS já está em execução" @@ -335,8 +336,8 @@ ConfirmStopRecord.Text="Tem a certeza de que deseja parar a gravação?" ConfirmBWTest.Title="Iniciar teste de largura de banda?" ConfirmBWTest.Text="O OBS está configurado em modo de teste de largura de banda. Este modo permite o teste de rede sem que o seu canal seja emitido. Uma vez terminado o teste terá de o desativar para que os espetadores possam ver a transmissão.\n\nDeseja continuar?" -ConfirmExit.Title="Sair do OBS?" -ConfirmExit.Text="O OBS está ativo. Todas as transmissões e gravações serão terminadas. Tem a certeza de que pretende sair?" +ConfirmExit.Title="Saídas ativas" +ConfirmExit.Text="O OBS ainda está ativo. Todas as transmissões/gravações serão encerradas." ConfirmRemove.Title="Confirmar remoção" ConfirmRemove.Text="Tem a certeza que quer remover '%1'?" ConfirmRemove.TextMultiple="Tem a certeza de que pretende remover %1 itens?" @@ -821,12 +822,15 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Ativar sobreposição de configuração" Basic.Settings.Stream.MultitrackVideoLabel="Video multipista" Basic.Settings.Stream.MultitrackVideoExtraCanvas="Área adicional" +Basic.Settings.Stream.WHIPSimulcastLabel="Transmissão simultânea" +Basic.Settings.Stream.WHIPSimulcastInfo="Transmissão simultânea permite codificar e enviar várias qualidades de vídeo. <a href='https://obsproject.com/kb/whip-streaming-guide'>Saber mais</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Total de camadas" Basic.Settings.Stream.AdvancedOptions="Opções avançadas" Basic.Settings.Output="Saída" Basic.Settings.Output.Format="Formato de gravação" Basic.Settings.Output.Format.MKV="Vídeo Matroska (.mkv)" -Basic.Settings.Output.Format.hMP4="MP4 híbrido BETA (.mp4)" -Basic.Settings.Output.Format.hMOV="MOV híbrido BETA (.mov)" +Basic.Settings.Output.Format.hMP4="MP4 híbrido (.mp4)" +Basic.Settings.Output.Format.hMOV="MOV híbrido (.mov)" Basic.Settings.Output.Format.fMP4="MP4 fragmentado (.mp4)" Basic.Settings.Output.Format.fMOV="MOV fragmentado (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="MOV fragmentado escreve a gravação em partes e não requer a mesma finalização que os ficheiros MOV tradicionais.\nIsto garante que o ficheiro poderá ser executado mesmo se a gravação no disco for interrompida, por exemplo, como resultado de um BSOD ou perda de energia.\n\nPode não ser compatível com todas as aplicações de leitura e edição de vídeo. Utilize Ficheiro → Converter gravações, para converter o ficheiro para um formato compatível, se necessário." @@ -1293,7 +1297,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 necessita de várias configurações diferentes para Áudio → Geral → Canais" Basic.OpenPluginManager="Gestor de plugins" PluginManager="Gestor de plugins" -PluginManager.HelpText="Gestor de plugins" -PluginManager.Restart="Reiniciar OBS?" -PluginManager.NeedsRestart="Para aplicar estas alterações, o OBS precisa de ser reiniciado. Deseja reiniciar agora?" +PluginManager.Restart="O OBS Studio tem de ser reiniciado para aplicar as alterações ao plugin" PluginManager.MissingPlugin="PLUGIN NÃO ENCONTRADO" +PluginManager.Section.Discover="Navegar" +PluginManager.Section.Manage="Instalado" +PluginManager.Section.Updates="Atualizações" +PluginManager.Section.Manage.Title="Gerir plugins ativados"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/ro-RO.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/ro-RO.ini
Changed
@@ -99,17 +99,21 @@ List="Listă" Grid="Grilă" Automatic="Automat" +ComingSoon="În Curând" PluginsFailedToLoad.Title="Eroare la încărcarea pluginului" PluginsFailedToLoad.Text="Următoarele pluginuri OBS nu au putut fi încărcate:\n\n%1\nTe rugăm să actualizezi sau să elimini aceste pluginuri." AlreadyRunning.Title="OBS rulează deja" AlreadyRunning.Text="OBS rulează deja! Cu excepția cazului în care intenționezi să faci acest lucru, te rugăm să închizi orice instanță OBS înainte de a încerca să rulezi o instanță nouă. Dacă ai OBS-ul setat pentru a fi minimizat în bara de sistem, te rugăm să verifici dacă încă rulează acolo." AlreadyRunning.LaunchAnyway="Lansează oricum" +CrashHandling.Labels.Text="OBS Studio nu s-a închis în mod corect.\n\nRulezi în modul sigur (pluginurile terțe, scripturile și WebSocketurile dezactivate)?" +CrashHandling.Buttons.LaunchSafe="Rulează în modul sigur" +CrashHandling.Buttons.LaunchNormal="Rulează în modul normal" SafeMode.Restart="Dorești să repornești OBS în modul sigur (pluginurile terțe, scripturile și WebSocketurile dezactivate)?" SafeMode.RestartNormal="Vrei să repornești OBS în modul normal?" ChromeOS.Title="Platformă nesuportată" ChromeOS.Text="OBS pare să ruleze în interiorul unui container ChromeOS. Această platformă nu este suportată." Wine.Title="Wine detectat" -Wine.Text="Funcționarea OBS în Wine nu este suportată și multe caracteristici, cum ar fi sursele de captare sau de dispozitiv, nu vor funcționa sau nu vor funcționa decât într-o capacitate limitată.<br><br>Se recomandă rularea unei versiuni native de OBS în loc, de exemplu <a href='https://flathub.org/apps/details/com.obsproject.Studio'>versiunea noastră Flatpak</a> sau pachetele sistemului dvs. de operare." +Wine.Text="Rularea lui OBS în Wine nu este suportată și multe caracteristici, cum ar fi sursele de captură sau de dispozitiv, nu vor funcționa sau nu vor funcționa decât într-o capacitate limitată.<br><br>Se recomandă să rulezi în schimb o versiune nativă de OBS, de exemplu, <a href='https://flathub.org/apps/details/com.obsproject.Studio'>versiunea noastră de Flatpak</a> sau pachetele sistemului tău de operare." DockCloseWarning.Title="Închiderea ferestrei andocabile" DockCloseWarning.Text="Tocmai ai închis o fereastră andocabilă. Dacă dorești să o afișezi din nou, folosește meniul Andocări din bara de meniu." ExtraBrowsers="Andocări personalizate de browser" @@ -313,8 +317,6 @@ ConfirmStopRecord.Text="Sigur vrei să oprești înregistrarea?" ConfirmBWTest.Title="Pornești testarea lățimii de bandă?" ConfirmBWTest.Text="Ai configurat OBS în modul de testare a lățimii de bandă. Acest mod permite testarea rețelei fără să transmiți live pe canal. Odată ce ai terminat testarea, va trebui să îl dezactivezi pentru ca spectatorii să îți poată vedea transmisiunea.\n\nVrei să continui?" -ConfirmExit.Title="Ieși din OBS?" -ConfirmExit.Text="OBS este în prezent activ. Toate transmisiunile/înregistrările vor fi închise. Sigur vrei să ieși?" ConfirmRemove.Title="Confirmă eliminarea" ConfirmRemove.Text="Sigur dorești să elimini '%1'?" ConfirmRemove.TextMultiple="Sigur vrei să elimini %1 elemente?" @@ -351,6 +353,8 @@ Output.NoBroadcast.Text="Trebuie să configurezi o difuzare înainte de a putea porni streamingul." Output.BroadcastStartFailed="Eșec la pornirea difuzării" Output.BroadcastStopFailed="Eșec la oprirea difuzării" +LogUploadDialog.Buttons.ConfirmUpload="Încarcă" +LogUploadDialog.Buttons.RetryButton="Reîncearcă" Remux.SourceFile="Înregistrare OBS" Remux.TargetFile="Fișier țintă" Remux.Remux="Remuxează" @@ -768,7 +772,6 @@ Basic.Settings.Stream.AdvancedOptions="Opțiuni avansate" Basic.Settings.Output.Format="Format de înregistrare" Basic.Settings.Output.Format.MKV="Video Matroska (.mkv)" -Basic.Settings.Output.Format.hMP4="MP4 hibrid BETA (.mp4)" Basic.Settings.Output.Format.fMP4="MP4 fragmentat (.mp4)" Basic.Settings.Output.Format.fMOV="MOV fragmentat (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="MOV fragmentat scrie înregistrarea în bucăți și nu necesită aceeași finalizare ca și fișierele MOV tradiționale.\nAcest lucru asigură faptul că fișierul rămâne reproductibil chiar dacă scrierea pe disc este întreruptă, de exemplu, ca urmare a unui BSOD sau a unei pierderi de curent.\n\nEste posibil ca acest lucru să nu fie compatibil cu toate playerele și programele de editare. Folosește Fișier → Remuxează înregistrări pentru a converti fișierul într-un format mai compatibil, dacă este necesar."
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/ru-RU.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/ru-RU.ini
Changed
@@ -110,6 +110,7 @@ List="Список" Grid="Сетка" Automatic="Автоматически" +ComingSoon="В разработке" PluginsFailedToLoad.Title="Ошибка загрузки плагина" PluginsFailedToLoad.Text="Следующие плагины OBS не удалось загрузить:\n\n%1\nПожалуйста, обновите или удалите эти плагины." AlreadyRunning.Title="OBS уже запущен" @@ -336,8 +337,8 @@ ConfirmStopRecord.Text="Уверены, что хотите остановить запись?" ConfirmBWTest.Title="Начать проверку пропускной способности?" ConfirmBWTest.Text="Вы настроили OBS в режиме проверки пропускной способности. Этот режим позволяет проверять сеть без выхода вашего канала в эфир. После того, как вы закончите проверку, вам необходимо отключить эту функцию для того, чтобы зрители могли видеть вашу трансляцию.\n\nХотите продолжить?" -ConfirmExit.Title="Выйти из OBS?" -ConfirmExit.Text="OBS сейчас запущен. Все потоки/записи будут отключены. Уверены, что хотите выйти?" +ConfirmExit.Title="Действующие выводы" +ConfirmExit.Text="OBS всё ещё активен. Все стримы/записи будут приостановлены." ConfirmRemove.Title="Подтвердить удаление" ConfirmRemove.Text="Уверены, что хотите удалить «%1»?" ConfirmRemove.TextMultiple="Уверены, что хотите удалить %1 элем.?" @@ -384,7 +385,7 @@ LogUploadDialog.Buttons.AnalyzeURL="Анализ файла журнала" LogUploadDialog.Buttons.RetryButton="Повторить" LogUploadDialog.Errors.Template="Произошла ошибка при попытке отправки файла:\n\n%1" -LogUploadDialog.Errors.NoLogFile="Файлы для отправки не были найдены или файл был пустым." +LogUploadDialog.Errors.NoLogFile="Файлы для отправки не были найдены, или файл был пустым." Remux.SourceFile="Файл записи OBS" Remux.TargetFile="Конечный файл" Remux.Remux="Ремультиплексировать" @@ -729,8 +730,8 @@ Basic.Settings.General.EnableAutoUpdates="Проверять наличие обновлений при запуске" Basic.Settings.General.OpenStatsOnStartup="Открывать окно статистики при запуске" Basic.Settings.General.HideOBSWindowsFromCapture="Не захватывать OBS при захвате экрана" -Basic.Settings.General.HideOBSWindowsFromCapture.Tooltip="Эта настройка скрывает все окна OBS Studio, не являющиеся проектором, от захвата в OBS; \nона также влияет на иные программы захвата, используемые для конференции, общего доступа к рабочему столу, удалённой поддержки, снимков экрана и т. п." -Basic.Settings.General.HideOBSWindowsFromCapture.Message="Включение этого параметра скроет все окна OBS Studio, не являющиеся проектором, от захвата в OBS; он также повлияет на иные программы захвата, используемые для конференции, общего доступа к рабочему столу, удалённой поддержки, снимков экрана и т. п." +Basic.Settings.General.HideOBSWindowsFromCapture.Tooltip="Эта настройка скрывает все окна OBS Studio, не являющиеся проектором, от захвата в OBS; она также влияет\nна прочие программы захвата, используемые для конференции, общего доступа к рабочему столу, удалённой поддержки и снимков экрана." +Basic.Settings.General.HideOBSWindowsFromCapture.Message="Включение этого параметра скроет все окна OBS Studio, не являющиеся проектором, от захвата в OBS; он также повлияет на прочие программы захвата, используемые для конференции, общего доступа к рабочему столу, удалённой поддержки и снимков экрана." Basic.Settings.General.WarnBeforeStartingStream="Показывать окно подтверждения при запуске трансляции" Basic.Settings.General.WarnBeforeStoppingStream="Показывать окно подтверждения при остановке трансляции" Basic.Settings.General.WarnBeforeStoppingRecord="Показывать окно подтверждения при остановке записи" @@ -827,12 +828,15 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Включить перезапись конфигурации" Basic.Settings.Stream.MultitrackVideoLabel="Многодорожечное видео" Basic.Settings.Stream.MultitrackVideoExtraCanvas="Дополнительный холст" +Basic.Settings.Stream.WHIPSimulcastLabel="Одновременная трансляция" +Basic.Settings.Stream.WHIPSimulcastInfo="Одновременная трансляция позволяет кодировать и отправлять видео с разным качеством. <a href='https://obsproject.com/kb/whip-streaming-guide'>Подробности</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Всего слоёв" Basic.Settings.Stream.AdvancedOptions="Расширенные настройки" Basic.Settings.Output="Вывод" Basic.Settings.Output.Format="Формат записи" Basic.Settings.Output.Format.MKV="Видеоформат «Матрёшка» (.mkv)" -Basic.Settings.Output.Format.hMP4="Гибридный MP4 БЕТА (.mp4)" -Basic.Settings.Output.Format.hMOV="Гибридный MOV БЕТА (.mov)" +Basic.Settings.Output.Format.hMP4="Гибридный MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="Гибридный MOV (.mov)" Basic.Settings.Output.Format.fMP4="Фрагментированный MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="Фрагментированный MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="Фрагментированные MOV производят запись кусочно и не требуют такой же финализации как традиционные файлы MOV.\nЭто гарантирует, что файл будет проигрываться, даже если запись на диск будет прервана, например, в результате «синего экрана смерти» или потери питания.\n\nМожет быть несовместимо со всеми плеерами и редакторами. При необходимости используйте «Файл→ Перепаковать записи» для преобразования файла в более совместимый формат." @@ -1003,6 +1007,7 @@ Basic.Settings.Video.Numerator="Числитель" Basic.Settings.Video.Denominator="Знаменатель" Basic.Settings.Video.Renderer="Отрисовщик" +Basic.Settings.Video.Renderer.Experimental="%1 (Экспериментально)" Basic.Settings.Video.InvalidResolution="Недопустимое значение разрешения. Должно быть ширинаxвысота (например, 1920x1080)" Basic.Settings.Video.CurrentlyActive="Видео выход запущен. Пожалуйста, отключите все выходы, чтобы изменить настройки видео." Basic.Settings.Video.DownscaleFilter.Bilinear="Билинейный (быстрейший, но размытый при масштабировании)" @@ -1321,7 +1326,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 требует несколько разных настроек для Аудио → Общие → Каналы" Basic.OpenPluginManager="Менеджер плагинов" PluginManager="Менеджер плагинов" -PluginManager.HelpText="Менеджер плагинов" -PluginManager.Restart="Перезапустить OBS?" -PluginManager.NeedsRestart="Чтобы применить эти изменения, OBS необходимо перезапустить. Хотите перезапустить сейчас?" +PluginManager.Restart="Для применения изменений плагинов необходимо перезапустить OBS Studio" PluginManager.MissingPlugin="ПЛАГИН НЕ НАЙДЕН" +PluginManager.Section.Discover="Поиск" +PluginManager.Section.Manage="Установленные" +PluginManager.Section.Updates="Обновления" +PluginManager.Section.Manage.Title="Управление включенными плагинами"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/si-LK.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/si-LK.ini
Changed
@@ -279,8 +279,6 @@ ConfirmStop.Text="ඔබට ප්රචාරය නැවැත්වීමට වුවමනා ද?" ConfirmStopRecord.Title="පටිගතය නවතන්නද?" ConfirmStopRecord.Text="ඔබට පටිගත වීම නැවැත්වීමට වුවමනා ද?" -ConfirmExit.Title="ඕබීඑස් වෙතින් පිටවනවාද?" -ConfirmExit.Text="ඕබීඑස් දැනට ක්රියාත්මකයි. සියළුම ප්රචාර/පටිගත වසා දමනු ඇත. පිටවීමට වුවමනා ද?" ConfirmRemove.Title="ඉවතලීම තහවුරුව" ConfirmRemove.Text="'%1' ඉවත් කිරීමට වුවමනා ද?" ConfirmRemove.TextMultiple="අංග %1 ක් ඉවත් කිරීමට වුවමනා ද?"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/sk-SK.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/sk-SK.ini
Changed
@@ -105,6 +105,7 @@ List="Zoznam" Grid="Mriežka" Automatic="Automatický" +ComingSoon="Už čoskoro" PluginsFailedToLoad.Title="Chyba pri načítaní pluginu" PluginsFailedToLoad.Text="Nasledujúce OBS pluginy sa nepodarilo načítať:\n\n%1\nProsím aktualizujte alebo odstráňte tieto pluginy." AlreadyRunning.Title="OBS je už spustený" @@ -112,9 +113,12 @@ AlreadyRunning.LaunchAnyway="Napriek tomu spustiť" CrashHandling.Dialog.Title="OBS Štúdio havária zistená" CrashHandling.Labels.Text="OBS Štúdio nebolo poriadne vypnuté.\n\nSpustiť v núdzovom režime (pluginy tretích strán, skriptovanie, a websockety vypnuté)?" +CrashHandling.Labels.PrivacyNotice="Môžete tiež zvoliť automatické nahrávanie najnovšej správy o havárií pre OBSProject.<br /><br />Prosím prečítajte si <a href='https://obsproject.com/privacy-policy'>Zásady ochrany súkromia</a> pred nahrávaním akýchkoľvek súborov a venujte zvláštnu pozornosť častiam týkajúcim sa nahrávania súborov." +CrashHandling.Checkbox.SendReport="Prečítal(a) som si zásady ochrany osobných údajov a súhlasím s nahraním." CrashHandling.Buttons.LaunchSafe="Spustiť v núdzovom režime" CrashHandling.Buttons.LaunchNormal="Spustiť v normálnom režime" -CrashHandling.Errors.Title="Chyba pri nahrávaní záznamu havárie" +CrashHandling.Errors.UploadJSONError="Pri nahrávaní najnovšieho logu o havárií nastala chyba. Prosím skúste znova neskôr." +CrashHandling.Errors.Title="Chyba pri nahrávaní logu havárie" SafeMode.Restart="Chcete reštartovať OBS v núdzovom režime (pluginy tretích strán, skriptovanie, a websockety vypnuté)?" SafeMode.RestartNormal="Chcete reštartovať OBS v normálnom režime?" ChromeOS.Title="Nepodporovaná platforma" @@ -324,8 +328,8 @@ ConfirmStopRecord.Text="Naozaj si želáte zastaviť nahrávanie?" ConfirmBWTest.Title="Spustiť test šírky pásma siete?" ConfirmBWTest.Text="Vaše OBS je nakonfigurované pre režim testovania šírky pásma. Toto umožní zistiť parametre vašej siete bez spustenia živého vysielania na vašom kanáli. Po dokončení testovania musíte tento režim zakázať, ináč diváci neuvidia vami prenášaný obsah.\n\nNaozaj si želáte pokračovať?" -ConfirmExit.Title="Ukončiť OBS?" -ConfirmExit.Text="OBS je momentálne aktívny. Všetky prúdy údajov/záznamy sa ukončia. Naozaj pokračovať?" +ConfirmExit.Title="Aktívne výstupy" +ConfirmExit.Text="OBS je momentálne stále aktívne. Všetky streamy/nahrávania budu zastavené." ConfirmRemove.Title="Potvrdenie odobratia" ConfirmRemove.Text="Ste si istí, že chcete odstrániť '%1'?" ConfirmRemove.TextMultiple="Naozaj si prajete odstrániť %1 položiek?" @@ -362,8 +366,17 @@ Output.NoBroadcast.Text="Najprv musíte nastaviť vysielanie predtým než začnete streamovať." Output.BroadcastStartFailed="Spustenie vysielania zlyhalo" Output.BroadcastStopFailed="Zastavenie vysielania zlyhalo" +LogUploadDialog.Title="Nahrávanie log súboru OBS Štúdia" +LogUploadDialog.Labels.PrivacyNotice="Prosím prečítajte si <a href='https://obsproject.com/privacy-policy'>Zásady ochrany súkromia</a> a ich sekciu ohľadom nahrávania súborov pred nahrávaním akýchkoľvek súborov." +LogUploadDialog.Labels.Progress="Nahrávanie log súboru prebieha. Prosím počkajte..." +LogUploadDialog.Labels.Description.AppLog="Váš log súbor bol nahratý. Môžete teraz zdieľať URL pre potreby ladenia alebo podpory." +LogUploadDialog.Labels.Description.CrashLog="Vaša správa o havárií aplikácie bola nahratá. Môžete teraz zdieľať URL pre potreby ladenia." LogUploadDialog.Buttons.ConfirmUpload="Nahrať" +LogUploadDialog.Buttons.CopyURL="Kopírovať URL logu" +LogUploadDialog.Buttons.AnalyzeURL="Analyzovať log súbor" LogUploadDialog.Buttons.RetryButton="Skúsiť znova" +LogUploadDialog.Errors.Template="Nastala chyba pri pokuse nahrať súbor:\n\n%1" +LogUploadDialog.Errors.NoLogFile="Nenašiel sa súbor pre nahratie alebo je súbor prázdny." Remux.SourceFile="OBS nahrávka" Remux.TargetFile="Cieľový súbor" Remux.Remux="Previesť" @@ -579,6 +592,7 @@ Basic.Main.PauseRecording="Pozastaviť nahrávanie" Basic.Main.UnpauseRecording="Pokračovať v nahrávaní" Basic.Main.SplitFile="Rozdeliť nahrávací súbor" +Basic.Main.AddChapterMarker="Pridať značku kapitoly (iba pre Hybridný MP4/MOV)" Basic.Main.StoppingRecording="Zastavenie nahrávania..." Basic.Main.StopReplayBuffer="Zastaviť záznam do pamäte" Basic.Main.StoppingReplayBuffer="Zastavujem záznam do pamäte..." @@ -801,10 +815,13 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Zapnúť prepísanie konfigurácie" Basic.Settings.Stream.MultitrackVideoLabel="Viacstopé video" Basic.Settings.Stream.MultitrackVideoExtraCanvas="Dodatočné plátno" +Basic.Settings.Stream.WHIPSimulcastInfo="Simulcast umožňuje enkódovať a posielať viacero video kvalít. <a href='https://obsproject.com/kb/whip-streaming-guide'>Zistiť viac</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Všetky vrstvy" Basic.Settings.Stream.AdvancedOptions="Pokročilé možnosti" Basic.Settings.Output="Výstup" Basic.Settings.Output.Format="Formát nahrávania" -Basic.Settings.Output.Format.hMP4="Hybridný MP4 BETA (.mp4)" +Basic.Settings.Output.Format.hMP4="Hybridný MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="Hybridný MOV (.mov)" Basic.Settings.Output.Format.fMP4="Fragmentovaný MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="Fragmentovaný MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="Fragmentovaný MOV zapisuje nahrávku v kusoch a nevyžaduje rovnakú finalizáciu ako tradičné MOV súbory.\nToto zabezpečí, že súbor ostane prehrávateľný aj keď je zapisovanie na disk prerušené, napríklad pri BSOD alebo strate napájania.\n\nToto však nemusí byť kompatibilné so všetkými prehrávačmi a editormi. Použite Súbor -> Previesť nahrávky pre konvertovanie súboru do viac kompatibilného formátu ak je to potrebné." @@ -971,6 +988,7 @@ Basic.Settings.Video.Numerator="Čitateľ" Basic.Settings.Video.Denominator="Menovateľ" Basic.Settings.Video.Renderer="Vykresľovač" +Basic.Settings.Video.Renderer.Experimental="%1 (Experimentálny)" Basic.Settings.Video.InvalidResolution="Neplatné rozlíšenie. Správne je šírkaxvýška (napr. 1920x1080)" Basic.Settings.Video.CurrentlyActive="Výstup videa je práve aktívny. Prosím, vypnite všetky výstupy na zmenu nastavení videa." Basic.Settings.Video.DownscaleFilter.Bilinear="Bilineárny (Najrýchlejší, ale rozmazaný pri škálovaní)" @@ -1279,7 +1297,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 vyžaduje viacero rôznych nastavení pre Zvuk → Všeobecné → Kanály" Basic.OpenPluginManager="Správca pluginov" PluginManager="Správca pluginov" -PluginManager.HelpText="Správca pluginov" -PluginManager.Restart="Reštartovať OBS?" -PluginManager.NeedsRestart="Pre použitie týchto zmien, OBS sa potrebuje reštartovať. Chcete reštartovať teraz?" +PluginManager.Restart="OBS Štúdio musí byť reštartované pre použitie zmien" PluginManager.MissingPlugin="PLUGIN NENÁJDENÝ" +PluginManager.Section.Discover="Prehliadať" +PluginManager.Section.Manage="Nainštalovaný" +PluginManager.Section.Updates="Aktualizácie" +PluginManager.Section.Manage.Title="Spravovať zapnuté pluginy"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/sl-SI.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/sl-SI.ini
Changed
@@ -23,6 +23,18 @@ Mixer="Zvočna mešalka" Browse="Brskaj" DroppedFrames="Spuščeni okvirji %1 (%2 %)" +Projector.Open.Program="Odpri projektor programa" +Projector.Open.Preview="Odpri projektor predogleda" +Projector.Open.Scene="Odpri projektor scene" +Projector.Open.Source="Odpri projektor vira" +Projector.Open.Multiview="Odpri več-prikazno" +Projector.Display="Zaslon: %1" +Projector.Window="Novo okno" +Projector.Title="Projektor" +Projector.Title.Scene="Scena: %1" +Projector.Title.Source="Vir: %1" +Projector.Title.Multiview="Več-prikazno" +Projector.ResizeWindowToContent="Prilagodi okno vsebini" Clear="Počisti" Revert="Povrni" Show="Prikaži" @@ -80,6 +92,7 @@ LogViewer="Pregledovalnik dnevnika" ShowOnStartup="Pokaži ob zagonu" OpenFile="Odpri datoteko" +AddScene="Dodaj sceno" AddSource="Dodaj vir" RemoveScene="Odstrani izbrani prizor" RemoveSource="Odstrani izbrani vir" @@ -94,11 +107,20 @@ List="Seznam" Grid="Mreža" Automatic="Samodejno" +ComingSoon="Kmalu na voljo" PluginsFailedToLoad.Title="Napaka pri nalaganju vstavka" PluginsFailedToLoad.Text="Naslednji vstavki OBS se niso uspešno naložili.\n\n%1\nTe vstavke posodobite ali odstranite." AlreadyRunning.Title="OBS se že izvaja" AlreadyRunning.Text="OBS se že izvaja! Če tega niste že storili, zaprite vse obstoječe primerke OBS, preden poskusite zagnati nov primerek. Če imate OBS nastavljen, da se zmanjša v sistemsko vrstico, preverite, ali se tam še vedno izvaja." AlreadyRunning.LaunchAnyway="Vseeno zaženi" +CrashHandling.Dialog.Title="OBS se je sesul" +CrashHandling.Labels.Text="Ali želite ponovno zagnati OBS v varnem načinu (z onemogočenimi vstavki, skriptami in spletnimi vtičnicami tretjih strani)?" +CrashHandling.Labels.PrivacyNotice="Lahko izberete tudi samodejno nalaganja poročila o sesutju na OBSProject.<br /><br />Preberite <a href='https://obsproject.com/privacy-policy'>pravilnik o zasebnosti</a> preden naložite katerokoli datoteko in bodite še posebej pozorni na razdelke, ki govorijo o nalaganju datotek." +CrashHandling.Checkbox.SendReport="Prebral sem pravilnik o zasebnosti in stirnjam se z nalaganjem." +CrashHandling.Buttons.LaunchSafe="Zagon v varnem načinu" +CrashHandling.Buttons.LaunchNormal="Zagon v normalnem načinu" +CrashHandling.Errors.UploadJSONError="Pri nalaganju zadnjega dnevnika o sesutju se je zgodila napaka. Znova poskusite kasneje." +CrashHandling.Errors.Title="Napaka pri nalaganju dnevnika o sesutju" SafeMode.Restart="Ali želite ponovno zagnati OBS v varnem načinu (z onemogočenimi vstavki, skriptami in spletnimi vtičnicami tretjih strani)?" SafeMode.RestartNormal="Ali želite ponovno zagnati OBS v navadnem načinu?" ChromeOS.Title="Nepodprta platforma" @@ -214,6 +236,7 @@ Basic.Stats.MegabytesSent="Skupaj izhodnih podatkov" Basic.Stats.Bitrate="Bitna hitrost" Basic.Stats.DiskFullIn="Disk bo poln v (pribl.)" +Basic.Stats.DiskFullIn.Text="ur: %1, minut: %2" Basic.Stats.ResetStats="Ponastavi statistiko" ResetUIWarning.Title="Ali res želite ponastaviti uporabniški vmesnik?" ResetUIWarning.Text="Ponastavitev uporabniškega vmesnika bo skrila dodatna sidrišča. Če jih želite spet prikazati, morate to storiti iz menija sidrišča.\n\nŽelite res ponastaviti uporabniški vmesnik?" @@ -310,8 +333,6 @@ ConfirmStopRecord.Text="Ali res želite prenehati snemati?" ConfirmBWTest.Title="Zaženi preizkus pasovne širine?" ConfirmBWTest.Text="OBS imate nastavljen v načinu preizkusa pasovne širine. Ta način omogoča preizkušanje omrežja brez oddajanja v živo. Ko končate s preizkusom, ga boste morali onemogočiti, da si bodo gledalci lahko ogledali vaš pretok.\n\nŽelite nadaljevati?" -ConfirmExit.Title="Želite zapustiti OBS?" -ConfirmExit.Text="OBS je trenutno aktiven. Vsi pretoki/snemanja bodo ustavljeni. Ali res želite zapreti program?" ConfirmRemove.Title="Potrdite odstranitev" ConfirmRemove.Text="Ali res želite odstraniti '%1'?" ConfirmRemove.TextMultiple="Ali res želite odstraniti %1 predmetov?" @@ -348,6 +369,17 @@ Output.NoBroadcast.Text="Pred začtekom pretakanja morate nastaviti oddajanje." Output.BroadcastStartFailed="Neuspešen zagon oddajanja" Output.BroadcastStopFailed="Neuspešna zaustavitev oddajanja" +LogUploadDialog.Title="Nalaganje OBS Studio dnevnika" +LogUploadDialog.Labels.PrivacyNotice="Preberite razdelek o nalaganju datotek v <a href='https://obsproject.com/privacy-policy'>Pravilniku o zasebnosti</a> še preden naložite kakšno datoteko." +LogUploadDialog.Labels.Progress="Nalaganje dnevnika se izvaja. Počakajte..." +LogUploadDialog.Labels.Description.AppLog="Dnevnik je bil naložen. Sedaj lahko uporabite URL naslov za razhroščevanje ali podporo." +LogUploadDialog.Labels.Description.CrashLog="Poročilo o sesutju je bilo naloženo. URL naslov je mogoče uporabiti za razhroščevanje." +LogUploadDialog.Buttons.ConfirmUpload="Naloži" +LogUploadDialog.Buttons.CopyURL="Kopiraj URL dnevnika" +LogUploadDialog.Buttons.AnalyzeURL="Analiziraj dnevniško datoteko" +LogUploadDialog.Buttons.RetryButton="Ponovno" +LogUploadDialog.Errors.Template="Prišlo je do napake pri nalaganju datoteke:\n\n%1" +LogUploadDialog.Errors.NoLogFile="Datoteka za nalaganje ne obstaja ali pa je prazna." Remux.SourceFile="Posnetek OBS" Remux.TargetFile="Ciljna datoteka" Remux.Remux="Prepakiranje" @@ -398,7 +430,10 @@ MacPermissions.Item.Camera.Details="To dovoljenje je potrebno za zajem vsebbine iz spletne kamere ali kartice za zajem videa." MacPermissions.Item.Microphone="Mikrofon" MacPermissions.Item.Microphone.Details="OBS potrebuje to dovoljenje, če želite zajeti zvok z mikrofona ali zunanje zvokovne naprave." +MacPermissions.Item.InputMonitoring="Nadzorovanje vhoda" +MacPermissions.Item.InputMonitoring.Details="Hitre tipke potrebujejo to dovoljenje, da bi lahko delovale z OBS v ozadju." MacPermissions.Item.Accessibility="Dostopnost" +MacPermissions.Item.Accessibility.Details="Na starejših različicah se lahko OBS nahaja v \"Dostopnost\" in ne \"Nadzorovanje vhoda\"." MacPermissions.Continue="Nadaljuj" SourceLeak.Title="Napaka pri čiščenju virov" SourceLeak.Text="Pri spreminjanju scenskih zbirk je prišlo do težav in nekaterih virov ni bilo mogoče sprostiti. Razlog je ponavadi v vtičnikih, ki virov ne sprostijo pravilno. Poskrbite, da so vtičniki ažurirani.\n\nOBS Studi se bo sedaj zaprl, da prepreči morebitno okvaro podatkov." @@ -448,6 +483,7 @@ Basic.Main.RemigrateSceneCollection.Text="Ali želite posodobiti ločljivost zbirke scen za \"%1\", da ustreza ločljivosti platna %2x%3 trenutnega profila?" Basic.Main.RemigrateSceneCollection.CannotMigrate.Active="Ko so izhodi aktivni, ni mogoče posodobiti ločljivosti zbirke scen." Basic.Main.RemigrateSceneCollection.CannotMigrate.UnknownBaseResolution="Ločljivosti zbirke scen ni bilo mogoče posodobiti. Izvirna ločljivost ni poznana." +Basic.Main.RemigrateSceneCollection.CannotMigrate.FailedVideoReset="Ponastavitev ni možna. Sprememba ločljivosti OBS ni uspela." AddProfile.Title="Dodaj profil" AddProfile.Text="Vnesite ime profila" AddProfile.WizardCheckbox="Prikaži čarovnika za samodejno konfiguracijo"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/sq-AL.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/sq-AL.ini
Changed
@@ -205,7 +205,6 @@ Undo.MoveToTop="Zhvendos '%1' sipër '%2'" Undo.MoveToBottom="Zhvendos '%1' poshtë '%2'" TitleBar.PortableMode="Færanlegt-mode " -ConfirmExit.Title="Dil nga OBS?" MissingFiles.HelpText="Disa skedarë mungojnë që herën e fundit që ju perdorët OBS" MissingFiles.Replaced="Zëvëndesuar" SourceLeak.Title="Hreinsun á Grunnvillu"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/sr-CS.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/sr-CS.ini
Changed
@@ -322,8 +322,6 @@ ConfirmStopRecord.Text="Da li ste sigurni da želite zaustaviti snimanje?" ConfirmBWTest.Title="Započeti probu protoka?" ConfirmBWTest.Text="OBS Vam je konfigurisan u režimu probe protoka. Ovaj režim Vam dopušta da isprobate mrežnu povezanost bez potrebe da se uključujete uživo na svom kanalu. Kada budete bili gotovi sa testiranjem, moraćete da onemogućite ovaj režim da bi gledaoci mogli da vide Vaš strim.\n\nŽelite li da nastavite?" -ConfirmExit.Title="Izađite iz OBS programa?" -ConfirmExit.Text="OBS je trenutno aktivan. Svi strimovi/snimanja će biti ugašeni. Da li ste sigurni da želite da izađete iz programa?" ConfirmRemove.Title="Potvrdi izbacivanje" ConfirmRemove.Text="Da li ste sigurni da želite da uklonite '%1'?" ConfirmRemove.TextMultiple="Da li ste sigurni da želite da izbacite %1 stavke?" @@ -802,7 +800,6 @@ Basic.Settings.Output="Izlaz" Basic.Settings.Output.Format="Format snimanja" Basic.Settings.Output.Format.MKV="Matroska video (.mkv)" -Basic.Settings.Output.Format.hMP4="Hibridni MP4 BETA (.mp4)" Basic.Settings.Output.Format.fMP4="Fragmentirani MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="Fragmentirani MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="Fragmentirani MOV zapisuje snimak u delovima i ne zahteva istu finalizaciju kao tradicionalne MOV datoteke.\nOvo osigurava da datoteka ostane reprodukovana čak i ako je pisanje na disk prekinuto, na primer, kao rezultat BSOD-a ili nestanka struje.\n\nOvo možda nije kompatibilno sa svim plejerima i uređivačima. Koristite Datoteka → Remultifikuj snimke da biste konvertovali datoteku u kompatibilniji format ako je potrebno."
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/sr-SP.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/sr-SP.ini
Changed
@@ -111,11 +111,14 @@ List="Списак" Grid="Мрежни приказ" Automatic="Аутоматски" +ComingSoon="Ускоро стиже" PluginsFailedToLoad.Title="Грешка приликом учитавања додатне компоненте" PluginsFailedToLoad.Text="Следеће OBS додатне компоненте нису успеле да се учитају:\n\n%1\nМолимо Вас ажурирајте их или их уклоните." AlreadyRunning.Title="OBS је већ покренут" AlreadyRunning.Text="OBS je већ покренут! Осим ако заиста желите да урадите ово, молимо Вас да прекинете све процесе везане за OBS пре него што покренете нов задатак. У случају да OBS ради у позадини, молимо вас да проверите system tray (иконице доле десно, поред сата)." AlreadyRunning.LaunchAnyway="Свеједно покрени" +CrashHandling.Buttons.LaunchSafe="Покрени у безбедном режиму" +CrashHandling.Buttons.LaunchNormal="Покрени у Нормалном Режиму" SafeMode.Restart="Да ли желите да поново покренете ОБС у безбедном режиму (додаци треће стране, скрипте и ВебСоцкетс су ононемогућени)?" SafeMode.RestartNormal="Да ли желите да поново покренете ОБС у нормалном режиму?" ChromeOS.Title="Неподржани формат" @@ -329,8 +332,6 @@ ConfirmStopRecord.Text="Да ли сте сигурни да желите зауставити снимање?" ConfirmBWTest.Title="Започети пробу протока?" ConfirmBWTest.Text="OBS Вам је конфигурисан у режиму пробе протока. Овај режим Вам допушта да испробате мрежну повезаност без потребе да се укључујете уживо на свом каналу. Када будете били готови са тестирањем, мораћете да онемогућите овај режим да би гледаоци могли да виде Ваш стрим.\n\nЖелите ли да наставите?" -ConfirmExit.Title="Изађите из OBS програма?" -ConfirmExit.Text="OBS је тренутно активан. Сви стримови/снимања ће бити угашени. Да ли сте сигурни да желите да изађете из програма?" ConfirmRemove.Title="Потврди избацивање" ConfirmRemove.Text="Да ли сте сигурни да желите да уклоните '%1'?" ConfirmRemove.TextMultiple="Да ли сте сигурни да желите да избаците %1 ставке?" @@ -367,6 +368,8 @@ Output.NoBroadcast.Text="Морате да конфигуришете пренос пре почетка стримовања." Output.BroadcastStartFailed="Неуспешан покушај започињања преноса" Output.BroadcastStopFailed="Неуспешан покушај заустављања преноса" +LogUploadDialog.Buttons.ConfirmUpload="Отпреми" +LogUploadDialog.Buttons.RetryButton="Покушај поново" Remux.SourceFile="OBS снимак" Remux.TargetFile="Датотека" Remux.Remux="Ремукс" @@ -810,7 +813,8 @@ Basic.Settings.Output="Излаз" Basic.Settings.Output.Format="Формат снимања" Basic.Settings.Output.Format.MKV="Матроска видео (.mkv)" -Basic.Settings.Output.Format.hMP4="Хибридни MP4 БЕТА (.mp4)" +Basic.Settings.Output.Format.hMP4="Хибридни MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="Хибридни MOV (.mov)" Basic.Settings.Output.Format.fMP4="Фрагментирани MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="Фрагментирани MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="Фрагментирани MOV записује снимак у деловима и не захтева исту финализацију као традиционалне MOV датотеке.\nОво осигурава да датотека остане репродукована чак и ако је писање на диск прекинуто, на пример, као резултат BSOD-а или нестанка струје.\n\nОво можда није компатибилно са свим плејерима и уређивачима. Користите Датотека → Ремултификуј снимке да бисте конвертовали датотеку у компатибилнији формат ако је потребно." @@ -1307,3 +1311,10 @@ MultitrackVideo.IncompatibleSettings.AudioChannels="%1 тренутно није компатибилан са Аудио → Опште → Канали подешеним на '%2', %3" MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="Аудио → Опште → Канали треба да буде подешено на '%1'" MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 захтева више различитих подешавања за Аудио → Опште → Канали" +Basic.OpenPluginManager="Управљач додацима" +PluginManager="Управљач додацима" +PluginManager.Restart="OBS Studio мора бити поново покренут да би се примениле промене додатка" +PluginManager.MissingPlugin="ДОДАТАК НИЈЕ ПРОНАЂЕН" +PluginManager.Section.Discover="Прегледај" +PluginManager.Section.Manage="Инсталирано" +PluginManager.Section.Updates="Ажурирања"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/sv-SE.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/sv-SE.ini
Changed
@@ -106,6 +106,7 @@ List="Lista" Grid="Rutnät" Automatic="Automatisk" +ComingSoon="Kommer snart" PluginsFailedToLoad.Title="Fel vid inläsning av insticksprogram" PluginsFailedToLoad.Text="Följande OBS-insticksprogram kunde inte läsas in:\n\n%1\nVar god uppdatera eller ta bort dessa insticksprogram." AlreadyRunning.Title="OBS körs redan" @@ -196,12 +197,12 @@ Basic.AutoConfig.StreamPage.StreamWarning.Text="Bandbreddstestet kommer att strömma slumpad videodata utan ljud till din kanal. Om det fungerar, är det rekommenderat det att tillfälligt inaktivera att spara videor av strömmar och ändra strömmen till privat tills testet är färdigt. Fortsätta?" Basic.AutoConfig.StreamPage.UseMultitrackVideo="Testa %1" Basic.AutoConfig.TestPage="Slutgiltiga resultat" -Basic.AutoConfig.TestPage.SubTitle.Testing="Programmet utför nu en grupp tester för att uppskatta de mest idealiska inställningarna" +Basic.AutoConfig.TestPage.SubTitle.Testing="Programmet utför nu en uppsättning tester för att uppskatta de mest idealiska inställningarna" Basic.AutoConfig.TestPage.SubTitle.Complete="Testet slutfördes" -Basic.AutoConfig.TestPage.TestingBandwidth="Utför bandbreddstest, detta kan ta några minuter..." -Basic.AutoConfig.TestPage.TestingBandwidth.NoOutput="Ingen utmatning för protokollet av denna tjänst hittades" +Basic.AutoConfig.TestPage.TestingBandwidth="Utför bandbreddstest, som kan ta några minuter..." +Basic.AutoConfig.TestPage.TestingBandwidth.NoOutput="Ingen utmatning hittades för protokollet av denna tjänst" Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="Ansluter till: %1 ..." -Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="Misslyckades att ansluta till någon server, kontrollera din Internetanslutning och försök igen." +Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="Misslyckades att ansluta till en server. Kontrollera din internetanslutning och försök igen." Basic.AutoConfig.TestPage.TestingBandwidth.Server="Testar bandbredden för: %1" Basic.AutoConfig.TestPage.TestingStreamEncoder="Testar strömkodare, detta kan ta några minuter..." Basic.AutoConfig.TestPage.TestingRecordingEncoder="Testar inspelningskodare, detta kan ta några minuter..." @@ -210,8 +211,8 @@ Basic.AutoConfig.TestPage.Result.StreamingEncoder="Strömningskodare" Basic.AutoConfig.TestPage.Result.RecordingEncoder="Inspelningskodare" Basic.AutoConfig.TestPage.Result.Header="Programmet har uppskattat att de här inställningar är de mest idealiska för dig:" -Basic.AutoConfig.TestPage.Result.Footer="För att använda dessa inställningar, klicka på Verkställ inställningar. För att köra guiden igen, klicka på Tillbaka. För att konfigurera inställningarna manuellt, klicka på Avbryt och öppna Inställningar." -Basic.AutoConfig.Info="Autokonfigurationsguiden kommer att avgöra de bästa inställningarna baserat på din dators specifikation och din internethastighet." +Basic.AutoConfig.TestPage.Result.Footer="För att använda dessa inställningar klickar du på \"Verkställ inställningar\". För att köra guiden igen klickar du på \"Tillbaka\". För att konfigurera inställningarna manuellt klickar du på \"Avbryt\" och öppnar Inställningar." +Basic.AutoConfig.Info="Den automatiska konfigurationsguiden kommer att avgöra de bästa inställningarna baserat på din dators specifikation och din internethastighet." Basic.AutoConfig.RunAnytime="Detta kan köras när som helst via verktygsmenyn." Basic.AutoConfig.TestPage.Result.StreamingResolution="Strömningsupplösning (skalad)" Basic.Stats="Statistik" @@ -249,7 +250,7 @@ Updater.RepairButUpdatesAvailable.Text="Det är endast möjligt att kontrollera filintegriteten för den senast tillgängliga versionen. Använd Hjälp → Sök efter uppdateringar för att verifiera och uppdatera OBS-installationen." Updater.RepairConfirm.Title="Bekräfta integritetskontroll" Updater.RepairConfirm.Text="Integritetskontrollen kommer skanna din OBS-installation för skador och ladda ned trasiga/modifierade filer på nytt. Detta kan ta ett tag.\n\nVill du fortsätta?" -Updater.FailedToLaunch="Misslyckades att starta uppdateringen" +Updater.FailedToLaunch="Misslyckades att starta uppdateringsprogrammet" QuickTransitions.SwapScenes="Växla mellan förhandsvisning/programscener efter övergång" QuickTransitions.SwapScenesTT="Växlar mellan förhandsvisningen och programscener efter övergångar (om progrmamets originalscen fortfarande finns).\nDetta kommer inte några några ändringar som har gjorts i programmets orignalscen." QuickTransitions.DuplicateScene="Duplicera scen" @@ -329,8 +330,8 @@ ConfirmStopRecord.Text="Är du säker på att du vill stoppa inspelningen?" ConfirmBWTest.Title="Starta bandbreddstest?" ConfirmBWTest.Text="Du har konfigurerat OBS i testläge för bandbredd. Detta läge låter dig testa nätverket utan att din kanal direktsänder. När du har testat färdigt behöver du inaktivera den för att att tittare ska kunna se din ström.\n\nVill du fortsätta?" -ConfirmExit.Title="Avsluta OBS?" -ConfirmExit.Text="OBS körs för tillfället. Alla strömmar/inspelningar kommer att stängas av. Är du säker på att du vill avsluta?" +ConfirmExit.Title="Aktiva utmatningar" +ConfirmExit.Text="OBS körs fortfarande. Alla strömmar/inspelningar kommer att stängas ned." ConfirmRemove.Title="Bekräfta borttagning" ConfirmRemove.Text="Är du säker på att du vill ta bort \"%1\"?" ConfirmRemove.TextMultiple="Är du säker på att du vill ta bort %1 objekt?" @@ -808,6 +809,8 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Aktivera överskridande av konfiguration" Basic.Settings.Stream.MultitrackVideoLabel="Flerspårsvideo" Basic.Settings.Stream.MultitrackVideoExtraCanvas="Ytterligare kanvas" +Basic.Settings.Stream.WHIPSimulcastInfo="Simulcast låter dig koda och skicka flera videokvaliteter. <a href='https://obsproject.com/kb/whip-streaming-guide'>Läs mer</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Totalt antal lager" Basic.Settings.Stream.AdvancedOptions="Avancerade alternativ" Basic.Settings.Output="Utmatning" Basic.Settings.Output.Format="Inspelningsformat" @@ -978,6 +981,7 @@ Basic.Settings.Video.Numerator="Täljare" Basic.Settings.Video.Denominator="Nämnare" Basic.Settings.Video.Renderer="Renderare" +Basic.Settings.Video.Renderer.Experimental="%1 (experimentell)" Basic.Settings.Video.InvalidResolution="Ogiltigt upplösningsvärde. Måste vara breddxhöjd (t.ex. 1920x1080)" Basic.Settings.Video.CurrentlyActive="Videoutmatning är aktiv. Stoppa alla utmatningar för att kunna ändra videoinställningar." Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinjär (snabbast, men blir suddigt det skalas)" @@ -1289,7 +1293,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 kräver flera olika inställningar för Ljud → Allmänt → Kanaler" Basic.OpenPluginManager="Insticksprogramshanterare" PluginManager="Insticksprogramshanterare" -PluginManager.HelpText="Insticksprogramshanterare" -PluginManager.Restart="Vill du starta om OBS?" -PluginManager.NeedsRestart="För att kunna tillämpa dessa ändringar måste OBS startas om. Vill du starta om nu?" +PluginManager.Restart="OBS Studio måste startas om för att tillämpa ändringar för insticksprogram" PluginManager.MissingPlugin="INSTICKSPROGRAMMET HITTADES INTE" +PluginManager.Section.Discover="Bläddra" +PluginManager.Section.Manage="Installerade" +PluginManager.Section.Updates="Uppdateringar" +PluginManager.Section.Manage.Title="Hanterade aktiverade insticksprogram"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/szl-PL.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/szl-PL.ini
Changed
@@ -250,7 +250,6 @@ ConfirmStopRecord.Title="Zasztopować nagrowanie?" ConfirmStopRecord.Text="Chcesz zakończyć nagrowanie?" ConfirmBWTest.Title="Sztartnōńć test przepustowości?" -ConfirmExit.Title="Wyjść z OBS?" ConfirmRemove.Title="Potwiyrdź wyciepniyńcie" Output.StartStreamFailed="Niy podarziło sie sztartnōńć streamowanio" Output.StartRecordingFailed="Niy podarziło sie sztartnōńć nagrowanio"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/ta-IN.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/ta-IN.ini
Changed
@@ -97,6 +97,7 @@ SceneFilters="காட்சி வடிப்பான்களைத் திறக்கவும்" List="பட்டியல்" Grid="கட்டம்" +ComingSoon="விரைவில் வருகிறது" PluginsFailedToLoad.Title="செருகுநிரல் ஏற்றுவதில் பிழை" PluginsFailedToLoad.Text="பின்வரும் OBS செருகுநிரல்களை ஏற்ற முடியவில்லை:\n\n%1\nஇந்த செருகுநிரல்களைப் புதுப்பிக்கவும் அல்லது அகற்றவும்." AlreadyRunning.Title="OBS ஏற்கனவே இயங்கிக்கொண்டிருக்கிறது" @@ -205,6 +206,7 @@ Updater.Skip="பதிப்பு தவிர்க்க" Updater.NoUpdatesAvailable.Title="மேம்படுத்தல்கள் கிடைக்கவில்லை" Updater.NoUpdatesAvailable.Text="மேம்படுத்தல்கள் ஏதும் நடப்பில் இல்லை" +Updater.RepairButUpdatesAvailable.Title="மெய்மைத்தன்மை சரிபார்ப்பு கிடைக்கவில்லை" Updater.FailedToLaunch="மேம்படுத்தல் தோல்வியுற்றது" QuickTransitions.DuplicateScene="நகல் காட்சி" QuickTransitions.EditProperties="நகல் மூலங்கள்" @@ -246,13 +248,12 @@ ConfirmStopRecord.Title="பதிவெடுப்பதை நிறுத்து?" ConfirmStopRecord.Text="பதிவு செய்வதை நிறுத்த விரும்புகிறீர்களா?" ConfirmBWTest.Title="அலைவரிசை சோதனையைத் தொடங்கவா?" -ConfirmExit.Title="OBS ஐ வெளியேற்றவா?" -ConfirmExit.Text="OBS தற்போது செயலில் உள்ளது. அனைத்து அலைகள் / பதிவுகள் மூடப்படும். நிச்சயமாக வெளியேற விரும்புகிறீர்களா?" ConfirmRemove.Title="அகற்ற உறுதி செய்" ConfirmRemove.TextMultiple="'%1' ஐ அகற்ற விரும்புகிறீர்களா?" Output.StartStreamFailed="பாய்வு துவக்கம் தோல்வி" Output.StartRecordingFailed="பதிவாக்கத் துவக்கம் தோல்வி" Output.StartReplayFailed="மறுபகிர்வு தாங்கலை தொடங்க முடியவில்லை" +Output.ReplayBuffer.PauseWarning.Title="நிறுத்தப்பட்ட நிலையில் மறுபார்வைகளை சேமிக்க முடியாது" Output.ConnectFail.Title="இணைக்க இயலவில்லை" Output.ConnectFail.BadPath="தவறான URL பாதை அல்லது இணைப்பு. அவை செல்லுபடியாகிறதா என்று உறுதிப்படுத்த உங்கள் அமைப்புகளை சரிபார்க்கவும்." Output.ConnectFail.ConnectFailed="சேவகையத்திடம் தொடர்பு கொள்ள முடியவில்லை"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/th-TH.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/th-TH.ini
Changed
@@ -111,13 +111,20 @@ List="รายชื่อ" Grid="ตาราง" Automatic="อัตโนมัติ" +ComingSoon="เร็วๆนี้" PluginsFailedToLoad.Title="การโหลดปลั๊กอินเกิดข้อผิดพลาด" PluginsFailedToLoad.Text="ไม่สามารถโหลดปลั๊กอิน OBS ต่อไปนี้ได้:\n\n%1\nโปรดปรับรุ่นหรือลบปลั๊กอินเหล่านี้" AlreadyRunning.Title="OBS กำลังทำงานอยู่" AlreadyRunning.Text="โปรแกรม OBS กำลังทำงานอยู่! หากคุณไม่ต้องการดำเนินการดังกล่าว โปรดปิดโปรแกรม OBS ที่มีอยู่ก่อนที่จะพยายามเรียกใช้อินสแตนซ์ใหม่ หากคุณตั้งค่าโปรแกรม OBS ให้ย่อเล็กสุด ให้ดูที่ถาดระบบว่าโปรแกรมยังคงทำงานอยู่หรือไม่" AlreadyRunning.LaunchAnyway="ยืนยันเปิดต่อไป" -SafeMode.Restart="คุณต้องการเริ่ม OBS ใหม่ในโหมดปลอดภัย (โดยปิดใช้งานปลั๊กอิน สคริปต์ และ WebSockets) หรือไม่?" -SafeMode.RestartNormal="คุณต้องการเริ่ม OBS ใหม่ในโหมดปกติหรือไม่?" +CrashHandling.Dialog.Title="ตรวจพบข้อขัดข้องของ OBS Studio" +CrashHandling.Labels.Text="OBS Studio ไม่ได้ปิดระบบอย่างถูกต้อง\n\nเรียกใช้ในเซฟโหมด (ปลั๊กอินของบุคคลที่สาม สคริปต์ และ WebSockets ถูกปิดใช้งาน) หรือไม่" +CrashHandling.Labels.PrivacyNotice="คุณยังสามารถเลือกที่จะอัปโหลดรายงานข้อขัดข้องล่าสุดไปยัง OBSProject ได้โดยอัตโนมัติ<br /><br />โปรดอ่าน<a href='https://obsproject.com/privacy-policy'>นโยบายความเป็นส่วนตัว</a> ก่อนที่จะอัปโหลดไฟล์ใดๆ และให้ความสนใจเป็นพิเศษกับส่วนที่เกี่ยวข้องกับการอัปโหลดไฟล์" +CrashHandling.Checkbox.SendReport="ฉันได้อ่านนโยบายความเป็นส่วนตัวแล้วและยินยอมให้ทำการอัปโหลด" +CrashHandling.Buttons.LaunchSafe="เรียกใช้ในเซฟโหมด" +CrashHandling.Buttons.LaunchNormal="เรียกใช้ในโหมดปกติ" +SafeMode.Restart="คุณต้องการรีสตาร์ท OBS ในเซฟโหมด (ปลั๊กอินของบุคคลที่สาม สคริปต์ และ WebSockets ถูกปิดใช้งาน) หรือไม่" +SafeMode.RestartNormal="คุณต้องการรีสตาร์ท OBS ในโหมดปกติหรือไม่" ChromeOS.Title="ไม่รองรับแพลตฟอร์มนี้" ChromeOS.Text="ดูเหมือนว่า OBS จะทำงานภายในคอนเทนเนอร์ ChromeOS ซึ่งเป็นแพลตฟอร์มที่ไม่รองรับ" Wine.Title="ตรวจพบ Wine" @@ -329,8 +336,6 @@ ConfirmStopRecord.Text="คุณแน่ใจหรือว่าคุณต้องการที่จะหยุดการบันทึก?" ConfirmBWTest.Title="เริ่มการทดสอบแบนด์วิดท์?" ConfirmBWTest.Text="คุณได้กำหนดค่า OBS ในโหมดทดสอบแบนด์วิดท์ โหมดนี้อนุญาตให้ทำการทดสอบเครือข่ายโดยที่ช่องของคุณไม่ได้ถ่ายทอดสด เมื่อคุณทดสอบเสร็จแล้ว คุณจะต้องปิดการใช้งานเพื่อให้ผู้ดูสามารถเห็นสตรีมของคุณ\n\nคุณต้องการดำเนินการต่อหรือไม่" -ConfirmExit.Title="ออก OBS?" -ConfirmExit.Text="OBS กำลังใช้งานอยู่ สตรีม/การบันทึกทั้งหมดจะถูกปิด คุณแน่ใจหรือไม่ว่าต้องการออก?" ConfirmRemove.Title="ยืนยันการลบ" ConfirmRemove.Text="คุณแน่ใจหรือไม่ว่าต้องการลบ '%1'?" ConfirmRemove.TextMultiple="คุณแน่ใจแล้วหรือที่จะลบ '%1'?" @@ -367,6 +372,8 @@ Output.NoBroadcast.Text="คุณต้องตั้งค่า broadcast ก่อนจึงจะเริ่ม streaming ได้" Output.BroadcastStartFailed="ไม่สามารถเริ่มถ่ายทอดได้" Output.BroadcastStopFailed="ไม่สามารถหยุดถ่ายทอดได้" +LogUploadDialog.Labels.Description.CrashLog="" +LogUploadDialog.Buttons.ConfirmUpload="อัปโหลด" Remux.SourceFile="การบันทึก OBS" Remux.TargetFile="ไฟล์เป้าหมาย" Remux.Remux="รีมักซ์" @@ -678,13 +685,13 @@ Basic.MainMenu.Help.ReleaseNotes="บันทึกประจำรุ่น" Basic.MainMenu.Help.CheckForUpdates="ตรวจสอบการอัพเดต" Basic.MainMenu.Help.Repair="ตรวจสอบความสมบูรณ์ของไฟล์" -Basic.MainMenu.Help.RestartSafeMode="เริ่มใหม่ในโหมดปลอดภัย" -Basic.MainMenu.Help.RestartNormal="เริ่มใหม่ในโหมดปกติ" +Basic.MainMenu.Help.RestartSafeMode="รีสตาร์ทในเซฟโหมด" +Basic.MainMenu.Help.RestartNormal="รีสตาร์ทในโหมดปกติ" Basic.MainMenu.Help.CrashLogs="รายงานความผิดพลาด" Basic.MainMenu.Help.CrashLogs.ShowLogs="&แสดงรายงานความผิดพลาด" Basic.MainMenu.Help.CrashLogs.UploadLastLog="อัปโหลดรายงานความผิดพลาด&ก่อนหน้า" Basic.MainMenu.Help.About="&เกี่ยวกับเรา" -Basic.Settings.ProgramRestart="ต้องรีสตาร์ทโปรแกรมเพื่อตั้งค่า" +Basic.Settings.ProgramRestart="ต้องรีสตาร์ทโปรแกรมเพื่อให้การตั้งค่าเหล่านี้มีผล" Basic.Settings.ConfirmTitle="ยืนยันการเปลี่ยนแปลง" Basic.Settings.Confirm="คุณมีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก บันทึกการเปลี่ยนแปลง?" Basic.Settings.MultitrackVideoDisabledSettings="%1 %2 กำลังควบคุมการตั้งค่าสตรีมของคุณบางอย่าง" @@ -699,7 +706,7 @@ Basic.Settings.General.HideOBSWindowsFromCapture="ซ่อนหน้าต่าง OBS จากการจับภาพหน้าจอ" Basic.Settings.General.HideOBSWindowsFromCapture.Tooltip="ซ่อนหน้าต่าง OBS Studio ที่ไม่อยู่ในจอโปรเจคเตอร์ทั้งหมดไม่ให้ถูกจับภาพได้โดย OBS\nและให้มีผลกับแอพพลิเคชันอื่นด้วย" Basic.Settings.General.HideOBSWindowsFromCapture.Message="การเปิดใช้ตัวเลือกนี้จะซ่อนหน้าต่าง OBS Studio ที่ไม่อยู่ในจอโปรเจคเตอร์ทั้งหมดไม่ให้ถูกจับภาพได้โดย OBS และให้มีผลกับแอพพลิเคชันอื่น เช่น การประชุม การแชร์หน้าจอ การรองรับระยะไกล การจับภาพหน้าจอ และซอฟต์แวร์จับภาพอื่นๆ ด้วย" -Basic.Settings.General.WarnBeforeStartingStream="แสดหน้าต่างยืนยันเมื่อเริ่มสตรีม" +Basic.Settings.General.WarnBeforeStartingStream="แสดงกล่องโต้ตอบการยืนยันเมื่อเริ่มสตรีม" Basic.Settings.General.WarnBeforeStoppingStream="แสดหน้าต่างยืนยันเมื่อหยุดสตรีม" Basic.Settings.General.WarnBeforeStoppingRecord="แสดหน้าต่างยืนยันเมื่อหยุดบันทึก" Basic.Settings.General.Projectors="โปรเจกเตอร์" @@ -798,7 +805,6 @@ Basic.Settings.Stream.AdvancedOptions="ตัวเลือกขั้นสูง" Basic.Settings.Output="ผลลัพธ์" Basic.Settings.Output.Format="รูปแบบการบันทึก" -Basic.Settings.Output.Format.hMP4="Hybrid MP4 เบต้า (.mp4)" Basic.Settings.Output.Format.TT.fragmented_mov="Fragmented MOV จะเขียนสิ่งบันทึกโดยแบ่งออกเป็นก้อนๆ และไม่ต้องการการประมวลผลให้เสร็จสมบูรณ์เหมือนไฟล์ MOV แบบดั้งเดิม\nซึ่งช่วยรับประกันว่าไฟล์จะยังคงสามารถเปิดเล่นได้ แม้ว่าการเขียนข้อมูลลงดิสก์จะถูกขัดจังหวะก็ตาม ตัวอย่างเช่น เกิดจาก BSOD หรือไฟตัด\n\nแต่อาจจะเข้ากันไม่ได้กับโปรแกรมเล่นและโปรแกรมแก้ไขทั้งหมด ให้ใช้ ไฟล์ → รีมักซ์สิ่งบันทึก เพื่อทำการแปลงไฟล์ให้เป็นรูปแบบที่เข้ากันได้ดีกว่านี้หากจำเป็น" Basic.Settings.Output.Format.TT.fragmented_mp4="Fragmented MP4 จะเขียนสิ่งบันทึกโดยแบ่งออกเป็นก้อนๆ และไม่ต้องการการประมวลผลให้เสร็จสมบูรณ์เหมือนไฟล์ MP4 แบบดั้งเดิม\nซึ่งช่วยรับประกันว่าไฟล์จะยังคงสามารถเปิดเล่นได้ แม้ว่าการเขียนข้อมูลลงดิสก์จะถูกขัดจังหวะก็ตาม ตัวอย่างเช่น เกิดจาก BSOD หรือไฟตัด\n\nแต่อาจจะเข้ากันไม่ได้กับโปรแกรมเล่นและโปรแกรมแก้ไขทั้งหมด ให้ใช้ ไฟล์ → รีมักซ์สิ่งบันทึก เพื่อทำการแปลงไฟล์ให้เป็นรูปแบบที่เข้ากันได้ดีกว่านี้หากจำเป็น" Basic.Settings.Output.Encoder.Video="ตัวเข้ารหัสข้อมูลวิดีโอ" @@ -965,6 +971,7 @@ Basic.Settings.Video.Numerator="ตัวเศษ" Basic.Settings.Video.Denominator="ตัวหาร" Basic.Settings.Video.Renderer="ตัวเรนเดอร์" +Basic.Settings.Video.Renderer.Experimental="%1 (อยู่ในช่วงทดลอง)" Basic.Settings.Video.InvalidResolution="ค่าความละเอียดไม่ถูกต้อง ต้องมีค่าเป็น กว้างxสูง (เช่น 1920x1080)" Basic.Settings.Video.CurrentlyActive="เอาต์พุตวิดีโอใช้งานอยู่ในขณะนี้ กรุณาปิดเอาต์พุตทั้งหมดแล้วค่อยเปลี่ยนแปลงการตั้งค่าวิดีโอ" Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (เร็วที่สุด แต่จะเบลอถ้าปรับสัดส่วน)" @@ -1159,8 +1166,8 @@ Importer.AutomaticCollectionText="OBS สามารถค้นหาคอลเลกชันฉากที่สามารถนำเข้าได้จากโปรแกรมของบุคคลที่สามที่รองรับได้โดยอัตโนมัติ คุณต้องการให้ OBS ค้นหาคอลเลกชันให้คุณโดยอัตโนมัติหรือไม่?\n\nคุณสามารถเปลี่ยนตัวเลือกนี้ได้ภายหลังใน ตั้งค่า > ทั่วไป > ตัวนำเข้า" Importer.SelectFile="เรียกดู..." Restart="รีสตาร์ท" -NeedsRestart="OBS Studio ต้องการเริ่มการทำงานใหม่ คุณต้องการเริ่มการทำงานใหม่เลยหรือไม่?" -LoadProfileNeedsRestart="โปรไฟล์มีการตั้งค่าซึ่งต้องการให้เริ่ม OBS ใหม่:\n%1\n\nคุณต้องการที่จะเริ่ม OBS ใหม่เพื่อให้การตั้งค่าเหล่านี้มีผลหรือไม่?" +NeedsRestart="OBS Studio จำเป็นต้องรีสตาร์ท คุณต้องการรีสตาร์ทตอนนี้เลยหรือไม่" +LoadProfileNeedsRestart="โปรไฟล์มีการตั้งค่าที่ต้องการให้รีสตาร์ท OBS:\n%1\n\nคุณต้องการรีสตาร์ท OBS เพื่อให้การตั้งค่าเหล่านี้มีผลหรือไม่" ContextBar.NoSelectedSource="ไม่ได้เลือกแหล่งใด" ContextBar.MediaControls.PlayMedia="เล่นสื่อ" ContextBar.MediaControls.PauseMedia="หยุดสื่อชั่วคราว" @@ -1271,3 +1278,11 @@ MultitrackVideo.IncompatibleSettings.AudioChannels="ขณะนี้ %1 ไม่เข้ากับ เสียง → ทั่วไป → ช่องเสียง ซึ่งกำหนดเป็น '%2', %3" MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="เสียง → ทั่วไป → ช่องเสียง จะต้องกำหนดเป็น '%1'" MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 ต้องใช้การตั้งค่าที่ต่างกันหลายอย่างสำหรับ เสียง → ทั่วไป → ช่องเสียง" +Basic.OpenPluginManager="ตัวจัดการปลั๊กอิน" +PluginManager="ตัวจัดการปลั๊กอิน" +PluginManager.Restart="ต้องรีสตาร์ท OBS Studio เพื่อนำการเปลี่ยนแปลงปลั๊กอินไปใช้" +PluginManager.MissingPlugin="ไม่พบเจอปลั๊กอิน" +PluginManager.Section.Discover="เรียกดู" +PluginManager.Section.Manage="ติดตั้งแล้ว" +PluginManager.Section.Updates="อัปเดต" +PluginManager.Section.Manage.Title="จัดการปลั๊กอินที่ติดตั้งไว้"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/tl-PH.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/tl-PH.ini
Changed
@@ -23,6 +23,17 @@ Mixer="Panghalo sa Tunog" Browse="Magsaliksik" DroppedFrames="Mga larawang hindi sinali %1 (%2%)" +Projector.Open.Program="Buksan ang Pangsalintanaw ng Palatuntunin" +Projector.Open.Preview="Buksan ang Siliping Pangsalintanaw" +Projector.Open.Source="Bukas na Pinagmulang Pangsalintanaw" +Projector.Open.Multiview="Buksan ang Damin-tanaw" +Projector.Display="Tanghal: %1" +Projector.Window="Bagong durungawan" +Projector.Title="Pangsalintanaw" +Projector.Title.Scene="Tagpo: %1" +Projector.Title.Source="Pagtututok: %1" +Projector.Title.Multiview="Damin-tanaw" +Projector.ResizeWindowToContent="Pagkasyahin ang durungawan sa nilalaman" Clear="Linisin" Revert="Ibalik" Show="Ipakita" @@ -35,14 +46,14 @@ DisableOSXVSync="Huwag paganahain ang macOS V-Sync" ResetOSXVSyncOnExit="Ibalik sa dati muli ang macOS V-Sync sa Pag-alis" HighResourceUsage="Labis na ang paglululan sa pagkokodigo! Pagisipan ang pagpapababa ng mga pagpipilian sa bidyo o ang pag-gamit ng higit na mabilis na nakahandang pangkodigo." -Transition="Paglipat" -QuickTransitions="Mabilis na mga Paglipat" +Transition="Pagbabai-baiting" +QuickTransitions="Mabilisang Pagbabai-baiting" FadeToBlack="Kumupas hanggang Itim" Left="Kaliwa" Right="Kanan" Top="Tuktok" Bottom="Baba" -Reset="Ibalik sa dati muli" +Reset="Ibalik sa dati" Hours="Oras" Minutes="Minuto" Seconds="Segundo" @@ -54,19 +65,20 @@ Paste="Idikit" PasteReference="Idikit (Sanggunian)" PasteDuplicate="Idikit (Sipi)" -RemuxRecordings="Isalin ang mga Pagtataya" +RemuxRecordings="Isalin ang mga Pagtatala" Next="Sunod" Back="Bumalik" Defaults="Mga Nakahanda" HideMixer="Itago sa Tagahalo" -TransitionOverride="Pagpapawalang-bisa ng Paglipat" -ShowTransition="Ipakita ang Paglipat" -HideTransition="Itago ang Paglipat" +TransitionOverride="Daiging Pagbabai-baiting" +ShowTransition="Ipapakitang Pagbabai-baiting" +HideTransition="Itatagong Pagbabai-baitang" None="Wala" -StudioMode.Preview="Paglipat" +StudioMode.Preview="Silip" StudioMode.Program="Programa" -ShowInMultiview="Ipakita sa Maramihang Pagtingin" -VerticalLayout="Patayong Pagkakaayos" +StudioMode.PreviewSceneName="Silip: %1" +ShowInMultiview="Ipakita sa Damin-tanaw" +VerticalLayout="Patayong Ayos" Group="Pangkat" DoNotShowAgain="Huwag ipakitang muli" Default="(Nakahanda)" @@ -79,10 +91,26 @@ LogViewer="Tagatingin ng mgs Nakatala" ShowOnStartup="Ipakita sa pagbukas" OpenFile="Buksan ang talaksan" +AddScene="Magdagdag ng Tagpo" +AddSource="Magdagdag ng Pagtututok" +RemoveSource="Alisin ang mga Napiling Pagtututok" +MoveSourceUp="Ilipat ang mga Pagtututok Pataas" +MoveSourceDown="Ilipat ang mga Pagtututok Pababa" +SourceProperties="Buksan ang mga Katangian ng Pagtututok" +SourceFilters="Buksan ang mga Pagsasala ng Pagtututok" +ComingSoon="Papaparating Na" AlreadyRunning.Title="Ang OBS ay pinapagana na" AlreadyRunning.Text="Ang OBS ay pinapagana na! Kung hindi mo ito sinasadya, mangyari lamang patayin ang mga umiiral na OBS bago subukang magpatakbo ng bago. Kung ikaw ay may OBS na kailangan ibaba sa batya ng sistema, mangyari lamang tingnan kung ito ay tumatakbo pa doon." AlreadyRunning.LaunchAnyway="Ilunsad pa rin" +CrashHandling.Dialog.Title="Nalamang Nagkandarapa ang OBS Studio" +CrashHandling.Labels.Text="Hindi maayos ang pagkapinid ng OBS Studio.\n\nIpatakbo sa Paraang Ligtas (hindi ipapagana ang mga third-party plugins, scripting, at WebSockets)?" +CrashHandling.Labels.PrivacyNotice="Maaari mo ring piliin na sarimo ang pagbabahagi ng pinakabagong ulat ng pagkandarapa sa OBSProject.<br /><br />Mangyaring basahin ang <a href='https://obsproject.com/privacy-policy'>Mga Patakaran sa Pribasya</a> bago magbahagi ng mga talaksan at magbigay pansin sa mga bahaging ukol sa pagbahagi ng mga talaksan." +CrashHandling.Checkbox.SendReport="Binasa ko ang patakaran sa pribasya at pinahihintulotan ko ang pagbahagi." +CrashHandling.Buttons.LaunchSafe="Ipatakbo sa Paraan Ligtas." +CrashHandling.Buttons.LaunchNormal="Ipatakbo sa Karaniwang Paraan." +CrashHandling.Errors.UploadJSONError="Isang kamalian ang nangyari habang binabahagi ang kamakailang ulat ng pagkandarapa. Mangyaring pakisubukan muli mamamaya." ChromeOS.Title="Hindi Sinusuportahang Plataporma" +Wine.Text="Hindi sinusuporta ang pagpapatakbo ng OBS sa Wine, at maraming tampok ang hindi gagana o magkakakulang tulad ng dakip o mga pagtututok ng device. <br><br>Inimumungkahi ang pagtatakbo ng wastong bersiyon ng OBS, isang halimbawa na ang <a href='https://flathub.org/apps/details/com.obsproject.Studio'>bersiyong Flatpak namin</a> o package ng operating system mo." DockCloseWarning.Title="Ipinid ang Nakadaong na Durungawan" DockCloseWarning.Text="Napinid mo ang isang nakadaong na durungawan. Kung nais mong ipakita itong muli, gamitin ang talaan ng Daungan sa talaan." ExtraBrowsers="Pasadyang Panginaing Daungan" @@ -101,16 +129,16 @@ Basic.AutoConfig.ApplySettings="Gamitin ang mga Setting" Basic.AutoConfig.StartPage="Impormasyon ukol sa Paggamit" Basic.AutoConfig.StartPage.SubTitle="Tukuyin kung para saan mo gustong gamitin ang programa" -Basic.AutoConfig.StartPage.PrioritizeStreaming="I-optimize para sa pag-stream, pangalawa lamang pag-rerekord" -Basic.AutoConfig.StartPage.PrioritizeRecording="I-optimize para lamang sa pag-rerekord, Hindi ako mag-iistream" +Basic.AutoConfig.StartPage.PrioritizeStreaming="Isaayos para sa pagsi-stream, pangalawa lamang ang pagtataya" +Basic.AutoConfig.StartPage.PrioritizeRecording="Isaaayos para sa pagtatala lamang, Hindi ako magsi-stream" Basic.AutoConfig.StartPage.PrioritizeVirtualCam="Gagamitin ko lang ang virtual camera" Basic.AutoConfig.VideoPage="Mga Setting sa Video" Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="Gamitin ang Pangkasalukuyang (%1x%2)" -Basic.AutoConfig.VideoPage.BaseResolution.Display="Ipakita ang %1 (%2x%3)" +Basic.AutoConfig.VideoPage.BaseResolution.Display="%1 Tanghal (%2x%3)" Basic.AutoConfig.VideoPage.FPS.UseCurrent="Gamitin ang Pangkasalukuyang (%1)" Basic.AutoConfig.VideoPage.FPS.PreferHighFPS="60 o 30, pero mas piliin ang 60 kung maaari" -Basic.AutoConfig.VideoPage.FPS.PreferHighRes="60 o 30, pero mas piliin ang mataas na resolution" -Basic.AutoConfig.VideoPage.CanvasExplanation="Tandaan: Ang kanbas (base) na resolution ay hindi kinakailangang katulad sa resolution na gagamitin mo sa pag-stream o pagrekord. Ang actual na resolution ng iyong stream/rekord ay maaaring pababain upang mabawasan ang gamit sa mga resource o mga kakailanganing bitrate." +Basic.AutoConfig.VideoPage.FPS.PreferHighRes="60 o 30, ngunit piliin ang mas mataas na hisikot" +Basic.AutoConfig.VideoPage.CanvasExplanation="Tandaan: Hindi kinakailangang magkatulad ang hisikot ng kanbas (batayan) sa hisikot na gagamitin sa pagsi-stream o pagtatala. Maaaring magbawas sa magiging hisikot ng iyong stream/tala galing sa hisikot ng kanbas upang mabawasan ang paggamit ng mapagkukunan o mga kinakailanganing bitrate." Basic.AutoConfig.StreamPage="Mag-stream ng Impormasyon" Basic.AutoConfig.StreamPage.SubTitle="Mangyari lamang ilagay ang impormasyon ng iyong pagstream" Basic.AutoConfig.StreamPage.ConnectAccount="I-connect ang Account (ipinapayo)" @@ -124,7 +152,7 @@ Basic.AutoConfig.StreamPage.PreferHardwareEncoding="Mas piliin ang hardware encoding" Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="Ang Hardware Encoding ay nagtatanggal ng karamihan sa paggamit ng CPU, ngunit maaaring nangangailangan ito ng mas maraming bitrate upang magkaroon ng katulad na lebel ng kalidad." Basic.AutoConfig.StreamPage.StreamWarning.Title="Babala sa stream" -Basic.AutoConfig.StreamPage.StreamWarning.Text="Ang bandwith test ay mag-iistream ng datos ng video nang walang audio sa iyong channel. Kung kaya mo, minumungkahi namin na pansamantala mong i-off ang pag-save ng mga video ng mga stream at gawing pribado ang stream hanggang sa matapos ang test. Magpatuloy?" +Basic.AutoConfig.StreamPage.StreamWarning.Text="Magsisimulang magsi-stream ang pagsubok ng bandwith ng walang tunog na sapalarang malak ng panoorin sa iyong channel. Kung makakaya mo, iminumungkahing pansamantalang ipagpaliban ang pag-iimbak ng mga panoorin ng mga stream at gawing pribado ang stream hanggang matapos ang nitong pagsubok." Basic.AutoConfig.TestPage="Mga Huling Resulta" Basic.AutoConfig.TestPage.SubTitle.Testing="Ang programang ito ay nagapapatupad ngayon ng mga pagsusuri upang matantiya ang pinakamainam na mga setting" Basic.AutoConfig.TestPage.SubTitle.Complete="Natapos na ang pagsusuri" @@ -133,11 +161,11 @@ Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="Bigong maka-konekta sa kahit anong mga serber, mangyari lamang suriin ang iyong koneksyon sa internet at subukan muli." Basic.AutoConfig.TestPage.TestingBandwidth.Server="Sinusuri ang bandwidth para sa: %1" Basic.AutoConfig.TestPage.TestingStreamEncoder="Sinusuri ang encoder ng stream, maaari itong magtagal ng isang minuto..." -Basic.AutoConfig.TestPage.TestingRecordingEncoder="Sinusuri ang encoder para sa pagrekord, maaari itong magtagal ng isang minuto..." +Basic.AutoConfig.TestPage.TestingRecordingEncoder="Sinusuri ang encoder ng pagtatala, maaari itong magtagal ng isang minuto..." Basic.AutoConfig.TestPage.TestingRes.Fail="Bigong mapatakbo ang encoder" Basic.AutoConfig.TestPage.TestingRes.Resolution="Sinusuri ang %1x%2 %3 FPS..." Basic.AutoConfig.TestPage.Result.StreamingEncoder="Encoder para sa Pag-stream" -Basic.AutoConfig.TestPage.Result.RecordingEncoder="Encoder para sa Pagrekord" +Basic.AutoConfig.TestPage.Result.RecordingEncoder="Encoder ng Pagtatala" Basic.AutoConfig.TestPage.Result.Header="Napagtanto ng programa na ang mga setting na ito ang pinakamainam para sa iyo:" Basic.AutoConfig.TestPage.Result.Footer="Upang magamit ang mga setting, pindutin ang Apply Settings. Upang ma-configure muli ang wizard at subukang muli, pindutin ang Back. Upang ma-configure mo mismo nang mano-mano ang mga setting, pindutin ang Cancel at buksan ang mga Setting." Basic.Stats="Mga Statistika" @@ -146,14 +174,15 @@ Basic.Stats.AverageTimeToRender="Karaniwang bilis upang ma-render ang frame" Basic.Stats.SkippedFrames="Mga nalaktawang imahe dahil sa antala sa pag-encode" Basic.Stats.MissedFrames="Mga imaheng di nakuha dahil sa antala sa pag-render" -Basic.Stats.Output.Recording="Pag-rerekord" +Basic.Stats.Output.Recording="Pagtatala" Basic.Stats.Status="Estado" -Basic.Stats.Status.Recording="Pagrerekord" +Basic.Stats.Status.Recording="Pagtatala" Basic.Stats.Status.Reconnecting="Muling kumukunekta" Basic.Stats.Status.Inactive="Hindi aktibo" Basic.Stats.Status.Active="Aktibo" Basic.Stats.DroppedFrames="Mga Imaheng hindi sinali (Network)" Basic.Stats.MegabytesSent="Kabuuan ng Output ng mga Datos" +Basic.Stats.DiskFullIn.Text="%s Oras, %2 Minuto" Updater.Title="Mga bagong update na magagamit" Updater.Text="Mayroong bagong update na magagamit:" Updater.UpdateNow="Iupdate na Ngayon" @@ -162,14 +191,28 @@ Updater.NoUpdatesAvailable.Title="Walang mga update na magagamit" Updater.NoUpdatesAvailable.Text="Walang mga update ang kasalukuyang magagamit" Updater.FailedToLaunch="Bigong malunsad ang updater" -QuickTransitions.DuplicateScene="Gayahin ang Eksena" -QuickTransitions.EditProperties="Gayahin ang mga Source" -QuickTransitions.HotkeyName="Mabilis na Transisyon: %1" -Basic.AddTransition="Idagdag ang Configurable na Transisyon" -Basic.RemoveTransition="Alisin ang Configurable na Transisyon" -Basic.TransitionProperties="Mga Katangian ng Transisyon" +QuickTransitions.SwapScenes="Makikipagpalitan ang mga Tagpong Silip/Palatuntunan Pagkatapos ang Pagbabai-baitang" +QuickTransitions.SwapScenesTT="Makikipagpalit ang mga tagpong silip at palatuntunan pagkatapos ng pagbabai-baitang (kapag umiiral pa ang naunang tagpo ng palatuntunan).\nHindi nito mababalik ang anumang pagbabagong itinakda sa naunang tagpong palatuntunan." +QuickTransitions.DuplicateScene="Dumagdag ng Sipi ng Tagpo" +QuickTransitions.EditProperties="Dumagdag ng Sipi ng mga Pagtututok" +QuickTransitions.HotkeyName="Mabilis na Pagbabai-baitang: %1" +Basic.AddTransition="Magdagdag ng Maisasaayos na Pagbabai-baitang" +Basic.RemoveTransition="Alisin ang Maisasaayos na Pagbabai-baitang" +Basic.TransitionProperties="Mga Katangian ng Pagbabai-baitang" Basic.SceneTransitions="Mga Transisyon ng Eksena" Basic.TransitionDuration="Tagal" +Basic.TogglePreviewProgramMode="Paraang Aral" +Basic.EnablePreviewProgramMode="Paganahin ang Paraang Aral" +Basic.DisablePreviewProgramMode="Huwag Paganahin ang Paraang Aral" +Undo.Transform="Pagsaanyo ng (mga) pagtutok Sa '%1'" +Undo.Transform.Paste="Pagdikit ng Pagsasaanyo sa '%1'" +Undo.Transform.Reset="Pagsauli ng Pagsaanyo sa '%1'" +Undo.Transform.FitToScreen="Ikasya sa Tabing sa '%1'" +Undo.Transform.StretchToScreen="Ilapad sa Tabing sa '%1'" +Undo.Transform.Center="I-gitna sa Tabing sa '%1'" +Undo.Transform.VCenter="I-patayong Gitna sa Tabing sa '%1'" +Undo.Transform.HCenter="I-pahalang Gitna sa Tabing sa '%1'" +Undo.PasteSourceRef="Ilapat ang mga Sangguniang Pagtutukoy sa '%1'" TransitionNameDlg.Text="Mangyari lamang ilagay ang pangalan ng transisyon" TransitionNameDlg.Title="Pangalan ng Transition" TitleBar.Scenes="Mga Eksena" @@ -181,34 +224,51 @@ ConfirmStart.Text="Sigurado ka bang gusto mo nang simulan ang pag-stream?" ConfirmStop.Title="Itigil ang pag-stream?" ConfirmStop.Text="Sigurado ka bang gusto mong itigil ang pag-stream?" -ConfirmExit.Title="Lumabas sa OBS?" -ConfirmExit.Text="Ang OBS ang kasalukuyang aktibo. Ang lahat ng pag-stream/pagrerekord ay magsasara. Sigurado ka bang gusto mong lumabas?" +ConfirmStopRecord.Title="Itigil ang Pagtatala?" +ConfirmStopRecord.Text="Tiyak ka bang nais mong itigil ang pagtatala?" ConfirmRemove.Title="Kumpirmahin ang pagtanggal" ConfirmRemove.TextMultiple="Sigurado ka bang gusto mong tanggalin ang %1 na mga item?" Output.StartStreamFailed="Bigong masimulan ang pag-stream" -Output.StartRecordingFailed="Bigong masimulan ang pag-rerekord" +Output.StartRecordingFailed="Bigong masimulan ang pagtatala" Output.StartReplayFailed="Bigong masimulan ang replay buffer" Output.StartFailedGeneric="Bigong masimulan ang output. Mangyari lamang tingnan ang log para sa mga detalye.\n\nTandaan: Kung ikaw ay gumagamit ng NVENC o AMD na mga encoder, siguraduhing ang iyong mga video driver ay naka-update." +Output.ReplayBuffer.PauseWarning.Title="Hindi makakapag-imbak ng mga baliking pagpapalabas habang nakahinto" +Output.ReplayBuffer.PauseWarning.Text="Babala: Hindi maaaring maimbak ang mga baliking pagpapalabas habang nakahinto ang pagtatala." Output.ConnectFail.Title="Bigong kumonekta" -Output.ConnectFail.BadPath="Hindi wasto ang Path o Connection URL. Mangyari lamang tingnan ang iyong mga setting upang makumpirma na sila ay balido." +Output.ConnectFail.BadPath="Di-wastong Landas o Connection URL. Mangyaring pakisuri ng iyong mga setting upang mapatunayang wasto ang mga ito." Output.ConnectFail.ConnectFailed="Bigong kumonekta sa serber" Output.ConnectFail.InvalidStream="Hindi madaanan ang tinutukoy na channel o stream key, mangyari lamang tingnan muli ang iyong stream key. Kung ito ay wasto, maaaring mayroong problema sa pagkonekta sa serber." Output.ConnectFail.Error="Isang di-inaasahang error ang naganap habang sinusubukang kumonekta sa serber. Karagdagang impormasyon ay nasa log file." Output.ConnectFail.Disconnected="Nadiskonek mula sa serber." Output.StreamEncodeError.Title="Pagkakabigo sa encording" -Output.RecordFail.Title="Bigong masimulan ang pa-rerekord" -Output.RecordFail.Unsupported="Ang output format ay maaaring hindi suportado o di kaya'y hindi nagsusuporta ng higit sa isang audio track. Mangyari lamang tingnan ang iyong mga setting at subukan muli." -Output.RecordNoSpace.Title="Hindi sapat ang espasyo sa disk" -Output.RecordNoSpace.Msg="Hindi sapat ang espasyo sa disk upang magpatuloy sa pag-rerekord." -Output.RecordError.Title="Error sa Pag-rerekord" -Output.RecordError.Msg="Isang hindi matukoy na error ang naganap habang nag-rerekord." -Output.BadPath.Title="Maling File Path" +Output.RecordFail.Title="Bigong masimulan ang pagtatala." +Output.RecordFail.Unsupported="Maaaring hindi sinusuporta ang output format o ng humigit isang audio track. Mangyaring salisikin ang iyong mga kagustuhan at subukan muli." +Output.RecordNoSpace.Title="Hindi sapat ang lawak ng disk" +Output.RecordNoSpace.Msg="Hindi sapat ang lawak ng disk sa pagpatuloy ng pagtatala." +Output.RecordError.Title="Kamalian habang nagtatala" +Output.RecordError.Msg="Isang hindi matukoy na kamalian habang nagtatala." +Output.RecordError.EncodeErrorMsg="Isang kamaliang encoder habang nagtatala." +Output.RecordError.EncodeErrorMsg.LastError="Isang kamaliang encoder habang nagtatala:<br><br>%1" +Output.BadPath.Title="Di-wastong Landas ng Talaksan" +Output.BadPath.Text="Hindi mabuksan ang itinakdang Landas ng Pagtatala. Maaaring pakisuri sa iyong Landas ng Pagtatala sa loob ng Settings → Output → Pagtatala." +LogUploadDialog.Title="Nabahagi na ang Log File ng OBS Studio" +LogUploadDialog.Labels.PrivacyNotice="Pakibasa ng <a href='https://obsproject.com/privacy-policy'>Mga Patakaran sa Pribasya</a> at ang pangkat ukol sa pagbahagi ng mga talaksanbago magbahagi ng kahit na anong talaksan." +LogUploadDialog.Labels.Progress="Binabahagi ang iyong log file. Mangyaring pakihintay..." +LogUploadDialog.Labels.Description.AppLog="Nabahagi na ang iyong log file. Maaari mo nang ibahagi ang URL para sa pagdadalisay o pagpapatulong." +LogUploadDialog.Labels.Description.CrashLog="Nabahagi na ang iyong ulat ng pagkandarapa. Maaari mo nang ibahagi ang URL para sa pagdadalisay." +LogUploadDialog.Buttons.ConfirmUpload="Ibahagi" +LogUploadDialog.Buttons.CopyURL="Kopyahin ang Log URL" +LogUploadDialog.Buttons.RetryButton="Subukan muli" +Remux.SourceFile="Pagtatalang OBS" Remux.Stop="Ihinto ang Pag-reremuxing" +Remux.OBSRecording="Pagtatalang OBS" Remux.FinishedTitle="Tapos na ang pag-remux" -Remux.Finished="Na-remux na ang recording" -Remux.FinishedError="Na-remux na ang recording, ngunit ay file ay maaaring hindi kumpleto" +Remux.Finished="Naisalin na ang pagtatala" +Remux.FinishedError="Nai-remux na ang pagtatala, ngunit maaring hindi natapos ang talaksan." +Remux.SelectRecording="Pumili ng Pagtatalang OBS..." Remux.ExitUnfinishedTitle="Ang pagremux ay tinutuloy pa" Remux.ExitUnfinished="Hindi pa tapos ang pag-remux. Kung ihihinto ito ngayon, maaaring hindi na magagamit ang target file.\nSigurado ka bang gusto mong ihinto ang pagremux?" +Remux.HelpText="Ilagay ang mga talaksan sa nitong durungawan upang maisalin, o pumili ng walang-lamang \"Pagtatalang OBS\" na cell upang maghanap ng talaksan." MissingFiles="Nawawalang mga File" MissingFiles.MissingFile="Nawawalang File" MissingFiles.NewFile="Bagong File" @@ -216,15 +276,21 @@ MissingFiles.Missing="Nawawala" MissingFiles.Found="Nahanap" MissingFiles.AutoSearch="May nahanap na mga magkatulad na file" +MacPermissions.Item.ScreenRecording="Pagtatala ng Tabing" +MacPermissions.Item.ScreenRecording.Details="Kinakailangan ng OBS ang pahintulot na ito sa pagdakip ng iyong tabing." +SourceLeak.Title="Kamalian Sa Paglilinis ng Pagtututok" Basic.Scene="Eksena" -Basic.DisplayCapture="Ipakita ang Kuha" -Basic.Main.PreviewConextMenu.Enable="Paganahin ang Preview" +Basic.DisplayCapture="Dakip ng Tanghal" +Basic.Main.PreviewConextMenu.Enable="Paganahin ang Silip" +Basic.Main.Preview.Disable="Huwag Paganahin ang Silip" ScaleFiltering="I-scale ang pag-fifilter" ScaleFiltering.Point="Punto" +BlendingMode.Screen="Tabing" Deinterlacing.TopFieldFirst="Itaas ang Patlang Una" Deinterlacing.BottomFieldFirst="Ibaba ang Patlang Una" VolControl.Mute="Mahina '%1'" VolControl.Properties="Ari-arian na para sa '%1'" +VolControl.UnassignedWarning.Title="Hindi Nakatalagang Pagtututok ng Audio" Basic.Main.AddSceneDlg.Title="Idagdag sa Eksena" Basic.Main.AddSceneDlg.Text="Pakiusap idagdag ang pangalan ng mga eksena" Basic.Main.DefaultSceneName.Text="Eksena %1" @@ -236,7 +302,7 @@ RenameProfile.Title="Palitan ang pangalan ng Profile" Basic.Main.MixerRename.Title="Palitan ang pangalan ng Audio Source" Basic.Main.MixerRename.Text="Mangyari lamang ilagay ang pangalan ng audio source" -Basic.Main.PreviewDisabled="Ang preview ay kasalukuyang hindi gumagana" +Basic.Main.PreviewDisabled="Kasalukuyang hindi pinapagana ang silip" Basic.SourceSelect="Lumikha/Pumili ng Source" Basic.SourceSelect.CreateNew="Lumikha ng bago" Basic.SourceSelect.AddExisting="Idagdag ang Umiiral na" @@ -245,11 +311,11 @@ Basic.PropertiesWindow.SelectColor="Pumili ng Kulay" Basic.PropertiesWindow.SelectFont="Pumili ng font" Basic.PropertiesWindow.ConfirmTitle="Binago ang mga Setting" -Basic.PropertiesWindow.Confirm="Mayroong mga pagbabagong hindi na-save. Nais mo bang panatilihin ang mga ito?" +Basic.PropertiesWindow.Confirm="Mayroong mga pagbabagong hindi naimbak. Nais mo bang panatilihin ang mga ito?" Basic.PropertiesWindow.NoProperties="Walang mga katangiang magagamit" Basic.PropertiesWindow.AddFiles="Idagdag ang mga File" Basic.PropertiesWindow.AddDir="Idagdag ang Direktory" -Basic.PropertiesWindow.AddURL="Idagdag ang Path/URL" +Basic.PropertiesWindow.AddURL="Magdagdag ng Landas/URL" Basic.PropertiesWindow.AddEditableListDir="Idagdag ang directory sa '%1'" Basic.PropertiesWindow.AddEditableListFiles="Idagdag ang mga file sa '%1'" Basic.PropertiesWindow.AddEditableListEntry="Magdagdag ng entry sa '%1'" @@ -266,8 +332,9 @@ Basic.StatusBar.DelayStartingIn="Antala (magsisimula sa loob ng %1 segundo)" Basic.StatusBar.DelayStoppingIn="Antala (hihinto sa loob ng %1 segundo)" Basic.StatusBar.DelayStartingStoppingIn="Antala (hihinto sa loob ng %1 segundo, magsisimula sa loob ng %2 segundo)" -Basic.StatusBar.RecordingSavedTo="Nailigtas ang Recording sa '%1'" -Basic.StatusBar.ReplayBufferSavedTo="Nailigtas ang Replay Buffer sa '%1'" +Basic.StatusBar.RecordingSavedTo="Naimbak ang Recording sa '%1'" +Basic.StatusBar.ReplayBufferSavedTo="Naimbak ang Replay Buffer sa '%1'" +Basic.StatusBar.ScreenshotSavedTo="Naimbak ang screenshot sa '%1'" Basic.Filters="Mga Filter" Basic.Filters.AsyncFilters="Audio/Video na mga Filter" Basic.Filters.AudioFilters="Audio na mga Filter" @@ -275,16 +342,25 @@ Basic.Filters.Title="Mga Filter para sa '%1'" Basic.Filters.AddFilter.Title="Pangalan ng Filter" Basic.Filters.AddFilter.Text="Mangyari lamang tukuyin ang pangalan ng filter" -Basic.TransformWindow="Pagbabago ng mga Bagay sa Eksena" +Basic.TransformWindow="Pagsaanyo ng Bagay sa Tagpo" Basic.TransformWindow.Position="Posisyon" +Basic.TransformWindow.PositionX="Katayuang X" +Basic.TransformWindow.PositionY="Katayuang Y" Basic.TransformWindow.Rotation="Pag-ikot" Basic.TransformWindow.Size="Sukat" Basic.TransformWindow.Width="Lapad" +Basic.TransformWindow.Height="Taas" Basic.TransformWindow.Alignment="Pagkahanay-hanay ng mga posisyon" Basic.TransformWindow.BoundsType="Tipo ng Nakagagapos na Kahon" Basic.TransformWindow.BoundsAlignment="Pagkakahanay sa Bounding Kahon" Basic.TransformWindow.Bounds="Kahon Sukat ng Bounding" +Basic.TransformWindow.BoundsWidth="Lapad ng Makaratig na Kahon" +Basic.TransformWindow.BoundsHeight="Taas ng Makaratig na Kahon" Basic.TransformWindow.Crop="I-krop" +Basic.TransformWindow.CropLeft="Gupitin sa Kaliwa" +Basic.TransformWindow.CropRight="Gupitin sa Kanan" +Basic.TransformWindow.CropTop="Gupitin sa Itaas" +Basic.TransformWindow.CropBottom="Gupitin sa Ibaba" Basic.TransformWindow.Alignment.TopLeft="Itaas sa kaliwa" Basic.TransformWindow.Alignment.TopCenter="Itaas sa Gitna" Basic.TransformWindow.Alignment.TopRight="Itaas sa Kanan" @@ -301,6 +377,7 @@ Basic.TransformWindow.BoundsType.ScaleToWidth="Lapad ng hangganan ng scale" Basic.TransformWindow.BoundsType.ScaleToHeight="Taas ng hangganan ng scale" Basic.TransformWindow.BoundsType.Stretch="Kahabaan sa hangganan" +Basic.TransformWindow.Title="Baguhin ang Pagsaanyo ng '%1'" Basic.Main.AddSourceHelp.Title="Hindi pwede idagdag sa Pinagmulan" Basic.Main.AddSourceHelp.Text="Kailangan mo na magkaroon ng hindi bababa sa isang eksena na idadagdag sa pinagmulan." Basic.Main.Scenes="Eksena" @@ -309,6 +386,7 @@ Basic.Main.Connecting="Pagkonekta..." Basic.Main.StartRecording="Magsimula sa Pagtatala" Basic.Main.StartReplayBuffer="Magsimula Mag replay Buffer" +Basic.Main.SaveReplay="Iimbak ang Baliking Pagpapalabas" Basic.Main.StartStreaming="Magsimula na mag Streaming" Basic.Main.StartVirtualCam="Simulan ang Virtual Camera" Basic.Main.StopRecording="Huminto sa Pagtatala" @@ -334,21 +412,25 @@ Basic.MainMenu.Edit="I&edit" Basic.MainMenu.Edit.Undo="Ipawalang-bisa (&U)" Basic.MainMenu.Edit.Redo="Gawin Muli (&R)" -Basic.MainMenu.Edit.LockPreview="Naka-&lock na Preview" +Basic.MainMenu.Edit.LockPreview="Pa&lagiin ang Silip" +Basic.MainMenu.Edit.Scale="Pag&sasalinlaki ng Silip" Basic.MainMenu.Edit.Scale.Window="Gawing Kasing-Laki ng Window" Basic.MainMenu.Edit.Scale.Canvas="Kanbas (%1x%2)" -Basic.MainMenu.Edit.Transform.EditTransform="Baguhin ang Transform... (&E)" -Basic.MainMenu.Edit.Transform.CopyTransform="Kopyahin ang Transform" -Basic.MainMenu.Edit.Transform.PasteTransform="I-paste ang Transform" -Basic.MainMenu.Edit.Transform.ResetTransform="I-set muli ang T&ransform" -Basic.MainMenu.Edit.Transform.Rotate90CW="Iikot ng 90 degrees CW" -Basic.MainMenu.Edit.Transform.Rotate90CCW="Iikot ng 90 degrees CCW" -Basic.MainMenu.Edit.Transform.Rotate180="Iikot ng 180 degrees" -Basic.MainMenu.Edit.Transform.FlipHorizontal="Baliktarin ng pa&halang" -Basic.MainMenu.Edit.Transform.FlipVertical="Baliktarin ng patayo (&V)" -Basic.MainMenu.Edit.Transform.FitToScreen="Pagkasyahin sa Screen (&F)" -Basic.MainMenu.Edit.Transform.StretchToScreen="I-&stretch sa screen" -Basic.MainMenu.Edit.Transform.CenterToScreen="I-sentro sa s&creen" +Basic.MainMenu.Edit.Transform="Pagsaanyo (&T)" +Basic.MainMenu.Edit.Transform.EditTransform="Baguhin ang Pagsaanyo... (&E)" +Basic.MainMenu.Edit.Transform.CopyTransform="Sipiin ang Pagsaanyo" +Basic.MainMenu.Edit.Transform.PasteTransform="Idikit ang Pagsaanyo" +Basic.MainMenu.Edit.Transform.ResetTransform="Isauli ang Pagsaanyo (&R)" +Basic.MainMenu.Edit.Transform.Rotate90CW="Paikutin ng 90 pataknaang antas" +Basic.MainMenu.Edit.Transform.Rotate90CCW="Paikutin ng 90 balitaknaang antas" +Basic.MainMenu.Edit.Transform.Rotate180="Paikutin ng 180 antas" +Basic.MainMenu.Edit.Transform.FlipHorizontal="Baliktaring Pa&halang" +Basic.MainMenu.Edit.Transform.FlipVertical="Baliktaring Patayo (&V)" +Basic.MainMenu.Edit.Transform.FitToScreen="Pagkasyahin sa tabing (&F)" +Basic.MainMenu.Edit.Transform.StretchToScreen="Banatin sa tabing (&S)" +Basic.MainMenu.Edit.Transform.CenterToScreen="Igitna sa tabing (&C)" +Basic.MainMenu.Edit.Transform.VerticalCenter="I-patayong Gitna" +Basic.MainMenu.Edit.Transform.HorizontalCenter="I-pahalang Gitna" Basic.MainMenu.Edit.Order="Pagkakasun&od-sunod" Basic.MainMenu.Edit.Order.MoveUp="Ilipat Pataas (&U)" Basic.MainMenu.Edit.Order.MoveDown="Ilipat Pababa (&D)" @@ -362,6 +444,7 @@ Basic.MainMenu.Profile.Export="I-export ang Profile" Basic.MainMenu.SceneCollection.Import="I-import ang Koleksyon ng mga Eksena" Basic.MainMenu.SceneCollection.Export="I-export ang Koleksyon ng mga Eksena" +Basic.MainMenu.SceneCollection.Migrate="Ilagay ang Batayang Hisikot" Basic.MainMenu.Profile.Exists="May ganito ng Profile" Basic.MainMenu.Tools="Mga Kasangkapan (&T)" Basic.MainMenu.Help="Tulong (&H)" @@ -374,9 +457,9 @@ Basic.MainMenu.Help.CheckForUpdates="Maghanap ng mga Update" Basic.Settings.ProgramRestart="Ang programa ay kailangan i-start muli para gumana ang mga setting na ito." Basic.Settings.ConfirmTitle="Kumpirmahin ang mga Pagbabago" -Basic.Settings.Confirm="Mayroon kang mga binago na hindi pa na-save. I-save ang mga pagbabago?" +Basic.Settings.Confirm="Mayroon kang mga binago na hindi pa naimbak. Iimbak ang mga pagbabago?" Basic.Settings.General="Pangkalahatan" -Basic.Settings.General.Language="Lenggwahe" +Basic.Settings.General.Language="Wika" Basic.Settings.General.EnableAutoUpdates="Awtomatikong maghanap ng mga update sa pag-start up" Basic.Settings.General.OpenStatsOnStartup="Buksan ang dialogong panstatistiko sa pag-startup" Basic.Settings.General.WarnBeforeStartingStream="Ipakita ang kumpirmasyon ng dialogo kapag nagumpisang mag-stream" @@ -395,10 +478,15 @@ Basic.Settings.General.KeepReplayBufferStreamStops="Panatilihing aktibo ang replay buffer kapag huminto ang pagstream" Basic.Settings.General.SysTrayWhenStarted="Paliitin sa system tray kapag inumpisahan" Basic.Settings.General.SystemTrayHideMinimize="Palaging paliitin sa system tray sa halip na task bar" -Basic.Settings.General.SaveProjectors="I-save ang mga projector sa paglabas" +Basic.Settings.General.SaveProjectors="Iimbak ang mga projector sa paglabas" +Basic.Settings.General.Preview="Silip" Basic.Settings.General.SwitchOnDoubleClick="Lumipat sa eksena kapag dalawang beses pinindot" -Basic.Settings.General.StudioPortraitLayout="Paganahin ang portrait/patayong layout" +Basic.Settings.General.StudioPortraitLayout="Paganahin ang portrait na/patayong ayos" +Basic.Settings.General.TogglePreviewProgramLabels="Ipakita ang tawagan ng mga silip/palatuntunan" +Basic.Settings.General.Multiview="Damin-tanaw" +Basic.Settings.General.MultiviewLayout="Damin-tanaw na Ayos" Basic.Settings.Stream="Mag-stream" +Basic.Settings.Stream.Recommended.MaxResolution="Pinakahangganan ng Hisikot: %1" Basic.Settings.Output.Format="Format ng Recording" Basic.Settings.Output.SelectDirectory="Pumili ng Recording Directory" Basic.Settings.Output.Mode="Paraan ng Output" @@ -409,7 +497,7 @@ Basic.Settings.Output.ReplayBuffer.EstimateUnknown="Hindi matantiya ang gamit sa memorya. Mangyari lamang mag-takda ng pinakamataas na limitasyon sa memorya." Basic.Settings.Output.ReplayBuffer.Prefix="Panlapi para Filename ng Replay Buffer" Basic.Settings.Output.ReplayBuffer.Suffix="Hulapi" -Basic.Settings.Output.Simple.SavePath="Landas ng Recording" +Basic.Settings.Output.Simple.SavePath="Landas ng Pagtatala" Basic.Settings.Output.Simple.RecordingQuality="Kalidad ng Recording" Basic.Settings.Output.Simple.RecordingQuality.Stream="Katulad ng pag-stream" Basic.Settings.Output.Simple.RecordingQuality.Small="Mataas na Kalidad, Katamtamang Laki ng File" @@ -419,7 +507,8 @@ Basic.Settings.Output.Simple.Warn.Lossless.Msg="Sigurado ka bang gusto mong gamitin ang lossless na kalidad?" Basic.Settings.Output.Simple.Warn.Lossless.Title="Lossless na kalidad babala!" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Software (x264 mababa ang nakatakdang paggamit ng CPU, dagdagan ang laki ng file)" -Basic.Settings.Output.Warn.EnforceResolutionFPS.Resolution="Resolusyon: %1" +Basic.Settings.Output.Warn.EnforceResolutionFPS.Title="Di-Akmang Hisikot o Framerate" +Basic.Settings.Output.Warn.EnforceResolutionFPS.Resolution="Hisikot: %1" Basic.Settings.Output.Reconnect="Pakusa Makipagkonek muli" Basic.Settings.Output.MaxRetries="Pinakamaraming Retries" Basic.Settings.Output.CustomEncoderSettings="Pasadyang enkoder Mga setting" @@ -444,22 +533,25 @@ Basic.Settings.Output.Adv.FFmpeg.Type="Ang Palabas na Uri ng FFmpeg" Basic.Settings.Output.Adv.FFmpeg.Type.URL="Output sa URL" Basic.Settings.Output.Adv.FFmpeg.Type.RecordToFile="Output sa File" -Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Mga Karaniwang format sa pagrekord" -Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Lahat ng mga File" -Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Landas ng file o URL" +Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Mga karaniwang format sa pagtatala" +Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Lahat ng mga Talaksan" +Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Landas ng talaksan o URL" Basic.Settings.Output.Adv.FFmpeg.Format="Format ng Container" Basic.Settings.Output.Adv.FFmpeg.FormatDefault="Default na Format" Basic.Settings.Output.Adv.FFmpeg.FormatDesc="Paglalarawan ng Container Format" -Basic.Settings.Output.Adv.FFmpeg.FormatDescDef="Audio/Video Codec na hinulaan mula sa landas ng File o URL" +Basic.Settings.Output.Adv.FFmpeg.FormatDescDef="Audio/Video Codec na hinulaan mula sa landas ng Talaksan o URL" Basic.Settings.Output.Adv.FFmpeg.AVEncoderDisable="Huwag paganahin ang Encoder" Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Mga Setting para sa Video Encoder (kung mayroon)" Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Mga Setting ng Audio Encoder(kung mayroon)" Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Mga Setting ng Muxer (kung mayroon)" Basic.Settings.Output.Adv.FFmpeg.GOPSize="Agwat ng Keyframe (mga imahe)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Ipakita ang lahat ng mga code (kahit na maaaring hindi akma)" -Basic.Settings.Video.BaseResolution="Resolusyon ng Base (Kanbas)" -Basic.Settings.Video.ScaledResolution="Resolution ng Output (Na-scale)" +Screenshot.StudioProgram="Iimbak ang Screenshot ng Palatuntunan" +Screenshot.Preview="Iimbak ang Siliping Screenshot" +Basic.Settings.Video.BaseResolution="Batayang (Kanbas) Hisikot" +Basic.Settings.Video.ScaledResolution="Output na (Scaled) Hisikot" Basic.Settings.Video.DownscaleFilter="Pababaan ang Filter" +Basic.Settings.Video.DownscaleFilter.Unavailable="Tugmang mga hisikot, walang kinakailangang pagbabawas" Basic.Settings.Video.FPSCommon="Karaniwang mga FPS Value" Basic.Settings.Video.FPSInteger="Integer ng FPS Value" Basic.Settings.Video.FPSFraction="Praksyonal na FPS Value" @@ -467,9 +559,9 @@ Basic.Settings.Video.Denominator="Denominador" Basic.Settings.Video.InvalidResolution="Walang bisa ang value ng resolusyon. Kailangang widthxheight (hal. 1920x1080)" Basic.Settings.Video.CurrentlyActive="Kasalukuyang aktibo ang video output. Mangyari lamang patayin ang anumang mga output upang mabago ang mga video setting." -Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (Pinakamabilis, ngunit hindi malinaw pag nag-scale)" -Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubic (Matalas na pag-scale, 16 na mga halimbawa)" -Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Pinatalas na pag-scale, 36 na mga halimbawa)" +Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (Pinakamabilis, ngunit malabo sa paglaki)" +Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubic (Matalas na pagsasanlaki, 16 na halimbagay)" +Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Matalas na pagsasanlaki, 36 na halimbagay)" Basic.Settings.Audio.Channels="Mga Channel" Basic.Settings.Audio.MeterDecayRate.Fast="Mabilis" Basic.Settings.Audio.MeterDecayRate.Slow="Mabagal (Type II PPM)" @@ -538,6 +630,10 @@ About.Info="Ang OBS Studio ay isang libre at open source na software para sa parerercord ng bidyo at pag-iistream nang live." About.Authors="Mga May-akda" About.License="Lisensya" +ResizeOutputSizeOfSource.Text="Magiging magkasinlaki ang batayan at output na hisikot sa kasalukuyang pagtututok." +PreviewTransition="Silipin ang Pagbabai-baitang" +Importer.Path="Landas ng Pagtitipon" ContextBar.MediaControls.StopMedia="I-tigil ang Media" ContextBar.MediaControls.RestartMedia="Ulitin ang Media" YouTube.Auth.WaitingAuth.Title="Pagpapahintulot sa Paggamit sa Youtube" +YouTube.Actions.Stream.ScheduledFor="Nakatakda sa %1"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/tr-TR.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/tr-TR.ini
Changed
@@ -18,11 +18,11 @@ MoveDown="Aşağı Taşı" Settings="Ayarlar" Display="Ekran" -Name="Adı" -Exit="Çıkış" +Name="İsim" +Exit="Çık" Mixer="Ses Karıştırıcı" Browse="Gözat" -Mono="Tekli" +Mono="Tek Kanallı Ses" DroppedFrames="Kaybedilen Kareler %1 (%%2)" Projector.Open.Program="Program Projektörünü Aç" Projector.Open.Preview="Önizleme Projektörünü Aç" @@ -41,7 +41,7 @@ Show="Göster" Hide="Gizle" UnhideAll="Tümünü Göster" -Untitled="İsimsiz" +Untitled="Başlıksız" New="Yeni" Duplicate="Çoğalt" Enable="Etkinleştir" @@ -108,11 +108,20 @@ List="Liste" Grid="Izgara" Automatic="Otomatik" +ComingSoon="Yakında" PluginsFailedToLoad.Title="Eklenti Yükleme Hatası" PluginsFailedToLoad.Text="Aşağıdaki OBS eklentileri yüklenemedi:\n\n%1\nLütfen bu eklentileri güncelleyin veya silin." AlreadyRunning.Title="OBS zaten çalışıyor" AlreadyRunning.Text="OBS zaten çalışıyor! Eğer bunu yapmak istemediyseniz, lütfen yeni bir objeyi çalıştırmayı denemeden önce varolan tüm OBS objelerini kapatın. OBS'yi sistem tepsisine küçülmesi için ayarladıysanız, lütfen hala çalışıp çalışmadığını görmek için orayı kontrol edin." AlreadyRunning.LaunchAnyway="Yine de Başlat" +CrashHandling.Dialog.Title="OBS Studio Çökmesi Tespit Edildi" +CrashHandling.Labels.Text="OBS Studio düzgün şekilde kapanmadı.\n\nGüvenli Mod'da çalıştırın (üçüncü taraf eklentileri, komut dosyası oluşturma ve WebSockets devre dışı)?" +CrashHandling.Labels.PrivacyNotice="En son çökme raporunu otomatik olarak OBSProject'e yüklemeyi de seçebilirsiniz.<br /><br />Lütfen herhangi bir dosya yüklemeden önce <a href='https://obsproject.com/privacy-policy'>Gizlilik Politikası</a>'nı okuyun ve dosya yüklemeleriyle ilgili bölümlere özellikle dikkat edin." +CrashHandling.Checkbox.SendReport="Gizlilik politikasını okudum ve yüklemeye izin veriyorum." +CrashHandling.Buttons.LaunchSafe="Güvenli Mod'da başlat" +CrashHandling.Buttons.LaunchNormal="Normal Mod'da başlat" +CrashHandling.Errors.UploadJSONError="En son çökme günlüğünü yüklemeye çalışırken bir hata oluştu." +CrashHandling.Errors.Title="Çökme Günlüğü Yükleme Hatası" SafeMode.Restart="OBS'i Güvenli Mod'da yeniden başlatmak ister misin? (3. parti eklentiler, betikler ve WebSocketler kapalı şekilde)" SafeMode.RestartNormal="OBS'i Normal Mod'da yeniden başlatmak ister misin?" ChromeOS.Title="Desteklenmeyen Platform" @@ -325,8 +334,8 @@ ConfirmStopRecord.Text="Kaydı durdurmak istediğinizden emin misiniz?" ConfirmBWTest.Title="Bant genişliği testini başlat?" ConfirmBWTest.Text="OBS'i bant genişliği test modunda yapılandırdınız. Bu mod, kanalınız yayına girmeden ağ testi yapmanıza olanak sağlar. Test tamamlandıktan sonra, izleyicilerin yayını görebilmesi için bu modu devre dışı bırakmanız gerekecektir.\n\nDevam etmek istiyor musunuz?" -ConfirmExit.Title="OBS'den Çıkılsın mı?" -ConfirmExit.Text="OBS şu anda etkin. Tüm yayınlar/kayıtlar kapatılacaktır. Çıkmak istediğinize emin misiniz?" +ConfirmExit.Title="Aktif Çıktılar" +ConfirmExit.Text="OBS şu anda hala aktif. Tüm yayınlar/kayıtlar kapatılacak." ConfirmRemove.Title="Kaldırmayı Onayla" ConfirmRemove.Text="'%1' ögesini kaldırmak istediğinizden emin misiniz?" ConfirmRemove.TextMultiple="%1 ögeyi kaldırmak istediğinizden emin misiniz?" @@ -363,6 +372,16 @@ Output.NoBroadcast.Text="Yayınlamaya başlamadan önce yayın ayarlarını yapmalısınız." Output.BroadcastStartFailed="Yayın başlatılamadı" Output.BroadcastStopFailed="Yayın durdurulamadı" +LogUploadDialog.Title="OBS Studio Günlük Dosyası Yükleme" +LogUploadDialog.Labels.PrivacyNotice="Lütfen herhangi bir dosya yüklemeden önce <a href='https://obsproject.com/privacy-policy'>Gizlilik Politikası</a> ve dosya yüklemeleriyle ilgili bölümünü okuyun." +LogUploadDialog.Labels.Progress="Günlük yükleme işlemi devam ediyor. Lütfen bekleyin..." +LogUploadDialog.Labels.Description.AppLog="Günlük dosyanız yüklendi. Artık Bağlantı Adresini hata ayıklama ya da destek amacıyla paylaşabilirsiniz." +LogUploadDialog.Labels.Description.CrashLog="Çökme raporunuz yüklendi. Artık Bağlantı Adresini hata ayıklama amacıyla paylaşabilirsiniz." +LogUploadDialog.Buttons.ConfirmUpload="Yükle" +LogUploadDialog.Buttons.CopyURL="Günlüğün Bağlantı Adresini Kopyala" +LogUploadDialog.Buttons.AnalyzeURL="Günlük Dosyasını Analiz Et" +LogUploadDialog.Buttons.RetryButton="Yeniden Dene" +LogUploadDialog.Errors.Template="Dosya yüklenmeye çalışılırken bir hata oluştu:\n\n%1" LogUploadDialog.Errors.NoLogFile="Yüklenecek dosya bulunamadı veya dosya boştu" Remux.SourceFile="OBS Kaydı" Remux.TargetFile="Hedef Dosya" @@ -795,11 +814,14 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Yapılandırmayı Geçersiz Kılmayı Etkinleştir" Basic.Settings.Stream.MultitrackVideoLabel="Çok kanallı Video" Basic.Settings.Stream.MultitrackVideoExtraCanvas="Ek Tuval" +Basic.Settings.Stream.WHIPSimulcastLabel="Eş zamanlı yayın" +Basic.Settings.Stream.WHIPSimulcastInfo="Eş zamanlı yayın, birden fazla video kalitesini kodlamanıza ve göndermenize olanak tanır. <a href='https://obsproject.com/kb/whip-streaming-guide'>Daha fazla bilgi edinin</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Toplam Katman" Basic.Settings.Stream.AdvancedOptions="Gelişmiş Seçenekler" Basic.Settings.Output="Çıkış" Basic.Settings.Output.Format="Kayıt Biçimi" -Basic.Settings.Output.Format.hMP4="Hibrit MP4 BETA (.mp4)" -Basic.Settings.Output.Format.hMOV="Hibrit MOV BETA (.mov)" +Basic.Settings.Output.Format.hMP4="Hibrit MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="Hibrit MOV (.mov)" Basic.Settings.Output.Format.fMP4="Parçalı MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="Parçalı MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="Parçalanmış MOV kaydı parçalar halinde yazar ve geleneksel MOV dosyalarıyla aynı son işlemeyi gerektirmez.\nBu, örneğin bir BSOD (mavi ekran) veya güç kaybı sonucunda diske yazma işlemi kesintiye uğrasa bile dosyanın oynatılabilir kalmasını sağlar.\n\nBu, tüm oynatıcılar ve düzenleyicilerle uyumlu olmayabilir. Gerekirse dosyayı daha uyumlu bir biçime dönüştürmek için Dosya → Kayıtları Remux Et seçeneğini kullanın." @@ -966,6 +988,7 @@ Basic.Settings.Video.Numerator="Pay" Basic.Settings.Video.Denominator="Payda" Basic.Settings.Video.Renderer="İşleyici" +Basic.Settings.Video.Renderer.Experimental="%1 (Deneysel)" Basic.Settings.Video.InvalidResolution="Geçersiz çözünürlük değeri. GenişlikxYükseklik şeklinde olmalıdır. (örnek 1920x1080)" Basic.Settings.Video.CurrentlyActive="Video çıkışı şu anda etkin durumda. Video ayarlarını değiştirmek için lütfen bütün çıkışları kapalı duruma getirin." Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (En hızlı, ancak boyutlandırmada bulanık görüntü)" @@ -1278,3 +1301,11 @@ MultitrackVideo.IncompatibleSettings.AudioChannels="%1 şu anda '%2', %3 olarak ayarlanmış Ses → Genel → Kanallar ile uyumlu değil" MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="Ses → Genel → Kanallar '%1' olarak ayarlanmalı" MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1, Ses → Genel → Kanallar için birden fazla farklı ayar gerektirir" +Basic.OpenPluginManager="Eklenti Yöneticisi" +PluginManager="Eklenti Yöneticisi" +PluginManager.Restart="Eklenti değişikliklerini uygulamak için OBS Studio yeniden başlatılmalıdır." +PluginManager.MissingPlugin="EKLENTI BULUNAMADI" +PluginManager.Section.Discover="Gözat" +PluginManager.Section.Manage="Yüklendi" +PluginManager.Section.Updates="Güncellemeler" +PluginManager.Section.Manage.Title="Etkin Eklentileri Yönet"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/tt-RU.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/tt-RU.ini
Changed
@@ -35,11 +35,14 @@ Transition="Күчеш" Left="Сул" Right="Уң" +Top="Өстә" +Bottom="Аста" Reset="Ташлату" Hours="сәгатьтән" Minutes="минуттан" Seconds="секундтан" Deprecated="Искергән" +ReplayBuffer="Кабатлау буферы" Import="Импортлау" Export="Экспортлау" Copy="Күчермә алу" @@ -150,7 +153,6 @@ ConfirmStart.Title="Агымны башларгамы?" ConfirmStop.Title="Агымны туктатыргамы?" ConfirmStopRecord.Title="Яздыруны туктатыргамы?" -ConfirmExit.Title="OBS'ыннан чыгаргамы?" ConfirmReset.Title="Үзләкләрне ташлату" Output.StartStreamFailed="Агымны башлап булмады" Output.StartRecordingFailed="Яздыруны башлап булмады" @@ -290,7 +292,6 @@ Basic.Settings.Output="Чыгыш" Basic.Settings.Output.Format="Яздыру форматы" Basic.Settings.Output.Format.MKV="«Матрёшка» видеоформаты (.mkv)" -Basic.Settings.Output.Format.hMP4="Гибрид MP4 БЕТА (.mp4)" Basic.Settings.Output.Mode="Чыгыш шарты" Basic.Settings.Output.Mode.Simple="Гади" Basic.Settings.Output.Mode.Adv="Киңәйтелгән"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/ug-CN.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/ug-CN.ini
Changed
@@ -111,6 +111,7 @@ List="تىزىم" Grid="سېتكا" Automatic="ئاپتوماتىك" +ComingSoon="پات يېقىندا تارقىتىلىدۇ" PluginsFailedToLoad.Title="قىستۇرما يۈكلەش خاتالىقى" PluginsFailedToLoad.Text="تۆۋەندىكى OBS قىستۇرمىنى يۈكلىيەلمىدى: \n\n%1\nبۇ قىستۇرمىنى يېڭىلاڭ ياكى چىقىرىۋېتىڭ." AlreadyRunning.Title="OBS ئىجرا قىلىنىۋاتىدۇ!" @@ -337,8 +338,8 @@ ConfirmStopRecord.Text="خاتىرىلەشنى راستىنلا توختىتامسىز؟" ConfirmBWTest.Title="بەلباغ كەڭلىكى سىنىقىنى باشلامدۇ؟" ConfirmBWTest.Text="بەلباغ كەڭلىكىنى سىناش ھالىتىدە OBS نى سەپلىدىڭىز. بۇ ھالەتتە قانالنى ئاچمىغان ئەھۋالدا تور سىنىقى ئېلىپ بېرىشقا يول قويىدۇ. سىناق تاماملانغاندىن كېيىن، كۆرۈرمەنلەرنىڭ سىن ئېقىمىڭىزنى كۆرەلىشى ئۈچۈن ئۇنى چەكلىشىڭىز كېرەك.\n\nراستتىنلا داۋاملاشتۇرامسىز؟" -ConfirmExit.Title="OBS تىن چېكىنەمدۇ؟" -ConfirmExit.Text="OBS ھازىر ئاكتىپ ھالەتتە. بارلىق ئېقىم/خاتىرىلەر تاقىلىدۇ. راستىنلا چېكىنىشنى خالامسىز؟" +ConfirmExit.Title="چىقىرىۋاتقىنى" +ConfirmExit.Text="OBS يەنىلا ئاكتىپ ھالەتتە. بارلىق ئېقىم/خاتىرىلەر تاقىلىدۇ." ConfirmRemove.Title="چىقىرىۋېتىشنى جەزملە" ConfirmRemove.Text="«%1» نى راستتىنلا چىقىرىۋېتەمسىز؟" ConfirmRemove.TextMultiple="%1 تۈرنى چىقىرىۋېتىشنى خالامسىز؟" @@ -825,12 +826,15 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="سەپلىمە قاپلاشنى قوزغىتىدۇ" Basic.Settings.Stream.MultitrackVideoLabel="كۆپ يوللۇق سىن" Basic.Settings.Stream.MultitrackVideoExtraCanvas="قوشۇمچە كەرگە" +Basic.Settings.Stream.WHIPSimulcastLabel="تەڭ تارقىتىش" +Basic.Settings.Stream.WHIPSimulcastInfo="تەڭ تارقىتىش ئىقتىدارى كۆپ خىل سىن سۈپىتىدە كودلاش ۋە سىن تارقىتىشقا يول قويىدۇ. <a href='https://obsproject.com/kb/whip-streaming-guide'>مول بىلىم</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="جەمئىي قەۋەت سانى" Basic.Settings.Stream.AdvancedOptions="ئالىي تاللانما" Basic.Settings.Output="چىقار" Basic.Settings.Output.Format="سىن خاتىرىلەش پىچىمى" Basic.Settings.Output.Format.MKV="Matroska سىن (.mkv)" -Basic.Settings.Output.Format.hMP4="Hybrid MP4 سىناق (.mp4)" -Basic.Settings.Output.Format.hMOV="ئارىلاش MOV سىناق (.mov)" +Basic.Settings.Output.Format.hMP4="ئارىلاش MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="ئارىلاش MOV (.mov)" Basic.Settings.Output.Format.fMP4="پارچىلانغان MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="پارچىلانغان MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="پارچىلانغان MOV بۆلەك شەكلىدە خاتىرىلەيدۇ، ئەنئەنىۋى MOV ھۆججىتىگە ئوخشاش ئەڭ ئاخىرىدا بىر تەرەپ قىلىش كېرەك بولمايدۇ.\nبۇنداق بولغاندا دىسكىغا يېزىش ئۈزۈلۈپ قالغان تەقدىردىمۇ (مەسىلەن، كۆك ئېكران ياكى توك كېتىش)، ھۆججەتنى يەنىلا قويغىلى بولىدۇ.\n\nبۇنى ھەممە قويغۇچ ۋە تەھرىرلەش يۇمشاق دېتالى قوللىشى ناتايىن. زۆرۈر تېپىلغاندا، «ھۆججەت ← خاتىرىنى قايتا كودلا» نى ئىشلىتىپ ھۆججەتنى تېخىمۇ ماسلىشىدىغان پىچىمغا ئۆزگەرتىشكە بولىدۇ." @@ -1000,6 +1004,7 @@ Basic.Settings.Video.Numerator="سۈرەت" Basic.Settings.Video.Denominator="مەخرەج" Basic.Settings.Video.Renderer="رەڭلىگۈچ" +Basic.Settings.Video.Renderer.Experimental="%1 (سىناق)" Basic.Settings.Video.InvalidResolution="ئىناۋەتسىز ئېنىقلىق قىممىتى. چوقۇم كەڭلىكxئېگىزلىك (مەسىلەن، 1920x1080)" Basic.Settings.Video.CurrentlyActive="نۆۋەتتە سىن چىقىرىش ئاكتىپ ھالەتتە. سىن تەڭشىكىنى ئۆزگەرتىشتە خالىغان سىن چىقىرىشنى تاقاڭ." Basic.Settings.Video.DownscaleFilter.Bilinear="قوش سىزىقلىق (ئەڭ تېز، ئەمما چوڭلۇقى تەڭشەلسە غۇۋالىشىدۇ)" @@ -1322,7 +1327,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 ئۈن ← ئادەتتىكى ← قانال غا كۆپ خىل پەرقلىق تەڭشەك كېرەك" Basic.OpenPluginManager="قىستۇرما باشقۇرغۇچ" PluginManager="قىستۇرما باشقۇرغۇچ" -PluginManager.HelpText="قىستۇرما باشقۇرغۇچ" -PluginManager.Restart="OBS نى قايتا قوزغىتامدۇ؟" -PluginManager.NeedsRestart="بۇ ئۆزگىرىشنى قوللىنىش ئۈچۈن OBS نى قايتا قوزغىتىش كېرەك. ھازىر قايتا قوزغىتامسىز؟" +PluginManager.Restart="OBS Studio قايتا قوزغىتىلسا ئاندىن قىستۇرمىنىڭ ئۆزگىرىشىنى قوللىنىدۇ" PluginManager.MissingPlugin="قىستۇرما تېپىلمىدى" +PluginManager.Section.Discover="كۆز يۈگۈرت" +PluginManager.Section.Manage="ئورنىتىلغان" +PluginManager.Section.Updates="يېڭىلانما" +PluginManager.Section.Manage.Title="قوزغىتىلغان قىستۇرمىنى باشقۇرۇش"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/uk-UA.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/uk-UA.ini
Changed
@@ -111,6 +111,7 @@ List="Список" Grid="Сітка" Automatic="Автоматично" +ComingSoon="Незабаром" PluginsFailedToLoad.Title="Помилка завантаження плагіна" PluginsFailedToLoad.Text="Не вдалося завантажити такі плагіни OBS:\n\n%1\nОновіть або вилучіть ці плагіни." AlreadyRunning.Title="OBS уже запущено" @@ -337,8 +338,8 @@ ConfirmStopRecord.Text="Справді зупинити записування?" ConfirmBWTest.Title="Почати тест пропускної здатності?" ConfirmBWTest.Text="OBS налаштовано у режимі тестування пропускної здатності. Цей режим дозволяє здійснювати тестування мережі не вмикаючи на вашому каналі трансляцію наживо. Після закінчення тестування, вам потрібно буде вимкнути його, щоб глядачі змогли побачити вашу трансляцію.\n\nБажаєте продовжити?" -ConfirmExit.Title="Вийти з OBS?" -ConfirmExit.Text="OBS ще працює. Усі розпочаті трансляції/записи будуть зупинені. Ви дійсно хочете вийти?" +ConfirmExit.Title="Активні виводи" +ConfirmExit.Text="OBS досі активний. Усі трансляції/записи будуть вимкнені." ConfirmRemove.Title="Підтвердження видалення" ConfirmRemove.Text="Ви впевнені, що хочете вилучити «%1»?" ConfirmRemove.TextMultiple="Справді видалити ці (%1) елементи?" @@ -826,12 +827,15 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Увімкнути перевизначення конфігурації" Basic.Settings.Stream.MultitrackVideoLabel="Мультитрекове відео" Basic.Settings.Stream.MultitrackVideoExtraCanvas="Додаткове Полотно" +Basic.Settings.Stream.WHIPSimulcastLabel="Одночасна трансляція" +Basic.Settings.Stream.WHIPSimulcastInfo="Одночасна трансляція дозволяє кодувати та надсилати відео різної якості. <a href='https://obsproject.com/kb/whip-streaming-guide'>Докладніше</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Загальна кількість шарів" Basic.Settings.Stream.AdvancedOptions="Розширені налаштування" Basic.Settings.Output="Вивід" Basic.Settings.Output.Format="Формат запису" Basic.Settings.Output.Format.MKV="Відео Matroska (.mkv)" -Basic.Settings.Output.Format.hMP4="Гібридний MP4 БЕТА (.mp4)" -Basic.Settings.Output.Format.hMOV="Гібридний MOV БЕТА (.mov)" +Basic.Settings.Output.Format.hMP4="Гібридний MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="Гібридний MOV (.mov)" Basic.Settings.Output.Format.fMP4="Фрагментований MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="Фрагментований MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="Фрагментований MOV записує запис фрагментами та не потребує такої ж обробки, як звичайні файли MOV.\nЦе гарантує, що файл можна буде відтворити, навіть якщо запис на диск буде перервано, наприклад, унаслідок аварійного завершення роботи пристрою або втрати живлення.\n\nЦе може бути несумісним з деякими програвачами та редакторами. За потреби скористайтеся командою Файл → Ремультиплексувати записи, щоб перетворити файл у більш сумісний формат." @@ -1000,7 +1004,8 @@ Basic.Settings.Video.FPSFraction="Дробова частота кадрів" Basic.Settings.Video.Numerator="Чисельник" Basic.Settings.Video.Denominator="Знаменник" -Basic.Settings.Video.Renderer="Рендерер" +Basic.Settings.Video.Renderer="Візуалізатор" +Basic.Settings.Video.Renderer.Experimental="%1 (Експериментальний)" Basic.Settings.Video.InvalidResolution="Неприпустима роздільна здатність. Має бути ширинаxвисота (наприклад, 1920x1080)" Basic.Settings.Video.CurrentlyActive="Зараз відео виводиться. Вимкніть усі виведення, щоб змінити налаштування відео." Basic.Settings.Video.DownscaleFilter.Bilinear="Білінійний (найшвидший, але розмитий якщо масштабувати)" @@ -1299,3 +1304,11 @@ MultitrackVideo.IncompatibleSettings.AudioChannels="%1 наразі несумісний з Аудіо → Загальні → Канали, для якого встановлено значення '%2', '%3'." MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="Аудіо → Загальні → Канали потрібно встановити на '%1'" MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 вимагає декількох різних налаштувань для Аудіо → Загальні → Канали" +Basic.OpenPluginManager="Менеджер плагінів" +PluginManager="Менеджер плагінів" +PluginManager.Restart="Для застосування змін плагіну, OBS Studio слід перезапустити" +PluginManager.MissingPlugin="ПЛАГІНИ НЕ ЗНАЙДЕНО" +PluginManager.Section.Discover="Огляд" +PluginManager.Section.Manage="Установлено" +PluginManager.Section.Updates="Оновлення" +PluginManager.Section.Manage.Title="Керування увімкненими плагінами"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/ur-PK.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/ur-PK.ini
Changed
@@ -100,8 +100,6 @@ ConfirmStop.Title="نشریہ روکیں؟" ConfirmStop.Text="کیا آپ نشریہ کو بالکل روکنا چاہتے ہیں؟" ConfirmStopRecord.Title="روکرڈنگ بند کریں؟" -ConfirmExit.Title="OBS بند کریں؟" -ConfirmExit.Text="OBS فالحال چل رہا ہے، تمام نشریات اور رکوڈنگز رک جائیں گی۔ کیا آپ بالکل بند کرنا چاہتے ہیں؟" ConfirmRemove.Title="مٹان کی تصدیق" Output.StartStreamFailed="نشریہ شروع کرنے میں ناکامی" Output.ConnectFail.Title="سمبندھ کرنے میں ناکامی"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/vi-VN.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/vi-VN.ini
Changed
@@ -111,11 +111,16 @@ List="Danh sách" Grid="Lưới" Automatic="Tự động" +ComingSoon="Sắp ra mắt" PluginsFailedToLoad.Title="Lỗi nạp trình cắm" PluginsFailedToLoad.Text="Những trình cắm OBS sau đây đang bị lỗi:\n\n%1\nVui lòng cập nhật hoặc xóa các trình cắm đó đi." AlreadyRunning.Title="OBS hiện đang chạy" AlreadyRunning.Text="OBS hiện đang chạy. Trừ phi bạn muốn tiếp tục, xin vui lòng tắt các phiên OBS khác trước khi khởi chạy một cửa sổ mới. Nếu OBS đang chạy trong trạng thái thu nhỏ trên thanh tác vụ, hãy kiểm tra lại rồi hẵng khởi chạy." AlreadyRunning.LaunchAnyway="Tiếp tục khởi động" +CrashHandling.Buttons.LaunchSafe="Chạy trong chế độ an toàn" +CrashHandling.Buttons.LaunchNormal="Chạy trong chế độ bình thường" +CrashHandling.Errors.UploadJSONError="Có lỗi xảy ra trong khi cố gắng tải lên nhật kí sự cố gần nhất. Xin vui lòng thử lại sau." +CrashHandling.Errors.Title="Lỗi tải lên nhật kí sự cố" SafeMode.Restart="Bạn có muốn khởi động lại OBS ở Chế độ an toàn (đã tắt trình cắm, tập lệnh và WebSockets của bên thứ ba) không?" SafeMode.RestartNormal="Bạn có muốn khởi động lại OBS trong chế độ bình thường không?" ChromeOS.Title="Nền tảng không được hỗ trợ" @@ -329,8 +334,6 @@ ConfirmStopRecord.Text="Có chắc là bạn muốn dừng ghi hình không?" ConfirmBWTest.Title="Bắt đầu kiểm tra băng thông?" ConfirmBWTest.Text="Bạn đã chỉnh OBS thành chế độ kiểm tra băng thông. Chế độ này cho phép kiểm tra mạng mà không cần phát trực tiếp. Sau khi xong việc, bạn sẽ cần tắt nó đi để khán giả có thể xem được luồng của bạn.\n\nBạn có muốn tiếp tục không?" -ConfirmExit.Title="Thoát OBS?" -ConfirmExit.Text="OBS hiện đang hoạt động. Tất cả các luồng/bản ghi sẽ bị tắt. Có chắc là bạn muốn tắt OBS không?" ConfirmRemove.Title="Xác nhận loại bỏ" ConfirmRemove.Text="Có chắc là bạn muốn loại bỏ \"%1\" không?" ConfirmRemove.TextMultiple="Có chắc là bạn muốn xóa %1 nội dung không?" @@ -367,6 +370,10 @@ Output.NoBroadcast.Text="Bạn cần thiết lập một phát sóng trước khi bạn có thể bắt đầu phát luồng." Output.BroadcastStartFailed="Không thể bắt đầu phát sóng" Output.BroadcastStopFailed="Không thể dừng phát sóng" +LogUploadDialog.Buttons.ConfirmUpload="Tải lên" +LogUploadDialog.Buttons.CopyURL="Sao chép URL nhật kí" +LogUploadDialog.Buttons.AnalyzeURL="Phân tích tệp nhật kí" +LogUploadDialog.Buttons.RetryButton="Thử lại" Remux.TargetFile="Tệp đích" Remux.Remux="Ghép lại" Remux.Stop="Dừng ghép lại" @@ -565,6 +572,7 @@ Basic.Main.PauseRecording="Tạm dừng ghi hình" Basic.Main.UnpauseRecording="Tiếp tục ghi hình" Basic.Main.SplitFile="Tách tệp ghi hình" +Basic.Main.AddChapterMarker="Thêm phần đánh dấu chương (chỉ MP4/MOV lai)" Basic.Main.StoppingRecording="Dừng ghi video..." Basic.Main.StopReplayBuffer="Dừng Replay Buffer" Basic.Main.StoppingReplayBuffer="Đang dừng Replay Buffer..." @@ -748,6 +756,7 @@ Basic.Settings.Appearance.General.Variant="Kiểu cách" Basic.Settings.Appearance.General.NoVariant="Không có sẵn kiểu nào" Basic.Settings.Appearance.FontScale="Cỡ chữ" +Basic.Settings.Appearance.Density="Mật độ" Basic.Settings.Appearance.Classic="Cổ điển" Basic.Settings.Appearance.Compact="Gọn" Basic.Settings.Appearance.Normal="Bình thường" @@ -787,10 +796,14 @@ Basic.Settings.Stream.MultitrackVideoConfigOverride="Ghi đè cấu hình (JSON)" Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Bật ghi đè cấu hình" Basic.Settings.Stream.MultitrackVideoLabel="Video đa kênh" +Basic.Settings.Stream.WHIPSimulcastLabel="Phát sóng đồng thời" +Basic.Settings.Stream.WHIPSimulcastInfo="Phát sóng đồng thời cho phép bạn biên mã và gửi nhiều mức chất lượng video khác nhau. <a href='https://obsproject.com/kb/whip-streaming-guide'>Tìm hiểu thêm</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="Tổng số lớp" Basic.Settings.Stream.AdvancedOptions="Tùy chọn Nâng cao" Basic.Settings.Output="Đầu ra" Basic.Settings.Output.Format="Định dạng ghi hình" -Basic.Settings.Output.Format.hMP4="MP4 lai THỬ NGHIỆM (.mp4)" +Basic.Settings.Output.Format.hMP4="MP4 lai (.mp4)" +Basic.Settings.Output.Format.hMOV="MOV lai (.mov)" Basic.Settings.Output.Format.fMP4="MP4 bị phân mảnh (.mp4)" Basic.Settings.Output.Format.fMOV="MOV bị phân mảnh (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="MOV phân mảnh ghi các bản ghi theo từng đoạn và không yêu cầu quá trình hoàn thiện giống như các tệp MOV truyền thống.\nĐiều này đảm bảo tệp vẫn có thể phát được ngay cả khi quá trình ghi vào đĩa bị gián đoạn, chẳng hạn như do lỗi màn hình xanh hoặc mất điện.\n\nĐiều này có thể không tương thích với tất cả trình phát và trình chỉnh sửa. Sử dụng Tập tin → Ghép lại bản ghi để chuyển đổi tệp thành định dạng tương thích hơn nếu cần." @@ -956,6 +969,7 @@ Basic.Settings.Video.Numerator="Tử số" Basic.Settings.Video.Denominator="Mẫu số" Basic.Settings.Video.Renderer="Trình kết xuất" +Basic.Settings.Video.Renderer.Experimental="%1 (Thử nghiệm)" Basic.Settings.Video.InvalidResolution="Giá trị độ phân giải không hợp lệ. Phải là widthxheight (tức là năm 1920 x 1080)" Basic.Settings.Video.CurrentlyActive="Đầu ra video là hiện đang hoạt động. Hãy tắt vào bất kỳ kết quả đầu ra để thay đổi thiết đặt video." Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (nhanh nhất, nhưng mờ nếu thu phóng)" @@ -1264,6 +1278,7 @@ FailedToStartStream.WarningRetryNonMultitrackVideo="\n<br><br>\nBạn có muốn tiếp tục phát trực tuyến mà không có %1 không?" FailedToStartStream.WarningRetry="\n<br><br>\nBạn có muốn tiếp tục phát trực tuyến không?" FailedToStartStream.MissingEncoderConfigs="Cấu hình phát trực tiếp không bao gồm cấu hình bộ biên mã" +FailedToStartStream.InvalidEncoderConfig="Cấu hình phát trực tiếp có chứa cấu hình bộ biên mã không hợp lệ" FailedToStartStream.StatusMissingHTML="Yêu cầu phát trực tiếp trả về lỗi không xác định" FailedToStartStream.NoConfigSupplied="Thiếu cấu hình" MultitrackVideo.Info="%1 tự động tối ưu hóa cài đặt của bạn để mã hóa và gửi nhiều chất lượng video tới. Việc chọn tùy chọn này sẽ gửi %2 thông tin về máy tính và cài đặt phần mềm của bạn." @@ -1274,3 +1289,11 @@ MultitrackVideo.IncompatibleSettings.AudioChannels="%1 hiện không tương thích với Âm thanh → Chung → Kênh được đặt thành '%2', %3" MultitrackVideo.IncompatibleSettings.AudioChannelsSingle="Âm thanh → Chung → Kênh cần được đặt thành '%1'" MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 yêu cầu nhiều cài đặt khác nhau cho Âm thanh → Chung → Kênh" +Basic.OpenPluginManager="Trình quản lí trình cắm" +PluginManager="Trình quản lí trình cắm" +PluginManager.Restart="OBS Studio cần phải được khởi động lại để áp dụng các thay đổi cho trình cắm" +PluginManager.MissingPlugin="KHÔNG THẤY TRÌNH CẮM" +PluginManager.Section.Discover="Duyệt" +PluginManager.Section.Manage="Đã cài" +PluginManager.Section.Updates="Cập nhật" +PluginManager.Section.Manage.Title="Quản lí các trình cắm đã bật"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/zh-CN.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/zh-CN.ini
Changed
@@ -54,8 +54,8 @@ FadeToBlack="淡出到黑色" Left="左" Right="右" -Top="上" -Bottom="下" +Top="顶部" +Bottom="底部" Reset="重置" Hours="小时" Minutes="分钟" @@ -111,6 +111,7 @@ List="列表" Grid="网格" Automatic="自动" +ComingSoon="即将推出" PluginsFailedToLoad.Title="插件加载出错" PluginsFailedToLoad.Text="以下 OBS 插件加载失败:\n\n%1\n请更新或移除这些插件。" AlreadyRunning.Title="OBS 已在运行" @@ -337,8 +338,8 @@ ConfirmStopRecord.Text="你确定要停止录制吗?" ConfirmBWTest.Title="开始带宽测试?" ConfirmBWTest.Text="您已经在带宽测试模式下配置了 OBS。此模式允许在不开启频道的情况下进行网络测试。完成测试后,您需要禁用它,以便观众能够看到您的直播。\n\n是否继续?" -ConfirmExit.Title="退出OBS?" -ConfirmExit.Text="OBS 正在运行。将停止所有的直播和录制。确定要退出吗?" +ConfirmExit.Title="输出正在活动中" +ConfirmExit.Text="OBS 目前正在进行推流 / 录制任务,确认停止当前正在进行的所有任务并关闭程序吗?" ConfirmRemove.Title="确认删除" ConfirmRemove.Text="您确定要移除“%1”吗?" ConfirmRemove.TextMultiple="您确定要删除 %1 项目吗?" @@ -827,12 +828,15 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="启用配置覆盖" Basic.Settings.Stream.MultitrackVideoLabel="多轨视频" Basic.Settings.Stream.MultitrackVideoExtraCanvas="额外画布" +Basic.Settings.Stream.WHIPSimulcastLabel="同播" +Basic.Settings.Stream.WHIPSimulcastInfo="同播功能允许您编码和发送多种视频质量。<a href='https://obsproject.com/kb/whip-streaming-guide'>了解更多</a>" +Basic.Settings.Stream.WHIPSimulcastTotalLayers="总层数" Basic.Settings.Stream.AdvancedOptions="高级选项" Basic.Settings.Output="输出" Basic.Settings.Output.Format="录像格式" Basic.Settings.Output.Format.MKV="Matroska 视频 (.mkv)" -Basic.Settings.Output.Format.hMP4="混合 MP4 测试版 (.mp4)" -Basic.Settings.Output.Format.hMOV="混合 MOV 测试版 (.mov)" +Basic.Settings.Output.Format.hMP4="混合 MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="混合 MOV (.mov)" Basic.Settings.Output.Format.fMP4="分片 MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="分片 MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="分片 MOV 以块的形式录制,不需要像传统 MOV 文件一样做最后处理。\n这确保即使磁盘写入中断 (例如,由于蓝屏或断电),文件仍可播放。\n\n可能不是所有播放器和编辑软件都能兼容。必要的话,请使用 “文件 → 录像转封装” 将文件转换为更兼容的格式。" @@ -1003,6 +1007,7 @@ Basic.Settings.Video.Numerator="分子:" Basic.Settings.Video.Denominator="分母:" Basic.Settings.Video.Renderer="渲染器" +Basic.Settings.Video.Renderer.Experimental="%1 (实验性)" Basic.Settings.Video.InvalidResolution="无效的分辨率值。必须是 宽x高(如 1920x1080)" Basic.Settings.Video.CurrentlyActive="视频输出处于活动状态。请关闭任何输出以更改视频设置。" Basic.Settings.Video.DownscaleFilter.Bilinear="双线性插值(最快, 但会变模糊)" @@ -1315,7 +1320,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 需要对 音频 → 常规 → 声道 进行多个不同的设置" Basic.OpenPluginManager="插件管理器" PluginManager="插件管理器" -PluginManager.HelpText="插件管理器" -PluginManager.Restart="重启 OBS?" -PluginManager.NeedsRestart="要应用这些更改,OBS 需要重启。您要立即重启吗?" +PluginManager.Restart="必须重启 OBS Studio 才能应用插件更改" PluginManager.MissingPlugin="未找到插件" +PluginManager.Section.Discover="浏览" +PluginManager.Section.Manage="已安装" +PluginManager.Section.Updates="更新" +PluginManager.Section.Manage.Title="管理已启用的插件"
View file
obs-studio-32.0.4.tar.xz/frontend/data/locale/zh-TW.ini -> obs-studio-32.1.0.tar.xz/frontend/data/locale/zh-TW.ini
Changed
@@ -10,7 +10,7 @@ No="否" Add="新增" Remove="移除" -Rename="重新命名" +Rename="重新命名…" Interact="互動" Filters="濾鏡" Properties="屬性" @@ -30,7 +30,7 @@ Projector.Open.Scene="開啟場景投影" Projector.Open.Source="開啟來源投影" Projector.Open.Multiview="開啟多重檢視" -Projector.Display="螢幕:%1" +Projector.Display="顯示器:%1" Projector.Window="新視窗" Projector.Title="投影" Projector.Title.Scene="場景:%1" @@ -43,8 +43,8 @@ Hide="隱藏" UnhideAll="全數取消隱藏" Untitled="無標題" -New="新增" -Duplicate="複製" +New="新增…" +Duplicate="複製…" Enable="啟用" DisableOSXVSync="關閉 macOS 垂直同步" ResetOSXVSyncOnExit="離開時重設 macOS 垂直同步" @@ -111,6 +111,7 @@ List="清單" Grid="網格" Automatic="自動" +ComingSoon="即將推出" PluginsFailedToLoad.Title="載入外掛程式時發生錯誤" PluginsFailedToLoad.Text="無法載入下列 OBS 外掛程式:\n\n%1\n請更新或移除這些外掛程式。" AlreadyRunning.Title="OBS 已經執行" @@ -337,9 +338,7 @@ ConfirmStopRecord.Text="您是否要停止錄製?" ConfirmBWTest.Title="開始頻寬測試?" ConfirmBWTest.Text="你已在頻寬測試模式下設定了 OBS。此模式允許在沒有開始串流的情況下進行網路測試。完成測試後,你要停用它才可以進行串流。\n\n要繼續嗎?" -ConfirmExit.Title="關閉 OBS?" -ConfirmExit.Text="正在使用 OBS,所有的串流/錄製都將被關閉。您確定要退出嗎?" -ConfirmRemove.Title="確認刪除?" +ConfirmRemove.Title="確認刪除" ConfirmRemove.Text="您確定要移除「%1」嗎?" ConfirmRemove.TextMultiple="您確定要移除這 %1 個項目嘛?" ConfirmReset.Title="重設屬性" @@ -349,11 +348,11 @@ Output.StartReplayFailed="無法啟動重播緩衝區" Output.StartVirtualCamFailed="啟動虛擬相機失敗" Output.StartFailedGeneric="啟動輸出失敗。 詳情請看記錄檔。\n\n注意︰ 如果你使用 NVENC 或 AMD 編碼器,請確保您的視訊驅動程式是最新。" -Output.ReplayBuffer.PauseWarning.Title="暫停時,無法儲存檔案。" +Output.ReplayBuffer.PauseWarning.Title="暫停時,無法儲存檔案" Output.ReplayBuffer.PauseWarning.Text="警告:錄影暫停時,將無法儲存重播。" Output.ConnectFail.Title="連線失敗" Output.ConnectFail.BadPath="無效的路徑或 URL。 請確認您的設定是正確的。" -Output.ConnectFail.ConnectFailed="與伺服器連線失敗。" +Output.ConnectFail.ConnectFailed="與伺服器連線失敗" Output.ConnectFail.InvalidStream="無法訪問指定的頻道或串流金鑰,請仔細檢查您的串流金鑰。 如果它是正確的有可能是連接到伺服器時出現問題。" Output.ConnectFail.HdrDisabled="目前這個輸出已停用 HDR 輸出。" Output.ConnectFail.Error="嘗試連線伺服器時發生非預期的錯誤。詳細資訊請見記錄檔。" @@ -364,7 +363,7 @@ Output.RecordFail.Title="無法開始錄影" Output.RecordFail.Unsupported="輸出格式不被支援或不支援超過一個音軌。請確認你的設定後再試一次。" Output.RecordNoSpace.Title="硬碟空間不足" -Output.RecordNoSpace.Msg="沒有足夠的空間存放錄製影片" +Output.RecordNoSpace.Msg="沒有足夠的空間存放錄製影片。" Output.RecordError.Title="錄製錯誤" Output.RecordError.Msg="在錄製時發生了預料外的錯誤。" Output.RecordError.EncodeErrorMsg="錄影時編碼器發生錯誤。" @@ -438,7 +437,7 @@ MacPermissions.Item.Microphone.Details="如果您想用麥克風或其他錄音器,請允許 OBS 的錄音權利。" MacPermissions.Item.InputMonitoring="輸入監視" MacPermissions.Item.InputMonitoring.Details="當OBS在背景執行時需要取得權限來使用快速鍵。" -MacPermissions.Item.Accessibility="輔助使用" +MacPermissions.Item.Accessibility="協助工具" MacPermissions.Item.Accessibility.Details="在舊版本的安裝上,OBS 可能列為“可訪問性”,而不是“輸入監視”。" MacPermissions.Continue="繼續" SourceLeak.Title="清理來源時發生錯誤" @@ -473,7 +472,7 @@ Deinterlacing.Discard="捨棄" Deinterlacing.TopFieldFirst="由偶數場開始" Deinterlacing.BottomFieldFirst="由奇數場開始" -VolControl.SliderUnmuted="'%1' 的音量滑桿︰" +VolControl.SliderUnmuted="「%1」的音量滑桿︰" VolControl.SliderMuted="'%1' 的音量滑桿︰(目前靜音中)" VolControl.Mute="靜音 '%1'" VolControl.Properties="'%1' 的屬性" @@ -650,7 +649,7 @@ Basic.MainMenu.Edit.Scale.ZoomOut="縮小" Basic.MainMenu.Edit.Scale.ResetZoom="重設縮放" Basic.MainMenu.Edit.Transform="變換 (&T)" -Basic.MainMenu.Edit.Transform.EditTransform="編輯變換設定 (&E)…" +Basic.MainMenu.Edit.Transform.EditTransform="編輯變換設定(&E)" Basic.MainMenu.Edit.Transform.CopyTransform="複製變換" Basic.MainMenu.Edit.Transform.PasteTransform="貼上變換" Basic.MainMenu.Edit.Transform.ResetTransform="重設變換設定 (&R)" @@ -684,7 +683,7 @@ Basic.MainMenu.Docks.ResetDocks="重設停駐視窗 (&R)" Basic.MainMenu.Docks.LockDocks="鎖定停駐視窗 (&L)" Basic.MainMenu.Docks.SideDocks="全高度停駐視窗 (&F)" -Basic.MainMenu.Docks.CustomBrowserDocks="自訂瀏覽器停駐視窗 (&C)…" +Basic.MainMenu.Docks.CustomBrowserDocks="自訂瀏覽器停駐視窗(&C)" Basic.MainMenu.Import="匯入..." Basic.MainMenu.Export="匯出..." Basic.MainMenu.SceneCollection="場景群組 (&S)" @@ -827,12 +826,12 @@ Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="啟用配置覆寫" Basic.Settings.Stream.MultitrackVideoLabel="多軌視頻" Basic.Settings.Stream.MultitrackVideoExtraCanvas="額外的畫布" -Basic.Settings.Stream.AdvancedOptions="進階選項 " +Basic.Settings.Stream.AdvancedOptions="進階選項" Basic.Settings.Output="輸出" Basic.Settings.Output.Format="錄影格式" Basic.Settings.Output.Format.MKV="Matroska 視訊檔案 (.mkv)" -Basic.Settings.Output.Format.hMP4="混合 MP4 測試版 (.mp4)" -Basic.Settings.Output.Format.hMOV="混合 MOV 測試版 (.mov)" +Basic.Settings.Output.Format.hMP4="混合 MP4 (.mp4)" +Basic.Settings.Output.Format.hMOV="混合 MOV (.mov)" Basic.Settings.Output.Format.fMP4="分段 MP4 (.mp4)" Basic.Settings.Output.Format.fMOV="分段 MOV (.mov)" Basic.Settings.Output.Format.TT.fragmented_mov="分段的 MOV 會分塊寫入錄影內容,並且和傳統 MOV 檔案不同,不需要寫入檔案結尾。\n這樣「寫入磁碟」程序即便被打斷(舉例來說,因為 BSOD 或斷電),檔案依然是可以播放的。\n\n這可能不相容某些播放器和編輯器,如果需要相容的話,可以使用 檔案 → 重新封裝錄影 將檔案轉換為更能廣泛相容的格式。" @@ -866,7 +865,7 @@ Basic.Settings.Output.Simple.Warn.AudioBitrate="警告:串流音訊位元速率將設定到目前串流服務的最高值—%1。" Basic.Settings.Output.Simple.Warn.CannotPause="警告:如果錄影編碼器畫質設為「(和串流編碼器相同)」,錄影時將無法暫停。" Basic.Settings.Output.Simple.Warn.IncompatibleContainer="警告:目前選擇的錄影格式與選擇的串流編碼器不相容。" -Basic.Settings.Output.Simple.Warn.Encoder="警告:如果錄影與串流同時運作,並使用與串流不同的編碼品質設定將會增加額外的CPU使用量" +Basic.Settings.Output.Simple.Warn.Encoder="警告:如果錄影與串流同時運作,並使用與串流不同的編碼品質設定,將會增加額外的 CPU 使用量。" Basic.Settings.Output.Simple.Warn.Lossless="警告:無損品質的錄影會產生極大的檔案!在高解析度和高影格率下,無損品質每分鐘可能消耗超過 7GB 的磁碟空間。除非你有大量的磁碟空間,否則不建議在長時間錄影時使用無損品質。使用無損品質時,無法使用重播緩衝功能。" Basic.Settings.Output.Simple.Warn.Lossless.Msg="你確定你想要使用無損畫質?" Basic.Settings.Output.Simple.Warn.Lossless.Title="無損畫質警告!" @@ -906,7 +905,7 @@ Basic.Settings.Output.CustomMuxerSettings="自訂 Muxer 設定" Basic.Settings.Output.NoSpaceFileName="產生沒有空格的檔案名稱" Basic.Settings.Output.Adv.Rescale="重新縮放輸出" -Basic.Settings.Output.Adv.Rescale.Disabled=" 停用" +Basic.Settings.Output.Adv.Rescale.Disabled="停用" Basic.Settings.Output.Adv.AudioTrack="音軌" Basic.Settings.Output.Adv.Streaming="串流" Basic.Settings.Output.Adv.Streaming.Settings="串流設定" @@ -991,18 +990,19 @@ FilenameFormatting.TT.ORES="輸出(縮放)解析度" FilenameFormatting.TT.VF="影像格式" Basic.Settings.Video="影像" -Basic.Settings.Video.Adapter="顯示卡:" -Basic.Settings.Video.BaseResolution="來源(畫布)解析度:" -Basic.Settings.Video.ScaledResolution="輸出(縮放)解析度:" -Basic.Settings.Video.DownscaleFilter="壓縮方式:" +Basic.Settings.Video.Adapter="視訊轉接器" +Basic.Settings.Video.BaseResolution="來源(畫布)解析度" +Basic.Settings.Video.ScaledResolution="輸出(縮放)解析度" +Basic.Settings.Video.DownscaleFilter="降階濾波器" Basic.Settings.Video.DownscaleFilter.Unavailable="解析度相配,無需縮減" -Basic.Settings.Video.FPS="FPS (影格率):" -Basic.Settings.Video.FPSCommon="常用 FPS:" -Basic.Settings.Video.FPSInteger="自訂 FPS:" -Basic.Settings.Video.FPSFraction="自訂 FPS 比率:" -Basic.Settings.Video.Numerator="影格數(分子):" -Basic.Settings.Video.Denominator="秒數(分母):" -Basic.Settings.Video.Renderer="渲染器:" +Basic.Settings.Video.FPS="FPS(影格率)" +Basic.Settings.Video.FPSCommon="常用 FPS 數值" +Basic.Settings.Video.FPSInteger="整數 FPS 數值" +Basic.Settings.Video.FPSFraction="浮點數 FPS 數值" +Basic.Settings.Video.Numerator="分子" +Basic.Settings.Video.Denominator="分母" +Basic.Settings.Video.Renderer="渲染器" +Basic.Settings.Video.Renderer.Experimental="%1(實驗性)" Basic.Settings.Video.InvalidResolution="無效的解析度。 必須表達為 寬x高 (例如:1920x1080)" Basic.Settings.Video.CurrentlyActive="目前影像輸出進行中。 請先停止輸出以便修改影像設定。" Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear(快速,但縮放時易模糊)" @@ -1332,7 +1332,9 @@ MultitrackVideo.IncompatibleSettings.AudioChannelsMultiple="%1 需要為 音效 → 一般 → 頻道 設置多種不同的設定" Basic.OpenPluginManager="外掛管理器" PluginManager="外掛管理器" -PluginManager.HelpText="外掛管理器" -PluginManager.Restart="重新啟動 OBS?" -PluginManager.NeedsRestart="要應用這些更改,OBS 需要重新啟動。您現在要重新啟動嗎?" +PluginManager.Restart="OBS Studio 需要重新啟動才能套用外掛變更" PluginManager.MissingPlugin="找不到外掛" +PluginManager.Section.Discover="瀏覽" +PluginManager.Section.Manage="已安裝" +PluginManager.Section.Updates="更新" +PluginManager.Section.Manage.Title="管理已啟用的外掛"
View file
obs-studio-32.1.0.tar.xz/frontend/data/themes/Dark/headphones-off.svg
Added
@@ -0,0 +1,1 @@ +<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" width="160" height="160"><style>.a{fill:#fefefe;opacity:0.4;}.b{fill:#fefefe}</style><path class="a" d="m150 65.6c0-25-13-43.6-35-56.6-11-6-23-9-35-9-12 0-24 3-35 9-22 13-35 36-35 61v60c0 0 0 20 20 20h10c6 0 10-4 10-10v-40c0-6-5-10-10-10 0 0-10 0-10-10v-10c0-18 10-34 25-43 15-9 35-9 50 0 15 9 25.5 22.5 25.5 40.8l19.5-0.2z"/><path class="b" d="m90 78q-4.8 0-8.4 3.6c-4.8 4.8-4.8 12 0 16.8l15.6 15.6-15.6 15.6c-4.8 4.8-4.8 12 0 16.8 4.8 4.8 12 4.8 16.8 0l15.6-15.6 15.6 15.6c4.8 4.8 12 4.8 16.8 0 4.8-4.8 4.8-12 0-16.8l-15.6-15.6 15.6-15.6c4.8-4.8 4.8-12 0-16.8q-3.6-3.6-8.4-3.6-4.8 0-8.4 3.6l-15.6 15.6-15.6-15.6q-3.6-3.6-8.4-3.6z"/></svg> \ No newline at end of file
View file
obs-studio-32.1.0.tar.xz/frontend/data/themes/Dark/headphones.svg
Added
@@ -0,0 +1,1 @@ +<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><style>.a{fill:#fefefe}</style><path class="a" d="m8 0c-1.2 0-2.4 0.3-3.5 0.9-2.2 1.3-3.5 3.6-3.5 6.1v6c0 0 0 2 2 2h1c0.6 0 1-0.4 1-1v-4c0-0.6-0.5-1-1-1 0 0-1 0-1-1v-1c0-1.8 1-3.4 2.5-4.3 1.5-0.9 3.5-0.9 5 0 1.5 0.9 2.5 2.5 2.5 4.3v1c0 1-1 1-1 1-0.5 0-1 0.4-1 1v4c0 0.6 0.4 1 1 1h1c2 0 2-2 2-2v-6c0-2.5-1.3-4.8-3.5-6.1-1.1-0.6-2.3-0.9-3.5-0.9z"/></svg> \ No newline at end of file
View file
obs-studio-32.1.0.tar.xz/frontend/data/themes/Dark/layout-horizontal.svg
Added
@@ -0,0 +1,8 @@ +<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" width="160" height="160"> + <style> + .s0 { fill: #fefefe } + </style> + <g> + <path class="s0" d="m160 42c0-16.45-13.55-30-30-30h-100c-16.45 0-30 13.55-30 30v76c0 16.45 13.55 30 30 30h100c16.45 0 30-13.55 30-30zm-20 0v28h-120v-28c0-5.7 4.3-10 10-10h100c5.7 0 10 4.3 10 10zm0 48v28c0 5.7-4.3 10-10 10h-100c-5.7 0-10-4.3-10-10v-28z"/> + </g> +</svg> \ No newline at end of file
View file
obs-studio-32.1.0.tar.xz/frontend/data/themes/Dark/layout-vertical.svg
Added
@@ -0,0 +1,8 @@ +<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" width="160" height="160"> + <style> + .s0 { fill: #fefefe } + </style> + <g> + <path class="s0" d="m42 0c-16.45 0-30 13.55-30 30v100c0 16.45 13.55 30 30 30h76c16.45 0 30-13.55 30-30v-100c0-16.45-13.55-30-30-30zm0 20h28v120h-28c-5.7 0-10-4.3-10-10v-100c0-5.7 4.3-10 10-10zm48 0h28c5.7 0 10 4.3 10 10v100c0 5.7-4.3 10-10 10h-28z"/> + </g> +</svg> \ No newline at end of file
View file
obs-studio-32.1.0.tar.xz/frontend/data/themes/Light/headphones-off.svg
Added
@@ -0,0 +1,1 @@ +<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" width="160" height="160"><style>.a{fill:#202020;opacity:0.4;}.b{fill:#202020}</style><path class="a" d="m150 65.6c0-25-13-43.6-35-56.6-11-6-23-9-35-9-12 0-24 3-35 9-22 13-35 36-35 61v60c0 0 0 20 20 20h10c6 0 10-4 10-10v-40c0-6-5-10-10-10 0 0-10 0-10-10v-10c0-18 10-34 25-43 15-9 35-9 50 0 15 9 25.5 22.5 25.5 40.8l19.5-0.2z"/><path class="b" d="m90 78q-4.8 0-8.4 3.6c-4.8 4.8-4.8 12 0 16.8l15.6 15.6-15.6 15.6c-4.8 4.8-4.8 12 0 16.8 4.8 4.8 12 4.8 16.8 0l15.6-15.6 15.6 15.6c4.8 4.8 12 4.8 16.8 0 4.8-4.8 4.8-12 0-16.8l-15.6-15.6 15.6-15.6c4.8-4.8 4.8-12 0-16.8q-3.6-3.6-8.4-3.6-4.8 0-8.4 3.6l-15.6 15.6-15.6-15.6q-3.6-3.6-8.4-3.6z"/></svg> \ No newline at end of file
View file
obs-studio-32.1.0.tar.xz/frontend/data/themes/Light/headphones.svg
Added
@@ -0,0 +1,1 @@ +<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><style>.a{fill:#202020}</style><path class="a" d="m8 0c-1.2 0-2.4 0.3-3.5 0.9-2.2 1.3-3.5 3.6-3.5 6.1v6c0 0 0 2 2 2h1c0.6 0 1-0.4 1-1v-4c0-0.6-0.5-1-1-1 0 0-1 0-1-1v-1c0-1.8 1-3.4 2.5-4.3 1.5-0.9 3.5-0.9 5 0 1.5 0.9 2.5 2.5 2.5 4.3v1c0 1-1 1-1 1-0.5 0-1 0.4-1 1v4c0 0.6 0.4 1 1 1h1c2 0 2-2 2-2v-6c0-2.5-1.3-4.8-3.5-6.1-1.1-0.6-2.3-0.9-3.5-0.9z"/></svg> \ No newline at end of file
View file
obs-studio-32.1.0.tar.xz/frontend/data/themes/Light/layout-horizontal.svg
Added
@@ -0,0 +1,8 @@ +<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" width="160" height="160"> + <style> + .s0 { fill: #202020 } + </style> + <g> + <path class="s0" d="m160 42c0-16.45-13.55-30-30-30h-100c-16.45 0-30 13.55-30 30v76c0 16.45 13.55 30 30 30h100c16.45 0 30-13.55 30-30zm-20 0v28h-120v-28c0-5.7 4.3-10 10-10h100c5.7 0 10 4.3 10 10zm0 48v28c0 5.7-4.3 10-10 10h-100c-5.7 0-10-4.3-10-10v-28z"/> + </g> +</svg> \ No newline at end of file
View file
obs-studio-32.1.0.tar.xz/frontend/data/themes/Light/layout-vertical.svg
Added
@@ -0,0 +1,8 @@ +<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" width="160" height="160"> + <style> + .s0 { fill: #202020 } + </style> + <g> + <path class="s0" d="m42 0c-16.45 0-30 13.55-30 30v100c0 16.45 13.55 30 30 30h76c16.45 0 30-13.55 30-30v-100c0-16.45-13.55-30-30-30zm0 20h28v120h-28c-5.7 0-10-4.3-10-10v-100c0-5.7 4.3-10 10-10zm48 0h28c5.7 0 10 4.3 10 10v100c0 5.7-4.3 10-10 10h-28z"/> + </g> +</svg> \ No newline at end of file
View file
obs-studio-32.0.4.tar.xz/frontend/data/themes/System.obt -> obs-studio-32.1.0.tar.xz/frontend/data/themes/System.obt
Changed
@@ -1,4 +1,4 @@ -/* Intentionnally left blank */ +/* Intentionally left blank */ /* Themes are created using Qt CSS, you can visit */ /* http://doc.qt.io/qt-5/stylesheet-reference.html and */ /* http://doc.qt.io/qt-5/stylesheet-examples.html for examples. */
View file
obs-studio-32.0.4.tar.xz/frontend/data/themes/Yami.obt -> obs-studio-32.1.0.tar.xz/frontend/data/themes/Yami.obt
Changed
@@ -12,42 +12,49 @@ --blue3: #284CB8; --blue4: #213E97; --blue5: #1A3278; + --blue6: #162A64; --red1: #E85E75; --red2: #E33B57; --red3: #C01C37; --red4: #A1172E; --red5: #7D1224; + --red6: #590D1A; --pink1: #E5619A; --pink2: #E03E84; --pink3: #C11F65; --pink4: #9E1A53; --pink5: #7B1441; + --pink6: #580E2E; --teal1: #3DBEF5; --teal2: #16B1F3; --teal3: #0981B4; --teal4: #086F9B; --teal5: #065374; + --teal6: #04374E; --purple1: #997FDC; --purple2: #805FD3; --purple3: #5B34BF; --purple4: #4D2CA0; --purple5: #3D2380; + --purple6: #2E1A60; --green1: #59D966; --green2: #37D247; --green3: #25A231; --green4: #1E8528; --green5: #17641E; + --green6: #0F4313; --yellow1: #EABC48; --yellow2: #E5AF24; --yellow3: #B88A16; --yellow4: #926E11; --yellow5: #6E520D; + --yellow6: #493709; --grey1: #5B6273; --grey2: #4E5566; @@ -101,7 +108,7 @@ --highlight_color: var(--primary_lighter); /* TODO: Better Accessibility focus state */ - /* TODO: Move Accessibilty Colors to Theme config system */ + /* TODO: Move Accessibility Colors to Theme config system */ --border_highlight: "transparent"; /* OS Fixes */ @@ -109,7 +116,7 @@ --font_base: calc(1pt * var(--font_base_value)); --font_small: max(7pt, calc(0.8pt * var(--font_base_value))); - --font_xsmall: max(6.25pt, calc(0.85pt * var(--font_base_value))); + --font_xsmall: max(6.75pt, calc(0.65pt * var(--font_base_value))); --font_large: calc(1.1pt * var(--font_base_value)); --font_xlarge: calc(1.5pt * var(--font_base_value)); @@ -209,7 +216,7 @@ --separator_hover: var(--white1); --action_row_base: calc(var(--input_height_base) * 0.75); - --action_row_height: calc(var(--action_row_base) + calc(var(--action_row_padding) * 2)); + --action_row_height: calc(var(--action_row_base) + calc(var(--action_row_padding) * 2px)); --action_row_border: 3px; --action_row_input_width: calc(var(--action_row_base) * 4); --action_row_collapse: calc(var(--action_row_base) + var(--padding_large)); @@ -280,6 +287,14 @@ font-weight: bold; } +.text-small { + font-size: var(--font_small); +} + +.text-tiny { + font-size: var(--font_xsmall); +} + .text-heading { font-size: var(--font_heading); font-weight: bold; @@ -289,6 +304,14 @@ font-size: var(--font_large); } +.text-bold { + font-weight: bold; +} + +.text-italic { + font-style: italic; +} + .text-bright { color: var(--primary_light); } @@ -335,6 +358,12 @@ margin: var(--spacing_base) 0; } +.subtitle { + font-size: var(--font_small); + font-weight: bold; + color: var(--text_muted); +} + .button-primary { background-color: var(--primary_dark); border-color: var(--primary); @@ -351,6 +380,15 @@ border-color: var(--primary_light); } +.toolbar-button { + background: transparent; + font-weight: bold; + padding: 0 var(--padding_xlarge); + margin: var(--spacing_small) var(--spacing_small) 0px; + border: var(--highlight_width) solid transparent; + border-radius: var(--border_radius); +} + .margin { margin: var(--spacing_base); } @@ -447,6 +485,18 @@ qproperty-icon: url(theme:Dark/close.svg); } +.icon-pin { + qproperty-icon: url(theme:Dark/pin.svg); +} + +.icon-layout-vertical { + qproperty-icon: url(theme:Dark/layout-vertical.svg); +} + +.icon-layout-horizontal { + qproperty-icon: url(theme:Dark/layout-horizontal.svg); +} + /* Media icons */ .icon-media-play { @@ -611,7 +661,16 @@ background: var(--primary); } +/* Toolbars */ + +QToolBar::separator { + background: var(--border_color); + width: 1px; + margin: 0px var(--spacing_base) 0px; +} + /* Item Lists */ + QListWidget { border-radius: var(--border_radius); } @@ -636,14 +695,20 @@ padding: var(--padding_large) var(--padding_large); } -QMenu::item { +QMenu::item, +QMenu > QWidget { padding: var(--padding_large) var(--padding_menu); padding-right: 20px; } +QMenu > QWidget { + outline: none; +} + +QMenu::item, +QMenu > QWidget, QListView::item, -QListWidget::item, -QMenu::item { +QListWidget::item { border-radius: var(--border_radius); color: var(--text); border: 1px solid transparent; @@ -672,6 +737,7 @@ } QMenu::item:selected, +QMenu > QWidget:selected, QListView::item:selected, QListWidget::item:selected { background-color: var(--primary); @@ -752,16 +818,12 @@ OBSDock QToolBar { padding: 1px; margin: 0px; + height: 32px; + max-height: 32px; border-top: 1px solid var(--border_color); spacing: 0; } -OBSDock QToolBar::separator { - background: transparent; - width: var(--spacing_large); - border: none; -} - OBSDock QToolBar QToolButton { background: transparent; border: 1px solid transparent; @@ -1400,10 +1462,11 @@ } QPushButton::menu-indicator { - image: url(theme:Dark/down.svg); + image: url(theme:Dark/collapse.svg); subcontrol-position: right; - subcontrol-origin: padding; - width: 25px; + subcontrol-origin: content; + margin-left: var(--spacing_large); + right: -2px; } QToolButton { @@ -1428,9 +1491,7 @@ QToolButton:hover, QToolButton:focus, .btn-tool:hover, -.btn-tool:focus, -.indicator-mute::indicator:hover, -.indicator-mute::indicator:focus { +.btn-tool:focus { border-color: var(--button_border); background-color: var(--button_bg_hover); } @@ -1526,48 +1587,169 @@ background-color: var(--white5); } -/* Volume Control */ +#stackedMixerArea { + border: none; + padding: 0px; +} -#stackedMixerArea QPushButton { - width: var(--icon_base); - height: var(--icon_base); - background-color: var(--button_bg); +.mixer-category { + color: var(--text_muted); + margin: 0; + padding: 0; + text-align: center; +} + +/* Volume Control Buttons */ + +.btn-mute, +.btn-monitor { + width: var(--icon_small); + height: var(--icon_small); + background-color: transparent; padding: var(--padding_base_border) var(--padding_base_border); - margin: 0px; - border: var(--highlight_width) solid var(--button_border); + margin: 0px var(--spacing_small); + border: var(--highlight_width) solid transparent; border-radius: var(--border_radius); - icon-size: var(--icon_base); + icon-size: var(--icon_small); } -/* This is an incredibly cursed but necessary fix */ -#stackedMixerArea QPushButton:!hover { - background-color: var(--button_bg); +.btn-mute:checked, +.btn-monitor:checked { + background-color: transparent; + border-color: transparent; } -#stackedMixerArea QPushButton:hover { +.btn-mute:hover, +.btn-monitor:hover { background-color: var(--button_bg_hover); - border-color: var(--button_border_hover); + border-color: transparent; } -#stackedMixerArea QPushButton:pressed { +.btn-mute:pressed, +.btn-monitor:pressed { background-color: var(--button_bg_down); } -#stackedMixerArea { - border: none; - padding: 0px; +/* Mute Button */ + +.btn-mute { + color: var(--text); + qproperty-icon: url(theme:Dark/settings/audio.svg); +} + +.btn-mute.checked { + color: var(--red3); + background: transparent; + qproperty-icon: url(theme:Dark/mute.svg); +} + +.btn-mute.checked.hover { + color: var(--red2); + background: var(--grey8); + border-color: var(--red1); +} + +.btn-mute.checked:focus { + border-color: var(--red1); +} + +.btn-mute.mute-unassigned { + color: var(--yellow1); + background: var(--yellow6); + qproperty-icon: url(theme:Dark/unassigned.svg); +} + +.btn-mute.mute-unassigned.hover, +.btn-mute.mute-unassigned:focus { + border-color: var(--yellow1); +} + +/* Monitor Button */ + +.btn-monitor { + background: transparent; + qproperty-icon: url(theme:Dark/headphones-off.svg); +} + +.btn-monitor:focus { + border-color: var(--red1); +} + +.btn-monitor.checked { + background: var(--green4); + qproperty-icon: url(theme:Dark/headphones.svg); +} + +.btn-monitor.checked:focus, +.btn-monitor:checked:focus { + border-color: var(--green1); +} + +.btn-monitor.checked:hover { + background: var(--green3); + border-color: var(--green1); } -VolControl { +.volume-inactive .btn-monitor.checked { + background: var(--grey7); +} + +.volume-inactive .btn-monitor.checked:hover { + background-color: var(--button_bg_hover); +} + +/* Toggle hidden button */ + +.toggle-hidden:checked { + background: var(--purple5); + border-color: var(--purple3); +} + +.toggle-hidden:disabled { + background: transparent; + border-color: transparent; +} + +VolumeControl, +VolumeMeter { background: var(--bg_base); } -VolControl QLabel { +VolumeMeter { + color: var(--grey3); + font-size: 7.5pt; + font-weight: bold; + + qproperty-backgroundNominalColor: var(--green5); + qproperty-backgroundWarningColor: var(--yellow5); + qproperty-backgroundErrorColor: var(--red5); + qproperty-foregroundNominalColor: var(--green2); + qproperty-foregroundWarningColor: var(--yellow2); + qproperty-foregroundErrorColor: var(--red2); + qproperty-magnitudeColor: rgb(0, 0, 0); + qproperty-majorTickColor: var(--white5); + qproperty-minorTickColor: var(--grey1); +} + +VolumeName { + background: transparent; + padding: var(--padding_base); +} + +VolumeName QLabel { font-size: var(--font_small); - margin: var(--spacing_small) 0px; } -VolControl #volLabel { +VolumeName:focus { + border: 1px solid var(--button_border_hover); +} + +VolumeName:hover { + background: var(--button_bg_hover); + border: 1px solid var(--button_border_hover); +} + +VolumeControl #volLabel { padding: var(--padding_base) 0px var(--padding_base); text-align: center; font-size: var(--font_base); @@ -1575,74 +1757,130 @@ } /* Horizontal Mixer */ -#hMixerScrollArea VolControl { - padding: 0px var(--padding_xlarge) var(--padding_base); +#hVolumeWidgets VolumeControl { + padding: 0px 0px; border-bottom: 1px solid var(--border_color); + margin-bottom: 0px; } -#hMixerScrollArea VolControl QSlider { - margin: 0px 0px var(--padding_base); +#hVolumeWidgets .mixer-category { + min-width: 72px; + margin: var(--spacing_base); + border-radius: var(--border_radius); +} + +#hVolumeWidgets VolumeName QLabel { + margin: 0px var(--spacing_base) var(--spacing_base); } -#hMixerScrollArea VolControl QSlider::groove:horizontal { +#hVolumeWidgets #volLabel { + margin: var(--spacing_base); + border-radius: var(--border_radius); +} + +#hVolumeWidgets #volMeterFrame { + margin-bottom: var(--padding_xlarge); +} + +#hVolumeWidgets VolumeControl QSlider { + margin: var(--padding_large) 0px var(--padding_xlarge); +} + +#hVolumeWidgets VolumeControl QSlider::groove:horizontal { background: var(--bg_window); height: var(--volume_slider); } +#hVolumeWidgets VolumeControl QPushButton { + margin-left: var(--padding_xlarge); +} + +#hVolumeWidgets VolumeControl #volMeterFrame { + padding: 0 var(--padding_xlarge); +} + /* Vertical Mixer */ -#vMixerScrollArea VolControl { - padding: var(--padding_container) 0px var(--padding_container); +#vVolumeWidgets VolumeControl { + padding: 0px 0px var(--padding_container); border-right: 1px solid var(--border_color); } -#vMixerScrollArea VolControl QSlider { +#vVolumeWidgets .mixer-category { + border-bottom: 1px solid var(--border_color); +} + +#vMixerScrollArea VolumeControl QSlider { width: var(--volume_slider_box); margin: 0px var(--padding_xlarge); } -#vMixerScrollArea VolControl #volLabel { +#vVolumeWidgets VolumeControl #volLabel { padding: var(--padding_base) 0px var(--padding_base); min-width: var(--volume_slider_label); margin-left: var(--padding_xlarge); text-align: center; } -#vMixerScrollArea VolControl QSlider::groove:vertical { +#vVolumeWidgets VolumeControl QSlider::groove:vertical { background: var(--bg_window); width: var(--volume_slider); } -#vMixerScrollArea VolControl #volMeterFrame { +#vVolumeWidgets VolumeControl #volMeterFrame { padding: var(--padding_large) var(--padding_xlarge) var(--padding_large) 0px; } -#vMixerScrollArea VolControl QLabel { +#vVolumeWidgets VolumeControl QLabel { padding: 0px var(--padding_large); } -#vMixerScrollArea VolControl QPushButton { - margin-left: var(--spacing_base); - margin-right: var(--padding_xlarge); +/* Hidden Volume Controls */ +VolumeControl.volume-hidden, +VolumeControl.volume-hidden VolumeMeter, +VolumeControl.volume-inactive VolumeMeter, +VolumeControl.volume-inactive { + background: var(--grey7); } -#vMixerScrollArea VolControl .indicator-mute { - margin-left: var(--padding_xlarge); +VolumeControl.volume-hidden .mixer-name, +VolumeControl.volume-inactive .mixer-name { + color: var(--text_muted); } -VolumeMeter { - background: transparent; +VolumeControl .mixer-category { + font-weight: bold; + background: var(--blue6); + color: var(--blue1); } -VolumeMeter { - qproperty-backgroundNominalColor: var(--green5); - qproperty-backgroundWarningColor: var(--yellow5); - qproperty-backgroundErrorColor: var(--red5); - qproperty-foregroundNominalColor: var(--green2); - qproperty-foregroundWarningColor: var(--yellow2); - qproperty-foregroundErrorColor: var(--red2); - qproperty-magnitudeColor: rgb(0, 0, 0); - qproperty-majorTickColor: var(--white1); - qproperty-minorTickColor: var(--grey1); +VolumeControl.volume-pinned .mixer-category { + background: var(--blue5); + color: var(--text); +} + +VolumeControl.volume-hidden .mixer-category { + background: var(--purple6); + color: var(--purple1); +} + +VolumeControl.volume-unassigned .mixer-category { + background: var(--yellow6); + color: var(--yellow1); +} + +VolumeControl.volume-inactive .mixer-category { + background: var(--grey8); + color: var(--text_muted); +} + +VolumeControl.volume-preview .mixer-category { + background: var(--green6); + color: var(--green1); +} + +#stackedMixerArea VolumeControl.volume-hidden QSlider::groove, +#stackedMixerArea VolumeControl.volume-inactive QSlider::groove { + background: var(--grey8); } /* Status Bar */ @@ -1754,7 +1992,6 @@ QCheckBox::indicator:unchecked:hover, QGroupBox::indicator:unchecked:hover, QTableView::indicator:unchecked:hover { - border: none; image: url(theme:Yami/checkbox_unchecked_focus.svg); } @@ -1828,75 +2065,6 @@ image: url(:res/images/invisible.svg); } -/* Mute CheckBox */ - -.indicator-mute { - outline: none; -} - -.indicator-mute::indicator, -.indicator-mute::indicator:unchecked { - width: var(--icon_base); - height: var(--icon_base); - background-color: var(--button_bg); - padding: var(--padding_base_border) var(--padding_base_border); - margin: 0px; - border: var(--highlight_width) solid var(--button_border); - border-radius: var(--border_radius); - icon-size: var(--icon_base); -} - -.indicator-mute::indicator:hover, -.indicator-mute::indicator:unchecked:hover { - background-color: var(--button_bg_hover); - padding: var(--padding_base_border) var(--padding_base_border); - margin: 0px; - border: var(--highlight_width) solid var(--button_border_hover); - icon-size: var(--icon_base); -} - -.indicator-mute::indicator:pressed, -.indicator-mute::indicator:pressed:hover { - background-color: var(--button_bg_down); - border-color: var(--button_border); -} - -.indicator-mute::indicator:checked { - image: url(theme:Dark/mute.svg); -} - -.indicator-mute::indicator:indeterminate { - image: url(theme:Dark/unassigned.svg); -} - -.indicator-mute::indicator:unchecked { - image: url(theme:Dark/settings/audio.svg); -} - -.indicator-mute::indicator:unchecked:hover { - image: url(theme:Dark/settings/audio.svg); -} - -.indicator-mute::indicator:unchecked:focus { - image: url(theme:Dark/settings/audio.svg); -} - -.indicator-mute::indicator:checked:hover { - image: url(theme:Dark/mute.svg); -} - -.indicator-mute::indicator:checked:focus { - image: url(theme:Dark/mute.svg); -} - -.indicator-mute::indicator:checked:disabled { - image: url(theme:Dark/mute.svg); -} - -.indicator-mute::indicator:unchecked:disabled { - image: url(theme:Dark/settings/audio.svg); -} - #hotkeyFilterReset { margin-top: 0px; } @@ -2315,11 +2483,11 @@ border: var(--highlight_width) solid transparent; } -idian--ToggleSwitch:hover { +idian--ToggleSwitch.hover { border-color: var(--grey4); } -idian--ToggleSwitch:checked:hover { +idian--ToggleSwitch.checked.hover { border-color: var(--white1); } @@ -2327,13 +2495,13 @@ border-color: var(--highlight_color); } -idian--Row idian--ToggleSwitch:hover, +idian--Row idian--ToggleSwitch.hover, idian--Row.hover > idian--ToggleSwitch.row-buddy { border-color: var(--grey1); } -idian--Row idian--ToggleSwitch:checked:hover, -idian--Row.hover idian--ToggleSwitch.row-buddy:checked { +idian--Row idian--ToggleSwitch.hover.checked, +idian--Row.hover > idian--ToggleSwitch.checked.row-buddy { border-color: var(--white1); } @@ -2352,7 +2520,7 @@ border-color: transparent; } -idian--Row QComboBox:hover { +idian--Row QComboBox.hover { border-color: var(--grey1); } @@ -2377,7 +2545,7 @@ padding: var(--padding_base) var(--padding_large); } -idian--Row QComboBox QAbstractItemView::item:hover, +idian--Row QComboBox QAbstractItemView.hover::item, idian--Row QComboBox QAbstractItemView::item:selected { background-color: var(--list_item_bg_selected); padding: var(--padding_base) var(--padding_large); @@ -2400,32 +2568,30 @@ outline: none; } -idian--Row idian--CheckBox::indicator, -idian--Row idian--CheckBox::indicator:unchecked:hover { +idian--CheckBox::indicator { border: var(--highlight_width) solid transparent; border-radius: var(--border_radius); } -idian--Row.hover > idian--CheckBox.row-buddy::indicator, -idian--Row > idian--CheckBox::indicator:unchecked:hover, -idian--Row > idian--CheckBox::indicator:hover { - border-color: var(--grey1); -} - -idian--Row.hover > idian--CheckBox.row-buddy::indicator:unchecked, -idian--CheckBox.keyFocus::indicator:unchecked { +idian--CheckBox.keyFocus::indicator, +idian--Row.hover > idian--CheckBox.row-buddy::indicator { image: url(theme:Yami/checkbox_unchecked_focus.svg); } -idian--Row idian--CheckBox.keyFocus::indicator, -idian--Row.hover > idian--CheckBox::indicator { +idian--CheckBox.keyFocus.checked::indicator, +idian--Row.hover > idian--CheckBox.row-buddy.checked::indicator { image: url(theme:Yami/checkbox_checked_focus.svg); } -idian--Row idian--CheckBox.keyFocus::indicator, -idian--Row idian--CheckBox.keyFocus::indicator:unchecked, -idian--Row idian--CheckBox.keyFocus::indicator:hover, -idian--Row idian--CheckBox.keyFocus::indicator:unchecked:hover { +idian--CheckBox.hover::indicator, +idian--CheckBox.checked.hover::indicator, +idian--Row.hover > idian--CheckBox.row-buddy::indicator +idian--Row.hover > idian--CheckBox.row-buddy.checked::indicator { + border-color: var(--grey1); +} + +idian--CheckBox.keyFocus::indicator, +idian--CheckBox.keyFocus.checked::indicator { border-color: var(--highlight_color); } @@ -2497,19 +2663,58 @@ background: var(--grey4); } -idian--RowFrame.hover idian--Row, -idian--RowFrame.hover idian--Row.hover { +idian--RowFrame.hover idian--Row { background: var(--grey4); - border: 2px solid var(--grey1); + border: var(--highlight_width) solid var(--grey1); border-right: none; } idian--RowFrame.hover .row-buddy { background: var(--grey4); - border: 2px solid var(--grey1); + border: var(--highlight_width) solid var(--grey1); border-left: none; } idian--RowFrame.hover idian--ExpandButton::indicator { border-color: var(--grey1); } + +AlignmentSelector { + border: 1px solid var(--input_border); + margin: 0px; + border-radius: 2px; +} + +AlignmentSelector:focus, +AlignmentSelector:hover { + border: 1px solid var(--white3); +} + +AlignmentSelector:checked:hover { + border: 1px solid var(--primary_lighter); +} + +AlignmentSelector::indicator { + margin: 0px; + background: transparent; +} + +AlignmentSelector::indicator:checked { + background: var(--primary); +} + +AlignmentSelector::indicator:checked:focus { + background: var(--primary_light); +} + +AlignmentSelector:disabled { + border: 1px solid var(--grey3); +} + +AlignmentSelector::indicator:disabled { + background: var(--grey5); +} + +AlignmentSelector::indicator:checked:disabled { + background: var(--grey3); +}
View file
obs-studio-32.0.4.tar.xz/frontend/data/themes/Yami_Acri.ovt -> obs-studio-32.1.0.tar.xz/frontend/data/themes/Yami_Acri.ovt
Changed
@@ -122,20 +122,6 @@ border-color: var(--toolbutton_bg_down); } -#stackedMixerArea QPushButton, -#stackedMixerArea QPushButton:!hover { - background-color: var(--toolbutton_bg); - border-color: var(--toolbutton_bg); -} - -#stackedMixerArea QPushButton:hover { - background-color: var(--toolbutton_bg_hover); -} - -#stackedMixerArea QPushButton:pressed { - background-color: var(--toolbutton_bg_down); -} - QTabBar::tab { background-color: var(--grey5); } @@ -229,3 +215,8 @@ QCalendarWidget QSpinBox { background-color: var(--primary_dark); } + +idian--ToggleSwitch { + qproperty-background_checked: var(--button_bg); + qproperty-background_checked_hover: var(--primary_light); +}
View file
obs-studio-32.0.4.tar.xz/frontend/data/themes/Yami_Classic.ovt -> obs-studio-32.1.0.tar.xz/frontend/data/themes/Yami_Classic.ovt
Changed
@@ -201,7 +201,7 @@ } QPushButton:checked { - border-color: var(--primary); + border-color: var(--primary); } QToolButton, @@ -214,22 +214,6 @@ background: var(--bg_base); } -#stackedMixerArea QPushButton { - min-width: var(--icon_base); - padding: var(--padding_large) var(--padding_large); - icon-size: var(--icon_base); -} - -#stackedMixerArea QPushButton:!hover { - background-color: var(--bg_base); - border: none; -} - -#stackedMixerArea QPushButton:hover { - background-color: var(--bg_base); - border: none; -} - #hMixerScrollArea VolControl { padding: 0px var(--padding_container); margin-bottom: 1px; @@ -280,13 +264,6 @@ background-color: var(--bg_window); } -#stackedMixerArea QPushButton, -#stackedMixerArea QPushButton:!hover { - width: var(--icon_base_mixer); - height: var(--icon_base_mixer); - padding: var(--spacing_base); -} - VolumeMeter { qproperty-backgroundNominalColor: rgb(38,127,38); qproperty-backgroundWarningColor: rgb(127,127,38);
View file
obs-studio-32.0.4.tar.xz/frontend/data/themes/Yami_Light.ovt -> obs-studio-32.1.0.tar.xz/frontend/data/themes/Yami_Light.ovt
Changed
@@ -44,16 +44,36 @@ --scrollbar_border: var(--grey7); } +/* Mute Button */ + +.btn-mute { + qproperty-icon: url(theme:Light/settings/audio.svg); +} + +.btn-mute.checked { + qproperty-icon: url(theme:Light/mute.svg); +} + +/* Monitor Button */ + +.btn-monitor { + qproperty-icon: url(theme:Light/headphones-off.svg); +} + +.btn-monitor.checked { + qproperty-icon: url(theme:Light/headphones.svg); +} + VolumeMeter { - qproperty-backgroundNominalColor: rgb(66,112,24); - qproperty-backgroundWarningColor: rgb(112,91,28); - qproperty-backgroundErrorColor: rgb(112,39,53); - qproperty-foregroundNominalColor: rgb(115,189,49); - qproperty-foregroundWarningColor: rgb(189,144,9); - qproperty-foregroundErrorColor: rgb(189,47,73); + qproperty-backgroundNominalColor: var(--green4); + qproperty-backgroundWarningColor: var(--yellow4); + qproperty-backgroundErrorColor: var(--red4); + qproperty-foregroundNominalColor: var(--green1); + qproperty-foregroundWarningColor: var(--yellow1); + qproperty-foregroundErrorColor: var(--red1); qproperty-magnitudeColor: rgb(0,0,0); - qproperty-majorTickColor: palette(text); - qproperty-minorTickColor: palette(light); + qproperty-majorTickColor: var(--black1); + qproperty-minorTickColor: var(--black5); } QMenu::right-arrow { @@ -129,6 +149,14 @@ qproperty-icon: url(theme:Light/close.svg); } +.icon-layout-vertical { + qproperty-icon: url(theme:Light/layout-vertical.svg); +} + +.icon-layout-horizontal { + qproperty-icon: url(theme:Light/layout-horizontal.svg); +} + QToolBarExtension { qproperty-icon: url(theme:Light/dots-vert.svg); } @@ -324,3 +352,33 @@ QCalendarWidget #qt_calendar_nextmonth { qproperty-icon: url(theme:Light/right.svg); } + +/* Idian Widgets */ +idian--ToggleSwitch { + qproperty-background: var(--grey8); + qproperty-background_hover: var(--grey7); + qproperty-background_checked: var(--primary); + qproperty-background_checked_hover: var(--primary_light); +} + +idian--Row QComboBox::down-arrow { + image: url(theme:Light/collapse.svg); +} + +idian--CheckBox.keyFocus::indicator, +idian--Row.hover > idian--CheckBox.row-buddy::indicator { + image: url(theme:Light/checkbox_unchecked_focus.svg); +} + +idian--CheckBox.keyFocus.checked::indicator, +idian--Row.hover > idian--CheckBox.row-buddy.checked::indicator { + image: url(theme:Light/checkbox_checked_focus.svg); +} + +idian--ExpandButton::indicator { + image: url(theme:Light/down.svg); +} + +idian--ExpandButton::indicator:checked { + image: url(theme:Light/up.svg); +}
View file
obs-studio-32.0.4.tar.xz/frontend/data/themes/Yami_Rachni.ovt -> obs-studio-32.1.0.tar.xz/frontend/data/themes/Yami_Rachni.ovt
Changed
@@ -174,20 +174,6 @@ border-color: var(--toolbutton_bg_down); } -#stackedMixerArea QPushButton, -#stackedMixerArea QPushButton:!hover { - background-color: var(--toolbutton_bg); - border-color: var(--toolbutton_bg); -} - -#stackedMixerArea QPushButton:hover { - background-color: var(--toolbutton_bg_hover); -} - -#stackedMixerArea QPushButton:pressed { - background-color: var(--toolbutton_bg_down); -} - QToolButton:disabled, QPushButtontoolButton="true":disabled { background-color: var(--toolbutton_bg_disabled);
View file
obs-studio-32.0.4.tar.xz/frontend/dialogs/NameDialog.cpp -> obs-studio-32.1.0.tar.xz/frontend/dialogs/NameDialog.cpp
Changed
@@ -56,6 +56,9 @@ connect(buttonbox, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(buttonbox, &QDialogButtonBox::rejected, this, &QDialog::reject); + + label->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); + adjustSize(); } static bool IsWhitespace(char ch)
View file
obs-studio-32.0.4.tar.xz/frontend/dialogs/OBSBasicFilters.cpp -> obs-studio-32.1.0.tar.xz/frontend/dialogs/OBSBasicFilters.cpp
Changed
@@ -76,10 +76,10 @@ installEventFilter(CreateShortcutFilter()); - connect(ui->asyncFilters->itemDelegate(), &QAbstractItemDelegate::closeEditor, + connect(ui->asyncFilters->itemDelegate(), &QAbstractItemDelegate::closeEditor, this, this(QWidget *editor) { FilterNameEdited(editor, ui->asyncFilters); }); - connect(ui->effectFilters->itemDelegate(), &QAbstractItemDelegate::closeEditor, + connect(ui->effectFilters->itemDelegate(), &QAbstractItemDelegate::closeEditor, this, this(QWidget *editor) { FilterNameEdited(editor, ui->effectFilters); }); QPushButton *close = ui->buttonBox->button(QDialogButtonBox::Close); @@ -133,7 +133,7 @@ ui->rightLayout->setContentsMargins(0, 0, 0, 0); ui->preview->show(); if (drawable_type) - connect(ui->preview, &OBSQTDisplay::DisplayCreated, addDrawCallback); + connect(ui->preview, &OBSQTDisplay::DisplayCreated, this, addDrawCallback); } else { ui->rightLayout->setContentsMargins(0, noPreviewMargin, 0, 0); ui->preview->hide(); @@ -486,7 +486,7 @@ QAction *popupItem = new QAction(QT_UTF8(type.name.c_str()), this); popupItem->setData(QT_UTF8(type.type.c_str())); - connect(popupItem, &QAction::triggered, this, type() { AddNewFilter(type.type.c_str()); }); + connect(popupItem, &QAction::triggered, this, this, type() { AddNewFilter(type.type.c_str()); }); popup->addAction(popupItem); foundValues = true;
View file
obs-studio-32.0.4.tar.xz/frontend/dialogs/OBSBasicInteraction.cpp -> obs-studio-32.1.0.tar.xz/frontend/dialogs/OBSBasicInteraction.cpp
Changed
@@ -69,7 +69,7 @@ obs_display_add_draw_callback(ui->preview->GetDisplay(), OBSBasicInteraction::DrawPreview, this); }; - connect(ui->preview, &OBSQTDisplay::DisplayCreated, addDrawCallback); + connect(ui->preview, &OBSQTDisplay::DisplayCreated, this, addDrawCallback); } OBSBasicInteraction::~OBSBasicInteraction()
View file
obs-studio-32.0.4.tar.xz/frontend/dialogs/OBSBasicProperties.cpp -> obs-studio-32.1.0.tar.xz/frontend/dialogs/OBSBasicProperties.cpp
Changed
@@ -76,7 +76,11 @@ ui->propertiesLayout->addWidget(view); if (type == OBS_SOURCE_TYPE_TRANSITION) { - connect(view, &OBSPropertiesView::PropertiesRefreshed, this, &OBSBasicProperties::AddPreviewButton); + ui->transitionButton->setVisible(true); + connect(ui->transitionButton, &QPushButton::clicked, this, + &OBSBasicProperties::previewTransitionClicked); + } else { + ui->transitionButton->setVisible(false); } view->show(); @@ -103,7 +107,7 @@ if (drawable_preview && drawable_type) { ui->preview->show(); - connect(ui->preview, &OBSQTDisplay::DisplayCreated, addDrawCallback); + connect(ui->preview, &OBSQTDisplay::DisplayCreated, this, addDrawCallback); } else if (type == OBS_SOURCE_TYPE_TRANSITION) { sourceA = obs_source_create_private("scene", "sourceA", nullptr); @@ -128,7 +132,7 @@ obs_source_inc_active(sourceClone); obs_transition_set(sourceClone, sourceA); - auto updateCallback = =() { + auto updateCallback = this() { OBSDataAutoRelease settings = obs_source_get_settings(source); obs_source_update(sourceClone, settings); @@ -139,14 +143,16 @@ direction = true; }; - connect(view, &OBSPropertiesView::Changed, updateCallback); + connect(view, &OBSPropertiesView::Changed, this, updateCallback); ui->preview->show(); - connect(ui->preview, &OBSQTDisplay::DisplayCreated, addTransitionDrawCallback); + connect(ui->preview, &OBSQTDisplay::DisplayCreated, this, addTransitionDrawCallback); } else { ui->preview->hide(); } + + connect(ui->defaultsButton, &QPushButton::clicked, this, &OBSBasicProperties::restoreDefaultsClicked); } OBSBasicProperties::~OBSBasicProperties() @@ -159,37 +165,6 @@ main->UpdateContextBarDeferred(true); } -void OBSBasicProperties::AddPreviewButton() -{ - QPushButton *playButton = new QPushButton(QTStr("PreviewTransition"), this); - VScrollArea *area = view; - area->widget()->layout()->addWidget(playButton); - - playButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - - auto play = =() { - OBSSource start; - OBSSource end; - - if (direction) { - start = sourceA; - end = sourceB; - } else { - start = sourceB; - end = sourceA; - } - - obs_transition_set(sourceClone, start); - obs_transition_start(sourceClone, OBS_TRANSITION_MODE_AUTO, main->GetTransitionDuration(), end); - direction = !direction; - - start = nullptr; - end = nullptr; - }; - - connect(playButton, &QPushButton::clicked, play); -} - static obs_source_t *CreateLabel(const char *name, size_t h) { OBSDataAutoRelease settings = obs_data_create(); @@ -251,6 +226,53 @@ obs_sceneitem_set_bounds_type(item, OBS_BOUNDS_SCALE_INNER); } +static bool ConfirmReset(QWidget *parent) +{ + QMessageBox::StandardButton button; + + button = OBSMessageBox::question(parent, QTStr("ConfirmReset.Title"), QTStr("ConfirmReset.Text"), + QMessageBox::Yes | QMessageBox::No); + + return button == QMessageBox::Yes; +} + +void OBSBasicProperties::restoreDefaultsClicked() +{ + if (!ConfirmReset(this)) { + return; + } + + OBSDataAutoRelease settings = obs_source_get_settings(source); + obs_data_clear(settings); + + if (!view->DeferUpdate()) { + obs_source_update(source, nullptr); + } + + view->ReloadProperties(); +} + +void OBSBasicProperties::previewTransitionClicked() +{ + OBSSource start; + OBSSource end; + + if (direction) { + start = sourceA; + end = sourceB; + } else { + start = sourceB; + end = sourceA; + } + + obs_transition_set(sourceClone, start); + obs_transition_start(sourceClone, OBS_TRANSITION_MODE_AUTO, main->GetTransitionDuration(), end); + direction = !direction; + + start = nullptr; + end = nullptr; +} + void OBSBasicProperties::SourceRemoved(void *data, calldata_t *) { QMetaObject::invokeMethod(static_cast<OBSBasicProperties *>(data), "close"); @@ -269,16 +291,6 @@ QMetaObject::invokeMethod(static_cast<OBSBasicProperties *>(data)->view, "ReloadProperties"); } -static bool ConfirmReset(QWidget *parent) -{ - QMessageBox::StandardButton button; - - button = OBSMessageBox::question(parent, QTStr("ConfirmReset.Title"), QTStr("ConfirmReset.Text"), - QMessageBox::Yes | QMessageBox::No); - - return button == QMessageBox::Yes; -} - void OBSBasicProperties::on_buttonBox_clicked(QAbstractButton *button) { QDialogButtonBox::ButtonRole val = ui->buttonBox->buttonRole(button); @@ -329,18 +341,6 @@ obs_source_update(source, oldSettings); close(); - - } else if (val == QDialogButtonBox::ResetRole) { - if (!ConfirmReset(this)) - return; - - OBSDataAutoRelease settings = obs_source_get_settings(source); - obs_data_clear(settings); - - if (!view->DeferUpdate()) - obs_source_update(source, nullptr); - - view->ReloadProperties(); } }
View file
obs-studio-32.0.4.tar.xz/frontend/dialogs/OBSBasicProperties.hpp -> obs-studio-32.1.0.tar.xz/frontend/dialogs/OBSBasicProperties.hpp
Changed
@@ -39,7 +39,6 @@ OBSSignal updatePropertiesSignal; OBSData oldSettings; OBSPropertiesView *view; - QDialogButtonBox *buttonBox; QSplitter *windowSplitter; OBSSourceAutoRelease sourceA; @@ -59,7 +58,8 @@ private slots: void on_buttonBox_clicked(QAbstractButton *button); - void AddPreviewButton(); + void restoreDefaultsClicked(); + void previewTransitionClicked(); public: OBSBasicProperties(QWidget *parent, OBSSource source_);
View file
obs-studio-32.0.4.tar.xz/frontend/dialogs/OBSBasicSourceSelect.cpp -> obs-studio-32.1.0.tar.xz/frontend/dialogs/OBSBasicSourceSelect.cpp
Changed
@@ -29,6 +29,14 @@ obs_sceneitem_crop *crop = nullptr; obs_blending_method *blend_method = nullptr; obs_blending_type *blend_mode = nullptr; + obs_scale_type *scale_type = nullptr; + const char *show_transition_id = nullptr; + const char *hide_transition_id = nullptr; + OBSData show_transition_settings; + OBSData hide_transition_settings; + uint32_t show_transition_duration = 300; + uint32_t hide_transition_duration = 300; + OBSData private_settings; /* Return data */ obs_sceneitem_t *scene_item = nullptr; @@ -125,9 +133,35 @@ obs_sceneitem_set_blending_method(sceneitem, *data->blend_method); if (data->blend_mode != nullptr) obs_sceneitem_set_blending_mode(sceneitem, *data->blend_mode); + if (data->scale_type != nullptr) + obs_sceneitem_set_scale_filter(sceneitem, *data->scale_type); + + if (data->show_transition_id && *data->show_transition_id) { + OBSSourceAutoRelease source = obs_source_create(data->show_transition_id, data->show_transition_id, + data->show_transition_settings, nullptr); + + if (source) + obs_sceneitem_set_transition(sceneitem, true, source); + } + + if (data->hide_transition_id && *data->hide_transition_id) { + OBSSourceAutoRelease source = obs_source_create(data->hide_transition_id, data->hide_transition_id, + data->hide_transition_settings, nullptr); + + if (source) + obs_sceneitem_set_transition(sceneitem, false, source); + } + + obs_sceneitem_set_transition_duration(sceneitem, true, data->show_transition_duration); + obs_sceneitem_set_transition_duration(sceneitem, false, data->hide_transition_duration); obs_sceneitem_set_visible(sceneitem, data->visible); + if (data->private_settings) { + OBSDataAutoRelease newPrivateSettings = obs_sceneitem_get_private_settings(sceneitem); + obs_data_apply(newPrivateSettings, data->private_settings); + } + data->scene_item = sceneitem; } @@ -149,8 +183,7 @@ return new_name.array; } -static void AddExisting(OBSSource source, bool visible, bool duplicate, obs_transform_info *transform, - obs_sceneitem_crop *crop, obs_blending_method *blend_method, obs_blending_type *blend_mode) +static void AddExisting(OBSSource source, bool visible, bool duplicate, SourceCopyInfo *info = nullptr) { OBSBasic *main = OBSBasic::Get(); OBSScene scene = main->GetCurrentScene(); @@ -171,22 +204,32 @@ AddSourceData data; data.source = source; data.visible = visible; - data.transform = transform; - data.crop = crop; - data.blend_method = blend_method; - data.blend_mode = blend_mode; + + if (info) { + data.transform = &info->transform; + data.crop = &info->crop; + data.blend_method = &info->blend_method; + data.blend_mode = &info->blend_mode; + data.scale_type = &info->scale_type; + data.show_transition_id = info->show_transition_id; + data.hide_transition_id = info->hide_transition_id; + data.show_transition_settings = std::move(info->show_transition_settings); + data.hide_transition_settings = std::move(info->hide_transition_settings); + data.show_transition_duration = info->show_transition_duration; + data.hide_transition_duration = info->hide_transition_duration; + data.private_settings = std::move(info->private_settings); + } obs_enter_graphics(); obs_scene_atomic_update(scene, AddSource, &data); obs_leave_graphics(); } -static void AddExisting(const char *name, bool visible, bool duplicate, obs_transform_info *transform, - obs_sceneitem_crop *crop, obs_blending_method *blend_method, obs_blending_type *blend_mode) +static void AddExisting(const char *name, bool visible, bool duplicate) { OBSSourceAutoRelease source = obs_get_source_by_name(name); if (source) { - AddExisting(source.Get(), visible, duplicate, transform, crop, blend_method, blend_mode); + AddExisting(source.Get(), visible, duplicate); } } @@ -243,7 +286,7 @@ return; QString source_name = item->text(); - AddExisting(QT_TO_UTF8(source_name), visible, false, nullptr, nullptr, nullptr, nullptr); + AddExisting(QT_TO_UTF8(source_name), visible, false); OBSBasic *main = OBSBasic::Get(); const char *scene_name = obs_source_get_name(main->GetCurrentSceneSource()); @@ -270,7 +313,7 @@ obs_source_t *scene_source = obs_get_source_by_name(scene_name); main->SetCurrentScene(scene_source, true); obs_source_release(scene_source); - AddExisting(QT_TO_UTF8(source_name), visible, false, nullptr, nullptr, nullptr, nullptr); + AddExisting(QT_TO_UTF8(source_name), visible, false); }; undo_s.add_action(QTStr("Undo.Add").arg(source_name), undo, redo, "", ""); @@ -359,18 +402,18 @@ installEventFilter(CreateShortcutFilter()); - connect(ui->createNew, &QRadioButton::pressed, &() { + connect(ui->createNew, &QRadioButton::pressed, this, &() { QPushButton *button = ui->buttonBox->button(QDialogButtonBox::Ok); if (!button->isEnabled()) button->setEnabled(true); }); - connect(ui->selectExisting, &QRadioButton::pressed, &() { + connect(ui->selectExisting, &QRadioButton::pressed, this, &() { QPushButton *button = ui->buttonBox->button(QDialogButtonBox::Ok); bool enabled = ui->sourceList->selectedItems().size() != 0; if (button->isEnabled() != enabled) button->setEnabled(enabled); }); - connect(ui->sourceList, &QListWidget::itemSelectionChanged, &() { + connect(ui->sourceList, &QListWidget::itemSelectionChanged, this, &() { QPushButton *button = ui->buttonBox->button(QDialogButtonBox::Ok); if (!button->isEnabled()) button->setEnabled(true); @@ -411,5 +454,5 @@ if (!source) return; - AddExisting(source, info.visible, dup, &info.transform, &info.crop, &info.blend_method, &info.blend_mode); + AddExisting(source, info.visible, dup, &info); }
View file
obs-studio-32.0.4.tar.xz/frontend/dialogs/OBSBasicTransform.cpp -> obs-studio-32.1.0.tar.xz/frontend/dialogs/OBSBasicTransform.cpp
Changed
@@ -4,6 +4,7 @@ #include "moc_OBSBasicTransform.cpp" +namespace { static bool find_sel(obs_scene_t *, obs_sceneitem_t *item, void *param) { OBSSceneItem &dst = *static_cast<OBSSceneItem *>(param); @@ -28,8 +29,28 @@ obs_scene_enum_items(scene, find_sel, &item); return item; } +static vec2 getAlignmentConversion(uint32_t alignment) +{ + vec2 ratio = {0.5f, 0.5f}; + if (alignment & OBS_ALIGN_RIGHT) { + ratio.x = 1.0f; + } + if (alignment & OBS_ALIGN_LEFT) { + ratio.x = 0.0f; + } + if (alignment & OBS_ALIGN_BOTTOM) { + ratio.y = 1.0f; + } + if (alignment & OBS_ALIGN_TOP) { + ratio.y = 0.0f; + } + + return ratio; +} +} // namespace #define COMBO_CHANGED &QComboBox::currentIndexChanged +#define ALIGN_CHANGED &AlignmentSelector::currentIndexChanged #define ISCROLL_CHANGED &QSpinBox::valueChanged #define DSCROLL_CHANGED &QDoubleSpinBox::valueChanged @@ -42,24 +63,38 @@ ui->setupUi(this); - HookWidget(ui->positionX, DSCROLL_CHANGED, &OBSBasicTransform::OnControlChanged); - HookWidget(ui->positionY, DSCROLL_CHANGED, &OBSBasicTransform::OnControlChanged); - HookWidget(ui->rotation, DSCROLL_CHANGED, &OBSBasicTransform::OnControlChanged); - HookWidget(ui->sizeX, DSCROLL_CHANGED, &OBSBasicTransform::OnControlChanged); - HookWidget(ui->sizeY, DSCROLL_CHANGED, &OBSBasicTransform::OnControlChanged); - HookWidget(ui->align, COMBO_CHANGED, &OBSBasicTransform::OnControlChanged); - HookWidget(ui->boundsType, COMBO_CHANGED, &OBSBasicTransform::OnBoundsType); - HookWidget(ui->boundsAlign, COMBO_CHANGED, &OBSBasicTransform::OnControlChanged); - HookWidget(ui->boundsWidth, DSCROLL_CHANGED, &OBSBasicTransform::OnControlChanged); - HookWidget(ui->boundsHeight, DSCROLL_CHANGED, &OBSBasicTransform::OnControlChanged); - HookWidget(ui->cropLeft, ISCROLL_CHANGED, &OBSBasicTransform::OnCropChanged); - HookWidget(ui->cropRight, ISCROLL_CHANGED, &OBSBasicTransform::OnCropChanged); - HookWidget(ui->cropTop, ISCROLL_CHANGED, &OBSBasicTransform::OnCropChanged); - HookWidget(ui->cropBottom, ISCROLL_CHANGED, &OBSBasicTransform::OnCropChanged); + positionAlignment = new AlignmentSelector(this); + positionAlignment->setAccessibleName(QTStr("Basic.TransformWindow.Alignment")); + ui->alignmentLayout->addWidget(positionAlignment); + positionAlignment->setAlignment(Qt::AlignTop | Qt::AlignLeft); + + boundsAlignment = new AlignmentSelector(this); + boundsAlignment->setAccessibleName(QTStr("Basic.TransformWindow.BoundsAlignment")); + boundsAlignment->setEnabled(false); + ui->boundsAlignmentLayout->addWidget(boundsAlignment); + boundsAlignment->setAlignment(Qt::AlignTop | Qt::AlignLeft); + + setTabOrder(ui->rotation, positionAlignment); + setTabOrder(ui->boundsType, boundsAlignment); + + hookWidget(ui->positionX, DSCROLL_CHANGED, &OBSBasicTransform::onControlChanged); + hookWidget(ui->positionY, DSCROLL_CHANGED, &OBSBasicTransform::onControlChanged); + hookWidget(ui->rotation, DSCROLL_CHANGED, &OBSBasicTransform::onControlChanged); + hookWidget(ui->sizeX, DSCROLL_CHANGED, &OBSBasicTransform::onControlChanged); + hookWidget(ui->sizeY, DSCROLL_CHANGED, &OBSBasicTransform::onControlChanged); + hookWidget(positionAlignment.get(), ALIGN_CHANGED, &OBSBasicTransform::onAlignChanged); + hookWidget(ui->boundsType, COMBO_CHANGED, &OBSBasicTransform::onBoundsType); + hookWidget(boundsAlignment.get(), ALIGN_CHANGED, &OBSBasicTransform::onControlChanged); + hookWidget(ui->boundsWidth, DSCROLL_CHANGED, &OBSBasicTransform::onControlChanged); + hookWidget(ui->boundsHeight, DSCROLL_CHANGED, &OBSBasicTransform::onControlChanged); + hookWidget(ui->cropLeft, ISCROLL_CHANGED, &OBSBasicTransform::onCropChanged); + hookWidget(ui->cropRight, ISCROLL_CHANGED, &OBSBasicTransform::onCropChanged); + hookWidget(ui->cropTop, ISCROLL_CHANGED, &OBSBasicTransform::onCropChanged); + hookWidget(ui->cropBottom, ISCROLL_CHANGED, &OBSBasicTransform::onCropChanged); #if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) - HookWidget(ui->cropToBounds, &QCheckBox::checkStateChanged, &OBSBasicTransform::OnControlChanged); + hookWidget(ui->cropToBounds, &QCheckBox::checkStateChanged, &OBSBasicTransform::onControlChanged); #else - HookWidget(ui->cropToBounds, &QCheckBox::stateChanged, &OBSBasicTransform::OnControlChanged); + hookWidget(ui->cropToBounds, &QCheckBox::stateChanged, &OBSBasicTransform::onControlChanged); #endif ui->buttonBox->button(QDialogButtonBox::Close)->setDefault(true); @@ -69,14 +104,18 @@ installEventFilter(CreateShortcutFilter()); OBSScene scene = obs_sceneitem_get_scene(item); - SetScene(scene); - SetItem(item); + setScene(scene); + setItem(item); std::string name = obs_source_get_name(obs_sceneitem_get_source(item)); setWindowTitle(QTStr("Basic.TransformWindow.Title").arg(name.c_str())); OBSDataAutoRelease wrapper = obs_scene_save_transform_states(main->GetCurrentScene(), false); undo_data = std::string(obs_data_get_json(wrapper)); + + adjustSize(); + setMinimumSize(size()); + setMaximumSize(size()); } OBSBasicTransform::~OBSBasicTransform() @@ -97,7 +136,7 @@ undo_redo, undo_redo, undo_data, redo_data); } -void OBSBasicTransform::SetScene(OBSScene scene) +void OBSBasicTransform::setScene(OBSScene scene) { sigs.clear(); @@ -113,25 +152,27 @@ } } -void OBSBasicTransform::SetItem(OBSSceneItem newItem) +void OBSBasicTransform::setItem(OBSSceneItem newItem) { - QMetaObject::invokeMethod(this, "SetItemQt", Q_ARG(OBSSceneItem, OBSSceneItem(newItem))); + QMetaObject::invokeMethod(this, "setItemQt", Q_ARG(OBSSceneItem, OBSSceneItem(newItem))); } -void OBSBasicTransform::SetEnabled(bool enable) +void OBSBasicTransform::setEnabled(bool enable) { - ui->container->setEnabled(enable); + ui->transformSettings->setEnabled(enable); + ui->boundsSettings->setEnabled(enable); + ui->cropSettings->setEnabled(enable); ui->buttonBox->button(QDialogButtonBox::Reset)->setEnabled(enable); } -void OBSBasicTransform::SetItemQt(OBSSceneItem newItem) +void OBSBasicTransform::setItemQt(OBSSceneItem newItem) { item = newItem; if (item) - RefreshControls(); + refreshControls(); bool enable = !!item && !obs_sceneitem_locked(item); - SetEnabled(enable); + setEnabled(enable); } void OBSBasicTransform::OBSSceneItemTransform(void *param, calldata_t *data) @@ -140,7 +181,7 @@ OBSSceneItem item = (obs_sceneitem_t *)calldata_ptr(data, "item"); if (item == window->item && !window->ignoreTransformSignal) - QMetaObject::invokeMethod(window, "RefreshControls"); + QMetaObject::invokeMethod(window, "refreshControls"); } void OBSBasicTransform::OBSSceneItemRemoved(void *param, calldata_t *data) @@ -150,7 +191,7 @@ obs_sceneitem_t *item = (obs_sceneitem_t *)calldata_ptr(data, "item"); if (item == window->item) - window->SetItem(FindASelectedItem(scene)); + window->setItem(FindASelectedItem(scene)); } void OBSBasicTransform::OBSSceneItemSelect(void *param, calldata_t *data) @@ -159,7 +200,7 @@ OBSSceneItem item = (obs_sceneitem_t *)calldata_ptr(data, "item"); if (item != window->item) - window->SetItem(item); + window->setItem(item); } void OBSBasicTransform::OBSSceneItemDeselect(void *param, calldata_t *data) @@ -170,7 +211,7 @@ if (item == window->item) { window->setWindowTitle(QTStr("Basic.TransformWindow.NoSelectedSource")); - window->SetItem(FindASelectedItem(scene)); + window->setItem(FindASelectedItem(scene)); } } @@ -179,23 +220,23 @@ OBSBasicTransform *window = static_cast<OBSBasicTransform *>(param); bool locked = calldata_bool(data, "locked"); - QMetaObject::invokeMethod(window, "SetEnabled", Q_ARG(bool, !locked)); + QMetaObject::invokeMethod(window, "setEnabled", Q_ARG(bool, !locked)); } -static const uint32_t listToAlign = {OBS_ALIGN_TOP | OBS_ALIGN_LEFT, - OBS_ALIGN_TOP, - OBS_ALIGN_TOP | OBS_ALIGN_RIGHT, - OBS_ALIGN_LEFT, - OBS_ALIGN_CENTER, - OBS_ALIGN_RIGHT, - OBS_ALIGN_BOTTOM | OBS_ALIGN_LEFT, - OBS_ALIGN_BOTTOM, - OBS_ALIGN_BOTTOM | OBS_ALIGN_RIGHT}; - -static int AlignToList(uint32_t align) +static const uint32_t indexToAlign = {OBS_ALIGN_TOP | OBS_ALIGN_LEFT, + OBS_ALIGN_TOP, + OBS_ALIGN_TOP | OBS_ALIGN_RIGHT, + OBS_ALIGN_LEFT, + OBS_ALIGN_CENTER, + OBS_ALIGN_RIGHT, + OBS_ALIGN_BOTTOM | OBS_ALIGN_LEFT, + OBS_ALIGN_BOTTOM, + OBS_ALIGN_BOTTOM | OBS_ALIGN_RIGHT}; + +static int alignToIndex(uint32_t align) { int index = 0; - for (uint32_t curAlign : listToAlign) { + for (uint32_t curAlign : indexToAlign) { if (curAlign == align) return index; @@ -205,14 +246,14 @@ return 0; } -void OBSBasicTransform::RefreshControls() +void OBSBasicTransform::refreshControls() { if (!item) return; - obs_transform_info osi; + obs_transform_info oti; obs_sceneitem_crop crop; - obs_sceneitem_get_info2(item, &osi); + obs_sceneitem_get_info2(item, &oti); obs_sceneitem_get_crop(item, &crop); obs_source_t *source = obs_sceneitem_get_source(item); @@ -221,26 +262,26 @@ float width = float(source_cx); float height = float(source_cy); - int alignIndex = AlignToList(osi.alignment); - int boundsAlignIndex = AlignToList(osi.bounds_alignment); + int alignIndex = alignToIndex(oti.alignment); + int boundsAlignIndex = alignToIndex(oti.bounds_alignment); ignoreItemChange = true; - ui->positionX->setValue(osi.pos.x); - ui->positionY->setValue(osi.pos.y); - ui->rotation->setValue(osi.rot); - ui->sizeX->setValue(osi.scale.x * width); - ui->sizeY->setValue(osi.scale.y * height); - ui->align->setCurrentIndex(alignIndex); + ui->positionX->setValue(oti.pos.x); + ui->positionY->setValue(oti.pos.y); + ui->rotation->setValue(oti.rot); + ui->sizeX->setValue(oti.scale.x * width); + ui->sizeY->setValue(oti.scale.y * height); + positionAlignment->setCurrentIndex(alignIndex); bool valid_size = source_cx != 0 && source_cy != 0; ui->sizeX->setEnabled(valid_size); ui->sizeY->setEnabled(valid_size); - ui->boundsType->setCurrentIndex(int(osi.bounds_type)); - ui->boundsAlign->setCurrentIndex(boundsAlignIndex); - ui->boundsWidth->setValue(osi.bounds.x); - ui->boundsHeight->setValue(osi.bounds.y); - ui->cropToBounds->setChecked(osi.crop_to_bounds); + ui->boundsType->setCurrentIndex(int(oti.bounds_type)); + boundsAlignment->setCurrentIndex(boundsAlignIndex); + ui->boundsWidth->setValue(oti.bounds.x); + ui->boundsHeight->setValue(oti.bounds.y); + ui->cropToBounds->setChecked(oti.crop_to_bounds); ui->cropLeft->setValue(int(crop.left)); ui->cropRight->setValue(int(crop.right)); @@ -252,7 +293,45 @@ setWindowTitle(QTStr("Basic.TransformWindow.Title").arg(name.c_str())); } -void OBSBasicTransform::OnBoundsType(int index) +void OBSBasicTransform::onAlignChanged(int index) +{ + uint32_t alignment = indexToAlignindex; + + vec2 flipRatio = getAlignmentConversion(alignment); + + obs_transform_info oti; + obs_sceneitem_crop crop; + obs_sceneitem_get_info2(item, &oti); + obs_sceneitem_get_crop(item, &crop); + + obs_source_t *source = obs_sceneitem_get_source(item); + uint32_t sourceWidth = obs_source_get_width(source); + uint32_t sourceHeight = obs_source_get_height(source); + + uint32_t widthForFlip = sourceWidth - crop.left - crop.right; + uint32_t heightForFlip = sourceHeight - crop.top - crop.bottom; + + if (oti.bounds_type != OBS_BOUNDS_NONE) { + widthForFlip = oti.bounds.x; + heightForFlip = oti.bounds.y; + } + + vec2 currentRatio = getAlignmentConversion(oti.alignment); + + float shiftX = (currentRatio.x - flipRatio.x) * widthForFlip * oti.scale.x; + float shiftY = (currentRatio.y - flipRatio.y) * heightForFlip * oti.scale.y; + + bool previousIgnoreState = ignoreItemChange; + + ignoreItemChange = true; + ui->positionX->setValue(oti.pos.x - shiftX); + ui->positionY->setValue(oti.pos.y - shiftY); + ignoreItemChange = previousIgnoreState; + + onControlChanged(); +} + +void OBSBasicTransform::onBoundsType(int index) { if (index == -1) return; @@ -260,10 +339,13 @@ obs_bounds_type type = (obs_bounds_type)index; bool enable = (type != OBS_BOUNDS_NONE); - ui->boundsAlign->setEnabled(enable); + boundsAlignment->setEnabled(enable && type != OBS_BOUNDS_STRETCH); ui->boundsWidth->setEnabled(enable); ui->boundsHeight->setEnabled(enable); - ui->cropToBounds->setEnabled(enable); + + bool isCoverBounds = type == OBS_BOUNDS_SCALE_OUTER || type == OBS_BOUNDS_SCALE_TO_WIDTH || + type == OBS_BOUNDS_SCALE_TO_HEIGHT; + ui->cropToBounds->setEnabled(isCoverBounds); if (!ignoreItemChange) { obs_bounds_type lastType = obs_sceneitem_get_bounds_type(item); @@ -272,15 +354,56 @@ int width = (int)obs_source_get_width(source); int height = (int)obs_source_get_height(source); - ui->boundsWidth->setValue(width); - ui->boundsHeight->setValue(height); + vec2 scale; + obs_sceneitem_get_scale(item, &scale); + + obs_sceneitem_crop crop; + obs_sceneitem_get_crop(item, &crop); + + ui->sizeX->setValue(width); + ui->sizeY->setValue(height); + + ui->boundsWidth->setValue((width - crop.left - crop.right) * scale.x); + ui->boundsHeight->setValue((height - crop.top - crop.bottom) * scale.y); + } else if (type == OBS_BOUNDS_NONE) { + OBSSource source = obs_sceneitem_get_source(item); + int width = (int)obs_source_get_width(source); + int height = (int)obs_source_get_height(source); + + matrix4 draw; + obs_sceneitem_get_draw_transform(item, &draw); + + ui->sizeX->setValue(width * draw.x.x); + ui->sizeY->setValue(height * draw.y.y); + + obs_transform_info oti; + obs_sceneitem_get_info2(item, &oti); + + // We use the draw transform values here which is always a top left coordinate origin. + vec2 currentRatio = getAlignmentConversion(OBS_ALIGN_TOP | OBS_ALIGN_LEFT); + vec2 flipRatio = getAlignmentConversion(oti.alignment); + + float drawX = draw.t.x; + float drawY = draw.t.y; + + obs_sceneitem_crop crop; + obs_sceneitem_get_crop(item, &crop); + + uint32_t widthForFlip = width - crop.left - crop.right; + uint32_t heightForFlip = height - crop.top - crop.bottom; + + float shiftX = (currentRatio.x - flipRatio.x) * (widthForFlip * draw.x.x); + float shiftY = (currentRatio.y - flipRatio.y) * (heightForFlip * draw.y.y); + + ui->positionX->setValue(oti.pos.x - (oti.pos.x - drawX) - shiftX); + ui->positionY->setValue(oti.pos.y - (oti.pos.y - drawY) - shiftY); } } - OnControlChanged(); + onControlChanged(); } -void OBSBasicTransform::OnControlChanged() +void OBSBasicTransform::onControlChanged() { if (ignoreItemChange) return; @@ -303,10 +426,10 @@ oti.pos.x = float(ui->positionX->value()); oti.pos.y = float(ui->positionY->value()); oti.rot = float(ui->rotation->value()); - oti.alignment = listToAlignui->align->currentIndex(); + oti.alignment = indexToAlignpositionAlignment->currentIndex(); oti.bounds_type = (obs_bounds_type)ui->boundsType->currentIndex(); - oti.bounds_alignment = listToAlignui->boundsAlign->currentIndex(); + oti.bounds_alignment = indexToAlignboundsAlignment->currentIndex(); oti.bounds.x = float(ui->boundsWidth->value()); oti.bounds.y = float(ui->boundsHeight->value()); oti.crop_to_bounds = ui->cropToBounds->isChecked(); @@ -316,7 +439,7 @@ ignoreTransformSignal = false; } -void OBSBasicTransform::OnCropChanged() +void OBSBasicTransform::onCropChanged() { if (ignoreItemChange) return; @@ -332,11 +455,11 @@ ignoreTransformSignal = false; } -void OBSBasicTransform::OnSceneChanged(QListWidgetItem *current, QListWidgetItem *) +void OBSBasicTransform::onSceneChanged(QListWidgetItem *current, QListWidgetItem *) { if (!current) return; OBSScene scene = GetOBSRef<OBSScene>(current); - this->SetScene(scene); + this->setScene(scene); }
View file
obs-studio-32.0.4.tar.xz/frontend/dialogs/OBSBasicTransform.hpp -> obs-studio-32.1.0.tar.xz/frontend/dialogs/OBSBasicTransform.hpp
Changed
@@ -3,8 +3,10 @@ #include "ui_OBSBasicTransform.h" #include <obs.hpp> +#include <components/AlignmentSelector.hpp> #include <QDialog> +#include <QPointer> class OBSBasic; class QListWidgetItem; @@ -15,6 +17,9 @@ private: std::unique_ptr<Ui::OBSBasicTransform> ui; + QPointer<AlignmentSelector> positionAlignment; + QPointer<AlignmentSelector> boundsAlignment; + OBSBasic *main; OBSSceneItem item; std::vector<OBSSignal> sigs; @@ -25,14 +30,14 @@ bool ignoreItemChange = false; template<typename Widget, typename WidgetParent, typename... SignalArgs, typename... SlotArgs> - void HookWidget(Widget *widget, void (WidgetParent::*signal)(SignalArgs...), + void hookWidget(Widget *widget, void (WidgetParent::*signal)(SignalArgs...), void (OBSBasicTransform::*slot)(SlotArgs...)) { QObject::connect(widget, signal, this, slot); } - void SetScene(OBSScene scene); - void SetItem(OBSSceneItem newItem); + void setScene(OBSScene scene); + void setItem(OBSSceneItem newItem); static void OBSSceneItemTransform(void *param, calldata_t *data); static void OBSSceneItemRemoved(void *param, calldata_t *data); @@ -41,17 +46,18 @@ static void OBSSceneItemLocked(void *param, calldata_t *data); private slots: - void RefreshControls(); - void SetItemQt(OBSSceneItem newItem); - void OnBoundsType(int index); - void OnControlChanged(); - void OnCropChanged(); - void SetEnabled(bool enable); + void refreshControls(); + void setItemQt(OBSSceneItem newItem); + void onAlignChanged(int index); + void onBoundsType(int index); + void onControlChanged(); + void onCropChanged(); + void setEnabled(bool enable); public: OBSBasicTransform(OBSSceneItem item, OBSBasic *parent); ~OBSBasicTransform(); public slots: - void OnSceneChanged(QListWidgetItem *current, QListWidgetItem *prev); + void onSceneChanged(QListWidgetItem *current, QListWidgetItem *prev); };
View file
obs-studio-32.0.4.tar.xz/frontend/dialogs/OBSYoutubeActions.cpp -> obs-studio-32.1.0.tar.xz/frontend/dialogs/OBSYoutubeActions.cpp
Changed
@@ -48,9 +48,9 @@ connect(ui->helpAutoStartStop, &QLabel::linkActivated, this, (const QString &) { QToolTip::showText(QCursor::pos(), QTStr("YouTube.Actions.AutoStartStop.TT")); }); connect(ui->help360Video, &QLabel::linkActivated, this, - (const QString &link) { QDesktopServices::openUrl(link); }); + (const QString &link) { QDesktopServices::openUrl(QUrl(link)); }); connect(ui->helpMadeForKids, &QLabel::linkActivated, this, - (const QString &link) { QDesktopServices::openUrl(link); }); + (const QString &link) { QDesktopServices::openUrl(QUrl(link)); }); ui->scheduledTime->setVisible(false); #if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) @@ -712,7 +712,7 @@ QString uri = QString("https://studio.youtube.com/channel/%1/videos/live?filter=&sort={\"columnType\"%3A\"date\"%2C\"sortOrder\"%3A\"DESCENDING\"}") .arg(channel.id); - QDesktopServices::openUrl(uri); + QDesktopServices::openUrl(QUrl(uri)); } void OBSYoutubeActions::Cancel()
View file
obs-studio-32.0.4.tar.xz/frontend/forms/OBSBasic.ui -> obs-studio-32.1.0.tar.xz/frontend/forms/OBSBasic.ui
Changed
@@ -7,8 +7,8 @@ <rect> <x>0</x> <y>0</y> - <width>1086</width> - <height>729</height> + <width>1280</width> + <height>960</height> </rect> </property> <property name="sizePolicy"> @@ -34,7 +34,7 @@ <string notr="true"/> </property> <property name="dockOptions"> - <set>QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks|QMainWindow::AnimatedDocks</set> + <set>QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks</set> </property> <widget class="QWidget" name="centralwidget"> <layout class="QVBoxLayout" name="verticalLayout"> @@ -54,378 +54,388 @@ <number>0</number> </property> <item> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <layout class="QHBoxLayout" name="previewLayout"> - <property name="spacing"> - <number>2</number> - </property> - <item> - <widget class="QFrame" name="previewDisabledWidget"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <widget class="QWidget" name="canvasEditor" native="true"> + <layout class="QHBoxLayout" name="previewLayout"> + <property name="spacing"> + <number>2</number> + </property> + <property name="leftMargin"> + <number>1</number> + </property> + <property name="topMargin"> + <number>1</number> + </property> + <property name="rightMargin"> + <number>1</number> + </property> + <property name="bottomMargin"> + <number>1</number> + </property> + <item> + <widget class="QFrame" name="previewDisabledWidget"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <layout class="QVBoxLayout" name="verticalLayout_7"> + <property name="spacing"> + <number>0</number> </property> - <layout class="QVBoxLayout" name="verticalLayout_7"> - <property name="spacing"> - <number>0</number> - </property> - <property name="leftMargin"> - <number>1</number> - </property> - <property name="topMargin"> - <number>1</number> - </property> - <property name="rightMargin"> - <number>1</number> - </property> - <property name="bottomMargin"> - <number>1</number> - </property> - <item> - <spacer name="verticalSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QLabel" name="label"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Basic.Main.PreviewDisabled</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <spacer name="horizontalSpacer_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="enablePreviewButton"> - <property name="text"> - <string>Basic.Main.PreviewConextMenu.Enable</string> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_3"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> + <property name="leftMargin"> + <number>1</number> + </property> + <property name="topMargin"> + <number>1</number> + </property> + <property name="rightMargin"> + <number>1</number> + </property> + <property name="bottomMargin"> + <number>1</number> + </property> + <item> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="label"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Basic.Main.PreviewDisabled</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="enablePreviewButton"> + <property name="text"> + <string>Basic.Main.PreviewConextMenu.Enable</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <spacer name="verticalSpacer_3"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QWidget" name="previewContainer" native="true"> + <layout class="QVBoxLayout" name="previewTextLayout"> + <property name="spacing"> + <number>0</number> + </property> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QLabel" name="previewLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Ignored" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>StudioMode.PreviewSceneName</string> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> + </property> + <property name="class" stdset="0"> + <string>label-preview-title</string> + </property> + </widget> + </item> + <item> + <layout class="QGridLayout" name="gridLayout"> + <property name="spacing"> + <number>0</number> + </property> + <item row="1" column="0" colspan="2"> + <widget class="OBSBasicPreview" name="preview" native="true"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>32</width> + <height>32</height> + </size> + </property> + <property name="focusPolicy"> + <enum>Qt::ClickFocus</enum> + </property> + <property name="contextMenuPolicy"> + <enum>Qt::CustomContextMenu</enum> + </property> + <addaction name="actionRemoveSource"/> + </widget> + </item> + <item row="2" column="1"> + <widget class="QWidget" name="previewXContainer" native="true"> + <layout class="QHBoxLayout" name="horizontalLayout_7"> + <property name="spacing"> + <number>0</number> </property> - </spacer> - </item> - </layout> - </item> - <item> - <spacer name="verticalSpacer_3"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QWidget" name="previewContainer" native="true"> - <layout class="QVBoxLayout" name="previewTextLayout"> - <property name="spacing"> - <number>0</number> - </property> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - <item> - <widget class="QLabel" name="previewLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Ignored" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>StudioMode.PreviewSceneName</string> - </property> - <property name="alignment"> - <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> - </property> - <property name="class" stdset="0"> - <string>label-preview-title</string> - </property> - </widget> - </item> - <item> - <layout class="QGridLayout" name="gridLayout"> - <property name="spacing"> - <number>0</number> - </property> - <item row="1" column="0" colspan="2"> - <widget class="OBSBasicPreview" name="preview" native="true"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <property name="leftMargin"> + <number>0</number> </property> - <property name="minimumSize"> - <size> - <width>32</width> - <height>32</height> - </size> + <property name="topMargin"> + <number>0</number> </property> - <property name="focusPolicy"> - <enum>Qt::ClickFocus</enum> + <property name="rightMargin"> + <number>0</number> </property> - <property name="contextMenuPolicy"> - <enum>Qt::CustomContextMenu</enum> + <property name="bottomMargin"> + <number>0</number> </property> - <addaction name="actionRemoveSource"/> - </widget> - </item> - <item row="2" column="1"> - <widget class="QWidget" name="previewXContainer" native="true"> - <layout class="QHBoxLayout" name="horizontalLayout_7"> - <property name="spacing"> - <number>0</number> - </property> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - <item> - <widget class="QPushButton" name="previewZoomOutButton"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>20</width> - <height>16</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>20</width> - <height>16</height> - </size> - </property> - <property name="toolTip"> - <string>Basic.MainMenu.Edit.Scale.ZoomOut</string> - </property> - <property name="accessibleName"> - <string>Basic.MainMenu.Edit.Scale.ZoomOut</string> - </property> - <property name="text"> - <string/> - </property> - <property name="icon"> - <iconset resource="obs.qrc"> - <normaloff>:/res/images/minus.svg</normaloff>:/res/images/minus.svg</iconset> - </property> - <property name="iconSize"> - <size> - <width>8</width> - <height>8</height> - </size> - </property> - <property name="toolButton" stdset="0"> - <bool>true</bool> - </property> - <property name="class" stdset="0"> - <string>icon-minus</string> - </property> - </widget> - </item> - <item> - <widget class="OBSPreviewScalingLabel" name="previewScalePercent"> + <item> + <widget class="QPushButton" name="previewZoomOutButton"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>20</width> + <height>16</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>20</width> + <height>16</height> + </size> + </property> + <property name="toolTip"> + <string>Basic.MainMenu.Edit.Scale.ZoomOut</string> + </property> + <property name="accessibleName"> + <string>Basic.MainMenu.Edit.Scale.ZoomOut</string> + </property> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset resource="obs.qrc"> + <normaloff>:/res/images/minus.svg</normaloff>:/res/images/minus.svg</iconset> + </property> + <property name="iconSize"> + <size> + <width>8</width> + <height>8</height> + </size> + </property> + <property name="toolButton" stdset="0"> + <bool>true</bool> + </property> + <property name="class" stdset="0"> + <string>icon-minus</string> + </property> + </widget> + </item> + <item> + <widget class="OBSPreviewScalingLabel" name="previewScalePercent"> + <property name="text"> + <string>100%</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="previewZoomInButton"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>20</width> + <height>16</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>20</width> + <height>16</height> + </size> + </property> + <property name="toolTip"> + <string>Basic.MainMenu.Edit.Scale.ZoomIn</string> + </property> + <property name="accessibleName"> + <string>Basic.MainMenu.Edit.Scale.ZoomIn</string> + </property> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset resource="obs.qrc"> + <normaloff>:/res/images/plus.svg</normaloff>:/res/images/plus.svg</iconset> + </property> + <property name="iconSize"> + <size> + <width>8</width> + <height>8</height> + </size> + </property> + <property name="toolButton" stdset="0"> + <bool>true</bool> + </property> + <property name="class" stdset="0"> + <string>icon-plus</string> + </property> + </widget> + </item> + <item> + <widget class="OBSPreviewScalingComboBox" name="previewScalingMode"> + <item> <property name="text"> - <string>100%</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="previewZoomInButton"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>20</width> - <height>16</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>20</width> - <height>16</height> - </size> - </property> - <property name="toolTip"> - <string>Basic.MainMenu.Edit.Scale.ZoomIn</string> - </property> - <property name="accessibleName"> - <string>Basic.MainMenu.Edit.Scale.ZoomIn</string> + <string>Basic.MainMenu.Edit.Scale.Window</string> </property> + </item> + <item> <property name="text"> - <string/> - </property> - <property name="icon"> - <iconset resource="obs.qrc"> - <normaloff>:/res/images/plus.svg</normaloff>:/res/images/plus.svg</iconset> + <string>Basic.MainMenu.Edit.Scale.Canvas</string> </property> - <property name="iconSize"> - <size> - <width>8</width> - <height>8</height> - </size> - </property> - <property name="toolButton" stdset="0"> - <bool>true</bool> - </property> - <property name="class" stdset="0"> - <string>icon-plus</string> - </property> - </widget> - </item> - <item> - <widget class="OBSPreviewScalingComboBox" name="previewScalingMode"> - <item> - <property name="text"> - <string>Basic.MainMenu.Edit.Scale.Window</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.MainMenu.Edit.Scale.Canvas</string> - </property> - </item> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_5"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Fixed</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>4</width> - <height>0</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QScrollBar" name="previewXScrollBar"> - <property name="sizePolicy"> - <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimum"> - <number>-200</number> - </property> - <property name="maximum"> - <number>200</number> - </property> - <property name="singleStep"> - <number>10</number> - </property> - <property name="pageStep"> - <number>100</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item row="1" column="2"> - <widget class="QScrollBar" name="previewYScrollBar"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - </item> - </layout> - </item> - </layout> + </item> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_5"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>4</width> + <height>0</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QScrollBar" name="previewXScrollBar"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimum"> + <number>-200</number> + </property> + <property name="maximum"> + <number>200</number> + </property> + <property name="singleStep"> + <number>10</number> + </property> + <property name="pageStep"> + <number>100</number> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item row="1" column="2"> + <widget class="QScrollBar" name="previewYScrollBar"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + </layout> + </widget> </item> <item> <widget class="QFrame" name="contextContainer"> @@ -703,7 +713,7 @@ <rect> <x>0</x> <y>0</y> - <width>1086</width> + <width>1280</width> <height>22</height> </rect> </property> @@ -1219,6 +1229,9 @@ </widget> </widget> <widget class="OBSDock" name="mixerDock"> + <property name="contextMenuPolicy"> + <enum>Qt::CustomContextMenu</enum> + </property> <property name="features"> <set>QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable</set> </property> @@ -1245,159 +1258,6 @@ <property name="bottomMargin"> <number>1</number> </property> - <item> - <widget class="QFrame" name="mixerFrame"> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <property name="spacing"> - <number>0</number> - </property> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - <item> - <widget class="QStackedWidget" name="stackedMixerArea"> - <widget class="VScrollArea" name="hMixerScrollArea"> - <property name="contextMenuPolicy"> - <enum>Qt::CustomContextMenu</enum> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Plain</enum> - </property> - <property name="verticalScrollBarPolicy"> - <enum>Qt::ScrollBarAsNeeded</enum> - </property> - <property name="horizontalScrollBarPolicy"> - <enum>Qt::ScrollBarAlwaysOff</enum> - </property> - <property name="widgetResizable"> - <bool>true</bool> - </property> - <widget class="QWidget" name="hVolumeWidgets"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>322</width> - <height>16</height> - </rect> - </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <layout class="QVBoxLayout" name="hVolControlLayout"> - <property name="spacing"> - <number>0</number> - </property> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - </layout> - </widget> - </widget> - <widget class="HScrollArea" name="vMixerScrollArea"> - <property name="contextMenuPolicy"> - <enum>Qt::CustomContextMenu</enum> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Plain</enum> - </property> - <property name="verticalScrollBarPolicy"> - <enum>Qt::ScrollBarAlwaysOff</enum> - </property> - <property name="horizontalScrollBarPolicy"> - <enum>Qt::ScrollBarAsNeeded</enum> - </property> - <property name="widgetResizable"> - <bool>true</bool> - </property> - <widget class="QWidget" name="vVolumeWidgets"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>16</width> - <height>28</height> - </rect> - </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <layout class="QHBoxLayout" name="vVolControlLayout"> - <property name="spacing"> - <number>0</number> - </property> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - </layout> - </widget> - </widget> - </widget> - </item> - <item> - <widget class="QToolBar" name="mixerToolbar"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="iconSize"> - <size> - <width>16</width> - <height>16</height> - </size> - </property> - <property name="floatable"> - <bool>false</bool> - </property> - <addaction name="actionMixerToolbarAdvAudio"/> - <addaction name="separator"/> - <addaction name="actionMixerToolbarMenu"/> - </widget> - </item> - </layout> - </widget> - </item> </layout> </widget> </widget> @@ -2213,7 +2073,7 @@ <bool>true</bool> </property> <property name="checked"> - <bool>false</bool> + <bool>true</bool> </property> <property name="text"> <string>Basic.MainMenu.Docks.SideDocks</string> @@ -2310,18 +2170,6 @@ <string>icon-cogs</string> </property> </action> - <action name="actionMixerToolbarMenu"> - <property name="icon"> - <iconset resource="obs.qrc"> - <normaloff>:/res/images/dots-vert.svg</normaloff>:/res/images/dots-vert.svg</iconset> - </property> - <property name="text"> - <string>MixerToolbarMenu</string> - </property> - <property name="class" stdset="0"> - <string>icon-dots-vert</string> - </property> - </action> <action name="actionSceneFilters"> <property name="icon"> <iconset resource="obs.qrc"> @@ -2396,18 +2244,6 @@ <header>widgets/OBSBasicStatusBar.hpp</header> </customwidget> <customwidget> - <class>HScrollArea</class> - <extends>QScrollArea</extends> - <header>components/HScrollArea.hpp</header> - <container>1</container> - </customwidget> - <customwidget> - <class>VScrollArea</class> - <extends>QScrollArea</extends> - <header>vertical-scroll-area.hpp</header> - <container>1</container> - </customwidget> - <customwidget> <class>SourceTree</class> <extends>QListView</extends> <header>components/SourceTree.hpp</header>
View file
obs-studio-32.0.4.tar.xz/frontend/forms/OBSBasicProperties.ui -> obs-studio-32.1.0.tar.xz/frontend/forms/OBSBasicProperties.ui
Changed
@@ -108,11 +108,58 @@ </widget> </widget> </item> - <item alignment="Qt::AlignBottom"> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::RestoreDefaults</set> + <item> + <widget class="QFrame" name="frame"> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Plain</enum> </property> + <property name="lineWidth"> + <number>0</number> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QPushButton" name="defaultsButton"> + <property name="text"> + <string>RestoreDefaults</string> + </property> + <property name="autoDefault"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="transitionButton"> + <property name="text"> + <string>PreviewTransition</string> + </property> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> </widget> </item> </layout>
View file
obs-studio-32.0.4.tar.xz/frontend/forms/OBSBasicSettings.ui -> obs-studio-32.1.0.tar.xz/frontend/forms/OBSBasicSettings.ui
Changed
@@ -2083,6 +2083,100 @@ </widget> </item> <item> + <widget class="QGroupBox" name="whipSimulcastGroupBox"> + <property name="title"> + <string>Basic.Settings.Stream.WHIPSimulcastLabel</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_35"> + <property name="leftMargin"> + <number>9</number> + </property> + <property name="topMargin"> + <number>2</number> + </property> + <property name="rightMargin"> + <number>9</number> + </property> + <property name="bottomMargin"> + <number>9</number> + </property> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_33"> + <item> + <spacer name="horizontalSpacer_33"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>170</width> + <height>10</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="whipSimulcastInfo"> + <property name="text"> + <string>Basic.Settings.Stream.WHIPSimulcastInfo</string> + </property> + <property name="textFormat"> + <enum>Qt::RichText</enum> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + <property name="openExternalLinks"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QFormLayout" name="formLayout_39"> + <property name="fieldGrowthPolicy"> + <enum>QFormLayout::AllNonFixedFieldsGrow</enum> + </property> + <item row="1" column="0"> + <widget class="QLabel" name="whipSimulcastTotalLayersLabel"> + <property name="text"> + <string>Basic.Settings.Stream.WHIPSimulcastTotalLayers</string> + </property> + <property name="minimumSize"> + <size> + <width>170</width> + <height>0</height> + </size> + </property> + </widget> + </item> + <item row="1" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout_35" stretch="0,0"> + <item> + <widget class="QSpinBox" name="whipSimulcastTotalLayers"> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>4</number> + </property> + <property name="value"> + <number>1</number> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> <widget class="QGroupBox" name="serviceAdvancedOptionsGroupBox"> <property name="title"> <string>Basic.Settings.Stream.AdvancedOptions</string>
View file
obs-studio-32.0.4.tar.xz/frontend/forms/OBSBasicTransform.ui -> obs-studio-32.1.0.tar.xz/frontend/forms/OBSBasicTransform.ui
Changed
@@ -6,28 +6,49 @@ <rect> <x>0</x> <y>0</y> - <width>564</width> - <height>320</height> + <width>900</width> + <height>280</height> </rect> </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> <property name="windowTitle"> <string>Basic.TransformWindow</string> </property> - <layout class="QVBoxLayout" name="verticalLayout" stretch="0,5,0"> + <layout class="QVBoxLayout" name="verticalLayout" stretch="0"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> <item> - <widget class="QWidget" name="container" native="true"> - <layout class="QFormLayout" name="formLayout"> - <property name="fieldGrowthPolicy"> - <enum>QFormLayout::AllNonFixedFieldsGrow</enum> - </property> - <property name="labelAlignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - <property name="horizontalSpacing"> - <number>4</number> - </property> - <property name="verticalSpacing"> - <number>4</number> + <widget class="QFrame" name="outerFrame"> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Plain</enum> + </property> + <property name="lineWidth"> + <number>0</number> + </property> + <property name="class" stdset="0"> + <string>dialog-container</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <property name="spacing"> + <number>0</number> </property> <property name="leftMargin"> <number>0</number> @@ -41,40 +62,21 @@ <property name="bottomMargin"> <number>0</number> </property> - <item row="0" column="0"> - <widget class="QLabel" name="label"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>170</width> - <height>0</height> - </size> + <item> + <widget class="QFrame" name="transformSettings"> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> </property> - <property name="accessibleName"> - <string>Basic.TransformWindow.Position</string> + <property name="frameShadow"> + <enum>QFrame::Plain</enum> </property> - <property name="text"> - <string>Basic.TransformWindow.Position</string> + <property name="lineWidth"> + <number>0</number> </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QFrame" name="widget"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <property name="class" stdset="0"> + <string>dialog-container dialog-frame</string> </property> - <layout class="QHBoxLayout" name="horizontalLayout"> + <layout class="QGridLayout" name="gridLayout_2"> <property name="leftMargin"> <number>0</number> </property> @@ -87,8 +89,40 @@ <property name="bottomMargin"> <number>0</number> </property> - <item> - <widget class="QDoubleSpinBox" name="positionX"> + <property name="horizontalSpacing"> + <number>8</number> + </property> + <property name="verticalSpacing"> + <number>2</number> + </property> + <item row="1" column="2"> + <widget class="QLabel" name="sizeWidthLabel"> + <property name="accessibleName"> + <string>Width</string> + </property> + <property name="text"> + <string>Basic.TransformWindow.Width</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="positionXLabel"> + <property name="accessibleName"> + <string>Basic.TransformWindow.Accessible.PositionX</string> + </property> + <property name="text"> + <string>X</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="1" column="3"> + <widget class="QDoubleSpinBox" name="sizeX"> <property name="minimumSize"> <size> <width>120</width> @@ -97,18 +131,18 @@ </property> <property name="maximumSize"> <size> - <width>100</width> + <width>120</width> <height>16777215</height> </size> </property> <property name="accessibleName"> - <string>Basic.TransformWindow.PositionX</string> + <string>Width</string> </property> <property name="suffix"> <string> px</string> </property> <property name="decimals"> - <number>4</number> + <number>2</number> </property> <property name="minimum"> <double>-90001.000000000000000</double> @@ -116,10 +150,26 @@ <property name="maximum"> <double>90001.000000000000000</double> </property> + <property name="singleStep"> + <double>1.000000000000000</double> + </property> </widget> </item> - <item> - <widget class="QDoubleSpinBox" name="positionY"> + <item row="0" column="4"> + <widget class="QLabel" name="label_2"> + <property name="accessibleName"> + <string>Basic.TransformWindow.Rotation</string> + </property> + <property name="text"> + <string>Basic.TransformWindow.Rotation</string> + </property> + <property name="class" stdset="0"> + <string>subtitle</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QDoubleSpinBox" name="positionX"> <property name="minimumSize"> <size> <width>120</width> @@ -128,18 +178,18 @@ </property> <property name="maximumSize"> <size> - <width>100</width> + <width>120</width> <height>16777215</height> </size> </property> <property name="accessibleName"> - <string>Basic.TransformWindow.PositionY</string> + <string>Basic.TransformWindow.PositionX</string> </property> <property name="suffix"> <string> px</string> </property> <property name="decimals"> - <number>4</number> + <number>2</number> </property> <property name="minimum"> <double>-90001.000000000000000</double> @@ -149,89 +199,14 @@ </property> </widget> </item> - </layout> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_2"> - <property name="accessibleName"> - <string>Basic.TransformWindow.Rotation</string> - </property> - <property name="text"> - <string>Basic.TransformWindow.Rotation</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QDoubleSpinBox" name="rotation"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>120</width> - <height>0</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>100</width> - <height>16777215</height> - </size> - </property> - <property name="accessibleName"> - <string>Basic.TransformWindow.Rotation</string> - </property> - <property name="suffix"> - <string>°</string> - </property> - <property name="minimum"> - <double>-360.000000000000000</double> - </property> - <property name="maximum"> - <double>360.000000000000000</double> - </property> - <property name="singleStep"> - <double>0.100000000000000</double> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="label_3"> - <property name="accessibleName"> - <string>Basic.TransformWindow.Size</string> - </property> - <property name="text"> - <string>Basic.TransformWindow.Size</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QFrame" name="widget_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - <item> - <widget class="QDoubleSpinBox" name="sizeX"> + <item row="1" column="4"> + <widget class="QDoubleSpinBox" name="rotation"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> <property name="minimumSize"> <size> <width>120</width> @@ -240,18 +215,107 @@ </property> <property name="maximumSize"> <size> - <width>100</width> + <width>120</width> <height>16777215</height> </size> </property> <property name="accessibleName"> - <string>Basic.TransformWindow.Width</string> + <string>Basic.TransformWindow.Rotation</string> + </property> + <property name="suffix"> + <string>°</string> + </property> + <property name="minimum"> + <double>-360.000000000000000</double> + </property> + <property name="maximum"> + <double>360.000000000000000</double> + </property> + <property name="singleStep"> + <double>0.100000000000000</double> + </property> + </widget> + </item> + <item row="0" column="2" colspan="2"> + <widget class="QLabel" name="label_3"> + <property name="accessibleName"> + <string>Basic.TransformWindow.Size</string> + </property> + <property name="text"> + <string>Basic.TransformWindow.Size</string> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> + </property> + <property name="class" stdset="0"> + <string>subtitle</string> + </property> + </widget> + </item> + <item row="0" column="0" colspan="2"> + <widget class="QLabel" name="label"> + <property name="accessibleName"> + <string>Basic.TransformWindow.Position</string> + </property> + <property name="text"> + <string>Basic.TransformWindow.Position</string> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> + </property> + <property name="class" stdset="0"> + <string>subtitle</string> + </property> + </widget> + </item> + <item row="1" column="6"> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>0</width> + <height>10</height> + </size> + </property> + </spacer> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="positionYLabel"> + <property name="accessibleName"> + <string>Basic.TransformWindow.Accessible.PositionY</string> + </property> + <property name="text"> + <string>Y</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QDoubleSpinBox" name="positionY"> + <property name="minimumSize"> + <size> + <width>120</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>120</width> + <height>16777215</height> + </size> + </property> + <property name="accessibleName"> + <string>Basic.TransformWindow.PositionY</string> </property> <property name="suffix"> <string> px</string> </property> <property name="decimals"> - <number>4</number> + <number>2</number> </property> <property name="minimum"> <double>-90001.000000000000000</double> @@ -259,12 +323,9 @@ <property name="maximum"> <double>90001.000000000000000</double> </property> - <property name="singleStep"> - <double>1.000000000000000</double> - </property> </widget> </item> - <item> + <item row="2" column="3"> <widget class="QDoubleSpinBox" name="sizeY"> <property name="minimumSize"> <size> @@ -274,7 +335,7 @@ </property> <property name="maximumSize"> <size> - <width>100</width> + <width>120</width> <height>16777215</height> </size> </property> @@ -285,7 +346,7 @@ <string> px</string> </property> <property name="decimals"> - <number>4</number> + <number>2</number> </property> <property name="minimum"> <double>-90001.000000000000000</double> @@ -298,226 +359,80 @@ </property> </widget> </item> + <item row="2" column="2"> + <widget class="QLabel" name="sizeHeightLabel"> + <property name="accessibleName"> + <string>Height</string> + </property> + <property name="text"> + <string>Basic.TransformWindow.Height</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="1" column="5"> + <widget class="QFrame" name="alignmentWidget"> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Plain</enum> + </property> + <property name="lineWidth"> + <number>0</number> + </property> + <layout class="QVBoxLayout" name="alignmentLayout"> + <property name="spacing"> + <number>0</number> + </property> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + </layout> + </widget> + </item> + <item row="0" column="5"> + <widget class="QLabel" name="label_4"> + <property name="accessibleName"> + <string>Basic.TransformWindow.Alignment</string> + </property> + <property name="text"> + <string>Basic.TransformWindow.Alignment</string> + </property> + <property name="class" stdset="0"> + <string>subtitle</string> + </property> + </widget> + </item> </layout> </widget> </item> - <item row="3" column="0"> - <widget class="QLabel" name="label_4"> - <property name="accessibleName"> - <string>Basic.TransformWindow.Alignment</string> - </property> - <property name="text"> - <string>Basic.TransformWindow.Alignment</string> - </property> - </widget> - </item> - <item row="3" column="1"> - <widget class="QComboBox" name="align"> - <property name="accessibleName"> - <string>Basic.TransformWindow.Alignment</string> - </property> - <property name="currentText"> - <string>Basic.TransformWindow.Alignment.TopLeft</string> - </property> - <item> - <property name="text"> - <string>Basic.TransformWindow.Alignment.TopLeft</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.Alignment.TopCenter</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.Alignment.TopRight</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.Alignment.CenterLeft</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.Alignment.Center</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.Alignment.CenterRight</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.Alignment.BottomLeft</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.Alignment.BottomCenter</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.Alignment.BottomRight</string> - </property> - </item> - </widget> - </item> - <item row="4" column="1"> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>10</width> - <height>10</height> - </size> - </property> - </spacer> - </item> - <item row="5" column="0"> - <widget class="QLabel" name="label_5"> - <property name="accessibleName"> - <string>Basic.TransformWindow.BoundsType</string> - </property> - <property name="text"> - <string>Basic.TransformWindow.BoundsType</string> - </property> - </widget> - </item> - <item row="5" column="1"> - <widget class="QComboBox" name="boundsType"> - <property name="accessibleName"> - <string>Basic.TransformWindow.BoundsType</string> + <item> + <widget class="QFrame" name="boundsSettings"> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> </property> - <item> - <property name="text"> - <string>Basic.TransformWindow.BoundsType.None</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.BoundsType.Stretch</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.BoundsType.ScaleInner</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.BoundsType.ScaleOuter</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.BoundsType.ScaleToWidth</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.BoundsType.ScaleToHeight</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.BoundsType.MaxOnly</string> - </property> - </item> - </widget> - </item> - <item row="6" column="0"> - <widget class="QLabel" name="label_6"> - <property name="accessibleName"> - <string>Basic.TransformWindow.BoundsAlignment</string> - </property> - <property name="text"> - <string>Basic.TransformWindow.BoundsAlignment</string> - </property> - </widget> - </item> - <item row="6" column="1"> - <widget class="QComboBox" name="boundsAlign"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="accessibleName"> - <string>Basic.TransformWindow.BoundsAlignment</string> - </property> - <property name="currentText"> - <string>Basic.TransformWindow.Alignment.TopLeft</string> - </property> - <item> - <property name="text"> - <string>Basic.TransformWindow.Alignment.TopLeft</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.Alignment.TopCenter</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.Alignment.TopRight</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.Alignment.CenterLeft</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.Alignment.Center</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.Alignment.CenterRight</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.Alignment.BottomLeft</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.Alignment.BottomCenter</string> - </property> - </item> - <item> - <property name="text"> - <string>Basic.TransformWindow.Alignment.BottomRight</string> - </property> - </item> - </widget> - </item> - <item row="7" column="0"> - <widget class="QLabel" name="label_7"> - <property name="accessibleName"> - <string>Basic.TransformWindow.Bounds</string> + <property name="frameShadow"> + <enum>QFrame::Plain</enum> </property> - <property name="text"> - <string>Basic.TransformWindow.Bounds</string> + <property name="lineWidth"> + <number>0</number> </property> - </widget> - </item> - <item row="7" column="1"> - <widget class="QFrame" name="widget_3"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <property name="class" stdset="0"> + <string>dialog-container dialog-frame</string> </property> - <layout class="QHBoxLayout" name="horizontalLayout_3"> + <layout class="QGridLayout" name="gridLayout_3"> <property name="leftMargin"> <number>0</number> </property> @@ -530,7 +445,147 @@ <property name="bottomMargin"> <number>0</number> </property> - <item> + <property name="horizontalSpacing"> + <number>8</number> + </property> + <property name="verticalSpacing"> + <number>2</number> + </property> + <item row="1" column="0" colspan="3"> + <widget class="QComboBox" name="boundsType"> + <property name="accessibleName"> + <string>Basic.TransformWindow.BoundsType</string> + </property> + <item> + <property name="text"> + <string>Basic.TransformWindow.BoundsType.None</string> + </property> + </item> + <item> + <property name="text"> + <string>Basic.TransformWindow.BoundsType.Stretch</string> + </property> + </item> + <item> + <property name="text"> + <string>Basic.TransformWindow.BoundsType.ScaleInner</string> + </property> + </item> + <item> + <property name="text"> + <string>Basic.TransformWindow.BoundsType.ScaleOuter</string> + </property> + </item> + <item> + <property name="text"> + <string>Basic.TransformWindow.BoundsType.ScaleToWidth</string> + </property> + </item> + <item> + <property name="text"> + <string>Basic.TransformWindow.BoundsType.ScaleToHeight</string> + </property> + </item> + <item> + <property name="text"> + <string>Basic.TransformWindow.BoundsType.MaxOnly</string> + </property> + </item> + </widget> + </item> + <item row="0" column="7" rowspan="4"> + <spacer name="horizontalSpacer_4"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>0</width> + <height>10</height> + </size> + </property> + </spacer> + </item> + <item row="0" column="0" colspan="3"> + <widget class="QLabel" name="label_7"> + <property name="accessibleName"> + <string>Basic.TransformWindow.Bounds</string> + </property> + <property name="text"> + <string>Basic.TransformWindow.Bounds</string> + </property> + <property name="class" stdset="0"> + <string>subtitle</string> + </property> + </widget> + </item> + <item row="1" column="3"> + <widget class="QFrame" name="alignmentWidget2"> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Plain</enum> + </property> + <property name="lineWidth"> + <number>0</number> + </property> + <layout class="QVBoxLayout" name="boundsAlignmentLayout"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + </layout> + </widget> + </item> + <item row="0" column="3"> + <widget class="QLabel" name="label_6"> + <property name="accessibleName"> + <string>Basic.TransformWindow.Alignment</string> + </property> + <property name="text"> + <string>Basic.TransformWindow.Alignment</string> + </property> + <property name="class" stdset="0"> + <string>subtitle</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="boundsWidthLabel"> + <property name="accessibleName"> + <string>Basic.TransformWindow.BoundsWidth</string> + </property> + <property name="text"> + <string>Basic.TransformWindow.Width</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="boundsHeightLabel"> + <property name="accessibleName"> + <string>Basic.TransformWindow.BoundsHeight</string> + </property> + <property name="text"> + <string>Basic.TransformWindow.Height</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="2" column="1"> <widget class="QDoubleSpinBox" name="boundsWidth"> <property name="enabled"> <bool>false</bool> @@ -543,7 +598,7 @@ </property> <property name="maximumSize"> <size> - <width>100</width> + <width>120</width> <height>16777215</height> </size> </property> @@ -554,7 +609,7 @@ <string> px</string> </property> <property name="decimals"> - <number>4</number> + <number>2</number> </property> <property name="minimum"> <double>1.000000000000000</double> @@ -564,7 +619,7 @@ </property> </widget> </item> - <item> + <item row="3" column="1"> <widget class="QDoubleSpinBox" name="boundsHeight"> <property name="enabled"> <bool>false</bool> @@ -577,7 +632,7 @@ </property> <property name="maximumSize"> <size> - <width>100</width> + <width>120</width> <height>16777215</height> </size> </property> @@ -588,7 +643,7 @@ <string> px</string> </property> <property name="decimals"> - <number>4</number> + <number>2</number> </property> <property name="minimum"> <double>1.000000000000000</double> @@ -598,260 +653,281 @@ </property> </widget> </item> + <item row="2" column="2"> + <widget class="QCheckBox" name="cropToBounds"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maximumSize"> + <size> + <width>100</width> + <height>16777215</height> + </size> + </property> + <property name="accessibleName"> + <string>Basic.TransformWindow.BoundsAlignment</string> + </property> + <property name="text"> + <string>Basic.TransformWindow.CropToBounds</string> + </property> + <property name="class" stdset="0"> + <string/> + </property> + </widget> + </item> </layout> </widget> </item> - <item row="8" column="1"> - <widget class="QCheckBox" name="cropToBounds"> - <property name="accessibleName"> - <string>Basic.TransformWindow.BoundsAlignment</string> + <item> + <widget class="QFrame" name="cropSettings"> + <property name="lineWidth"> + <number>0</number> </property> - <property name="text"> - <string>Basic.TransformWindow.CropToBounds</string> + <property name="class" stdset="0"> + <string>dialog-container dialog-frame</string> </property> + <layout class="QGridLayout" name="gridLayout"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <property name="horizontalSpacing"> + <number>8</number> + </property> + <property name="verticalSpacing"> + <number>2</number> + </property> + <item row="1" column="0"> + <widget class="QLabel" name="cropLeftLabel"> + <property name="accessibleName"> + <string>Basic.TransformWindow.CropLeft</string> + </property> + <property name="text"> + <string>Left</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QLabel" name="cropRightLabel"> + <property name="text"> + <string>Right</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="2" column="3"> + <widget class="QSpinBox" name="cropBottom"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>120</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>120</width> + <height>16777215</height> + </size> + </property> + <property name="accessibleName"> + <string>Basic.TransformWindow.CropBottom</string> + </property> + <property name="suffix"> + <string> px</string> + </property> + <property name="maximum"> + <number>100000</number> + </property> + </widget> + </item> + <item row="1" column="4"> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="1" column="3"> + <widget class="QSpinBox" name="cropRight"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>120</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>120</width> + <height>16777215</height> + </size> + </property> + <property name="accessibleName"> + <string>Basic.TransformWindow.CropRight</string> + </property> + <property name="suffix"> + <string> px</string> + </property> + <property name="maximum"> + <number>100000</number> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QSpinBox" name="cropLeft"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>120</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>120</width> + <height>16777215</height> + </size> + </property> + <property name="accessibleName"> + <string>Basic.TransformWindow.CropLeft</string> + </property> + <property name="suffix"> + <string> px</string> + </property> + <property name="maximum"> + <number>100000</number> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="cropTopLabel"> + <property name="text"> + <string>Top</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QSpinBox" name="cropTop"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>120</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>120</width> + <height>16777215</height> + </size> + </property> + <property name="accessibleName"> + <string>Basic.TransformWindow.CropTop</string> + </property> + <property name="suffix"> + <string> px</string> + </property> + <property name="maximum"> + <number>100000</number> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label_8"> + <property name="accessibleName"> + <string>Basic.TransformWindow.Crop</string> + </property> + <property name="text"> + <string>Basic.TransformWindow.Crop</string> + </property> + <property name="class" stdset="0"> + <string>subtitle</string> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QLabel" name="cropBottomLabel"> + <property name="text"> + <string>Bottom</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + </layout> </widget> </item> - <item row="9" column="1"> - <spacer name="verticalSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>10</width> - <height>10</height> - </size> - </property> - </spacer> - </item> - <item row="10" column="0"> - <widget class="QLabel" name="label_8"> - <property name="accessibleName"> - <string>Basic.TransformWindow.Crop</string> - </property> - <property name="text"> - <string>Basic.TransformWindow.Crop</string> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="standardButtons"> + <set>QDialogButtonBox::Close|QDialogButtonBox::Reset</set> </property> </widget> </item> - <item row="10" column="1"> - <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="1"> - <widget class="QSpinBox" name="cropLeft"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>100</width> - <height>0</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>100</width> - <height>16777215</height> - </size> - </property> - <property name="accessibleName"> - <string>Basic.TransformWindow.CropLeft</string> - </property> - <property name="suffix"> - <string> px</string> - </property> - <property name="maximum"> - <number>100000</number> - </property> - </widget> - </item> - <item row="0" column="3"> - <widget class="QSpinBox" name="cropRight"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>100</width> - <height>0</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>100</width> - <height>16777215</height> - </size> - </property> - <property name="accessibleName"> - <string>Basic.TransformWindow.CropRight</string> - </property> - <property name="suffix"> - <string> px</string> - </property> - <property name="maximum"> - <number>100000</number> - </property> - </widget> - </item> - <item row="0" column="0"> - <widget class="QLabel" name="label_9"> - <property name="text"> - <string>Left</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - <property name="buddy"> - <cstring>cropLeft</cstring> - </property> - </widget> - </item> - <item row="1" column="2"> - <widget class="QLabel" name="label_12"> - <property name="text"> - <string>Bottom</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - <property name="buddy"> - <cstring>cropBottom</cstring> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QSpinBox" name="cropTop"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>100</width> - <height>0</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>100</width> - <height>16777215</height> - </size> - </property> - <property name="accessibleName"> - <string>Basic.TransformWindow.CropTop</string> - </property> - <property name="suffix"> - <string> px</string> - </property> - <property name="maximum"> - <number>100000</number> - </property> - </widget> - </item> - <item row="1" column="3"> - <widget class="QSpinBox" name="cropBottom"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>100</width> - <height>0</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>100</width> - <height>16777215</height> - </size> - </property> - <property name="accessibleName"> - <string>Basic.TransformWindow.CropBottom</string> - </property> - <property name="suffix"> - <string> px</string> - </property> - <property name="maximum"> - <number>100000</number> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_11"> - <property name="text"> - <string>Top</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - <property name="buddy"> - <cstring>cropTop</cstring> - </property> - </widget> - </item> - <item row="0" column="2"> - <widget class="QLabel" name="label_10"> - <property name="text"> - <string>Right</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - <property name="buddy"> - <cstring>cropRight</cstring> - </property> - </widget> - </item> - <item row="0" column="4"> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>0</width> - <height>0</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> </layout> </widget> </item> - <item> - <spacer name="transformSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>0</width> - <height>10</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="standardButtons"> - <set>QDialogButtonBox::Close|QDialogButtonBox::Reset</set> - </property> - </widget> - </item> </layout> </widget> + <tabstops> + <tabstop>positionX</tabstop> + <tabstop>positionY</tabstop> + <tabstop>sizeX</tabstop> + <tabstop>sizeY</tabstop> + <tabstop>rotation</tabstop> + <tabstop>boundsType</tabstop> + <tabstop>boundsWidth</tabstop> + <tabstop>boundsHeight</tabstop> + <tabstop>cropToBounds</tabstop> + <tabstop>cropLeft</tabstop> + <tabstop>cropRight</tabstop> + <tabstop>cropTop</tabstop> + <tabstop>cropBottom</tabstop> + </tabstops> <resources/> <connections> <connection> @@ -862,7 +938,7 @@ <hints> <hint type="sourcelabel"> <x>20</x> - <y>20</y> + <y>358</y> </hint> <hint type="destinationlabel"> <x>20</x>
View file
obs-studio-32.0.4.tar.xz/frontend/forms/PluginManagerWindow.ui -> obs-studio-32.1.0.tar.xz/frontend/forms/PluginManagerWindow.ui
Changed
@@ -179,6 +179,9 @@ <property name="text"> <string>PluginManager.Section.Manage.Title</string> </property> + <property name="indent"> + <number>0</number> + </property> <property name="class" stdset="0"> <string>text-title</string> </property>
View file
obs-studio-32.1.0.tar.xz/frontend/forms/images/headphones-off.svg
Added
@@ -0,0 +1,1 @@ +<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><style>.a{opacity:.4}</style><path class="a" d="m15 6.6c0-2.5-1.3-4.4-3.5-5.7-1.1-0.6-2.3-0.9-3.5-0.9-1.2 0-2.4 0.3-3.5 0.9-2.2 1.3-3.5 3.6-3.5 6.1v6c0 0 0 2 2 2h1c0.6 0 1-0.4 1-1v-4c0-0.6-0.5-1-1-1 0 0-1 0-1-1v-1c0-1.8 1-3.4 2.5-4.3 1.5-0.9 3.5-0.9 5 0 1.5 0.9 2.6 2.3 2.6 4.1h1.9z"/><path d="m9 7.8q-0.5 0-0.8 0.4c-0.5 0.4-0.5 1.2 0 1.6l1.5 1.6-1.5 1.6c-0.5 0.4-0.5 1.2 0 1.6 0.4 0.5 1.2 0.5 1.6 0l1.6-1.5 1.6 1.5c0.4 0.5 1.2 0.5 1.6 0 0.5-0.4 0.5-1.2 0-1.6l-1.5-1.6 1.5-1.6c0.5-0.4 0.5-1.2 0-1.6q-0.3-0.4-0.8-0.4-0.5 0-0.8 0.4l-1.6 1.5-1.6-1.5q-0.3-0.4-0.8-0.4z"/></svg> \ No newline at end of file
View file
obs-studio-32.1.0.tar.xz/frontend/forms/images/headphones.svg
Added
@@ -0,0 +1,1 @@ +<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><style>.a{fill:#000000}</style><path class="a" d="m8 0c-1.2 0-2.4 0.3-3.5 0.9-2.2 1.3-3.5 3.6-3.5 6.1v6c0 0 0 2 2 2h1c0.6 0 1-0.4 1-1v-4c0-0.6-0.5-1-1-1 0 0-1 0-1-1v-1c0-1.8 1-3.4 2.5-4.3 1.5-0.9 3.5-0.9 5 0 1.5 0.9 2.5 2.5 2.5 4.3v1c0 1-1 1-1 1-0.5 0-1 0.4-1 1v4c0 0.6 0.4 1 1 1h1c2 0 2-2 2-2v-6c0-2.5-1.3-4.8-3.5-6.1-1.1-0.6-2.3-0.9-3.5-0.9z"/></svg> \ No newline at end of file
View file
obs-studio-32.1.0.tar.xz/frontend/forms/images/layout-horizontal.svg
Added
@@ -0,0 +1,8 @@ +<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" width="160" height="160"> + <style> + .s0 { fill: #000000 } + </style> + <g> + <path class="s0" d="m160 42c0-16.45-13.55-30-30-30h-100c-16.45 0-30 13.55-30 30v76c0 16.45 13.55 30 30 30h100c16.45 0 30-13.55 30-30zm-20 0v28h-120v-28c0-5.7 4.3-10 10-10h100c5.7 0 10 4.3 10 10zm0 48v28c0 5.7-4.3 10-10 10h-100c-5.7 0-10-4.3-10-10v-28z"/> + </g> +</svg> \ No newline at end of file
View file
obs-studio-32.1.0.tar.xz/frontend/forms/images/layout-vertical.svg
Added
@@ -0,0 +1,8 @@ +<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" width="160" height="160"> + <style> + .s0 { fill: #000000 } + </style> + <g> + <path class="s0" d="m42 0c-16.45 0-30 13.55-30 30v100c0 16.45 13.55 30 30 30h76c16.45 0 30-13.55 30-30v-100c0-16.45-13.55-30-30-30zm0 20h28v120h-28c-5.7 0-10-4.3-10-10v-100c0-5.7 4.3-10 10-10zm48 0h28c5.7 0 10 4.3 10 10v100c0 5.7-4.3 10-10 10h-28z"/> + </g> +</svg> \ No newline at end of file
View file
obs-studio-32.0.4.tar.xz/frontend/forms/obs.qrc -> obs-studio-32.1.0.tar.xz/frontend/forms/obs.qrc
Changed
@@ -1,8 +1,12 @@ <RCC> <qresource prefix="/res"> + <file>images/layout-horizontal.svg</file> + <file>images/layout-vertical.svg</file> <file>images/close.svg</file> + <file>images/headphones.svg</file> <file>images/save.svg</file> <file>images/media-pause.svg</file> + <file>images/headphones-off.svg</file> <file>images/trash.svg</file> <file>images/filter.svg</file> <file>images/mute.svg</file>
View file
obs-studio-32.0.4.tar.xz/frontend/importer/ImporterEntryPathItemDelegate.cpp -> obs-studio-32.1.0.tar.xz/frontend/importer/ImporterEntryPathItemDelegate.cpp
Changed
@@ -68,7 +68,7 @@ browseButton->setSizePolicy(buttonSizePolicy); layout->addWidget(browseButton); - container->connect(browseButton, &QToolButton::clicked, browseCallback); + connect(browseButton, &QToolButton::clicked, this, browseCallback); // The "clear" button is not shown in output cells // or the insertion point's input cell. @@ -78,7 +78,7 @@ clearButton->setSizePolicy(buttonSizePolicy); layout->addWidget(clearButton); - container->connect(clearButton, &QToolButton::clicked, clearCallback); + connect(clearButton, &QToolButton::clicked, this, clearCallback); } container->setLayout(layout);
View file
obs-studio-32.0.4.tar.xz/frontend/obs-main.cpp -> obs-studio-32.1.0.tar.xz/frontend/obs-main.cpp
Changed
@@ -16,13 +16,14 @@ ******************************************************************************/ #include <OBSApp.hpp> + +#include <components/VolumeAccessibleInterface.hpp> #ifdef __APPLE__ #include <dialogs/OBSPermissions.hpp> #endif #include <utility/BaseLexer.hpp> #include <utility/OBSTranslator.hpp> #include <utility/platform.hpp> -#include <widgets/VolumeAccessibleInterface.hpp> #include <qt-wrappers.hpp> #include <util/platform.h> @@ -519,7 +520,7 @@ #endif #if !defined(_WIN32) && !defined(__APPLE__) - /* NOTE: Users blindly set this, but this theme is incompatble with Qt6 and + /* NOTE: Users blindly set this, but this theme is incompatible with Qt6 and * crashes loading saved geometry. Just turn off this theme and let users complain OBS * looks ugly instead of crashing. */ const char *platform_theme = getenv("QT_QPA_PLATFORMTHEME"); @@ -856,33 +857,35 @@ int main(int argc, char *argv) { #ifndef _WIN32 - signal(SIGPIPE, SIG_IGN); - - struct sigaction sigint_handler; - - sigint_handler.sa_handler = OBSApp::SigIntSignalHandler; - sigemptyset(&sigint_handler.sa_mask); - sigint_handler.sa_flags = 0; - - sigaction(SIGINT, &sigint_handler, NULL); - - struct sigaction sigterm_handler; - - sigterm_handler.sa_handler = OBSApp::SigTermSignalHandler; - sigemptyset(&sigterm_handler.sa_mask); - sigterm_handler.sa_flags = 0; - - sigaction(SIGTERM, &sigterm_handler, NULL); - sigaction(SIGHUP, &sigterm_handler, NULL); - - /* Block SIGPIPE in all threads, this can happen if a thread calls write on - a closed pipe. */ - sigset_t sigpipe_mask; - sigemptyset(&sigpipe_mask); - sigaddset(&sigpipe_mask, SIGPIPE); - sigset_t saved_mask; - if (pthread_sigmask(SIG_BLOCK, &sigpipe_mask, &saved_mask) == -1) { - perror("pthread_sigmask"); + using SignalHandlerCallback = decltype(OBSApp::sigIntSignalHandler); + + auto setupSignalHandler = (SignalHandlerCallback &callback, int signal) { + struct sigaction signalHandler{}; + signalHandler.sa_handler = callback; + sigemptyset(&signalHandler.sa_mask); + signalHandler.sa_flags = 0; + + sigaction(signal, &signalHandler, nullptr); + }; + + setupSignalHandler(OBSApp::sigIntSignalHandler, SIGINT); + setupSignalHandler(OBSApp::sigTermSignalHandler, SIGTERM); + setupSignalHandler(OBSApp::sigTermSignalHandler, SIGHUP); + setupSignalHandler(OBSApp::sigAbrtSignalHandler, SIGABRT); + setupSignalHandler(OBSApp::sigQuitSignalHandler, SIGQUIT); + + // Block SIGPIPE in all threads, this can happen if a thread calls write on a closed pipe. + // Supposedly this can happen when OBS tries to write to a closed RTMP socket. + sigset_t sigpipeMask{}; + sigemptyset(&sigpipeMask); + sigaddset(&sigpipeMask, SIGPIPE); + sigset_t savedMask{}; + + // pthread_sigmask returns 0 on success + bool signalMaskChanged = pthread_sigmask(SIG_BLOCK, &sigpipeMask, &savedMask) == 0; + + if (!signalMaskChanged) { + perror("Unexpected failure to add 'SIG_BLOCK' to 'SIGPIPE' signal mask."); exit(1); } #endif
View file
obs-studio-32.0.4.tar.xz/frontend/plugin-manager/PluginManagerWindow.cpp -> obs-studio-32.1.0.tar.xz/frontend/plugin-manager/PluginManagerWindow.cpp
Changed
@@ -29,6 +29,8 @@ #include "moc_PluginManagerWindow.cpp" +extern bool safe_mode; + namespace OBS { PluginManagerWindow::PluginManagerWindow(std::vector<ModuleInfo> const &modules, QWidget *parent) @@ -73,7 +75,17 @@ return aName < bName; }); + std::sort(modules_.begin(), modules_.end(), (const ModuleInfo &a, const ModuleInfo &b) { + bool missingA = !obs_get_module(a.module_name.c_str()) && + !obs_get_disabled_module(a.module_name.c_str()); + bool missingB = !obs_get_module(b.module_name.c_str()) && + !obs_get_disabled_module(b.module_name.c_str()); + + return !missingA && missingB; + }); + int row = 0; + int missingIndex = -1; for (auto &metadata : modules_) { std::string id = metadata.module_name; // Check if the module is missing: @@ -81,21 +93,19 @@ QString name = !metadata.display_name.empty() ? metadata.display_name.c_str() : metadata.module_name.c_str(); - if (missing) { - name += " " + QTStr("PluginManager.MissingPlugin"); + + if (missing && missingIndex == -1) { + missingIndex = row; } auto item = new QCheckBox(name); item->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); item->setChecked(metadata.enabled); - if (!metadata.enabledAtLaunch) { + if (!metadata.enabledAtLaunch || missing) { item->setProperty("class", "text-muted"); } - if (missing) { - item->setEnabled(false); - } ui->modulesList->layout()->addWidget(item); connect(item, &QCheckBox::toggled, this, this, row(bool checked) { @@ -106,6 +116,24 @@ row++; } + QVBoxLayout *layout = qobject_cast<QVBoxLayout *>(ui->modulesList->layout()); + if (safe_mode) { + QLabel *safeModeLabel = new QLabel(ui->modulesList); + safeModeLabel->setText(QTStr("PluginManager.SafeMode")); + safeModeLabel->setProperty("class", "text-muted text-italic"); + safeModeLabel->setIndent(0); + + layout->insertWidget(0, safeModeLabel); + } else if (missingIndex != -1) { + QLabel *missingLabel = new QLabel(ui->modulesList); + missingLabel->setText(QTStr("PluginManager.MissingPlugin")); + missingLabel->setProperty("class", "text-warning text-bold"); + missingLabel->setIndent(0); + + layout->insertWidget(missingIndex, new QLabel("", ui->modulesList)); + layout->insertWidget(missingIndex + 1, missingLabel); + } + ui->modulesList->adjustSize(); ui->modulesListContents->adjustSize();
View file
obs-studio-32.0.4.tar.xz/frontend/plugins/aja-output-ui/CMakeLists.txt -> obs-studio-32.1.0.tar.xz/frontend/plugins/aja-output-ui/CMakeLists.txt
Changed
@@ -10,8 +10,6 @@ find_package(Qt6 REQUIRED Widgets) if(OS_LINUX OR OS_FREEBSD OR OS_OPENBSD) - find_package(Qt6 REQUIRED Gui) - find_package(X11 REQUIRED) endif() @@ -47,7 +45,6 @@ Qt::Widgets AJA::LibAJANTV2 $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:X11::X11> - $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:Qt::GuiPrivate> ) target_link_options(aja-output-ui PRIVATE $<$<PLATFORM_ID:Windows>:/IGNORE:4099>)
View file
obs-studio-32.0.4.tar.xz/frontend/plugins/aja-output-ui/aja-ui-main.cpp -> obs-studio-32.1.0.tar.xz/frontend/plugins/aja-output-ui/aja-ui-main.cpp
Changed
@@ -374,7 +374,7 @@ ajaOutputUI->ShowHideDialog(); }; - action->connect(action, &QAction::triggered, cb); + QObject::connect(action, &QAction::triggered, action, cb); } static void OBSEvent(enum obs_frontend_event event, void *)
View file
obs-studio-32.1.0.tar.xz/frontend/plugins/aja-output-ui/data/locale/lo-LA.ini
Added
@@ -0,0 +1,6 @@ +AJAOutput.Device="ຜົນອອກອຸປະກອນ AJA I/O" +AJAOutput.ProgramOutput="ຜົນອອກໂປຣແກຣມ" +AJAOutput.PreviewOutput="ຜົນອອກການສະແດງຕົວຢ່າງ" +AJAOutput.MiscOutput="ການຕັ້ງຄ່າເພີ່ມເຕີມ" +AJAOutput.MultiViewEnable="ເປີດໃຊ້ງານມຸມມອງຫຼາຍຈໍ" +AJAOutput.MultiViewAudioSource="ແຫຼ່ງສຽງມຸມມອງຫຼາຍຈໍ"
View file
obs-studio-32.1.0.tar.xz/frontend/plugins/aja-output-ui/data/locale/lv-LV.ini
Added
@@ -0,0 +1,2 @@ +AJAOutput.ProgramOutput="Programmas Izvade" +AJAOutput.MiscOutput="Papildu Iestatījumi"
View file
obs-studio-32.0.4.tar.xz/frontend/plugins/decklink-captions/decklink-captions.cpp -> obs-studio-32.1.0.tar.xz/frontend/plugins/decklink-captions/decklink-captions.cpp
Changed
@@ -133,7 +133,7 @@ obs_frontend_add_save_callback(save_decklink_caption_data, nullptr); - action->connect(action, &QAction::triggered, cb); + QObject::connect(action, &QAction::triggered, action, cb); } bool obs_module_load(void)
View file
obs-studio-32.0.4.tar.xz/frontend/plugins/decklink-output-ui/CMakeLists.txt -> obs-studio-32.1.0.tar.xz/frontend/plugins/decklink-output-ui/CMakeLists.txt
Changed
@@ -8,8 +8,6 @@ find_package(Qt6 REQUIRED Widgets) if(OS_LINUX OR OS_FREEBSD OR OS_OPENBSD) - find_package(Qt6 REQUIRED Gui) - find_package(X11 REQUIRED) endif() @@ -38,7 +36,6 @@ Qt::Widgets "$<$<PLATFORM_ID:Darwin>:$<LINK_LIBRARY:FRAMEWORK,Cocoa.framework>>" $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:X11::X11> - $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:Qt::GuiPrivate> ) if(OS_WINDOWS)
View file
obs-studio-32.0.4.tar.xz/frontend/plugins/decklink-output-ui/decklink-ui-main.cpp -> obs-studio-32.1.0.tar.xz/frontend/plugins/decklink-output-ui/decklink-ui-main.cpp
Changed
@@ -427,7 +427,7 @@ doUI->ShowHideDialog(); }; - action->connect(action, &QAction::triggered, cb); + QObject::connect(action, &QAction::triggered, action, cb); } static void OBSEvent(enum obs_frontend_event event, void *)
View file
obs-studio-32.0.4.tar.xz/frontend/plugins/frontend-tools/CMakeLists.txt -> obs-studio-32.1.0.tar.xz/frontend/plugins/frontend-tools/CMakeLists.txt
Changed
@@ -3,7 +3,6 @@ find_package(Qt6 REQUIRED Widgets) if(OS_LINUX OR OS_FREEBSD OR OS_OPENBSD) - find_package(Qt6 REQUIRED Gui) find_package(X11 REQUIRED) endif() @@ -65,7 +64,6 @@ Qt::Widgets "$<$<PLATFORM_ID:Darwin>:$<LINK_LIBRARY:FRAMEWORK,Cocoa>>" $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:X11::X11> - $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:Qt::GuiPrivate> ) add_subdirectory("${CMAKE_SOURCE_DIR}/shared/obs-scripting" "${CMAKE_BINARY_DIR}/shared/obs-scripting")
View file
obs-studio-32.0.4.tar.xz/frontend/plugins/frontend-tools/auto-scene-switcher.cpp -> obs-studio-32.1.0.tar.xz/frontend/plugins/frontend-tools/auto-scene-switcher.cpp
Changed
@@ -503,5 +503,5 @@ obs_frontend_add_save_callback(SaveSceneSwitcher, nullptr); obs_frontend_add_event_callback(OBSEvent, nullptr); - action->connect(action, &QAction::triggered, cb); + QObject::connect(action, &QAction::triggered, action, cb); }
View file
obs-studio-32.0.4.tar.xz/frontend/plugins/frontend-tools/data/locale/fil-PH.ini -> obs-studio-32.1.0.tar.xz/frontend/plugins/frontend-tools/data/locale/fil-PH.ini
Changed
@@ -32,9 +32,9 @@ Reload="I-reload" OpenFileLocation="Buksan ang lokasyon ng file" PythonSettings="Mga setting ng Python" -PythonSettings.PythonInstallPath32bit="Path kung saan naka-install ang Python (32bit)" -PythonSettings.PythonInstallPath64bit="Path kung saan naka-install ang Python (64bit)" -PythonSettings.BrowsePythonPath="Hanapin ang Path ng Python" +PythonSettings.PythonInstallPath32bit="Landas ng Instalasyon ng Python (32bit)" +PythonSettings.PythonInstallPath64bit="Landas ng Instalasyon ng Python (64bit)" +PythonSettings.BrowsePythonPath="Pumunta sa Landas ng Python" PythonSettings.PythonVersion="Na-load na ang Bersyon ng Python : %1" PythonSettings.PythonNotLoaded="Kasalukuyang hindi na-loload ang Python" PythonSettings.AlreadyLoaded.Title="Nag-load na ang Python"
View file
obs-studio-32.0.4.tar.xz/frontend/plugins/frontend-tools/data/locale/ka-GE.ini -> obs-studio-32.1.0.tar.xz/frontend/plugins/frontend-tools/data/locale/ka-GE.ini
Changed
@@ -2,7 +2,7 @@ SceneSwitcher.OnNoMatch="როცა ყველა ფანჯარა შეუსაბამოა:" SceneSwitcher.OnNoMatch.DontSwitch="არ გადაირთოს" SceneSwitcher.OnNoMatch.SwitchTo="გადაირთოს:" -SceneSwitcher.CheckInterval="მოქმედი ფანჯრის დასახელების გადამოწმების დროის შუალედი:" +SceneSwitcher.CheckInterval="მოქმედი ფანჯრის სათაურის შემოწმების დრო:" SceneSwitcher.ActiveOrNotActive="სცენის თვითგადამრთველი:" InvalidRegex.Title="არამართებული რეგულარული გამოსახულება" InvalidRegex.Text="შეყვანილი რეგულარული გამოსახულება არასწორია."
View file
obs-studio-32.0.4.tar.xz/frontend/plugins/frontend-tools/data/locale/lo-LA.ini -> obs-studio-32.1.0.tar.xz/frontend/plugins/frontend-tools/data/locale/lo-LA.ini
Changed
@@ -1,4 +1,47 @@ SceneSwitcher="ປຸ່ມປ່ຽນສາກອັດຕະໂນມັດ" +SceneSwitcher.OnNoMatch="ເມື່ອບໍ່ມີປ່ອງຢ້ຽມທີ່ກົງກັນ:" +SceneSwitcher.OnNoMatch.DontSwitch="ບໍ່ຕ້ອງປ່ຽນ" +SceneSwitcher.OnNoMatch.SwitchTo="ປ່ຽນໄປຍັງ:" +SceneSwitcher.CheckInterval="ກວດສອບຊື່ປ່ອງຢ້ຽມທີ່ໃຊ້ງານຢູ່ທຸກໆ:" +SceneSwitcher.ActiveOrNotActive="ສະຖານະຕົວປ່ຽນສາກ:" +InvalidRegex.Title="Regular Expression ບໍ່ຖືກຕ້ອງ" +InvalidRegex.Text="Regular Expression ທີ່ທ່ານປ້ອນບໍ່ຖືກຕ້ອງ." +Active="ເປີດໃຊ້ງານ" +Inactive="ປິດໃຊ້ງານ" Start="ເລີ່ມ" Stop="ຢຸດ" +Captions="ຄຳບັນຍາຍ (ທົດລອງ)" Captions.AudioSource="ສຽງຂາເຂົ້າ" +Captions.CurrentSystemLanguage="ພາສາຂອງລະບົບປະຈຸບັນ (%1)" +Captions.Provider="ຜູ້ໃຫ້ບໍລິການ" +Captions.Error.GenericFail="ລົ້ມເຫຼວໃນການເລີ່ມຄຳບັນຍາຍ" +OutputTimer="ຕົວຕັ້ງເວລາການສົ່ງອອກ" +OutputTimer.Stream="ຢຸດການຖ່າຍທອດສົດຫຼັງຈາກ:" +OutputTimer.Record="ຢຸດການບັນທຶກຫຼັງຈາກ:" +OutputTimer.Stream.StoppingIn="ການຖ່າຍທອດສົດຈະຢຸດໃນ:" +OutputTimer.Record.StoppingIn="ການບັນທຶກຈະຢຸດໃນ:" +OutputTimer.Stream.EnableEverytime="ເປີດໃຊ້ຕົວຕັ້ງເວລາຖ່າຍທອດສົດທຸກຄັ້ງ" +OutputTimer.Record.EnableEverytime="ເປີດໃຊ້ຕົວຕັ້ງເວລາບັນທຶກທຸກຄັ້ງ" +OutputTimer.Record.PauseTimer="ຢຸດເວລາຊົ່ວຄາວ ເມື່ອການບັນທຶກຖືກຢຸດຊົ່ວຄາວ" +Scripts="ສະຄຣິບ" +LoadedScripts="ສະຄຣິບທີ່ໂຫຼດແລ້ວ" +AddScripts="ເພີ່ມສະຄຣິບ" +RemoveScripts="ລຶບສະຄຣິບ" +ReloadScripts="ໂຫຼດສະຄຣິບຄືນໃໝ່" +EditScript="ແກ້ໄຂສະຄຣິບ" +Reload="ໂຫຼດຄືນໃໝ່" +OpenFileLocation="ເປີດບ່ອນເກັບໄຟລ໌" +PythonSettings="ການຕັ້ງຄ່າ Python" +PythonSettings.PythonInstallPath32bit="ເສັ້ນທາງຕິດຕັ້ງ Python (32bit)" +PythonSettings.PythonInstallPath64bit="ເສັ້ນທາງຕິດຕັ້ງ Python (64bit)" +PythonSettings.BrowsePythonPath="ເລືອກເສັ້ນທາງ Python" +PythonSettings.PythonVersion="ເວີຊັນ Python ທີ່ໂຫຼດ: %1" +PythonSettings.PythonNotLoaded="ຍັງບໍ່ທັນໂຫຼດ Python" +PythonSettings.AlreadyLoaded.Title="Python ຖືກໂຫຼດແລ້ວ" +PythonSettings.AlreadyLoaded.Message="Python %1 ຖືກໂຫຼດຢູ່ແລ້ວ. ເພື່ອໂຫຼດ Python ເວີຊັນໃໝ່ທີ່ເລືອກ, ກະລຸນາປິດແລ້ວເປີດ OBS ໃໝ່." +ScriptLogWindow="ບັນທຶກການທຳງານສະຄຣິບ" +Description="ຄຳອະທິບາຍ" +ScriptDescriptionLink.Text="ເປີດລິ້ງນີ້ໃນເວັບບຣາວເຊີເລີ່ມຕົ້ນຂອງທ່ານບໍ່?" +ScriptDescriptionLink.OpenURL="ເປີດ URL" +FileFilter.ScriptFiles="ໄຟລ໌ສະຄຣິບ" +FileFilter.AllFiles="ທຸກໄຟລ໌"
View file
obs-studio-32.1.0.tar.xz/frontend/plugins/frontend-tools/data/locale/lv-LV.ini
Added
@@ -0,0 +1,47 @@ +SceneSwitcher="Automātisks Ainu Pārslēdzējs" +SceneSwitcher.OnNoMatch="Kad neviens logs neatbilst:" +SceneSwitcher.OnNoMatch.DontSwitch="Nepārslēgties" +SceneSwitcher.OnNoMatch.SwitchTo="Pārslēgties uz:" +SceneSwitcher.CheckInterval="Pārbaudīt aktīvā loga nosaukumu ik pēc:" +SceneSwitcher.ActiveOrNotActive="Ainu Pārslēdzējs ir:" +InvalidRegex.Title="Nederīga Regulārā Izteiksme" +InvalidRegex.Text="Ievadītā regulārā izteiksme nav derīga." +Active="Aktīvs" +Inactive="Neaktīvs" +Start="Sākt" +Stop="Apturēt" +Captions="Subtitri (Eksperimentāli)" +Captions.AudioSource="Audio avots" +Captions.CurrentSystemLanguage="Pašreizējā Sistēmas Valoda (%1)" +Captions.Provider="Provaiders" +Captions.Error.GenericFail="Neizdevās sākt subtitrus" +OutputTimer="Izvades Taimeris" +OutputTimer.Stream="Pārtraukt straumēšanu pēc:" +OutputTimer.Record="Pārtraukt ierakstīšanu pēc:" +OutputTimer.Stream.StoppingIn="Straumēšana apstājas pēc:" +OutputTimer.Record.StoppingIn="Ierakstīšana apstājas pēc:" +OutputTimer.Stream.EnableEverytime="Iespējot straumēšanas taimeri katru reizi" +OutputTimer.Record.EnableEverytime="Iespējot ierakstīšanas taimeri katru reizi" +OutputTimer.Record.PauseTimer="Apstādināt taimeri, kad ierakstīšana ir apturēta" +Scripts="Skripti" +LoadedScripts="Ielādētie Skripti" +AddScripts="Pievienot Skriptus" +RemoveScripts="Noņemt Skriptus" +ReloadScripts="Atkārtoti ielādēt Skriptus" +EditScript="Rediģēt Skriptu" +Reload="Pārlādēt" +OpenFileLocation="Atvērt faila atrašanās vietu" +PythonSettings="Python Iestatījumi" +PythonSettings.PythonInstallPath32bit="Python Instalēšanas Ceļš (32 bitu)" +PythonSettings.PythonInstallPath64bit="Python Instalēšanas Ceļš (64 bitu)" +PythonSettings.BrowsePythonPath="Pārlūkot Python Ceļu" +PythonSettings.PythonVersion="Ielādēta Python Versija: %1" +PythonSettings.PythonNotLoaded="Python pašlaik nav ielādēts" +PythonSettings.AlreadyLoaded.Title="Python jau ir ielādēts" +PythonSettings.AlreadyLoaded.Message="Python %1 kopija jau ir ielādēta. Lai ielādētu jaunizveidoto Python versiju, lūdzu, restartējiet OBS." +ScriptLogWindow="Skripta Žurnāls" +Description="Apraksts" +ScriptDescriptionLink.Text="Atvērt šo saiti noklusējuma tīmekļa pārlūkā?" +ScriptDescriptionLink.OpenURL="Atvērt URL" +FileFilter.ScriptFiles="Skriptu Faili" +FileFilter.AllFiles="Visi Faili"
View file
obs-studio-32.0.4.tar.xz/frontend/plugins/frontend-tools/data/locale/tl-PH.ini -> obs-studio-32.1.0.tar.xz/frontend/plugins/frontend-tools/data/locale/tl-PH.ini
Changed
@@ -12,7 +12,7 @@ Stop="Ihinto" Captions="Mga Pamagat (Eksparimento)" Captions.AudioSource="Pinanggalingan ng Audio" -Captions.CurrentSystemLanguage="Kasalukuyang linggwahe ng sistema (%1)" +Captions.CurrentSystemLanguage="Kasalukuyang Wika ng Sistema (%1)" Captions.Provider="Tagapagtustos" Captions.Error.GenericFail="Nabigo sa pasisimula ng mga pamagat" OutputTimer="Pamlabas na Orasan" @@ -28,9 +28,9 @@ RemoveScripts="Tanggalin ang mga iskrip" ReloadScripts="Ikargang muli ang mga Iskrip" PythonSettings="Mga Setting Python" -PythonSettings.PythonInstallPath32bit="I-install ang daan sa Python (32bit)" -PythonSettings.PythonInstallPath64bit="I-install ang Daan sa Python (64bit)" -PythonSettings.BrowsePythonPath="Daan ng Browse Python" +PythonSettings.PythonInstallPath32bit="Landas ng Pagkakabit ng Python (32bit)" +PythonSettings.PythonInstallPath64bit="Landas ng Pagkakabit ng Python (64bit)" +PythonSettings.BrowsePythonPath="Pumunta sa Landas ng Python" ScriptLogWindow="Mag-log sa Iskrip" Description="Paglalarawan" FileFilter.ScriptFiles="Mga File ng Iskrip"
View file
obs-studio-32.0.4.tar.xz/frontend/plugins/frontend-tools/output-timer.cpp -> obs-studio-32.1.0.tar.xz/frontend/plugins/frontend-tools/output-timer.cpp
Changed
@@ -315,5 +315,5 @@ obs_frontend_add_save_callback(SaveOutputTimer, nullptr); obs_frontend_add_event_callback(OBSEvent, nullptr); - action->connect(action, &QAction::triggered, cb); + QObject::connect(action, &QAction::triggered, action, cb); }
View file
obs-studio-32.0.4.tar.xz/frontend/plugins/frontend-tools/scripts.cpp -> obs-studio-32.1.0.tar.xz/frontend/plugins/frontend-tools/scripts.cpp
Changed
@@ -630,6 +630,7 @@ { scriptLogWindow = new ScriptLogWindow(); + obs_scripting_set_module(obs_current_module()); obs_scripting_load(); obs_scripting_set_log_callback(script_log, nullptr); @@ -677,5 +678,5 @@ obs_frontend_add_preload_callback(load_script_data, nullptr); obs_frontend_add_event_callback(obs_event, nullptr); - action->connect(action, &QAction::triggered, cb); + QObject::connect(action, &QAction::triggered, action, cb); }
View file
obs-studio-32.0.4.tar.xz/frontend/settings/OBSBasicSettings.cpp -> obs-studio-32.1.0.tar.xz/frontend/settings/OBSBasicSettings.cpp
Changed
@@ -113,16 +113,16 @@ return widget->property("changed").toBool(); } -static inline void SetComboByName(QComboBox *combo, const char *name) +static inline void SetComboByName(QComboBox *combo, const QString &name) { - int idx = combo->findText(QT_UTF8(name)); + int idx = combo->findText(name); if (idx != -1) combo->setCurrentIndex(idx); } -static inline bool SetComboByValue(QComboBox *combo, const char *name) +static inline bool SetComboByValue(QComboBox *combo, const QString &name) { - int idx = combo->findData(QT_UTF8(name)); + int idx = combo->findData(name); if (idx != -1) { combo->setCurrentIndex(idx); return true; @@ -131,7 +131,7 @@ return false; } -static inline bool SetInvalidValue(QComboBox *combo, const char *name, const char *data = nullptr) +static inline bool SetInvalidValue(QComboBox *combo, const QString &name, const QVariant &data) { combo->insertItem(0, name, data); @@ -385,6 +385,7 @@ HookWidget(ui->authUsername, EDIT_CHANGED, STREAM1_CHANGED); HookWidget(ui->authPw, EDIT_CHANGED, STREAM1_CHANGED); HookWidget(ui->ignoreRecommended, CHECK_CHANGED, STREAM1_CHANGED); + HookWidget(ui->whipSimulcastTotalLayers, SCROLL_CHANGED, STREAM1_CHANGED); HookWidget(ui->enableMultitrackVideo, CHECK_CHANGED, STREAM1_CHANGED); HookWidget(ui->multitrackVideoMaximumAggregateBitrateAuto, CHECK_CHANGED, STREAM1_CHANGED); HookWidget(ui->multitrackVideoMaximumAggregateBitrate, SCROLL_CHANGED, STREAM1_CHANGED); @@ -1177,8 +1178,8 @@ #if defined(_WIN32) || defined(ENABLE_SPARKLE_UPDATER) void TranslateBranchInfo(const QString &name, QString &displayName, QString &description) { - QString translatedName = QTStr("Basic.Settings.General.ChannelName." + name.toUtf8()); - QString translatedDesc = QTStr("Basic.Settings.General.ChannelDescription." + name.toUtf8()); + QString translatedName = QTStr(QT_TO_UTF8(("Basic.Settings.General.ChannelName." + name))); + QString translatedDesc = QTStr(QT_TO_UTF8(("Basic.Settings.General.ChannelDescription." + name))); if (!translatedName.startsWith("Basic.Settings.")) displayName = translatedName; @@ -1748,7 +1749,7 @@ if (!IsSurround(speakers)) RestrictResetBitrates({ui->simpleOutputABitrate}, 320); - SetComboByName(ui->simpleOutputABitrate, std::to_string(audioBitrate).c_str()); + SetComboByName(ui->simpleOutputABitrate, QString::number(audioBitrate)); ui->simpleOutAdvanced->setChecked(advanced); ui->simpleOutCustom->setText(custom); @@ -2143,12 +2144,12 @@ 320); } - SetComboByName(ui->advOutTrack1Bitrate, std::to_string(track1Bitrate).c_str()); - SetComboByName(ui->advOutTrack2Bitrate, std::to_string(track2Bitrate).c_str()); - SetComboByName(ui->advOutTrack3Bitrate, std::to_string(track3Bitrate).c_str()); - SetComboByName(ui->advOutTrack4Bitrate, std::to_string(track4Bitrate).c_str()); - SetComboByName(ui->advOutTrack5Bitrate, std::to_string(track5Bitrate).c_str()); - SetComboByName(ui->advOutTrack6Bitrate, std::to_string(track6Bitrate).c_str()); + SetComboByName(ui->advOutTrack1Bitrate, QString::number(track1Bitrate)); + SetComboByName(ui->advOutTrack2Bitrate, QString::number(track2Bitrate)); + SetComboByName(ui->advOutTrack3Bitrate, QString::number(track3Bitrate)); + SetComboByName(ui->advOutTrack4Bitrate, QString::number(track4Bitrate)); + SetComboByName(ui->advOutTrack5Bitrate, QString::number(track5Bitrate)); + SetComboByName(ui->advOutTrack6Bitrate, QString::number(track6Bitrate)); ui->advOutTrack1Name->setText(name1); ui->advOutTrack2Name->setText(name2); @@ -2403,9 +2404,9 @@ TruncateLabel(label, label->text()); label->setMinimumSize(QSize(170, 0)); label->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter); - connect(label, &OBSSourceLabel::Removed, + connect(label, &OBSSourceLabel::removed, this, =() { QMetaObject::invokeMethod(this, "ReloadAudioSources"); }); - connect(label, &OBSSourceLabel::Destroyed, + connect(label, &OBSSourceLabel::destroyed, this, =() { QMetaObject::invokeMethod(this, "ReloadAudioSources"); }); layout->addRow(label, form); @@ -2548,8 +2549,8 @@ LoadRendererList(); - if (obs_audio_monitoring_available() && !SetComboByValue(ui->monitoringDevice, monDevId.toUtf8())) - SetInvalidValue(ui->monitoringDevice, monDevName.toUtf8(), monDevId.toUtf8()); + if (obs_audio_monitoring_available() && !SetComboByValue(ui->monitoringDevice, monDevId)) + SetInvalidValue(ui->monitoringDevice, monDevName, monDevId); ui->confirmOnExit->setChecked(confirmOnExit); @@ -2834,11 +2835,11 @@ } hotkeys.emplace_back(registerer_type == OBS_HOTKEY_REGISTERER_FRONTEND, hw); - connect(hw, &OBSHotkeyWidget::KeyChanged, this, =() { + connect(hw, &OBSHotkeyWidget::KeyChanged, this, this, hotkeysLayout() { HotkeysChanged(); ScanDuplicateHotkeys(hotkeysLayout); }); - connect(hw, &OBSHotkeyWidget::SearchKey, =(obs_key_combination_t combo) { + connect(hw, &OBSHotkeyWidget::SearchKey, this, this(obs_key_combination_t combo) { ui->hotkeyFilterSearch->setText(""); ui->hotkeyFilterInput->HandleNewKey(combo); ui->hotkeyFilterInput->KeyChanged(combo); @@ -3531,14 +3532,14 @@ } config_set_double(main->Config(), "Audio", "MeterDecayRate", meterDecayRate); - main->UpdateVolumeControlsDecayRate(); + emit main->profileSettingChanged("Audio", "MeterDecayRate"); } if (WidgetChanged(ui->peakMeterType)) { uint32_t peakMeterTypeIdx = ui->peakMeterType->currentIndex(); config_set_uint(main->Config(), "Audio", "PeakMeterType", peakMeterTypeIdx); - main->UpdateVolumeControlsPeakMeterType(); + emit main->profileSettingChanged("Audio", "PeakMeterType"); } if (WidgetChanged(ui->lowLatencyBuffering)) { @@ -4535,7 +4536,7 @@ QString recFormatName = ui->advOutRecFormat->currentText(); /* Set tooltip if available */ - QString tooltip = QTStr("Basic.Settings.Output.Format.TT." + recFormat.toUtf8()); + QString tooltip = QTStr(QT_TO_UTF8(("Basic.Settings.Output.Format.TT." + recFormat))); if (!tooltip.startsWith("Basic.Settings.Output")) ui->advOutRecFormat->setToolTip(tooltip); @@ -5198,7 +5199,7 @@ QString format = ui->simpleOutRecFormat->currentData().toString(); /* Set tooltip if available */ - QString tooltip = QTStr("Basic.Settings.Output.Format.TT." + format.toUtf8()); + QString tooltip = QTStr(QT_TO_UTF8(("Basic.Settings.Output.Format.TT." + format))); if (!tooltip.startsWith("Basic.Settings.Output")) ui->simpleOutRecFormat->setToolTip(tooltip);
View file
obs-studio-32.0.4.tar.xz/frontend/settings/OBSBasicSettings_A11y.cpp -> obs-studio-32.1.0.tar.xz/frontend/settings/OBSBasicSettings_A11y.cpp
Changed
@@ -111,7 +111,7 @@ config_set_int(config, "Accessibility", "MixerYellowActive", mixerYellowActive); config_set_int(config, "Accessibility", "MixerRedActive", mixerRedActive); - main->RefreshVolumeColors(); + emit main->userSettingChanged("Accessibility", "SettingsChanged"); } static void SetStyle(QLabel *label, uint32_t colorVal)
View file
obs-studio-32.0.4.tar.xz/frontend/settings/OBSBasicSettings_Stream.cpp -> obs-studio-32.1.0.tar.xz/frontend/settings/OBSBasicSettings_Stream.cpp
Changed
@@ -95,6 +95,7 @@ void OBSBasicSettings::LoadStream1Settings() { bool ignoreRecommended = config_get_bool(main->Config(), "Stream1", "IgnoreRecommended"); + int whipSimulcastTotalLayers = config_get_int(main->Config(), "Stream1", "WHIPSimulcastTotalLayers"); obs_service_t *service_obj = main->GetService(); const char *type = obs_service_get_type(service_obj); @@ -209,10 +210,13 @@ if (use_custom_server) ui->serviceCustomServer->setText(server); - if (is_whip) + if (is_whip) { ui->key->setText(bearer_token); - else + ui->whipSimulcastGroupBox->show(); + } else { ui->key->setText(key); + ui->whipSimulcastGroupBox->hide(); + } ServiceChanged(true); @@ -226,6 +230,7 @@ ui->streamPage->setEnabled(!streamActive); ui->ignoreRecommended->setChecked(ignoreRecommended); + ui->whipSimulcastTotalLayers->setValue(whipSimulcastTotalLayers); loading = false; @@ -327,6 +332,9 @@ SaveCheckBox(ui->ignoreRecommended, "Stream1", "IgnoreRecommended"); + auto oldWHIPSimulcastTotalLayers = config_get_int(main->Config(), "Stream1", "WHIPSimulcastTotalLayers"); + SaveSpinBox(ui->whipSimulcastTotalLayers, "Stream1", "WHIPSimulcastTotalLayers"); + auto oldMultitrackVideoSetting = config_get_bool(main->Config(), "Stream1", "EnableMultitrackVideo"); if (!IsCustomService()) { @@ -355,7 +363,8 @@ SaveText(ui->multitrackVideoConfigOverride, "Stream1", "MultitrackVideoConfigOverride"); SaveComboData(ui->multitrackVideoAdditionalCanvas, "Stream1", "MultitrackExtraCanvas"); - if (oldMultitrackVideoSetting != ui->enableMultitrackVideo->isChecked()) + if (oldMultitrackVideoSetting != ui->enableMultitrackVideo->isChecked() || + oldWHIPSimulcastTotalLayers != ui->whipSimulcastTotalLayers->value()) main->ResetOutputs(); SwapMultiTrack(QT_TO_UTF8(protocol)); @@ -588,6 +597,12 @@ } else { SwapMultiTrack(QT_TO_UTF8(protocol)); } + + if (IsWHIP()) { + ui->whipSimulcastGroupBox->show(); + } else { + ui->whipSimulcastGroupBox->hide(); + } } void OBSBasicSettings::on_customServer_textChanged(const QString &)
View file
obs-studio-32.0.4.tar.xz/frontend/settings/OBSHotkeyEdit.cpp -> obs-studio-32.1.0.tar.xz/frontend/settings/OBSHotkeyEdit.cpp
Changed
@@ -207,7 +207,7 @@ { dupeIcon = addAction(settings->GetHotkeyConflictIcon(), ActionPosition::TrailingPosition); dupeIcon->setToolTip(QTStr("Basic.Settings.Hotkeys.DuplicateWarning")); - QObject::connect(dupeIcon, &QAction::triggered, = { emit SearchKey(key); }); + connect(dupeIcon, &QAction::triggered, this, this { emit SearchKey(key); }); dupeIcon->setVisible(false); }
View file
obs-studio-32.0.4.tar.xz/frontend/settings/OBSHotkeyWidget.cpp -> obs-studio-32.1.0.tar.xz/frontend/settings/OBSHotkeyWidget.cpp
Changed
@@ -98,7 +98,7 @@ clear->setToolTip(QTStr("Clear")); clear->setEnabled(!obs_key_combination_is_empty(combo)); - QObject::connect(edit, &OBSHotkeyEdit::KeyChanged, =(obs_key_combination_t new_combo) { + QObject::connect(edit, &OBSHotkeyEdit::KeyChanged, this, =(obs_key_combination_t new_combo) { clear->setEnabled(!obs_key_combination_is_empty(new_combo)); revert->setEnabled(edit->original != new_combo); }); @@ -117,10 +117,10 @@ return std::distance(begin(removeButtons), res); }; - QObject::connect(add, &QPushButton::clicked, + QObject::connect(add, &QPushButton::clicked, this, &, CurrentIndex { AddEdit({0, OBS_KEY_NONE}, CurrentIndex() + 1); }); - QObject::connect(remove, &QPushButton::clicked, &, CurrentIndex { RemoveEdit(CurrentIndex()); }); + QObject::connect(remove, &QPushButton::clicked, this, &, CurrentIndex { RemoveEdit(CurrentIndex()); }); QHBoxLayout *subLayout = new QHBoxLayout; subLayout->setContentsMargins(0, 2, 0, 2); @@ -148,8 +148,9 @@ QObject::connect(revert, &QPushButton::clicked, edit, &OBSHotkeyEdit::ResetKey); QObject::connect(clear, &QPushButton::clicked, edit, &OBSHotkeyEdit::ClearKey); - QObject::connect(edit, &OBSHotkeyEdit::KeyChanged, &(obs_key_combination) { emit KeyChanged(); }); - QObject::connect(edit, &OBSHotkeyEdit::SearchKey, =(obs_key_combination combo) { emit SearchKey(combo); }); + QObject::connect(edit, &OBSHotkeyEdit::KeyChanged, this, &(obs_key_combination) { emit KeyChanged(); }); + QObject::connect(edit, &OBSHotkeyEdit::SearchKey, this, + this(obs_key_combination combo) { emit SearchKey(combo); }); } void OBSHotkeyWidget::RemoveEdit(size_t idx, bool signal)
View file
obs-studio-32.0.4.tar.xz/frontend/updater/CMakeLists.txt -> obs-studio-32.1.0.tar.xz/frontend/updater/CMakeLists.txt
Changed
@@ -32,7 +32,13 @@ ) # zstd is hardcoded with /DEFAULTLIB:LIBCMT -target_link_options(updater PRIVATE $<$<CONFIG:DEBUG>:/NODEFAULTLIB:LIBCMT>) +target_link_options( + updater + PRIVATE + $<$<CONFIG:DEBUG>:/NODEFAULTLIB:LIBCMT> + "$<$<OR:$<CONFIG:Release>,$<CONFIG:MinSizeRel>>:/PDBALTPATH:$<TARGET_PDB_FILE_NAME:updater>>" + "$<$<OR:$<CONFIG:Release>,$<CONFIG:MinSizeRel>>:/PDBSTRIPPED:$<TARGET_PDB_FILE_NAME:updater>>" +) set_target_properties( updater
View file
obs-studio-32.0.4.tar.xz/frontend/updater/http.cpp -> obs-studio-32.1.0.tar.xz/frontend/updater/http.cpp
Changed
@@ -203,6 +203,17 @@ return true; } +static void UpdateProgressBar() +{ + int position = (int)(((float)completedFileSize / (float)totalFileSize) * 100.0f); + int oldPosition = lastPosition; + + if (position > oldPosition && + lastPosition.compare_exchange_strong(oldPosition, position, memory_order_relaxed)) { + SendDlgItemMessage(hwndMain, IDC_PROGRESS, PBM_SETPOS, position, 0); + } +} + bool HTTPGetFile(HINTERNET hConnect, const wchar_t *url, const wchar_t *outputPath, const wchar_t *extraHeaders, int *responseCode) { @@ -281,7 +292,6 @@ BYTE bufferREAD_BUF_SIZE; DWORD dwSize, outSize; - int lastPosition = 0; WinHandle updateFile = CreateFile(outputPath, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, 0, nullptr); if (!updateFile.Valid()) { @@ -309,11 +319,7 @@ if (!ReadHTTPFile(updateFile, buffer, outSize, responseCode)) return false; - int position = (int)(((float)completedFileSize / (float)totalFileSize) * 100.0f); - if (position > lastPosition) { - lastPosition = position; - SendDlgItemMessage(hwndMain, IDC_PROGRESS, PBM_SETPOS, position, 0); - } + UpdateProgressBar(); } if (WaitForSingleObject(cancelRequested, 0) == WAIT_OBJECT_0) { @@ -404,7 +410,6 @@ BYTE bufferREAD_BUF_SIZE; DWORD dwSize, outSize; - int lastPosition = 0; do { /* Check for available data. */ @@ -426,11 +431,7 @@ out.insert(out.end(), (std::byte *)buffer, (std::byte *)buffer + outSize); completedFileSize += outSize; - int position = (int)(((float)completedFileSize / (float)totalFileSize) * 100.0f); - if (position > lastPosition) { - lastPosition = position; - SendDlgItemMessage(hwndMain, IDC_PROGRESS, PBM_SETPOS, position, 0); - } + UpdateProgressBar(); } if (WaitForSingleObject(cancelRequested, 0) == WAIT_OBJECT_0) {
View file
obs-studio-32.0.4.tar.xz/frontend/updater/resource.h -> obs-studio-32.1.0.tar.xz/frontend/updater/resource.h
Changed
@@ -8,6 +8,8 @@ #define IDC_STATUS 1002 #define IDCBUTTON 1004 #define IDC_BUTTON 1004 +#define IDC_LOG 1005 +#define IDC_LOGBUTTON 1006 // Next default values for new objects // @@ -15,7 +17,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 104 #define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1005 +#define _APS_NEXT_CONTROL_VALUE 1007 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif
View file
obs-studio-32.0.4.tar.xz/frontend/updater/updater.cpp -> obs-studio-32.1.0.tar.xz/frontend/updater/updater.cpp
Changed
@@ -14,21 +14,22 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include "updater.hpp" #include "manifest.hpp" +#include "updater.hpp" #include <psapi.h> -#include <WinTrust.h> #include <SoftPub.h> +#include <WinTrust.h> #include <util/windows/CoTaskMemPtr.hpp> +#include <exception> #include <future> +#include <mutex> +#include <queue> #include <string> #include <string_view> -#include <mutex> #include <unordered_set> -#include <queue> using namespace std; using namespace updater; @@ -53,11 +54,18 @@ static bool bExiting = false; static bool updateFailed = false; -static bool downloadThreadFailure = false; +static bool logVisible = false; +static int baseWindowHeight = 0; + +static constexpr int WM_LOG_MESSAGE = (WM_APP + 1); +static constexpr int LOG_HEIGHT_DLU = 120; + +static atomic<bool> downloadThreadFailure = false; size_t totalFileSize = 0; -size_t completedFileSize = 0; -static int completedUpdates = 0; +atomic<size_t> completedFileSize = 0; +atomic<int> lastPosition; +static atomic<int> completedUpdates = 0; static wchar_t tempPathMAX_PATH; static wchar_t obs_base_directoryMAX_PATH; @@ -97,18 +105,51 @@ return LOWORD(info->dwFileVersionMS) < 40; } +static void Log(const wchar_t *fmt, ...) +{ + va_list argptr; + + /* Find out how big our buffer needs to be */ + va_start(argptr, fmt); + int len = _vscwprintf(fmt, argptr); + va_end(argptr); + + if (len <= 0) + return; + + /* Using len + 1 for null terminator, which gets chopped off below */ + wstring str(len + 1, L'\0'); + + va_start(argptr, fmt); + len = _vsnwprintf_s(str.data(), len + 1, _TRUNCATE, fmt, argptr); + va_end(argptr); + + if (len <= 0) + return; + + /* Append newline and send to main window as a PostMessage to + * avoid blocking worker threads with UI messages */ + str.resize(len); + str += L"\r\n"; + + auto msg = make_unique<wstring>(move(str)); + + if (PostMessage(hwndMain, WM_LOG_MESSAGE, 0, reinterpret_cast<LPARAM>(msg.get()))) { + msg.release(); + } +} + static void Status(const wchar_t *fmt, ...) { wchar_t str512; va_list argptr; va_start(argptr, fmt); - StringCbVPrintf(str, sizeof(str), fmt, argptr); + va_end(argptr); SetDlgItemText(hwndMain, IDC_STATUS, str); - - va_end(argptr); + Log(L"%s", str); } static bool MyCopyFile(const wchar_t *src, const wchar_t *dest) @@ -215,14 +256,14 @@ static bool QuickWriteFile(const wchar_t *file, const void *data, size_t size) try { - WinHandle handle = CreateFile(file, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH, nullptr); + WinHandle handle = CreateFile(file, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, 0, nullptr); if (handle == INVALID_HANDLE_VALUE) - throw GetLastError(); + throw LastError(); DWORD written; if (!WriteFile(handle, data, (DWORD)size, &written, nullptr)) - throw GetLastError(); + throw LastError(); return true; @@ -380,7 +421,7 @@ HttpHandle hConnect = WinHttpConnect(hSession, kCDNHostname, INTERNET_DEFAULT_HTTPS_PORT, 0); if (!hConnect) { downloadThreadFailure = true; - Status(L"Update failed: Couldn't connect to %S", kCDNHostname); + Status(L"Update failed: Couldn't connect to %s", kCDNHostname); return false; } @@ -412,17 +453,19 @@ return false; } - auto &buf = download_dataupdate.downloadHash; + auto &buf = download_data.at(update.downloadHash); /* Reserve required memory */ buf.reserve(update.fileSize); + Log(L"Downloading %s...", update.sourceURL.c_str()); + if (!HTTPGetBuffer(hConnect, update.sourceURL.c_str(), L"Accept-Encoding: gzip", buf, &responseCode)) { downloadThreadFailure = true; Status(L"Update failed: Could not download " L"%s (error code %d)", update.outputPath.c_str(), responseCode); - return true; + return false; } if (responseCode != 200) { @@ -430,7 +473,7 @@ Status(L"Update failed: Could not download " L"%s (error code %d)", update.outputPath.c_str(), responseCode); - return true; + return false; } /* Validate hash of downloaded data. */ @@ -442,7 +485,7 @@ Status(L"Update failed: Integrity check " L"failed on %s", update.outputPath.c_str()); - return true; + return false; } /* Decompress data in compressed buffer. */ @@ -453,7 +496,7 @@ Status(L"Update failed: Decompression " L"failed on %s (error code %d)", update.outputPath.c_str(), res); - return true; + return false; } } @@ -490,7 +533,11 @@ return true; +} catch (const exception &e) { + Status(L"Exception: %S", e.what()); + return false; } catch (...) { + Status(L"Unknown exception occurred in RunDownloadWorkers"); return false; } @@ -529,6 +576,8 @@ hWait0 = proc; hWait1 = cancelRequested; + Log(L"Waiting for OBS PID %d at %s...", id, path); + int i = WaitForMultipleObjects(2, hWait, false, INFINITE); if (i == WAIT_OBJECT_0 + 1) return WAITIFOBS_CANCELLED; @@ -603,6 +652,7 @@ if (!UTF8ToWideBuf(updateFileName, fileName.c_str())) continue; + if (!IsSafeFilename(updateFileName)) continue; @@ -633,7 +683,11 @@ for (auto &result : futures) { result.wait(); } + +} catch (const exception &e) { + Status(L"Exception: %S", e.what()); } catch (...) { + Status(L"Unknown exception occurred in RunHasherWorkers"); } /* ----------------------------------------------------------------------- */ @@ -802,24 +856,24 @@ return false; } -static void UpdateWithPatchIfAvailable(const PatchResponse &patch) +static bool UpdateWithPatchIfAvailable(const PatchResponse &patch) { wchar_t widePatchableFilenameMAX_PATH; wchar_t sourceURL1024; if (patch.source.compare(0, kCDNUrl.size(), kCDNUrl) != 0) - return; + return false; if (patch.name.find('/') == string::npos) - return; + return false; string patchPackageName(patch.name, 0, patch.name.find('/')); string fileName(patch.name, patch.name.find('/') + 1); if (!UTF8ToWideBuf(widePatchableFilename, fileName.c_str())) - return; + return false; if (!UTF8ToWideBuf(sourceURL, patch.source.c_str())) - return; + return false; for (update_t &update : updates) { if (update.packageName != patchPackageName) @@ -836,8 +890,12 @@ totalFileSize -= (update.fileSize - patch.size); update.fileSize = patch.size; - break; + Log(L"Found patch for %s, %d bytes", widePatchableFilename, (int)patch.size); + + return true; } + + return false; } static bool MoveInUseFileAway(const update_t &file) @@ -929,6 +987,8 @@ retryAfterMovingFile: if (file.patchable) { + Log(L"Patching %s...", file.outputPath.c_str()); + error_code = ApplyPatch(ctx, patch_data.data(), file.fileSize, file.outputPath.c_str()); installed_ok = (error_code == 0); @@ -955,6 +1015,7 @@ } } } else { + Log(L"Installing %s...", file.outputPath.c_str()); installed_ok = QuickWriteFile(file.outputPath.c_str(), patch_data.data(), patch_data.size()); error_code = GetLastError(); } @@ -995,6 +1056,8 @@ return false; } + Log(L"Installing %s...", file.outputPath.c_str()); + /* We may be installing into new folders, * make sure they exist */ filesystem::path filePath(file.outputPath.c_str()); @@ -1017,9 +1080,9 @@ } queue<reference_wrapper<update_t>> updateQueue; -static int lastPosition = 0; -static int installed = 0; -static bool updateThreadFailed = false; + +static atomic<int> installed = 0; +static atomic<bool> updateThreadFailed = false; static bool UpdateWorker() { @@ -1043,8 +1106,10 @@ return false; } else { int position = (int)(((float)++installed / (float)completedUpdates) * 100.0f); - if (position > lastPosition) { - lastPosition = position; + int oldPosition = lastPosition; + + if (position > oldPosition && + lastPosition.compare_exchange_strong(oldPosition, position, memory_order_relaxed)) { SendDlgItemMessage(hwndMain, IDC_PROGRESS, PBM_SETPOS, position, 0); } } @@ -1072,7 +1137,11 @@ return true; +} catch (const exception &e) { + Status(L"Exception: %S", e.what()); + return false; } catch (...) { + Status(L"Unknown exception occurred in RunUpdateWorkers"); return false; } @@ -1219,9 +1288,11 @@ static void ClearShaderCache() { wchar_t shader_pathMAX_PATH; - SHGetFolderPathW(NULL, CSIDL_COMMON_APPDATA, NULL, SHGFP_TYPE_CURRENT, shader_path); - StringCbCatW(shader_path, sizeof(shader_path), L"\\obs-studio\\shader-cache"); - filesystem::remove_all(shader_path); + if (SHGetFolderPathW(NULL, CSIDL_COMMON_APPDATA, NULL, SHGFP_TYPE_CURRENT, shader_path) == S_OK) { + if (SUCCEEDED(StringCbCatW(shader_path, sizeof(shader_path), L"\\obs-studio\\shader-cache"))) { + filesystem::remove_all(shader_path); + } + } } extern "C" void UpdateHookFiles(void); @@ -1305,6 +1376,8 @@ } } + Log(L"Branch: %s, AppData: %s, Portable: %d", branch.c_str(), appdata.c_str(), bIsPortable ? 1 : 0); + /* ------------------------------------- * * Get config path */ @@ -1364,6 +1437,8 @@ Manifest manifest; { + Log(L"Using manifest %s", manifestPath); + string manifestFile = QuickReadFile(manifestPath); if (manifestFile.empty()) { Status(L"Update failed: Couldn't load manifest file"); @@ -1500,10 +1575,16 @@ } /* Update updates with patch information. */ + int patchableFiles = 0; for (const PatchResponse &patch : patches) { - UpdateWithPatchIfAvailable(patch); + if (UpdateWithPatchIfAvailable(patch)) { + patchableFiles++; + } } + Log(L"Total files: %d, patchable: %d, patches received: %d", (int)updates.size(), (int)files.size(), + patchableFiles); + /* ------------------------------------- * * Deduplicate Downloads */ @@ -1518,9 +1599,20 @@ } } + Log(L"Total download size: %lld bytes", totalFileSize); + /* ------------------------------------- * * Download Updates */ + /* Pre-allocate download_data map so worker threads only + * look up existing entries rather than inserting new ones, + * avoiding concurrent map mutation from multiple threads. */ + download_data.reserve(downloadHashes.size()); + for (update_t &update : updates) { + if (update.state == STATE_PENDING_DOWNLOAD) + download_data.try_emplace(update.downloadHash); + } + Status(L"Downloading updates..."); if (!RunDownloadWorkers(4)) return false; @@ -1534,6 +1626,7 @@ * Install updates */ SendDlgItemMessage(hwndMain, IDC_PROGRESS, PBM_SETPOS, 0, 0); + lastPosition = 0; Status(L"Installing updates..."); if (!RunUpdateWorkers(4)) @@ -1556,6 +1649,8 @@ si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; + Log(L"Executing: %s", cmd); + PROCESS_INFORMATION pi; bool success = !!CreateProcessW(nullptr, cmd, nullptr, nullptr, false, CREATE_NEW_CONSOLE, nullptr, nullptr, &si, &pi); @@ -1654,8 +1749,12 @@ Status(L"Update aborted."); HWND hProgress = GetDlgItem(hwndMain, IDC_PROGRESS); + + /* Even a no-op style change apparently resets the progress bar */ LONG_PTR style = GetWindowLongPtr(hProgress, GWL_STYLE); - SetWindowLongPtr(hProgress, GWL_STYLE, style & ~PBS_MARQUEE); + if (style & PBS_MARQUEE) + SetWindowLongPtr(hProgress, GWL_STYLE, style & ~PBS_MARQUEE); + SendMessage(hProgress, PBM_SETSTATE, PBST_ERROR, 0); SetDlgItemText(hwndMain, IDC_BUTTON, L"Exit"); @@ -1714,6 +1813,36 @@ ShellExecuteEx(&execInfo); } +static void ToggleLogVisibility() +{ + HWND hwndLog = GetDlgItem(hwndMain, IDC_LOG); + if (!hwndLog) + return; + + logVisible = !logVisible; + + RECT rc; + GetWindowRect(hwndMain, &rc); + + SetDlgItemText(hwndMain, IDC_LOGBUTTON, logVisible ? L"Hide Log" : L"Show Log"); + + if (logVisible) { + RECT dluRect = {0, 0, 0, LOG_HEIGHT_DLU}; + MapDialogRect(hwndMain, &dluRect); + int logPixelHeight = dluRect.bottom; + + SetWindowPos(hwndMain, nullptr, 0, 0, rc.right - rc.left, baseWindowHeight + logPixelHeight, + SWP_NOMOVE | SWP_NOZORDER); + + SendMessage(hwndLog, EM_SCROLL, SB_BOTTOM, 0); + + ShowWindow(hwndLog, SW_SHOW); + } else { + ShowWindow(hwndLog, SW_HIDE); + SetWindowPos(hwndMain, nullptr, 0, 0, rc.right - rc.left, baseWindowHeight, SWP_NOMOVE | SWP_NOZORDER); + } +} + static INT_PTR CALLBACK UpdateDialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { @@ -1721,6 +1850,33 @@ static HICON hMainIcon = LoadIcon(hinstMain, MAKEINTRESOURCE(IDI_ICON1)); SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hMainIcon); SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hMainIcon); + + /* Save original window height for ToggleLogVisibility */ + RECT rc; + GetWindowRect(hwnd, &rc); + baseWindowHeight = rc.bottom - rc.top; + + /* Position the log window on the bottom of the main window */ + RECT clientRc; + GetClientRect(hwnd, &clientRc); + + RECT dluRect = {0, 0, 0, LOG_HEIGHT_DLU}; + MapDialogRect(hwnd, &dluRect); + + HWND hwndLog = + CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", + WS_CHILD | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_READONLY | ES_AUTOVSCROLL, + 0, clientRc.bottom, clientRc.right, dluRect.bottom, hwnd, + (HMENU)(INT_PTR)IDC_LOG, hinstMain, nullptr); + + /* 32k by default without this */ + SendMessage(hwndLog, EM_SETLIMITTEXT, 0, 0); + + /* Propagate the main window font or it looks ugly */ + HFONT hFont = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0); + if (hFont) + SendMessage(hwndLog, WM_SETFONT, (WPARAM)hFont, FALSE); + return true; } @@ -1738,12 +1894,28 @@ CancelUpdate(false); } } + } else if (LOWORD(wParam) == IDC_LOGBUTTON) { + if (HIWORD(wParam) == BN_CLICKED) + ToggleLogVisibility(); } return true; case WM_CLOSE: CancelUpdate(true); return true; + + case WM_LOG_MESSAGE: { + /* Log message sent to us by Log() as PostMessage */ + unique_ptr<wstring> msg(reinterpret_cast<wstring *>(lParam)); + + HWND hwndLog = GetDlgItem(hwnd, IDC_LOG); + if (hwndLog && msg) { + int textLen = GetWindowTextLength(hwndLog); + SendMessage(hwndLog, EM_SETSEL, textLen, textLen); + SendMessage(hwndLog, EM_REPLACESEL, FALSE, reinterpret_cast<LPARAM>(msg->c_str())); + } + return true; + } } return false; @@ -1875,6 +2047,8 @@ return -1; } + Log(L"Update target: %s", obs_base_directory); + ShowWindow(hwndMain, SW_SHOWNORMAL); SetForegroundWindow(hwndMain);
View file
obs-studio-32.0.4.tar.xz/frontend/updater/updater.hpp -> obs-studio-32.1.0.tar.xz/frontend/updater/updater.hpp
Changed
@@ -37,6 +37,7 @@ #include <zstd.h> #include <array> +#include <atomic> #include <string> #include <vector> @@ -95,7 +96,8 @@ extern HWND hwndMain; extern HCRYPTPROV hProvider; extern size_t totalFileSize; -extern size_t completedFileSize; +extern std::atomic<int> lastPosition; +extern std::atomic<size_t> completedFileSize; extern HANDLE cancelRequested; #pragma pack(push, r1, 1)
View file
obs-studio-32.0.4.tar.xz/frontend/updater/updater.rc -> obs-studio-32.1.0.tar.xz/frontend/updater/updater.rc
Changed
@@ -57,6 +57,7 @@ FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN PUSHBUTTON "Cancel",IDC_BUTTON,259,34,50,14 + PUSHBUTTON "Show Log",IDC_LOGBUTTON,7,34,50,14 CONTROL "",IDC_PROGRESS,"msctls_progress32",PBS_SMOOTH,7,17,302,14 LTEXT "Waiting for OBS to exit...",IDC_STATUS,7,7,302,8,SS_WORDELLIPSIS END
View file
obs-studio-32.0.4.tar.xz/frontend/utility/AdvancedOutput.cpp -> obs-studio-32.1.0.tar.xz/frontend/utility/AdvancedOutput.cpp
Changed
@@ -132,6 +132,12 @@ throw "Failed to create streaming video encoder " "(advanced output)"; obs_encoder_release(videoStreaming); + if (whipSimulcastEncoders != nullptr) { + whipSimulcastEncoders->Create(streamEncoder, config_get_int(main->Config(), "AdvOut", "RescaleFilter"), + config_get_int(main->Config(), "Stream1", "WHIPSimulcastTotalLayers"), + video_output_get_width(obs_get_video()), + video_output_get_height(obs_get_video())); + } const char *rate_control = obs_data_get_string(useStreamEncoder ? streamEncSettings : recordEncSettings, "rate_control"); @@ -247,6 +253,9 @@ } obs_encoder_update(videoStreaming, settings); + if (whipSimulcastEncoders != nullptr) { + whipSimulcastEncoders->Update(settings, obs_data_get_int(settings, "bitrate")); + } } inline void AdvancedOutput::UpdateRecordingSettings() @@ -615,7 +624,8 @@ const char *audio_encoder_id = config_get_string(main->Config(), "AdvOut", "AudioEncoder"); int streamTrackIndex = config_get_int(main->Config(), "AdvOut", "TrackIndex") - 1; - auto handle_multitrack_video_result = =(std::optional<bool> multitrackVideoResult) { + auto handle_multitrack_video_result = this, type = std::string{type}, is_multitrack_output, + multiTrackAudioMixes(std::optional<bool> multitrackVideoResult) { if (multitrackVideoResult.has_value()) return multitrackVideoResult.value(); @@ -626,12 +636,9 @@ startStreaming.Disconnect(); stopStreaming.Disconnect(); - streamOutput = obs_output_create(type, "adv_stream", nullptr, nullptr); + streamOutput = obs_output_create(type.c_str(), "adv_stream", nullptr, nullptr); if (!streamOutput) { - blog(LOG_WARNING, - "Creation of stream output type '%s' " - "failed!", - type); + blog(LOG_WARNING, "Creation of stream output type '%s' failed!", type.c_str()); return false; } @@ -649,6 +656,9 @@ } obs_output_set_video_encoder(streamOutput, videoStreaming); + if (whipSimulcastEncoders != nullptr) { + whipSimulcastEncoders->SetStreamOutput(streamOutput); + } obs_output_set_audio_encoder(streamOutput, streamAudioEnc, 0); if (!is_multitrack_output) {
View file
obs-studio-32.0.4.tar.xz/frontend/utility/BasicOutputHandler.cpp -> obs-studio-32.1.0.tar.xz/frontend/utility/BasicOutputHandler.cpp
Changed
@@ -236,6 +236,9 @@ if (multitrack_enabled) multitrackVideo = make_unique<MultitrackVideoOutput>(); + + if (config_get_int(main->Config(), "Stream1", "WHIPSimulcastTotalLayers") > 1) + whipSimulcastEncoders = make_unique<WHIPSimulcastEncoders>(); } extern void log_vcam_changed(const VCamConfig &config, bool starting); @@ -529,7 +532,7 @@ return continuation(true); }; - QThreadPool::globalInstance()->start(=, multitrackVideo = multitrackVideo.get(), + QThreadPool::globalInstance()->start(=, main = main, multitrackVideo = multitrackVideo.get(), service_name = std::string{service_name}, service = OBSService{service}, stream_dump_config = OBSData{stream_dump_config}, start_streaming_guard = start_streaming_guard() mutable {
View file
obs-studio-32.0.4.tar.xz/frontend/utility/BasicOutputHandler.hpp -> obs-studio-32.1.0.tar.xz/frontend/utility/BasicOutputHandler.hpp
Changed
@@ -1,6 +1,7 @@ #pragma once #include <utility/MultitrackVideoOutput.hpp> +#include <utility/WHIPSimulcastEncoders.hpp> #include <obs.hpp> #include <util/dstr.hpp> @@ -42,6 +43,8 @@ obs_scene_t *vCamSourceScene = nullptr; obs_sceneitem_t *vCamSourceSceneItem = nullptr; + std::unique_ptr<WHIPSimulcastEncoders> whipSimulcastEncoders; + std::string outputType; std::string lastError;
View file
obs-studio-32.0.4.tar.xz/frontend/utility/GoLiveAPI_Network.cpp -> obs-studio-32.1.0.tar.xz/frontend/utility/GoLiveAPI_Network.cpp
Changed
@@ -81,7 +81,7 @@ std::vector<std::string> headers; headers.push_back("Content-Type: application/json"); - bool encodeConfigDownloadedOk = GetRemoteFile(url.toLocal8Bit(), encodeConfigText, + bool encodeConfigDownloadedOk = GetRemoteFile(url.toUtf8().constData(), encodeConfigText, libraryError, // out params nullptr, nullptr, // out params (response code and content type)
View file
obs-studio-32.0.4.tar.xz/frontend/utility/MissingFilesPathItemDelegate.cpp -> obs-studio-32.1.0.tar.xz/frontend/utility/MissingFilesPathItemDelegate.cpp
Changed
@@ -61,7 +61,7 @@ browseButton->setSizePolicy(buttonSizePolicy); layout->addWidget(browseButton); - container->connect(browseButton, &QToolButton::clicked, browseCallback); + connect(browseButton, &QToolButton::clicked, this, browseCallback); QToolButton *clearButton = new QToolButton(); QIcon icon; @@ -71,7 +71,7 @@ clearButton->setSizePolicy(buttonSizePolicy); layout->addWidget(clearButton); - container->connect(clearButton, &QToolButton::clicked, clearCallback); + connect(clearButton, &QToolButton::clicked, this, clearCallback); container->setLayout(layout); container->setFocusProxy(text);
View file
obs-studio-32.1.0.tar.xz/frontend/utility/PreviewProgramSizeObserver.cpp
Added
@@ -0,0 +1,221 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#include "PreviewProgramSizeObserver.hpp" + +#include <QEvent> +#include <QLayout> +#include <QResizeEvent> +#include <QTimer> + +#include <util/base.h> + +PreviewProgramSizeObserver::PreviewProgramSizeObserver(QWidget *widgetLeft, QWidget *widgetRight, QObject *parent) + : QObject(parent), + left(widgetLeft), + right(widgetRight) +{ + if (!left || !right) { + return; + } + + std::pair<QWidget *, QWidget *> siblingParents = findSiblingParents(left, right); + leftContainer = siblingParents.first; + rightContainer = siblingParents.second; + + leftOriginalMaxSize = leftContainer->maximumSize(); + rightOriginalMaxSize = rightContainer->maximumSize(); + + QWidget *sharedParent = leftContainer->parentWidget(); + + if (!sharedParent) { + return; + } + ancestorContainer = sharedParent; + + QLayout *ancestorLayout = ancestorContainer->layout(); + if (QBoxLayout *boxLayout = qobject_cast<QBoxLayout *>(ancestorLayout)) { + setOrientation((boxLayout->direction() == QBoxLayout::LeftToRight) ? Qt::Horizontal : Qt::Vertical); + } + + leftTargetSize = left->width(); + rightTargetSize = right->width(); + + ancestorContainer->installEventFilter(this); + + connect(ancestorContainer, &QWidget::destroyed, this, &QWidget::deleteLater); + connect(left, &QWidget::destroyed, this, &QWidget::deleteLater); + connect(right, &QWidget::destroyed, this, &QWidget::deleteLater); + connect(leftContainer, &QWidget::destroyed, this, &QWidget::deleteLater); + connect(rightContainer, &QWidget::destroyed, this, &QWidget::deleteLater); +} + +PreviewProgramSizeObserver::~PreviewProgramSizeObserver() +{ + if (ancestorContainer) { + ancestorContainer->removeEventFilter(this); + } + if (leftContainer) { + leftContainer->setMaximumSize(leftOriginalMaxSize); + } + + if (rightContainer) { + rightContainer->setMaximumSize(rightOriginalMaxSize); + } +} + +void PreviewProgramSizeObserver::setOrientation(Qt::Orientation orientation_) +{ + orientation = orientation_; +} + +std::pair<QWidget *, QWidget *> PreviewProgramSizeObserver::findSiblingParents(QWidget *a, QWidget *b) +{ + // Search through ancestors of two widgets to find the topmost pair that are siblings + QWidget *ancestor1 = a; + QWidget *ancestor2 = b; + + while (ancestor1 && ancestor2) { + QWidget *parent1 = ancestor1->parentWidget(); + QWidget *parent2 = ancestor2->parentWidget(); + + if (!parent1 || !parent2) { + break; + } + + // Found sibling containers + if (parent1 == parent2) { + return {ancestor1, ancestor2}; + } + + if (parent1->isAncestorOf(parent2)) { + ancestor2 = parent2; + } else if (parent2->isAncestorOf(parent1)) { + ancestor1 = parent1; + } else { + ancestor1 = parent1; + ancestor2 = parent2; + } + } + + return {a, b}; +} + +void PreviewProgramSizeObserver::syncContainerSizes(int containerSizeDelta) +{ + auto setMax = (orientation == Qt::Horizontal) ? (QWidget* widget, int value) { + widget->setMaximumWidth(value); + } : (QWidget* widget, int value) { + widget->setMaximumHeight(value); + }; + + QLayout *ancestorLayout = ancestorContainer->layout(); + if (QBoxLayout *boxLayout = qobject_cast<QBoxLayout *>(ancestorLayout)) { + setOrientation((boxLayout->direction() == QBoxLayout::LeftToRight) ? Qt::Horizontal : Qt::Vertical); + } + + if (orientation == Qt::Horizontal) { + leftContainer->setMaximumHeight(leftOriginalMaxSize.height()); + rightContainer->setMaximumHeight(rightOriginalMaxSize.height()); + } else { + leftContainer->setMaximumWidth(leftOriginalMaxSize.width()); + rightContainer->setMaximumWidth(rightOriginalMaxSize.width()); + } + + int leftInner = (orientation == Qt::Horizontal) ? left->width() : left->height(); + int rightInner = (orientation == Qt::Horizontal) ? right->width() : right->height(); + + int leftOuter = (orientation == Qt::Horizontal) ? leftContainer->width() : leftContainer->height(); + int rightOuter = (orientation == Qt::Horizontal) ? rightContainer->width() : rightContainer->height(); + + int totalOuter = leftOuter + rightOuter; + if (containerSizeDelta >= 0) { + totalOuter += containerSizeDelta; + } + + int leftOffset = leftOuter - leftInner; + int rightOffset = rightOuter - rightInner; + + int targetInner = (totalOuter - leftOffset - rightOffset) / 2; + + leftTargetSize = targetInner + leftOffset; + rightTargetSize = targetInner + rightOffset; + + if (containerSizeDelta >= 0) { + setMax(leftContainer, leftTargetSize); + setMax(rightContainer, rightTargetSize); + } else { + // Container shrunk, only set max size on larger widget + if (leftInner > rightInner) { + setMax(leftContainer, leftTargetSize); + setMax(rightContainer, QWIDGETSIZE_MAX); + } else { + setMax(leftContainer, QWIDGETSIZE_MAX); + setMax(rightContainer, rightTargetSize); + } + + // Force a second recalculation + QTimer::singleShot(1, this, &, setMax() { + if (updating) { + return; + } + + updating = true; + + setMax(leftContainer, leftTargetSize); + setMax(rightContainer, rightTargetSize); + + updating = false; + }); + } +} + +bool PreviewProgramSizeObserver::eventFilter(QObject *target, QEvent *event) +{ + if (event->type() != QEvent::Resize && event->type() != QEvent::LayoutRequest) { + return QObject::eventFilter(target, event); + } + + if (!left || !right || !leftContainer || !rightContainer) { + deleteLater(); + return QObject::eventFilter(target, event); + } + + if (updating == true) { + return QObject::eventFilter(target, event); + } + + updating = true; + + if (event->type() == QEvent::LayoutRequest) { + syncContainerSizes(0); + } else if (event->type() == QEvent::Resize) { + QResizeEvent *resizeEvent = static_cast<QResizeEvent *>(event); + int newSize = (orientation == Qt::Horizontal) ? resizeEvent->size().width() + : resizeEvent->size().height(); + int oldSize = (orientation == Qt::Horizontal) ? resizeEvent->oldSize().width() + : resizeEvent->oldSize().height(); + + if (newSize - oldSize != 0) { + syncContainerSizes(newSize - oldSize); + } + } + + updating = false; + + return QObject::eventFilter(target, event); +}
View file
obs-studio-32.1.0.tar.xz/frontend/utility/PreviewProgramSizeObserver.hpp
Added
@@ -0,0 +1,57 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#pragma once + +#include <QObject> +#include <QPointer> +#include <QWidget> + +class PreviewProgramSizeObserver : public QObject { + Q_OBJECT + + QPointer<QWidget> left; + QPointer<QWidget> right; + + QPointer<QWidget> leftContainer; + QPointer<QWidget> rightContainer; + + QSize leftOriginalMaxSize; + QSize rightOriginalMaxSize; + + int leftTargetSize{}; + int rightTargetSize{}; + + QPointer<QWidget> ancestorContainer; + + bool updating = false; + + Qt::Orientation orientation = Qt::Horizontal; + + std::pair<QWidget *, QWidget *> findSiblingParents(QWidget *a, QWidget *b); + + void syncContainerSizes(int containerSizeDelta); + +public: + PreviewProgramSizeObserver(QWidget *widgetLeft, QWidget *widgetRight, QObject *parent = nullptr); + ~PreviewProgramSizeObserver(); + + void setOrientation(Qt::Orientation orientation_); + +protected: + bool eventFilter(QObject *target, QEvent *event) override; +};
View file
obs-studio-32.0.4.tar.xz/frontend/utility/QuickTransition.hpp -> obs-studio-32.1.0.tar.xz/frontend/utility/QuickTransition.hpp
Changed
@@ -21,8 +21,6 @@ #include <QMetaType> -using namespace std; - class QPushButton; struct QuickTransition {
View file
obs-studio-32.0.4.tar.xz/frontend/utility/RemuxEntryPathItemDelegate.cpp -> obs-studio-32.1.0.tar.xz/frontend/utility/RemuxEntryPathItemDelegate.cpp
Changed
@@ -85,7 +85,7 @@ browseButton->setSizePolicy(buttonSizePolicy); layout->addWidget(browseButton); - container->connect(browseButton, &QToolButton::clicked, browseCallback); + connect(browseButton, &QToolButton::clicked, this, browseCallback); // The "clear" button is not shown in output cells // or the insertion point's input cell. @@ -95,7 +95,7 @@ clearButton->setSizePolicy(buttonSizePolicy); layout->addWidget(clearButton); - container->connect(clearButton, &QToolButton::clicked, clearCallback); + connect(clearButton, &QToolButton::clicked, this, clearCallback); } container->setLayout(layout);
View file
obs-studio-32.0.4.tar.xz/frontend/utility/SimpleOutput.cpp -> obs-studio-32.1.0.tar.xz/frontend/utility/SimpleOutput.cpp
Changed
@@ -75,6 +75,13 @@ if (!videoStreaming) throw "Failed to create video streaming encoder (simple output)"; obs_encoder_release(videoStreaming); + + if (whipSimulcastEncoders != nullptr) { + whipSimulcastEncoders->Create(encoderId, config_get_int(main->Config(), "AdvOut", "RescaleFilter"), + config_get_int(main->Config(), "Stream1", "WHIPSimulcastTotalLayers"), + video_output_get_width(obs_get_video()), + video_output_get_height(obs_get_video())); + } } /* mistakes have been made to lead us to this. */ @@ -351,11 +358,18 @@ break; default: obs_encoder_set_preferred_video_format(videoStreaming, VIDEO_FORMAT_NV12); + if (whipSimulcastEncoders != nullptr) { + whipSimulcastEncoders->SetVideoFormat(VIDEO_FORMAT_NV12); + } } obs_encoder_update(videoStreaming, videoSettings); obs_encoder_update(audioStreaming, audioSettings); obs_encoder_update(audioArchive, audioSettings); + + if (whipSimulcastEncoders != nullptr) { + whipSimulcastEncoders->Update(videoSettings, videoBitrate); + } } void SimpleOutput::UpdateRecordingAudioSettings() @@ -596,7 +610,8 @@ auto audio_bitrate = GetAudioBitrate(); auto vod_track_mixer = IsVodTrackEnabled(service) ? std::optional{1} : std::nullopt; - auto handle_multitrack_video_result = =(std::optional<bool> multitrackVideoResult) { + auto handle_multitrack_video_result = this, type = std::string{type}, + service(std::optional<bool> multitrackVideoResult) { if (multitrackVideoResult.has_value()) return multitrackVideoResult.value(); @@ -607,12 +622,9 @@ startStreaming.Disconnect(); stopStreaming.Disconnect(); - streamOutput = obs_output_create(type, "simple_stream", nullptr, nullptr); + streamOutput = obs_output_create(type.c_str(), "simple_stream", nullptr, nullptr); if (!streamOutput) { - blog(LOG_WARNING, - "Creation of stream output type '%s' " - "failed!", - type); + blog(LOG_WARNING, "Creation of stream output type '%s' failed!", type.c_str()); return false; } @@ -630,6 +642,9 @@ } obs_output_set_video_encoder(streamOutput, videoStreaming); + if (whipSimulcastEncoders != nullptr) { + whipSimulcastEncoders->SetStreamOutput(streamOutput); + } obs_output_set_audio_encoder(streamOutput, audioStreaming, 0); obs_output_set_service(streamOutput, service); return true;
View file
obs-studio-32.1.0.tar.xz/frontend/utility/WHIPSimulcastEncoders.hpp
Added
@@ -0,0 +1,84 @@ +/****************************************************************************** + Copyright (C) 2025 by Sean DuBois <sean@pion.ly> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ +#pragma once + +struct WHIPSimulcastEncoders { +public: + void Create(const char *encoderId, int rescaleFilter, int whipSimulcastTotalLayers, uint32_t outputWidth, + uint32_t outputHeight) + { + if (rescaleFilter == OBS_SCALE_DISABLE) { + rescaleFilter = OBS_SCALE_BICUBIC; + } + + if (whipSimulcastTotalLayers <= 1) { + return; + } + + auto widthStep = outputWidth / whipSimulcastTotalLayers; + auto heightStep = outputHeight / whipSimulcastTotalLayers; + std::string encoder_name = "whip_simulcast_0"; + + for (auto i = whipSimulcastTotalLayers - 1; i > 0; i--) { + uint32_t width = widthStep * i; + width -= width % 2; + + uint32_t height = heightStep * i; + height -= height % 2; + + encoder_nameencoder_name.size() - 1 = std::to_string(i).at(0); + auto whip_simulcast_encoder = + obs_video_encoder_create(encoderId, encoder_name.c_str(), nullptr, nullptr); + + if (whip_simulcast_encoder) { + obs_encoder_set_video(whip_simulcast_encoder, obs_get_video()); + obs_encoder_set_scaled_size(whip_simulcast_encoder, width, height); + obs_encoder_set_gpu_scale_type(whip_simulcast_encoder, (obs_scale_type)rescaleFilter); + whipSimulcastEncoders.push_back(whip_simulcast_encoder); + obs_encoder_release(whip_simulcast_encoder); + } else { + blog(LOG_WARNING, + "Failed to create video streaming WHIP Simulcast encoders (BasicOutputHandler)"); + } + } + } + + void Update(obs_data_t *videoSettings, int videoBitrate) + { + auto bitrateStep = videoBitrate / static_cast<int>(whipSimulcastEncoders.size() + 1); + for (auto &whipSimulcastEncoder : whipSimulcastEncoders) { + videoBitrate -= bitrateStep; + obs_data_set_int(videoSettings, "bitrate", videoBitrate); + obs_encoder_update(whipSimulcastEncoder, videoSettings); + } + } + + void SetVideoFormat(enum video_format format) + { + for (auto enc : whipSimulcastEncoders) + obs_encoder_set_preferred_video_format(enc, format); + } + + void SetStreamOutput(obs_output_t *streamOutput) + { + for (size_t i = 0; i < whipSimulcastEncoders.size(); i++) + obs_output_set_video_encoder2(streamOutput, whipSimulcastEncodersi, i + 1); + } + +private: + std::vector<OBSEncoder> whipSimulcastEncoders; +};
View file
obs-studio-32.0.4.tar.xz/frontend/utility/YoutubeApiWrappers.cpp -> obs-studio-32.1.0.tar.xz/frontend/utility/YoutubeApiWrappers.cpp
Changed
@@ -14,22 +14,22 @@ using namespace json11; -/* ------------------------------------------------------------------------- */ -#define YOUTUBE_LIVE_API_URL "https://www.googleapis.com/youtube/v3" +namespace { +using std::string_view_literals::operator""sv; -#define YOUTUBE_LIVE_STREAM_URL YOUTUBE_LIVE_API_URL "/liveStreams" -#define YOUTUBE_LIVE_BROADCAST_URL YOUTUBE_LIVE_API_URL "/liveBroadcasts" -#define YOUTUBE_LIVE_BROADCAST_TRANSITION_URL YOUTUBE_LIVE_BROADCAST_URL "/transition" -#define YOUTUBE_LIVE_BROADCAST_BIND_URL YOUTUBE_LIVE_BROADCAST_URL "/bind" +constexpr auto youtubeLiveStreamUrl = "https://www.googleapis.com/youtube/v3/liveStreams"sv; +constexpr auto youtubeLiveBroadcastUrl = "https://www.googleapis.com/youtube/v3/liveBroadcasts"sv; +constexpr auto youtubeLiveBroadcastTransitionUrl = "https://www.googleapis.com/youtube/v3/liveBroadcasts/transition"sv; +constexpr auto youtubeLiveBroadcastBindUrl = "https://www.googleapis.com/youtube/v3/liveBroadcasts/bind"sv; -#define YOUTUBE_LIVE_CHANNEL_URL YOUTUBE_LIVE_API_URL "/channels" -#define YOUTUBE_LIVE_TOKEN_URL "https://oauth2.googleapis.com/token" -#define YOUTUBE_LIVE_VIDEOCATEGORIES_URL YOUTUBE_LIVE_API_URL "/videoCategories" -#define YOUTUBE_LIVE_VIDEOS_URL YOUTUBE_LIVE_API_URL "/videos" -#define YOUTUBE_LIVE_THUMBNAIL_URL "https://www.googleapis.com/upload/youtube/v3/thumbnails/set" +constexpr auto youtubeLiveChannelUrl = "https://www.googleapis.com/youtube/v3/channels"sv; +constexpr auto youtubeLiveTokenUrl = "https://oauth2.googleapis.com/token"sv; +constexpr auto youtubeLiveVideoCategoriesUrl = "https://www.googleapis.com/youtube/v3/videoCategories"sv; +constexpr auto youtubeLiveVideosUrl = "https://www.googleapis.com/youtube/v3/videos"sv; +constexpr auto youtubeLiveThumbnailUrl = "https://www.googleapis.com/upload/youtube/v3/thumbnails/set"sv; -#define DEFAULT_BROADCASTS_PER_QUERY "50" // acceptable values are 0 to 50, inclusive -/* ------------------------------------------------------------------------- */ +constexpr auto defaultBroadcastsPerQuery = 50; // acceptable values are 0 to 50, inclusive +} // namespace bool IsYouTubeService(const std::string &service) { @@ -51,7 +51,8 @@ bool YoutubeApiWrappers::GetTranslatedError(QString &error_message) { - QString translated = QTStr("YouTube.Errors." + lastErrorReason.toUtf8()); + const QString errorKey = "YouTube.Errors." + lastErrorReason.toUtf8(); + const QString translated = QTStr(QT_TO_UTF8(errorKey)); // No translation found if (translated.startsWith("YouTube.Errors.")) return false; @@ -110,7 +111,6 @@ deobfuscate_str(&secret0, YOUTUBE_SECRET_HASH); std::string r_token = QUrl::toPercentEncoding(refresh_token.c_str()).toStdString(); - const QString url = YOUTUBE_LIVE_TOKEN_URL; const QString data_template = "client_id=%1" "&client_secret=%2" "&refresh_token=%3" @@ -118,8 +118,8 @@ const QString data = data_template.arg(QString(clientid.c_str()), QString(secret.c_str()), QString(r_token.c_str())); Json json_out; - bool success = - TryInsertCommand(QT_TO_UTF8(url), "application/x-www-form-urlencoded", "", QT_TO_UTF8(data), json_out); + bool success = TryInsertCommand(youtubeLiveTokenUrl.data(), "application/x-www-form-urlencoded", "", + QT_TO_UTF8(data), json_out); if (!success || json_out.object_items().find("error") != json_out.object_items().end()) return false; @@ -158,10 +158,11 @@ { lastErrorMessage.clear(); lastErrorReason.clear(); - const QByteArray url = YOUTUBE_LIVE_CHANNEL_URL "?part=snippet,contentDetails,statistics" - "&mine=true"; + + const std::string url = + std::string(youtubeLiveChannelUrl) + "?part=snippet,contentDetails,statistics&mine=true"; Json json_out; - if (!InsertCommand(url, "application/json", "", nullptr, json_out)) { + if (!InsertCommand(url.c_str(), "application/json", "", nullptr, json_out)) { return false; } @@ -179,7 +180,7 @@ { lastErrorMessage.clear(); lastErrorReason.clear(); - const QByteArray url = YOUTUBE_LIVE_BROADCAST_URL "?part=snippet,status,contentDetails"; + const std::string url = std::string(youtubeLiveBroadcastUrl) + "?part=snippet,status,contentDetails"; const Json data = Json::object{ {"snippet", Json::object{ @@ -208,7 +209,7 @@ }}, }; Json json_out; - if (!InsertCommand(url, "application/json", "", data.dump().c_str(), json_out)) { + if (!InsertCommand(url.c_str(), "application/json", "", data.dump().c_str(), json_out)) { return false; } broadcast.id = QString(json_out"id".string_value().c_str()); @@ -219,7 +220,7 @@ { lastErrorMessage.clear(); lastErrorReason.clear(); - const QByteArray url = YOUTUBE_LIVE_STREAM_URL "?part=snippet,cdn,status,contentDetails"; + const std::string url = std::string(youtubeLiveStreamUrl) + "?part=snippet,cdn,status,contentDetails"; const Json data = Json::object{ {"snippet", Json::object{ @@ -234,7 +235,7 @@ {"contentDetails", Json::object{{"isReusable", false}}}, }; Json json_out; - if (!InsertCommand(url, "application/json", "", data.dump().c_str(), json_out)) { + if (!InsertCommand(url.c_str(), "application/json", "", data.dump().c_str(), json_out)) { return false; } stream.id = QString(json_out"id".string_value().c_str()); @@ -246,9 +247,9 @@ { lastErrorMessage.clear(); lastErrorReason.clear(); - const QString url_template = YOUTUBE_LIVE_BROADCAST_BIND_URL "?id=%1" - "&streamId=%2" - "&part=id,snippet,contentDetails,status"; + // TODO: Use std::format with std::string instead of QString::arg with C++20 + const QString url_template = QString(youtubeLiveBroadcastBindUrl.data()) + + "?id=%1&streamId=%2&part=id,snippet,contentDetails,status"; const QString url = url_template.arg(broadcast_id, stream_id); const Json data = Json::object{}; this->broadcast_id = broadcast_id; @@ -260,26 +261,28 @@ { lastErrorMessage.clear(); lastErrorReason.clear(); - QByteArray url = YOUTUBE_LIVE_BROADCAST_URL "?part=snippet,contentDetails,status" - "&broadcastType=all&maxResults=" DEFAULT_BROADCASTS_PER_QUERY; + std::string url = std::string(youtubeLiveBroadcastUrl) + + "?part=snippet,contentDetails,status&broadcastType=all&maxResults=" + + std::to_string(defaultBroadcastsPerQuery); if (status.isEmpty()) url += "&mine=true"; else - url += "&broadcastStatus=" + status.toUtf8(); + url += "&broadcastStatus=" + status.toStdString(); if (!page.isEmpty()) - url += "&pageToken=" + page.toUtf8(); - return InsertCommand(url, "application/json", "", nullptr, json_out); + url += "&pageToken=" + page.toStdString(); + return InsertCommand(url.c_str(), "application/json", "", nullptr, json_out); } bool YoutubeApiWrappers::GetVideoCategoriesList(QVector<CategoryDescription> &category_list_out) { lastErrorMessage.clear(); lastErrorReason.clear(); - const QString url_template = YOUTUBE_LIVE_VIDEOCATEGORIES_URL "?part=snippet" - "®ionCode=%1" - "&hl=%2"; + // TODO: Use std::format with C++20 + const QString url_template = + QString(youtubeLiveVideoCategoriesUrl.data()) + "?part=snippet®ionCode=%1&hl=%2"; + /* * All OBS locale regions aside from "US" are missing category id 29 * ("Nonprofits & Activism"), but it is still available to channels @@ -316,7 +319,7 @@ { lastErrorMessage.clear(); lastErrorReason.clear(); - const QByteArray url = YOUTUBE_LIVE_VIDEOS_URL "?part=snippet"; + const std::string url = std::string(youtubeLiveVideosUrl) + "?part=snippet"; const Json data = Json::object{ {"id", QT_TO_UTF8(video_id)}, {"snippet", @@ -327,7 +330,7 @@ }}, }; Json json_out; - return InsertCommand(url, "application/json", "PUT", data.dump().c_str(), json_out); + return InsertCommand(url.c_str(), "application/json", "PUT", data.dump().c_str(), json_out); } bool YoutubeApiWrappers::SetVideoThumbnail(const QString &video_id, const QString &thumbnail_file) @@ -350,9 +353,9 @@ const QByteArray fileContents = thumbFile.readAll(); const QString mime = QMimeDatabase().mimeTypeForData(fileContents).name(); - const QString url = YOUTUBE_LIVE_THUMBNAIL_URL "?videoId=" + video_id; + const std::string url = std::string(youtubeLiveThumbnailUrl) + "?videoId=" + video_id.toStdString(); Json json_out; - return InsertCommand(QT_TO_UTF8(url), QT_TO_UTF8(mime), "POST", fileContents.constData(), json_out, + return InsertCommand(url.c_str(), QT_TO_UTF8(mime), "POST", fileContents.constData(), json_out, fileContents.size()); } @@ -383,9 +386,9 @@ if (lifeCycleStatus != "testing" && monitorStreamEnabled && !ResetBroadcast(broadcast_id, json_out)) return false; - const QString url_template = YOUTUBE_LIVE_BROADCAST_TRANSITION_URL "?id=%1" - "&broadcastStatus=%2" - "&part=status"; + // TODO: Use std::format with C++20 + const QString url_template = + QString(youtubeLiveBroadcastTransitionUrl.data()) + "?id=%1&broadcastStatus=%2&part=status"; const QString live = url_template.arg(broadcast_id, "live"); bool success = InsertCommand(QT_TO_UTF8(live), "application/json", "POST", "{}", json_out); // Return a success if the command failed, but was redundant (broadcast already live) @@ -402,9 +405,8 @@ lastErrorMessage.clear(); lastErrorReason.clear(); - const QString url_template = YOUTUBE_LIVE_BROADCAST_TRANSITION_URL "?id=%1" - "&broadcastStatus=complete" - "&part=status"; + const QString url_template = + QString(youtubeLiveBroadcastTransitionUrl.data()) + "?id=%1&broadcastStatus=complete&part=status"; const QString url = url_template.arg(broadcast_id); Json json_out; bool success = InsertCommand(QT_TO_UTF8(url), "application/json", "POST", "{}", json_out); @@ -472,19 +474,19 @@ }}, }; - const QString put = YOUTUBE_LIVE_BROADCAST_URL "?part=id,snippet,contentDetails,status"; - return InsertCommand(QT_TO_UTF8(put), "application/json", "PUT", data.dump().c_str(), json_out); + const std::string put = std::string(youtubeLiveBroadcastUrl) + "?part=id,snippet,contentDetails,status"; + return InsertCommand(put.c_str(), "application/json", "PUT", data.dump().c_str(), json_out); } bool YoutubeApiWrappers::FindBroadcast(const QString &id, json11::Json &json_out) { lastErrorMessage.clear(); lastErrorReason.clear(); - QByteArray url = YOUTUBE_LIVE_BROADCAST_URL "?part=id,snippet,contentDetails,status" - "&broadcastType=all&maxResults=1"; - url += "&id=" + id.toUtf8(); + std::string url = std::string(youtubeLiveBroadcastUrl) + + "?part=id,snippet,contentDetails,status&broadcastType=all&maxResults=1"; + url += "&id=" + id.toStdString(); - if (!InsertCommand(url, "application/json", "", nullptr, json_out)) + if (!InsertCommand(url.c_str(), "application/json", "", nullptr, json_out)) return false; auto items = json_out"items".array_items(); @@ -500,11 +502,10 @@ { lastErrorMessage.clear(); lastErrorReason.clear(); - QByteArray url = YOUTUBE_LIVE_STREAM_URL "?part=id,snippet,cdn,status" - "&maxResults=1"; - url += "&id=" + id.toUtf8(); + std::string url = std::string(youtubeLiveStreamUrl) + "?part=id,snippet,cdn,status&maxResults=1"; + url += "&id=" + id.toStdString(); - if (!InsertCommand(url, "application/json", "", nullptr, json_out)) + if (!InsertCommand(url.c_str(), "application/json", "", nullptr, json_out)) return false; auto items = json_out"items".array_items();
View file
obs-studio-32.0.4.tar.xz/frontend/utility/crypto-helpers-mbedtls.cpp -> obs-studio-32.1.0.tar.xz/frontend/utility/crypto-helpers-mbedtls.cpp
Changed
@@ -21,7 +21,7 @@ if ((ret = mbedtls_md(mbedtls_md_info_from_type(MBEDTLS_MD_SHA512), buf, len, hash)) != 0) { goto exit; } - // Verify signautre + // Verify signature if ((ret = mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA512, hash, 64, sig, sigLen)) != 0) { goto exit; }
View file
obs-studio-32.0.4.tar.xz/frontend/utility/platform-x11.cpp -> obs-studio-32.1.0.tar.xz/frontend/utility/platform-x11.cpp
Changed
@@ -40,6 +40,9 @@ #if defined(__FreeBSD__) || defined(__DragonFly__) #include <fcntl.h> +#include <sys/param.h> +#include <sys/queue.h> +#include <sys/socket.h> #include <libprocstat.h> #include <pthread_np.h> #endif
View file
obs-studio-32.1.0.tar.xz/frontend/widgets/AudioMixer.cpp
Added
@@ -0,0 +1,1086 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#include "AudioMixer.hpp" + +#include <components/MenuCheckBox.hpp> +#include <dialogs/NameDialog.hpp> +#include <utility/item-widget-helpers.hpp> +#include <widgets/OBSBasic.hpp> + +#include <Idian/Utils.hpp> + +#include <QAction> +#include <QCheckBox> +#include <QHBoxLayout> +#include <QMenu> +#include <QPointer> +#include <QPushButton> +#include <QScrollArea> +#include <QStackedWidget> +#include <QTimer> +#include <QToolBar> +#include <QVBoxLayout> +#include <QWidgetAction> + +#include "moc_AudioMixer.cpp" + +constexpr int GLOBAL_SOURCE_TOTAL = 6; + +namespace { +bool isHiddenInMixer(obs_source_t *source) +{ + OBSDataAutoRelease priv_settings = obs_source_get_private_settings(source); + bool hidden = obs_data_get_bool(priv_settings, "mixer_hidden"); + + return hidden; +} + +bool isPinnedInMixer(obs_source_t *source) +{ + OBSDataAutoRelease priv_settings = obs_source_get_private_settings(source); + bool hidden = obs_data_get_bool(priv_settings, "mixer_pinned"); + + return hidden; +} + +bool isSourceAudioActive(obs_source_t *source) +{ + bool active = obs_source_active(source) && obs_source_audio_active(source); + + return active; +} + +bool isVolumeLocked(obs_source_t *source) +{ + OBSDataAutoRelease priv_settings = obs_source_get_private_settings(source); + bool lock = obs_data_get_bool(priv_settings, "volume_locked"); + + return lock; +} + +} // namespace + +AudioMixer::AudioMixer(QWidget *parent) : QFrame(parent) +{ + mixerVertical = config_get_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolumeControl"); + showInactive = config_get_bool(App()->GetUserConfig(), "BasicWindow", "MixerShowInactive"); + keepInactiveLast = config_get_bool(App()->GetUserConfig(), "BasicWindow", "MixerKeepInactiveLast"); + showHidden = config_get_bool(App()->GetUserConfig(), "BasicWindow", "MixerShowHidden"); + keepHiddenLast = config_get_bool(App()->GetUserConfig(), "BasicWindow", "MixerKeepHiddenLast"); + + mainLayout = new QVBoxLayout(this); + mainLayout->setContentsMargins(0, 0, 0, 0); + mainLayout->setSpacing(0); + setLayout(mainLayout); + setFrameShape(QFrame::NoFrame); + setLineWidth(0); + + stackedMixerArea = new QStackedWidget(this); + stackedMixerArea->setObjectName("stackedMixerArea"); + + // Horizontal Widgets + hMixerScrollArea = new QScrollArea(this); + hMixerScrollArea->setObjectName("hMixerScrollArea"); + hMixerScrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + hMixerScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + hMixerScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + hMixerScrollArea->setWidgetResizable(true); + hMixerScrollArea->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu); + + hVolumeWidgets = new QWidget(this); + hVolumeWidgets->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); + hVolumeWidgets->setObjectName("hVolumeWidgets"); + + hVolumeControlLayout = new QVBoxLayout(hVolumeWidgets); + hVolumeWidgets->setLayout(hVolumeControlLayout); + hVolumeControlLayout->setContentsMargins(0, 0, 0, 0); + hVolumeControlLayout->setSpacing(0); + hVolumeControlLayout->setAlignment(Qt::AlignTop); + + hMixerScrollArea->setWidget(hVolumeWidgets); + + // Vertical Widgets + vMixerScrollArea = new QScrollArea(this); + vMixerScrollArea->setObjectName("vMixerScrollArea"); + vMixerScrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + vMixerScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + vMixerScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); + vMixerScrollArea->setWidgetResizable(true); + vMixerScrollArea->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu); + + vVolumeWidgets = new QWidget(this); + + vVolumeWidgets->setObjectName("vVolumeWidgets"); + + vVolumeControlLayout = new QHBoxLayout(vVolumeWidgets); + vVolumeWidgets->setLayout(vVolumeControlLayout); + vVolumeControlLayout->setContentsMargins(0, 0, 0, 0); + vVolumeControlLayout->setSpacing(0); + vVolumeControlLayout->setAlignment(Qt::AlignLeft); + + vMixerScrollArea->setWidget(vVolumeWidgets); + + stackedMixerArea->addWidget(hMixerScrollArea); + stackedMixerArea->addWidget(vMixerScrollArea); + + mixerToolbar = new QToolBar(this); + mixerToolbar->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); + mixerToolbar->setIconSize(QSize(16, 16)); + mixerToolbar->setFloatable(false); + + mainLayout->addWidget(stackedMixerArea); + mainLayout->addWidget(mixerToolbar); + + advAudio = new QAction(this); + advAudio->setText(QTStr("Basic.AdvAudio")); + advAudio->setToolTip(QTStr("Basic.AdvAudio")); + QIcon advIcon; + advIcon.addFile(QString::fromUtf8(":/settings/images/settings/advanced.svg"), QSize(16, 16), + QIcon::Mode::Normal, QIcon::State::Off); + advAudio->setIcon(advIcon); + advAudio->setObjectName("actionMixerToolbarAdvAudio"); + + layoutButton = new QAction(this); + layoutButton->setText(""); + layoutButton->setToolTip(QTStr("Basic.AudioMixer.Layout.Vertical")); + QIcon layoutIcon; + layoutIcon.addFile(QString::fromUtf8(":/res/images/layout-vertical.svg"), QSize(16, 16), QIcon::Mode::Normal, + QIcon::State::Off); + layoutButton->setIcon(layoutIcon); + layoutButton->setObjectName("actionMixerToolbarToggleLayout"); + + QWidget *spacer = new QWidget(mixerToolbar); + spacer->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); + + optionsButton = new QPushButton(mixerToolbar); + optionsButton->setText(QTStr("Basic.AudioMixer.Options")); + idian::Utils::addClass(optionsButton, "toolbar-button"); + idian::Utils::addClass(optionsButton, "text-bold"); + + createMixerContextMenu(); + optionsButton->setMenu(mixerMenu); + + toggleHiddenButton = new QPushButton(mixerToolbar); + toggleHiddenButton->setCheckable(true); + toggleHiddenButton->setChecked(showHidden); + toggleHiddenButton->setText(QTStr("Basic.AudioMixer.HiddenTotal").arg(0)); + toggleHiddenButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); + idian::Utils::addClass(toggleHiddenButton, "toolbar-button"); + idian::Utils::addClass(toggleHiddenButton, "toggle-hidden"); + + mixerToolbar->addWidget(toggleHiddenButton); + + mixerToolbar->addSeparator(); + mixerToolbar->addWidget(spacer); + mixerToolbar->addSeparator(); + + mixerToolbar->addAction(layoutButton); + mixerToolbar->addSeparator(); + mixerToolbar->addAction(advAudio); + mixerToolbar->addSeparator(); + mixerToolbar->addWidget(optionsButton); + + // Setting this property on the QAction itself does not seem to work despite + // the UI files doing exactly that, so we set it on the action widget directly + QWidget *advAudioWidget = mixerToolbar->widgetForAction(advAudio); + idian::Utils::addClass(advAudioWidget, "icon-cogs"); + + // Connect to OBS signals + signalHandlers.reserve(signalHandlers.size() + 8); + signalHandlers.emplace_back(obs_get_signal_handler(), "source_create", AudioMixer::obsSourceCreate, this); + signalHandlers.emplace_back(obs_get_signal_handler(), "source_remove", AudioMixer::obsSourceRemove, this); + signalHandlers.emplace_back(obs_get_signal_handler(), "source_destroy", AudioMixer::obsSourceRemove, this); + signalHandlers.emplace_back(obs_get_signal_handler(), "source_rename", AudioMixer::obsSourceRename, this); + signalHandlers.emplace_back(obs_get_signal_handler(), "source_activate", AudioMixer::obsSourceActivated, this); + signalHandlers.emplace_back(obs_get_signal_handler(), "source_deactivate", AudioMixer::obsSourceDeactivated, + this); + signalHandlers.emplace_back(obs_get_signal_handler(), "source_audio_activate", + AudioMixer::obsSourceAudioActivated, this); + signalHandlers.emplace_back(obs_get_signal_handler(), "source_audio_deactivate", + AudioMixer::obsSourceAudioDeactivated, this); + + obs_frontend_add_event_callback(AudioMixer::onFrontendEvent, this); + + // Connect to Qt signals + connect(hMixerScrollArea, &QScrollArea::customContextMenuRequested, this, + &AudioMixer::mixerContextMenuRequested); + + connect(vMixerScrollArea, &QScrollArea::customContextMenuRequested, this, + &AudioMixer::mixerContextMenuRequested); + + connect(&updateTimer, &QTimer::timeout, this, &AudioMixer::updateVolumeLayouts); + updateTimer.setSingleShot(true); + + OBSBasic *main = OBSBasic::Get(); + if (main) { + connect(main, &OBSBasic::userSettingChanged, this, + this(const std::string &category, const std::string &name) { + if (category == "BasicWindow" && name == "VerticalVolumeControl") { + updateLayout(); + } else if (category == "BasicWindow" && name == "MixerShowInactive") { + updateShowInactive(); + } else if (category == "BasicWindow" && name == "MixerKeepInactiveLast") { + updateKeepInactiveLast(); + } else if (category == "BasicWindow" && name == "MixerShowHidden") { + updateShowHidden(); + } else if (category == "BasicWindow" && name == "MixerKeepHiddenLast") { + updateKeepHiddenLast(); + } else if (category == "BasicWindow" && name == "ShowListboxToolbars") { + updateShowToolbar(); + } else if (category == "Accessibility" && name == "SettingsChanged") { + refreshVolumeColors(); + } + }); + + connect(main, &OBSBasic::mixerStatusChanged, this, &AudioMixer::queueLayoutUpdate); + + connect(advAudio, &QAction::triggered, main, &OBSBasic::on_actionAdvAudioProperties_triggered, + Qt::DirectConnection); + connect(toggleHiddenButton, &QPushButton::clicked, this, &AudioMixer::toggleShowHidden); + connect(layoutButton, &QAction::triggered, main, &OBSBasic::toggleMixerLayout); + } + + updateShowToolbar(); + updatePreviewSources(); + updatePreviewHandlers(); + updateGlobalSources(); + + reloadVolumeControls(); +} + +AudioMixer::~AudioMixer() +{ + signalHandlers.clear(); + + previewSources.clear(); + globalSources.clear(); + + clearVolumeControls(); + + obs_frontend_remove_event_callback(AudioMixer::onFrontendEvent, this); +} + +void AudioMixer::updateLayout() +{ + bool vertical = config_get_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolumeControl"); + setMixerLayoutVertical(vertical); + + updateVolumeLayouts(); +} + +void AudioMixer::toggleShowInactive(bool checked) +{ + config_set_bool(App()->GetUserConfig(), "BasicWindow", "MixerShowInactive", checked); + OBSBasic *main = OBSBasic::Get(); + if (main) { + emit main->userSettingChanged("BasicWindow", "MixerShowInactive"); + } +} + +void AudioMixer::toggleKeepInactiveLast(bool checked) +{ + config_set_bool(App()->GetUserConfig(), "BasicWindow", "MixerKeepInactiveLast", checked); + OBSBasic *main = OBSBasic::Get(); + if (main) { + emit main->userSettingChanged("BasicWindow", "MixerKeepInactiveLast"); + } +} + +void AudioMixer::toggleShowHidden(bool checked) +{ + config_set_bool(App()->GetUserConfig(), "BasicWindow", "MixerShowHidden", checked); + OBSBasic *main = OBSBasic::Get(); + if (main) { + emit main->userSettingChanged("BasicWindow", "MixerShowHidden"); + } +} + +void AudioMixer::toggleKeepHiddenLast(bool checked) +{ + config_set_bool(App()->GetUserConfig(), "BasicWindow", "MixerKeepHiddenLast", checked); + OBSBasic *main = OBSBasic::Get(); + if (main) { + emit main->userSettingChanged("BasicWindow", "MixerKeepHiddenLast"); + } +} + +VolumeControl *AudioMixer::createVolumeControl(obs_source_t *source) +{ + bool vertical = config_get_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolumeControl"); + VolumeControl *control = new VolumeControl(source, this, vertical); + + control->setGlobalInMixer(isSourceGlobal(source)); + control->setHiddenInMixer(isHiddenInMixer(source)); + control->setPinnedInMixer(isPinnedInMixer(source)); + + control->enableSlider(!isVolumeLocked(source)); + + OBSBasic *main = OBSBasic::Get(); + + double meterDecayRate = config_get_double(main->Config(), "Audio", "MeterDecayRate"); + control->setMeterDecayRate(meterDecayRate); + + uint64_t peakMeterTypeIdx = config_get_uint(main->Config(), "Audio", "PeakMeterType"); + + obs_peak_meter_type peakMeterType; + switch (peakMeterTypeIdx) { + case 0: + peakMeterType = SAMPLE_PEAK_METER; + break; + case 1: + peakMeterType = TRUE_PEAK_METER; + break; + default: + peakMeterType = SAMPLE_PEAK_METER; + break; + } + + control->setPeakMeterType(peakMeterType); + + connect(control, &VolumeControl::unhideAll, this, &AudioMixer::unhideAllAudioControls); + + return control; +} + +void AudioMixer::updateControlVisibility(QString uuid) +{ + auto item = volumeList.find(uuid); + if (item == volumeList.end()) { + return; + } + + VolumeControl *control = item->second; + bool show = getMixerVisibilityForControl(control); + + if (show) { + control->show(); + } else { + control->hide(); + } + + queueLayoutUpdate(); +} + +void AudioMixer::addSource(QString uuid) +{ + addControlForUuid(uuid); + updatePreviewSources(); + updateGlobalSources(); +} + +void AudioMixer::removeSource(QString uuid) +{ + removeControlForUuid(uuid); + updatePreviewSources(); + updateGlobalSources(); +} + +void AudioMixer::updatePreviewSources() +{ + bool isStudioMode = obs_frontend_preview_program_mode_active(); + clearPreviewSources(); + + if (isStudioMode) { + OBSSourceAutoRelease previewSource = obs_frontend_get_current_preview_scene(); + if (!previewSource) { + return; + } + + obs_scene_t *previewScene = obs_scene_from_source(previewSource); + if (!previewScene) { + return; + } + + if (!previewScene) { + return; + } + + auto getPreviewSources = this(obs_scene_t *, obs_sceneitem_t *item) { + if (!obs_sceneitem_visible(item)) { + return true; + } + + obs_source_t *source = obs_sceneitem_get_source(item); + if (!source) { + return true; + } + + uint32_t flags = obs_source_get_output_flags(source); + if ((flags & OBS_SOURCE_AUDIO) == 0) { + return true; + } + + if (!obs_source_audio_active(source)) { + return true; + } + + auto uuidPointer = obs_source_get_uuid(source); + if (uuidPointer && *uuidPointer) { + previewSources.insert(QString::fromUtf8(uuidPointer)); + } + + return true; + }; + + using getPreviewSources_t = decltype(getPreviewSources); + + auto previewEnum = (obs_scene_t *scene, obs_sceneitem_t *item, void *data) -> bool { + return (*static_cast<getPreviewSources_t *>(data))(scene, item); + }; + + obs_scene_enum_items(previewScene, previewEnum, &getPreviewSources); + } +} + +void AudioMixer::updateGlobalSources() +{ + globalSources.clear(); + + for (int i = 1; i <= GLOBAL_SOURCE_TOTAL; i++) { + OBSSourceAutoRelease source = obs_get_output_source(i); + if (source) { + auto uuidPointer = obs_source_get_uuid(source); + if (uuidPointer && *uuidPointer) { + globalSources.insert(QString::fromUtf8(uuidPointer)); + } + } + } + + queueLayoutUpdate(); +} + +QBoxLayout *AudioMixer::activeLayout() const +{ + bool vertical = config_get_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolumeControl"); + + QBoxLayout *layout = vertical ? static_cast<QBoxLayout *>(vVolumeControlLayout) + : static_cast<QBoxLayout *>(hVolumeControlLayout); + + return layout; +} + +void AudioMixer::reloadVolumeControls() +{ + clearVolumeControls(); + + auto createMixerControls = (void *param, obs_source_t *source) -> bool { + AudioMixer *mixer = static_cast<AudioMixer *>(param); + + uint32_t flags = obs_source_get_output_flags(source); + + if ((flags & OBS_SOURCE_AUDIO) == 0) { + return true; + } + + auto uuidPointer = obs_source_get_uuid(source); + if (!uuidPointer || !*uuidPointer) { + return true; + } + + mixer->addControlForUuid(QString::fromUtf8(uuidPointer)); + return true; + }; + + obs_enum_sources(createMixerControls, this); + + queueLayoutUpdate(); +} + +bool AudioMixer::getMixerVisibilityForControl(VolumeControl *control) +{ + bool isPinned = control->mixerStatus().has(VolumeControl::MixerStatus::Pinned); + bool isPreviewed = control->mixerStatus().has(VolumeControl::MixerStatus::Preview); + bool isHidden = control->mixerStatus().has(VolumeControl::MixerStatus::Hidden); + bool isAudioActive = control->mixerStatus().has(VolumeControl::MixerStatus::Active); + + if (isPinned) { + return true; + } + + if (isHidden && showHidden) { + return true; + } + + if (!isAudioActive && showInactive) { + return !isHidden; + } + + if (isAudioActive) { + return !isHidden; + } + + if (isPreviewed) { + return !isHidden; + } + + return false; +} + +void AudioMixer::clearPreviewSources() +{ + previewSources.clear(); +} + +bool AudioMixer::isSourcePreviewed(obs_source_t *source) +{ + if (!source) { + return false; + } + + auto uuidPointer = obs_source_get_uuid(source); + if (!uuidPointer || !*uuidPointer) { + return false; + } + + if (previewSources.find(QString::fromUtf8(uuidPointer)) != previewSources.end()) { + return true; + } + + return false; +} + +bool AudioMixer::isSourceGlobal(obs_source_t *source) +{ + if (!source) { + return false; + } + + auto uuidPointer = obs_source_get_uuid(source); + if (!uuidPointer || !*uuidPointer) { + return false; + } + + if (globalSources.find(QString::fromUtf8(uuidPointer)) != globalSources.end()) { + return true; + } + + return false; +} + +void AudioMixer::clearVolumeControls() +{ + for (const auto &uuid, control : volumeList) { + if (control) { + control->deleteLater(); + } + } + volumeList.clear(); +} + +void AudioMixer::refreshVolumeColors() +{ + for (const auto &uuid, control : volumeList) { + control->refreshColors(); + } +} + +void AudioMixer::unhideAllAudioControls() +{ + for (const auto &uuid, control : volumeList) { + control->setHiddenInMixer(false); + } + + queueLayoutUpdate(); +} + +void AudioMixer::queueLayoutUpdate() +{ + if (!updateTimer.isActive()) { + updateTimer.start(0); + } +} + +void AudioMixer::updateVolumeLayouts() +{ + setUpdatesEnabled(false); + + hiddenCount = 0; + bool vertical = config_get_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolumeControl"); + + std::vector<RankedVolume> rankedVolumes; + rankedVolumes.reserve(volumeList.size()); + for (const auto &entry : volumeList) { + VolumeControl *control = entry.second; + if (control) { + int sortingWeight = 0; + + OBSSource source = OBSGetStrongRef(control->weakSource()); + if (!source) { + const char *cachedName = control->getCachedName().toUtf8().constData(); + blog(LOG_INFO, "Tried to sort VolumeControl for '%s' but source is null", cachedName); + continue; + } + + bool isPreviewed = isSourcePreviewed(source); + bool isGlobal = isSourceGlobal(source); + bool isPinned = isPinnedInMixer(source); + bool isHidden = isHiddenInMixer(source); + bool isAudioActive = isSourceAudioActive(source); + bool isLocked = isVolumeLocked(source); + + control->mixerStatus().set(VolumeControl::MixerStatus::Preview, isPreviewed); + control->mixerStatus().set(VolumeControl::MixerStatus::Global, isGlobal); + control->mixerStatus().set(VolumeControl::MixerStatus::Pinned, isPinned); + control->mixerStatus().set(VolumeControl::MixerStatus::Hidden, isHidden); + control->mixerStatus().set(VolumeControl::MixerStatus::Active, isAudioActive); + control->mixerStatus().set(VolumeControl::MixerStatus::Locked, isLocked); + + if (isHidden) { + hiddenCount += 1; + } + + if (!isGlobal) { + sortingWeight += 20; + } + + if (!isPinned) { + sortingWeight += 20; + } + + if (isHidden && keepHiddenLast) { + sortingWeight += 20; + + if (isPreviewed) { + sortingWeight -= 10; + } + } + + if (!isAudioActive && keepInactiveLast) { + sortingWeight += 50; + + if (isPreviewed) { + sortingWeight -= 10; + } + } + + rankedVolumes.push_back({control, sortingWeight}); + } + } + + std::sort(rankedVolumes.begin(), rankedVolumes.end(), (const RankedVolume &a, const RankedVolume &b) { + const QString &nameA = a.control->getCachedName(); + const QString &nameB = b.control->getCachedName(); + + if (a.sortingWeight == b.sortingWeight) { + return nameA.toLower() < nameB.toLower(); + } + + return a.sortingWeight < b.sortingWeight; + }); + + VolumeControl *prevControl = nullptr; + int index = 0; + QBoxLayout *layout = activeLayout(); + + vMixerScrollArea->setWidgetResizable(false); + hMixerScrollArea->setWidgetResizable(false); + + QSize minimumSize{}; + for (const auto &entry : rankedVolumes) { + VolumeControl *volControl = entry.control; + if (!volControl) { + continue; + } + + layout->insertWidget(index, volControl); + volControl->setVertical(vertical); + volControl->updateName(); + volControl->updateMixerState(); + + bool showControl = getMixerVisibilityForControl(volControl); + + if (showControl) { + volControl->show(); + } else { + volControl->hide(); + } + + if (prevControl == nullptr) { + setTabOrder(previousInFocusChain(), volControl->firstWidget()); + } else { + setTabOrder(prevControl->lastWidget(), volControl->firstWidget()); + } + volControl->updateTabOrder(); + + prevControl = volControl; + + if (!minimumSize.isValid()) { + minimumSize = volControl->minimumSizeHint(); + } + + ++index; + } + + toggleHiddenButton->setText(QTStr("Basic.AudioMixer.HiddenTotal").arg(hiddenCount)); + if (hiddenCount == 0) { + toggleHiddenButton->setDisabled(true); + idian::Utils::toggleClass(toggleHiddenButton, "text-muted", true); + } else { + toggleHiddenButton->setDisabled(false); + idian::Utils::toggleClass(toggleHiddenButton, "text-muted", false); + } + + vMixerScrollArea->setWidgetResizable(true); + hMixerScrollArea->setWidgetResizable(true); + + int scrollBarSize = QApplication::style()->pixelMetric(QStyle::PM_ScrollBarExtent); + stackedMixerArea->setMinimumSize(minimumSize.width() + scrollBarSize, minimumSize.height() + scrollBarSize); + + setUpdatesEnabled(true); +} + +void AudioMixer::mixerContextMenuRequested() +{ + showMixerContextMenu(); +} + +void AudioMixer::setMixerLayoutVertical(bool vertical) +{ + mixerVertical = vertical; + + if (vertical) { + stackedMixerArea->setCurrentIndex(1); + + QIcon layoutIcon; + layoutIcon.addFile(QString::fromUtf8(":/res/images/layout-horizontal.svg"), QSize(16, 16), + QIcon::Mode::Normal, QIcon::State::Off); + layoutButton->setIcon(layoutIcon); + layoutButton->setToolTip(QTStr("Basic.AudioMixer.Layout.Horizontal")); + } else { + stackedMixerArea->setCurrentIndex(0); + + QIcon layoutIcon; + layoutIcon.addFile(QString::fromUtf8(":/res/images/layout-vertical.svg"), QSize(16, 16), + QIcon::Mode::Normal, QIcon::State::Off); + layoutButton->setIcon(layoutIcon); + layoutButton->setToolTip(QTStr("Basic.AudioMixer.Layout.Vertical")); + } + + // Qt caches the size of QWidgetActions so this is the simplest way to update the text + // of the checkboxes in the menu and make sure the menu size is recalculated. + createMixerContextMenu(); + + QWidget *buttonWidget = mixerToolbar->widgetForAction(layoutButton); + if (buttonWidget) { + idian::Utils::toggleClass(buttonWidget, "icon-layout-horizontal", vertical); + idian::Utils::toggleClass(buttonWidget, "icon-layout-vertical", !vertical); + } +} + +void AudioMixer::createMixerContextMenu() +{ + if (mixerMenu) { + mixerMenu->deleteLater(); + } + + mixerMenu = new QMenu(this); + + // Create menu actions + QAction *unhideAllAction = new QAction(QTStr("UnhideAll"), mixerMenu); + + showHiddenCheckBox = new MenuCheckBox(QTStr("Basic.AudioMixer.ShowHidden"), mixerMenu); + QWidgetAction *showHiddenAction = new QWidgetAction(mixerMenu); + showHiddenCheckBox->setAction(showHiddenAction); + showHiddenCheckBox->setChecked(showHidden); + showHiddenAction->setDefaultWidget(showHiddenCheckBox); + + QWidgetAction *showInactiveAction = new QWidgetAction(mixerMenu); + MenuCheckBox *showInactiveCheckBox = new MenuCheckBox(QTStr("Basic.AudioMixer.ShowInactive"), mixerMenu); + showInactiveCheckBox->setAction(showInactiveAction); + showInactiveCheckBox->setChecked(showInactive); + showInactiveAction->setDefaultWidget(showInactiveCheckBox); + + QWidgetAction *hiddenLastAction = new QWidgetAction(mixerMenu); + const char *hiddenLastString = mixerVertical ? "Basic.AudioMixer.KeepHiddenRight" + : "Basic.AudioMixer.KeepHiddenBottom"; + MenuCheckBox *hiddenLastCheckBox = new MenuCheckBox(QTStr(hiddenLastString), mixerMenu); + hiddenLastCheckBox->setAction(hiddenLastAction); + hiddenLastCheckBox->setChecked(keepHiddenLast); + hiddenLastAction->setDefaultWidget(hiddenLastCheckBox); + + QWidgetAction *inactiveLastAction = new QWidgetAction(mixerMenu); + const char *inactiveLastString = mixerVertical ? "Basic.AudioMixer.KeepInactiveRight" + : "Basic.AudioMixer.KeepInactiveBottom"; + MenuCheckBox *inactiveLastCheckBox = new MenuCheckBox(QTStr(inactiveLastString), mixerMenu); + inactiveLastCheckBox->setAction(inactiveLastAction); + inactiveLastCheckBox->setChecked(keepInactiveLast); + inactiveLastAction->setDefaultWidget(inactiveLastCheckBox); + + // Connect menu actions + connect(unhideAllAction, &QAction::triggered, this, &AudioMixer::unhideAllAudioControls, Qt::DirectConnection); + + connect(showHiddenCheckBox, &QCheckBox::toggled, this, &AudioMixer::toggleShowHidden, Qt::DirectConnection); + connect(hiddenLastCheckBox, &QCheckBox::toggled, this, &AudioMixer::toggleKeepHiddenLast, Qt::DirectConnection); + + connect(showInactiveCheckBox, &QCheckBox::toggled, this, &AudioMixer::toggleShowInactive, Qt::DirectConnection); + connect(inactiveLastCheckBox, &QCheckBox::toggled, this, &AudioMixer::toggleKeepInactiveLast, + Qt::DirectConnection); + + // Build menu and show + mixerMenu->addAction(unhideAllAction); + mixerMenu->addSeparator(); + mixerMenu->addAction(showHiddenAction); + mixerMenu->addAction(showInactiveAction); + mixerMenu->addAction(hiddenLastAction); + mixerMenu->addAction(inactiveLastAction); + + optionsButton->setMenu(mixerMenu); +} + +void AudioMixer::showMixerContextMenu() +{ + createMixerContextMenu(); + mixerMenu->popup(QCursor::pos()); +} + +void AudioMixer::addControlForUuid(QString uuid) +{ + OBSSourceAutoRelease source = obs_get_source_by_uuid(uuid.toUtf8().constData()); + + QPointer<VolumeControl> newControl = createVolumeControl(source); + + volumeList.insert({uuid, newControl}); + queueLayoutUpdate(); +} + +void AudioMixer::removeControlForUuid(QString uuid) +{ + auto item = volumeList.find(uuid); + if (item != volumeList.end()) { + VolumeControl *widget = item->second; + if (widget) { + activeLayout()->removeWidget(widget); + widget->deleteLater(); + } + + volumeList.erase(item); + } + + previewSources.erase(uuid); + globalSources.erase(uuid); +} + +void AudioMixer::onFrontendEvent(obs_frontend_event event, void *data) +{ + AudioMixer *mixer = static_cast<AudioMixer *>(data); + mixer->handleFrontendEvent(event); +} + +void AudioMixer::handleFrontendEvent(obs_frontend_event event) +{ + switch (event) { + case OBS_FRONTEND_EVENT_PREVIEW_SCENE_CHANGED: + case OBS_FRONTEND_EVENT_STUDIO_MODE_ENABLED: + case OBS_FRONTEND_EVENT_STUDIO_MODE_DISABLED: + updatePreviewSources(); + updatePreviewHandlers(); + queueLayoutUpdate(); + break; + case OBS_FRONTEND_EVENT_EXIT: + obs_frontend_remove_event_callback(AudioMixer::onFrontendEvent, this); + break; + default: + break; + } +} + +void AudioMixer::updatePreviewHandlers() +{ + previewSignals.clear(); + + bool isStudioMode = obs_frontend_preview_program_mode_active(); + if (isStudioMode) { + OBSSourceAutoRelease previewSource = obs_frontend_get_current_preview_scene(); + if (!previewSource) { + return; + } + + previewSignals.reserve(1); + + previewSignals.emplace_back(obs_source_get_signal_handler(previewSource), "item_visible", + AudioMixer::obsSceneItemVisibleChange, this); + } +} + +void AudioMixer::updateShowInactive() +{ + bool settingShowInactive = config_get_bool(App()->GetUserConfig(), "BasicWindow", "MixerShowInactive"); + if (showInactive == settingShowInactive) { + return; + } + + showInactive = settingShowInactive; + + queueLayoutUpdate(); +} + +void AudioMixer::updateKeepInactiveLast() +{ + bool settingKeepInactiveLast = config_get_bool(App()->GetUserConfig(), "BasicWindow", "MixerKeepInactiveLast"); + if (keepInactiveLast == settingKeepInactiveLast) { + return; + } + + keepInactiveLast = settingKeepInactiveLast; + + queueLayoutUpdate(); +} + +void AudioMixer::updateShowHidden() +{ + bool settingShowHidden = config_get_bool(App()->GetUserConfig(), "BasicWindow", "MixerShowHidden"); + if (showHidden == settingShowHidden) { + return; + } + + showHidden = settingShowHidden; + + toggleHiddenButton->setText(QTStr("Basic.AudioMixer.HiddenTotal").arg(hiddenCount)); + toggleHiddenButton->setChecked(showHidden); + showHiddenCheckBox->setChecked(showHidden); + + queueLayoutUpdate(); +} + +void AudioMixer::updateKeepHiddenLast() +{ + bool settingKeepHiddenLast = config_get_bool(App()->GetUserConfig(), "BasicWindow", "MixerKeepHiddenLast"); + if (keepHiddenLast == settingKeepHiddenLast) { + return; + } + + keepHiddenLast = settingKeepHiddenLast; + + queueLayoutUpdate(); +} + +void AudioMixer::updateShowToolbar() +{ + bool settingShowToolbar = config_get_bool(App()->GetUserConfig(), "BasicWindow", "ShowListboxToolbars"); + + if (showToolbar == settingShowToolbar) { + return; + } + + showToolbar = settingShowToolbar; + + showToolbar ? mixerToolbar->show() : mixerToolbar->hide(); +} + +void AudioMixer::obsSourceActivated(void *data, calldata_t *params) +{ + obs_source_t *source = static_cast<obs_source_t *>(calldata_ptr(params, "source")); + uint32_t flags = obs_source_get_output_flags(source); + + if (flags & OBS_SOURCE_AUDIO) { + auto uuidPointer = obs_source_get_uuid(source); + QMetaObject::invokeMethod(static_cast<AudioMixer *>(data), "updateControlVisibility", + Qt::QueuedConnection, Q_ARG(QString, QString::fromUtf8(uuidPointer))); + } +} + +void AudioMixer::obsSourceDeactivated(void *data, calldata_t *params) +{ + obs_source_t *source = static_cast<obs_source_t *>(calldata_ptr(params, "source")); + uint32_t flags = obs_source_get_output_flags(source); + + if (flags & OBS_SOURCE_AUDIO) { + auto uuidPointer = obs_source_get_uuid(source); + QMetaObject::invokeMethod(static_cast<AudioMixer *>(data), "updateControlVisibility", + Qt::QueuedConnection, Q_ARG(QString, QString::fromUtf8(uuidPointer))); + } +} + +void AudioMixer::obsSourceAudioActivated(void *data, calldata_t *params) +{ + obs_source_t *source = static_cast<obs_source_t *>(calldata_ptr(params, "source")); + uint32_t flags = obs_source_get_output_flags(source); + bool audioActive = obs_source_audio_active(source); + + if (flags & OBS_SOURCE_AUDIO && audioActive) { + auto uuidPointer = obs_source_get_uuid(source); + QMetaObject::invokeMethod(static_cast<AudioMixer *>(data), "addSource", Qt::QueuedConnection, + Q_ARG(QString, QString::fromUtf8(uuidPointer))); + } +} + +void AudioMixer::obsSourceAudioDeactivated(void *data, calldata_t *params) +{ + obs_source_t *source = static_cast<obs_source_t *>(calldata_ptr(params, "source")); + uint32_t flags = obs_source_get_output_flags(source); + + if (flags & OBS_SOURCE_AUDIO) { + auto uuidPointer = obs_source_get_uuid(source); + QMetaObject::invokeMethod(static_cast<AudioMixer *>(data), "removeSource", Qt::QueuedConnection, + Q_ARG(QString, QString::fromUtf8(uuidPointer))); + } +} + +void AudioMixer::obsSourceCreate(void *data, calldata_t *params) +{ + obs_source_t *source = static_cast<obs_source_t *>(calldata_ptr(params, "source")); + uint32_t flags = obs_source_get_output_flags(source); + bool audioActive = obs_source_audio_active(source); + + if (flags & OBS_SOURCE_AUDIO && audioActive) { + auto uuidPointer = obs_source_get_uuid(source); + QMetaObject::invokeMethod(static_cast<AudioMixer *>(data), "addSource", Qt::QueuedConnection, + Q_ARG(QString, QString::fromUtf8(uuidPointer))); + } +} + +void AudioMixer::obsSourceRemove(void *data, calldata_t *params) +{ + obs_source_t *source = static_cast<obs_source_t *>(calldata_ptr(params, "source")); + uint32_t flags = obs_source_get_output_flags(source); + + if (flags & OBS_SOURCE_AUDIO) { + auto uuidPointer = obs_source_get_uuid(source); + QMetaObject::invokeMethod(static_cast<AudioMixer *>(data), "removeSource", Qt::QueuedConnection, + Q_ARG(QString, QString::fromUtf8(uuidPointer))); + } +} + +void AudioMixer::obsSourceRename(void *data, calldata_t *) +{ + QMetaObject::invokeMethod(static_cast<AudioMixer *>(data), "queueLayoutUpdate", Qt::QueuedConnection); +} + +void AudioMixer::obsSceneItemVisibleChange(void *data, calldata_t *params) +{ + obs_sceneitem_t *sceneItem = static_cast<obs_sceneitem_t *>(calldata_ptr(params, "item")); + if (!sceneItem) { + return; + } + + obs_source_t *source = obs_sceneitem_get_source(sceneItem); + if (!source) { + return; + } + + uint32_t flags = obs_source_get_output_flags(source); + + if (flags & OBS_SOURCE_AUDIO) { + QMetaObject::invokeMethod(static_cast<AudioMixer *>(data), "updatePreviewSources", + Qt::QueuedConnection); + + auto uuidPointer = obs_source_get_uuid(source); + QMetaObject::invokeMethod(static_cast<AudioMixer *>(data), "updateControlVisibility", + Qt::QueuedConnection, Q_ARG(QString, QString::fromUtf8(uuidPointer))); + } +}
View file
obs-studio-32.1.0.tar.xz/frontend/widgets/AudioMixer.hpp
Added
@@ -0,0 +1,152 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#pragma once + +#include "OBSBasic.hpp" + +#include <components/MenuCheckBox.hpp> +#include <components/VolumeControl.hpp> + +#include <QObject> +#include <QPointer> +#include <QTimer> + +#include <unordered_set> + +class QHBoxLayout; +class QMenu; +class QPushButton; +class QScrollArea; +class QStackedWidget; +class QToolBar; +class QVBoxLayout; + +class AudioMixer : public QFrame { + Q_OBJECT + + struct RankedVolume { + VolumeControl *control; + int sortingWeight; + }; + +public: + explicit AudioMixer(QWidget *parent = 0); + ~AudioMixer(); + + void refreshVolumeColors(); + + void setMixerLayoutVertical(bool vertical); + void createMixerContextMenu(); + void showMixerContextMenu(); + +private: + std::vector<OBSSignal> signalHandlers; + std::vector<OBSSignal> previewSignals; + static void onFrontendEvent(enum obs_frontend_event event, void *data); + void handleFrontendEvent(enum obs_frontend_event event); + void updatePreviewHandlers(); + + std::unordered_map<QString, QPointer<VolumeControl>> volumeList; + void addControlForUuid(QString uuid); + void removeControlForUuid(QString uuid); + + std::unordered_set<QString> globalSources; + std::unordered_set<QString> previewSources; + bool mixerVertical{false}; + + int hiddenCount{0}; + bool showHidden{false}; + bool showInactive{false}; + + bool keepInactiveLast{false}; + bool keepHiddenLast{false}; + + bool showToolbar{true}; + + QFrame *mixerFrame{nullptr}; + QVBoxLayout *mainLayout{nullptr}; + QVBoxLayout *mixerLayout{nullptr}; + + QStackedWidget *stackedMixerArea{nullptr}; + QToolBar *mixerToolbar{nullptr}; + QAction *layoutButton{nullptr}; + QAction *advAudio{nullptr}; + QPushButton *optionsButton{nullptr}; + QPushButton *toggleHiddenButton{nullptr}; + + QPointer<QMenu> mixerMenu; + QPointer<MenuCheckBox> showHiddenCheckBox; + + QScrollArea *hMixerScrollArea{nullptr}; + QWidget *hVolumeWidgets{nullptr}; + QVBoxLayout *hVolumeControlLayout{nullptr}; + + QScrollArea *vMixerScrollArea{nullptr}; + QWidget *vVolumeWidgets{nullptr}; + QHBoxLayout *vVolumeControlLayout{nullptr}; + + QBoxLayout *activeLayout() const; + + void reloadVolumeControls(); + bool getMixerVisibilityForControl(VolumeControl *widget); + + void clearPreviewSources(); + bool isSourcePreviewed(obs_source_t *source); + bool isSourceGlobal(obs_source_t *source); + void clearVolumeControls(); + void updateShowInactive(); + void updateKeepInactiveLast(); + void updateShowHidden(); + void updateKeepHiddenLast(); + void updateShowToolbar(); + + QTimer updateTimer; + void updateVolumeLayouts(); + + // OBS Callbacks + static void obsSourceActivated(void *data, calldata_t *params); + static void obsSourceDeactivated(void *data, calldata_t *params); + static void obsSourceAudioActivated(void *data, calldata_t *params); + static void obsSourceAudioDeactivated(void *data, calldata_t *params); + static void obsSourceCreate(void *data, calldata_t *params); + static void obsSourceRemove(void *data, calldata_t *params); + static void obsSourceRename(void *data, calldata_t *params); + static void obsSceneItemVisibleChange(void *data, calldata_t *params); + +private slots: + void addSource(QString uuid); + void removeSource(QString uuid); + void updatePreviewSources(); + void updateGlobalSources(); + void unhideAllAudioControls(); + void queueLayoutUpdate(); + + VolumeControl *createVolumeControl(obs_source_t *source); + void updateControlVisibility(QString uuid); + + void updateLayout(); + void toggleShowInactive(bool checked); + void toggleKeepInactiveLast(bool checked); + void toggleShowHidden(bool checked); + void toggleKeepHiddenLast(bool checked); + + void mixerContextMenuRequested(); + +signals: + void advAudioPropertiesClicked(); +};
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasic.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSBasic.cpp
Changed
@@ -19,11 +19,11 @@ #include "OBSBasic.hpp" #include "ui-config.h" + #include "ColorSelect.hpp" #include "OBSBasicControls.hpp" #include "OBSBasicStats.hpp" #include "plugin-manager/PluginManager.hpp" -#include "VolControl.hpp" #include <obs-module.h> @@ -44,6 +44,7 @@ #if defined(_WIN32) || defined(WHATSNEW_ENABLED) #include <utility/WhatsNewInfoThread.hpp> #endif +#include <widgets/AudioMixer.hpp> #include <widgets/OBSProjector.hpp> #include <OBSStudioAPI.hpp> @@ -285,7 +286,6 @@ controlsDock->setWindowTitle(QTStr("Basic.Main.Controls")); /* Parenting is done there so controls will be deleted alongside controlsDock */ controlsDock->setWidget(controls); - addDockWidget(Qt::BottomDockWidgetArea, controlsDock); connect(controls, &OBSBasicControls::StreamButtonClicked, this, &OBSBasic::StreamActionTriggered); @@ -342,6 +342,17 @@ connect(ui->transitionDuration, &QSpinBox::valueChanged, this, this(int value) { SetTransitionDuration(value); }); + /* Main window default layout */ + setDockCornersVertical(true); + + /* Scenes and Sources dock on left + * This specific arrangement can't be set up in Qt Designer */ + addDockWidget(Qt::LeftDockWidgetArea, ui->scenesDock); + splitDockWidget(ui->scenesDock, ui->sourcesDock, Qt::Vertical); + int sideDockWidth = std::min(width() * 30 / 100, 320); + resizeDocks({ui->scenesDock, ui->sourcesDock}, {sideDockWidth, sideDockWidth}, Qt::Horizontal); + addDockWidget(Qt::BottomDockWidgetArea, controlsDock); + startingDockLayout = saveState(); statsDock = new OBSDock(); @@ -389,8 +400,8 @@ }; dpi = devicePixelRatioF(); - connect(windowHandle(), &QWindow::screenChanged, displayResize); - connect(ui->preview, &OBSQTDisplay::DisplayResized, displayResize); + connect(windowHandle(), &QWindow::screenChanged, this, displayResize); + connect(ui->preview, &OBSQTDisplay::DisplayResized, this, displayResize); /* TODO: Move these into window-basic-preview */ /* Preview Scaling label */ @@ -467,7 +478,7 @@ ui->actionCheckForUpdates->setMenuRole(QAction::AboutQtRole); ui->action_Settings->setMenuRole(QAction::PreferencesRole); ui->actionShowMacPermissions->setMenuRole(QAction::ApplicationSpecificRole); - ui->actionE_xit->setMenuRole(QAction::QuitRole); + delete ui->actionE_xit; #else renameScene->setShortcut({Qt::Key_F2}); renameSource->setShortcut({Qt::Key_F2}); @@ -486,7 +497,8 @@ nudge->setShortcut(seq); nudge->setShortcutContext(Qt::WidgetShortcut); ui->preview->addAction(nudge); - connect(nudge, &QAction::triggered, this, distance, direction() { Nudge(distance, direction); }); + connect(nudge, &QAction::triggered, this, + this, distance, direction() { Nudge(distance, direction); }); }; addNudge(Qt::Key_Up, MoveDir::Up, 1); @@ -555,10 +567,13 @@ ui->previewDisabledWidget->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->enablePreviewButton, &QPushButton::clicked, this, &OBSBasic::TogglePreview); - connect(ui->scenes, &SceneTree::scenesReordered, () { OBSProjector::UpdateMultiviewProjectors(); }); + connect(ui->scenes, &SceneTree::scenesReordered, ui->scenes, + () { OBSProjector::UpdateMultiviewProjectors(); }); connect(App(), &OBSApp::StyleChanged, this, this() { OnEvent(OBS_FRONTEND_EVENT_THEME_CHANGED); }); +#ifndef __APPLE__ connect(App(), &OBSApp::aboutToQuit, this, &OBSBasic::closeWindow); +#endif QActionGroup *actionGroup = new QActionGroup(this); actionGroup->addAction(ui->actionSceneListMode); @@ -900,15 +915,9 @@ { ProfileScope("OBSBasic::InitOBSCallbacks"); - signalHandlers.reserve(signalHandlers.size() + 10); + signalHandlers.reserve(signalHandlers.size() + 6); signalHandlers.emplace_back(obs_get_signal_handler(), "source_create", OBSBasic::SourceCreated, this); signalHandlers.emplace_back(obs_get_signal_handler(), "source_remove", OBSBasic::SourceRemoved, this); - signalHandlers.emplace_back(obs_get_signal_handler(), "source_activate", OBSBasic::SourceActivated, this); - signalHandlers.emplace_back(obs_get_signal_handler(), "source_deactivate", OBSBasic::SourceDeactivated, this); - signalHandlers.emplace_back(obs_get_signal_handler(), "source_audio_activate", OBSBasic::SourceAudioActivated, - this); - signalHandlers.emplace_back(obs_get_signal_handler(), "source_audio_deactivate", - OBSBasic::SourceAudioDeactivated, this); signalHandlers.emplace_back(obs_get_signal_handler(), "source_rename", OBSBasic::SourceRenamed, this); signalHandlers.emplace_back( obs_get_signal_handler(), "source_filter_add", @@ -1022,7 +1031,7 @@ /* Modules can access frontend information (i.e. profile and scene collection data) during their initialization, and some modules (e.g. obs-websockets) are known to use the filesystem location of the current profile in their own code. - Thus the profile and scene collection discovery needs to happen before any access to that information (but after intializing global settings) to ensure legacy code gets valid path information. + Thus the profile and scene collection discovery needs to happen before any access to that information (but after initializing global settings) to ensure legacy code gets valid path information. */ RefreshSceneCollections(true); @@ -1135,7 +1144,7 @@ ResizePreview(ovi.base_width, ovi.base_height); }; - connect(ui->preview, &OBSQTDisplay::DisplayCreated, addDisplay); + connect(ui->preview, &OBSQTDisplay::DisplayCreated, this, addDisplay); /* Show the main window, unless the tray icon isn't available * or neither the setting nor flag for starting minimized is set. */ @@ -1174,6 +1183,13 @@ show(); #endif + // Set up Audio Mixer dock + AudioMixer *audioMixer = new AudioMixer(this); + ui->mixerDock->setWidget(audioMixer); + ui->mixerDock->setContextMenuPolicy(Qt::CustomContextMenu); + + connect(ui->mixerDock, &QDockWidget::customContextMenuRequested, audioMixer, &AudioMixer::showMixerContextMenu); + /* setup stats dock */ OBSBasicStats *statsDlg = new OBSBasicStats(statsDock, false); statsDock->setWidget(statsDlg); @@ -1230,10 +1246,8 @@ ui->lockDocks->blockSignals(false); bool sideDocks = config_get_bool(App()->GetUserConfig(), "BasicWindow", "SideDocks"); - on_sideDocks_toggled(sideDocks); - ui->sideDocks->blockSignals(true); ui->sideDocks->setChecked(sideDocks); - ui->sideDocks->blockSignals(false); + setDockCornersVertical(sideDocks); SystemTray(true); @@ -1264,7 +1278,7 @@ #endif TimedCheckForUpdates(); - ToggleMixerLayout(config_get_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolControl")); + emit userSettingChanged("BasicWindow", "VerticalVolumeControl"); if (config_get_bool(activeConfiguration, "General", "OpenStatsOnStartup")) on_stats_triggered(); @@ -1382,7 +1396,9 @@ { /* clear out UI event queue */ QApplication::sendPostedEvents(nullptr); +#ifndef __APPLE_ QApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete); +#endif if (updateCheckThread && updateCheckThread->isRunning()) updateCheckThread->wait(); @@ -1391,8 +1407,6 @@ patronJsonThread->wait(); delete screenshotData; - delete previewProjector; - delete studioProgramProjector; delete previewProjectorSource; delete previewProjectorMain; delete sourceProjector; @@ -1405,7 +1419,6 @@ delete deinterlaceMenu; delete perSceneTransitionMenu; delete shortcutFilter; - delete trayMenu; delete programOptions; delete program; @@ -1467,6 +1480,14 @@ handledShutdown = true; } +void OBSBasic::toggleMixerLayout() +{ + bool vertical = config_get_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolumeControl"); + config_set_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolumeControl", !vertical); + + emit userSettingChanged("BasicWindow", "VerticalVolumeControl"); +} + static inline int AttemptToResetVideo(struct obs_video_info *ovi) { return obs_reset_video(ovi); @@ -1953,6 +1974,13 @@ #ifdef BROWSER_AVAILABLE ClearExtraBrowserDocks(); + +#ifdef YOUTUBE_ENABLED + if (youtubeAppDock) { + RemoveDockWidget(youtubeAppDock->objectName()); + youtubeAppDock = nullptr; + } +#endif #endif OnEvent(OBS_FRONTEND_EVENT_SCRIPTING_SHUTDOWN); @@ -1970,11 +1998,16 @@ api = nullptr; applicationShutdown(); + +#ifndef __APPLE__ deleteLater(); emit mainWindowClosed(); QMetaObject::invokeMethod(App(), "quit", Qt::QueuedConnection); +#else + QMetaObject::invokeMethod(App(), "quit", Qt::QueuedConnection); +#endif } void OBSBasic::UpdateEditMenu() @@ -2025,7 +2058,7 @@ ui->actionCopyTransform->setEnabled(canTransformSingle); ui->actionPasteTransform->setEnabled(canTransformMultiple && hasCopiedTransform && videoCount > 0); ui->actionCopyFilters->setEnabled(filter_count > 0); - ui->actionPasteFilters->setEnabled(!obs_weak_source_expired(copyFiltersSource) && totalCount > 0); + ui->actionPasteFilters->setEnabled(!obs_weak_source_expired(copyFiltersSource()) && totalCount > 0); ui->actionPasteRef->setEnabled(!!clipboard.size()); ui->actionPasteDup->setEnabled(allowPastingDuplicate);
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasic.hpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSBasic.hpp
Changed
@@ -21,9 +21,11 @@ #include "OBSMainWindow.hpp" #include <OBSApp.hpp> +#include <components/AccessibleAlignmentSelector.hpp> #include <oauth/Auth.hpp> #include <utility/BasicOutputHandler.hpp> #include <utility/OBSCanvas.hpp> +#include <utility/PreviewProgramSizeObserver.hpp> #include <utility/VCamConfig.hpp> #include <utility/platform.hpp> #include <utility/undo_stack.hpp> @@ -37,6 +39,7 @@ #include <util/threading.h> #include <util/util.hpp> +#include <QAccessible> #include <QSystemTrayIcon> #include <deque> @@ -53,7 +56,7 @@ class OBSLogViewer; class OBSMissingFiles; class OBSProjector; -class VolControl; +class VolumeControl; #ifdef YOUTUBE_ENABLED class YouTubeAppDock; #endif @@ -67,13 +70,6 @@ enum class LogFileType; } // namespace OBS -#define DESKTOP_AUDIO_1 Str("DesktopAudioDevice1") -#define DESKTOP_AUDIO_2 Str("DesktopAudioDevice2") -#define AUX_AUDIO_1 Str("AuxAudioDevice1") -#define AUX_AUDIO_2 Str("AuxAudioDevice2") -#define AUX_AUDIO_3 Str("AuxAudioDevice3") -#define AUX_AUDIO_4 Str("AuxAudioDevice4") - #define SIMPLE_ENCODER_X264 "x264" #define SIMPLE_ENCODER_X264_LOWCPU "x264_lowcpu" #define SIMPLE_ENCODER_QSV "qsv" @@ -112,6 +108,14 @@ obs_transform_info transform; obs_blending_method blend_method; obs_blending_type blend_mode; + obs_scale_type scale_type; + const char *show_transition_id; + const char *hide_transition_id; + OBSData show_transition_settings; + OBSData hide_transition_settings; + uint32_t show_transition_duration; + uint32_t hide_transition_duration; + OBSData private_settings; }; struct OBSProfile { @@ -152,28 +156,6 @@ item->setData(static_cast<int>(QtDataRole::OBSRef), QVariant::fromValue(val)); } -static inline bool SourceMixerHidden(obs_source_t *source) -{ - OBSDataAutoRelease priv_settings = obs_source_get_private_settings(source); - bool hidden = obs_data_get_bool(priv_settings, "mixer_hidden"); - - return hidden; -} - -static inline void SetSourceMixerHidden(obs_source_t *source, bool hidden) -{ - OBSDataAutoRelease priv_settings = obs_source_get_private_settings(source); - obs_data_set_bool(priv_settings, "mixer_hidden", hidden); -} - -static inline bool SourceVolumeLocked(obs_source_t *source) -{ - OBSDataAutoRelease priv_settings = obs_source_get_private_settings(source); - bool lock = obs_data_get_bool(priv_settings, "volume_locked"); - - return lock; -} - #ifdef _WIN32 static inline void UpdateProcessPriority() { @@ -305,6 +287,7 @@ void UpdatePatronJson(const QString &text, const QString &error); void UpdateEditMenu(); void applicationShutdown() noexcept; + void toggleMixerLayout(); public: /* `undo_s` needs to be declared after `ui` to prevent an uninitialized @@ -344,6 +327,12 @@ signals: void mainWindowClosed(); + void appSettingChanged(const std::string &category, const std::string &name); + void userSettingChanged(const std::string &category, const std::string &name); + void profileSettingChanged(const std::string &category, const std::string &name); + + void mixerStatusChanged(QString sourceUuid); + /* ------------------------------------- * MARK: - OAuth * ------------------------------------- @@ -384,7 +373,7 @@ */ private: std::deque<SourceCopyInfo> clipboard; - OBSWeakSourceAutoRelease copyFiltersSource; + OBSWeakSourceAutoRelease copyFiltersSource_; obs_transform_info copiedTransformInfo; obs_sceneitem_crop copiedCropInfo; bool hasCopiedTransform = false; @@ -398,8 +387,6 @@ void on_actionCopyFilters_triggered(); void on_actionPasteFilters_triggered(); - void AudioMixerCopyFilters(); - void AudioMixerPasteFilters(); void SourcePasteFilters(OBSSource source, OBSSource dstSource); void SceneCopyFilters(); @@ -408,7 +395,12 @@ void on_actionCopyTransform_triggered(); void on_actionPasteTransform_triggered(); +public slots: + void actionCopyFilters(); + void actionPasteFilters(); + public: + obs_weak_source_t *copyFiltersSource() { return copyFiltersSource_; } OBSWeakSource copyFilter; void CreateFilterPasteUndoRedoAction(const QString &text, obs_source_t *source, obs_data_array_t *undo_array, obs_data_array_t *redo_array); @@ -450,12 +442,14 @@ QList<QPointer<QDockWidget>> extraCustomDocks; QPointer<OBSDock> controlsDock; + QPointer<OBSDock> mixerDock; public: void AddDockWidget(QDockWidget *dock, Qt::DockWidgetArea area, bool extraBrowser = false); void RemoveDockWidget(const QString &name); bool IsDockObjectNameUsed(const QString &name); void AddCustomDockWidget(QDockWidget *dock); + void setDockCornersVertical(bool vertical); private slots: void on_resetDocks_triggered(bool force = false); @@ -470,7 +464,7 @@ */ private: void AddDropSource(const char *file, DropType image); - void AddDropURL(const char *url, QString &name, obs_data_t *settings, const obs_video_info &ovi); + void AddDropURL(QUrl url, QString &name, obs_data_t *settings, const obs_video_info &ovi); void ConfirmDropUrl(const QString &url); void dragEnterEvent(QDragEnterEvent *event) override; void dragLeaveEvent(QDragLeaveEvent *event) override; @@ -612,7 +606,6 @@ void on_actionRemux_triggered(); void on_action_Settings_triggered(); void on_actionShowMacPermissions_triggered(); - void on_actionAdvAudioProperties_triggered(); void on_actionShowLogs_triggered(); void on_actionUploadCurrentLog_triggered(); void on_actionUploadLastLog_triggered(); @@ -650,6 +643,9 @@ void updateCheckFinished(); +public slots: + void on_actionAdvAudioProperties_triggered(); + public: void ResetUI(); @@ -1161,9 +1157,6 @@ bool QueryRemoveSource(obs_source_t *source); int GetTopSelectedSourceItem(); - void GetAudioSourceFilters(); - void GetAudioSourceProperties(); - QModelIndexList GetAllSelectedSourceItems(); // TODO: Move back to transitions @@ -1173,10 +1166,6 @@ /* OBS Callbacks */ static void SourceCreated(void *data, calldata_t *params); static void SourceRemoved(void *data, calldata_t *params); - static void SourceActivated(void *data, calldata_t *params); - static void SourceDeactivated(void *data, calldata_t *params); - static void SourceAudioActivated(void *data, calldata_t *params); - static void SourceAudioDeactivated(void *data, calldata_t *params); static void SourceRenamed(void *data, calldata_t *params); void AddSource(const char *id); @@ -1186,9 +1175,6 @@ private slots: void RenameSources(OBSSource source, QString newName, QString prevName); - void ActivateAudioSource(OBSSource source); - void DeactivateAudioSource(OBSSource source); - void ReorderSources(OBSScene scene); void RefreshSources(OBSScene scene); @@ -1200,8 +1186,6 @@ void SetBlendingMethod(); void SetBlendingMode(); - void MixerRenameSource(); - void on_actionRotate90CW_triggered(); void on_actionRotate90CCW_triggered(); void on_actionRotate180_triggered(); @@ -1252,6 +1236,9 @@ obs_sceneitem_t *item); void CreateSourcePopupMenu(int idx, bool preview); + void actionOpenSourceFilters(); + void actionOpenSourceProperties(); + /* ------------------------------------- * MARK: - OBSBasic_Scenes * ------------------------------------- @@ -1430,6 +1417,7 @@ int programX = 0, programY = 0; int programCX = 0, programCY = 0; float programScale = 0.0f; + QPointer<PreviewProgramSizeObserver> sizeObserver; void CreateProgramDisplay(); void CreateProgramOptions(); @@ -1465,7 +1453,7 @@ * ------------------------------------- */ private: - QScopedPointer<QSystemTrayIcon> trayIcon; + QPointer<QSystemTrayIcon> trayIcon; QPointer<QAction> sysTrayStream; QPointer<QAction> sysTrayRecord; QPointer<QAction> sysTrayReplayBuffer; @@ -1573,6 +1561,7 @@ void RenameTransition(OBSSource transition); void TransitionClicked(); + void TransitionStarted(); void TransitionStopped(); void TransitionFullyStopped(); void TriggerQuickTransition(int id); @@ -1655,38 +1644,6 @@ void VirtualCamStopped(); /* ------------------------------------- - * MARK: - OBSBasic_VolControl - * ------------------------------------- - */ -private: - std::vector<VolControl *> volumes; - - void UpdateVolumeControlsDecayRate(); - void UpdateVolumeControlsPeakMeterType(); - void ClearVolumeControls(); - void VolControlContextMenu(); - void ToggleVolControlLayout(); - void ToggleMixerLayout(bool vertical); - -private slots: - void HideAudioControl(); - void UnhideAllAudioControls(); - void ToggleHideMixer(); - - void on_vMixerScrollArea_customContextMenuRequested(); - void on_hMixerScrollArea_customContextMenuRequested(); - - void LockVolumeControl(bool lock); - - void on_actionMixerToolbarAdvAudio_triggered(); - void on_actionMixerToolbarMenu_triggered(); - - void StackedMixerAreaContextMenuRequested(); - -public: - void RefreshVolumeColors(); - - /* ------------------------------------- * MARK: - OBSBasic_YouTube * ------------------------------------- */
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasicControls.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSBasicControls.cpp
Changed
@@ -57,7 +57,7 @@ forceStopStreamAction, &QAction::triggered, this, this() { emit this->ForceStopStreamMenuActionClicked(); }, Qt::DirectConnection); - /* Set up default visibilty */ + /* Set up default visibility */ ui->broadcastButton->setVisible(false); ui->pauseRecordButton->setVisible(false); ui->replayBufferButton->setVisible(false);
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasicStats.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSBasicStats.cpp
Changed
@@ -159,8 +159,8 @@ /* --------------------------------------------- */ if (closable) - connect(closeButton, &QPushButton::clicked, this() { close(); }); - connect(resetButton, &QPushButton::clicked, this() { Reset(); }); + connect(closeButton, &QPushButton::clicked, this, this() { close(); }); + connect(resetButton, &QPushButton::clicked, this, this() { Reset(); }); delete shortcutFilter; shortcutFilter = CreateShortcutFilter();
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasic_Clipboard.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSBasic_Clipboard.cpp
Changed
@@ -19,9 +19,9 @@ #include "OBSBasic.hpp" +#include <components/VolumeControl.hpp> #include <dialogs/OBSBasicFilters.hpp> #include <dialogs/OBSBasicSourceSelect.hpp> -#include <widgets/VolControl.hpp> extern void undo_redo(const std::string &data); @@ -83,6 +83,27 @@ copyInfo.blend_method = obs_sceneitem_get_blending_method(item); copyInfo.blend_mode = obs_sceneitem_get_blending_mode(item); copyInfo.visible = obs_sceneitem_visible(item); + copyInfo.scale_type = obs_sceneitem_get_scale_filter(item); + copyInfo.show_transition_id = obs_source_get_id(obs_sceneitem_get_transition(item, true)); + copyInfo.hide_transition_id = obs_source_get_id(obs_sceneitem_get_transition(item, false)); + + OBSDataAutoRelease newShowData = obs_data_create(); + OBSDataAutoRelease oldShowData = obs_source_get_settings(obs_sceneitem_get_transition(item, true)); + obs_data_apply(newShowData, oldShowData); + copyInfo.show_transition_settings = newShowData.Get(); + + OBSDataAutoRelease newHideData = obs_data_create(); + OBSDataAutoRelease oldHideData = obs_source_get_settings(obs_sceneitem_get_transition(item, false)); + obs_data_apply(newHideData, oldHideData); + copyInfo.hide_transition_settings = newHideData.Get(); + + copyInfo.show_transition_duration = obs_sceneitem_get_transition_duration(item, true); + copyInfo.hide_transition_duration = obs_sceneitem_get_transition_duration(item, false); + + OBSDataAutoRelease newPrivData = obs_data_create(); + OBSDataAutoRelease oldPrivData = obs_sceneitem_get_private_settings(item); + obs_data_apply(newPrivData, oldPrivData); + copyInfo.private_settings = newPrivData.Get(); clipboard.push_back(copyInfo); } @@ -114,6 +135,7 @@ } OBSBasicSourceSelect::SourcePaste(copyInfo, false); + RefreshSources(scene); } undo_s.pop_disabled(); @@ -135,6 +157,7 @@ for (size_t i = clipboard.size(); i > 0; i--) { SourceCopyInfo ©Info = clipboardi - 1; OBSBasicSourceSelect::SourcePaste(copyInfo, true); + RefreshSources(GetCurrentScene()); } undo_s.pop_disabled(); @@ -162,36 +185,42 @@ CreateFilterPasteUndoRedoAction(text, dstSource, undo_array, redo_array); } -void OBSBasic::AudioMixerCopyFilters() +void OBSBasic::actionCopyFilters() { QAction *action = reinterpret_cast<QAction *>(sender()); - VolControl *vol = action->property("volControl").value<VolControl *>(); - obs_source_t *source = vol->GetSource(); + obs_source_t *source = action->property("source").value<OBSSource>(); + + if (!source) { + return; + } - copyFiltersSource = obs_source_get_weak_source(source); + copyFiltersSource_ = obs_source_get_weak_source(source); ui->actionPasteFilters->setEnabled(true); } -void OBSBasic::AudioMixerPasteFilters() +void OBSBasic::actionPasteFilters() { QAction *action = reinterpret_cast<QAction *>(sender()); - VolControl *vol = action->property("volControl").value<VolControl *>(); - obs_source_t *dstSource = vol->GetSource(); + obs_source_t *dstSource = action->property("source").value<OBSSource>(); + + if (!dstSource) { + return; + } - OBSSourceAutoRelease source = obs_weak_source_get_source(copyFiltersSource); + OBSSourceAutoRelease source = obs_weak_source_get_source(copyFiltersSource()); SourcePasteFilters(source.Get(), dstSource); } void OBSBasic::SceneCopyFilters() { - copyFiltersSource = obs_source_get_weak_source(GetCurrentSceneSource()); + copyFiltersSource_ = obs_source_get_weak_source(GetCurrentSceneSource()); ui->actionPasteFilters->setEnabled(true); } void OBSBasic::ScenePasteFilters() { - OBSSourceAutoRelease source = obs_weak_source_get_source(copyFiltersSource); + OBSSourceAutoRelease source = obs_weak_source_get_source(copyFiltersSource()); OBSSource dstSource = GetCurrentSceneSource(); @@ -207,7 +236,7 @@ OBSSource source = obs_sceneitem_get_source(item); - copyFiltersSource = obs_source_get_weak_source(source); + copyFiltersSource_ = obs_source_get_weak_source(source); ui->actionPasteFilters->setEnabled(true); } @@ -240,7 +269,7 @@ void OBSBasic::on_actionPasteFilters_triggered() { - OBSSourceAutoRelease source = obs_weak_source_get_source(copyFiltersSource); + OBSSourceAutoRelease source = obs_weak_source_get_source(copyFiltersSource()); OBSSceneItem sceneItem = GetCurrentSceneItem(); OBSSource dstSource = obs_sceneitem_get_source(sceneItem);
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasic_ContextToolbar.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSBasic_ContextToolbar.cpp
Changed
@@ -43,7 +43,7 @@ continue; for (QByteArray &y : x->dynamicPropertyNames()) { - temp->setProperty(y, x->property(y)); + temp->setProperty(y.constData(), x->property(y.constData())); } } @@ -54,18 +54,7 @@ continue; for (QByteArray &y : x->dynamicPropertyNames()) { - temp->setProperty(y, x->property(y)); - } - } - - for (QAction *x : ui->mixerToolbar->actions()) { - QWidget *temp = ui->mixerToolbar->widgetForAction(x); - - if (!temp) - continue; - - for (QByteArray &y : x->dynamicPropertyNames()) { - temp->setProperty(y, x->property(y)); + temp->setProperty(y.constData(), x->property(y.constData())); } } }
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasic_Docks.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSBasic_Docks.cpp
Changed
@@ -37,10 +37,10 @@ // Replace the slot connected by default QObject::disconnect(action, &QAction::triggered, nullptr, 0); - dock->connect(action, &QAction::triggered, newToggleView); + QObject::connect(action, &QAction::triggered, dock, newToggleView); // Make the action unable to be disabled - action->connect(action, &QAction::enabledChanged, neverDisable); + QObject::connect(action, &QAction::enabledChanged, action, neverDisable); } void OBSBasic::on_resetDocks_triggered(bool force) @@ -74,21 +74,12 @@ #undef RESET_DOCKLIST restoreState(startingDockLayout); + ui->sideDocks->setChecked(true); int cx = width(); - int cy = height(); + int bottomDocksHeight = height(); - int cx22_5 = cx * 225 / 1000; - int cx5 = cx * 5 / 100; - int cx21 = cx * 21 / 100; - - cy = cy * 225 / 1000; - - int mixerSize = cx - (cx22_5 * 2 + cx5 + cx21); - - QList<QDockWidget *> docks{ui->scenesDock, ui->sourcesDock, ui->mixerDock, ui->transitionsDock, controlsDock}; - - QList<int> sizes{cx22_5, cx22_5, mixerSize, cx5, cx21}; + bottomDocksHeight = bottomDocksHeight * 225 / 1000; ui->scenesDock->setVisible(true); ui->sourcesDock->setVisible(true); @@ -98,8 +89,13 @@ statsDock->setVisible(false); statsDock->setFloating(true); - resizeDocks(docks, {cy, cy, cy, cy, cy}, Qt::Vertical); - resizeDocks(docks, sizes, Qt::Horizontal); + QList<QDockWidget *> bottomDocks{ui->mixerDock, ui->transitionsDock, controlsDock}; + + resizeDocks(bottomDocks, {bottomDocksHeight, bottomDocksHeight, bottomDocksHeight}, Qt::Vertical); + resizeDocks(bottomDocks, {cx * 45 / 100, cx * 14 / 100, cx * 16 / 100}, Qt::Horizontal); + + int sideDockWidth = std::min(width() * 30 / 100, 280); + resizeDocks({ui->scenesDock, ui->sourcesDock}, {sideDockWidth, sideDockWidth}, Qt::Horizontal); activateWindow(); } @@ -135,17 +131,9 @@ void OBSBasic::on_sideDocks_toggled(bool side) { - if (side) { - setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); - setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea); - setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); - setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea); - } else { - setCorner(Qt::TopLeftCorner, Qt::TopDockWidgetArea); - setCorner(Qt::TopRightCorner, Qt::TopDockWidgetArea); - setCorner(Qt::BottomLeftCorner, Qt::BottomDockWidgetArea); - setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea); - } + config_set_bool(App()->GetUserConfig(), "BasicWindow", "SideDocks", side); + + setDockCornersVertical(side); } void OBSBasic::AddDockWidget(QDockWidget *dock, Qt::DockWidgetArea area, bool extraBrowser) @@ -232,6 +220,21 @@ extraCustomDocks.push_back(dock); } +void OBSBasic::setDockCornersVertical(bool vertical) +{ + if (vertical) { + setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); + setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea); + setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); + setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea); + } else { + setCorner(Qt::TopLeftCorner, Qt::TopDockWidgetArea); + setCorner(Qt::TopRightCorner, Qt::TopDockWidgetArea); + setCorner(Qt::BottomLeftCorner, Qt::BottomDockWidgetArea); + setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea); + } +} + void OBSBasic::RepairCustomExtraDockName() { QDockWidget *dock = reinterpret_cast<QDockWidget *>(sender());
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasic_Dropfiles.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSBasic_Dropfiles.cpp
Changed
@@ -81,10 +81,9 @@ } #endif -void OBSBasic::AddDropURL(const char *url, QString &name, obs_data_t *settings, const obs_video_info &ovi) +void OBSBasic::AddDropURL(QUrl url, QString &name, obs_data_t *settings, const obs_video_info &ovi) { - QUrl path = QString::fromUtf8(url); - QUrlQuery query = QUrlQuery(path.query(QUrl::FullyEncoded)); + QUrlQuery query = QUrlQuery(url.query(QUrl::FullyEncoded)); int cx = (int)ovi.base_width; int cy = (int)ovi.base_height; @@ -109,15 +108,15 @@ obs_data_set_int(settings, "width", cx); obs_data_set_int(settings, "height", cy); - name = query.hasQueryItem("layer-name") ? query.queryItemValue("layer-name", QUrl::FullyDecoded) : path.host(); + name = query.hasQueryItem("layer-name") ? query.queryItemValue("layer-name", QUrl::FullyDecoded) : url.host(); query.removeQueryItem("layer-width"); query.removeQueryItem("layer-height"); query.removeQueryItem("layer-name"); query.removeQueryItem("layer-css"); - path.setQuery(query); + url.setQuery(query); - obs_data_set_string(settings, "url", QT_TO_UTF8(path.url())); + obs_data_set_string(settings, "url", QT_TO_UTF8(url.url())); } void OBSBasic::AddDropSource(const char *data, DropType image) @@ -170,7 +169,7 @@ type = "browser_source"; break; case DropType_Url: - AddDropURL(data, name, settings, ovi); + AddDropURL(QUrl(data), name, settings, ovi); type = "browser_source"; break; }
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasic_MainControls.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSBasic_MainControls.cpp
Changed
@@ -120,10 +120,11 @@ { bool studioPortraitLayout = config_get_bool(App()->GetUserConfig(), "BasicWindow", "StudioPortraitLayout"); - if (studioPortraitLayout) + if (studioPortraitLayout) { ui->previewLayout->setDirection(QBoxLayout::BottomToTop); - else + } else { ui->previewLayout->setDirection(QBoxLayout::LeftToRight); + } UpdatePreviewProgramIndicators(); } @@ -274,7 +275,8 @@ ui->menuLogFiles->setEnabled(false); stringstream ss; - ss << "OBS " << App()->GetVersionString(false) << " log file uploaded at " << CurrentDateTimeString() << "\n\n" + ss << "OBS " << App()->GetVersionString(false) << " log file uploaded at " << CurrentDateTimeString() + << ((uploadType == OBS::LogFileType::CurrentAppLog) ? " (Active Log)" : " (Complete Log)") << "\n\n" << fileString; if (logUploadThread) { @@ -488,7 +490,7 @@ if (transformWindow) transformWindow->close(); transformWindow = new OBSBasicTransform(item, this); - connect(ui->scenes, &QListWidget::currentItemChanged, transformWindow, &OBSBasicTransform::OnSceneChanged); + connect(ui->scenes, &QListWidget::currentItemChanged, transformWindow, &OBSBasicTransform::onSceneChanged); transformWindow->show(); transformWindow->setAttribute(Qt::WA_DeleteOnClose, true); } @@ -520,9 +522,9 @@ { ui->sourcesToolbar->setVisible(visible); ui->scenesToolbar->setVisible(visible); - ui->mixerToolbar->setVisible(visible); config_set_bool(App()->GetUserConfig(), "BasicWindow", "ShowListboxToolbars", visible); + emit userSettingChanged("BasicWindow", "ShowListboxToolbars"); } void OBSBasic::on_toggleStatusBar_toggled(bool visible) @@ -675,8 +677,6 @@ ui->scenes->customContextMenuRequested(globalPos); } else if (objName.compare("sourcesDock") == 0) { ui->sources->customContextMenuRequested(globalPos); - } else if (objName.compare("mixerDock") == 0) { - StackedMixerAreaContextMenuRequested(); } } else if (!className) { ui->menuDocks->exec(globalPos);
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasic_Preview.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSBasic_Preview.cpp
Changed
@@ -350,7 +350,7 @@ std::string undo_data(obs_data_get_json(wrapper)); nudge_timer = new QTimer; - QObject::connect(nudge_timer, &QTimer::timeout, this, &recent_nudge = recent_nudge, undo_data() { + QObject::connect(nudge_timer, &QTimer::timeout, this, this, &recent_nudge = recent_nudge, undo_data() { OBSDataAutoRelease rwrapper = obs_scene_save_transform_states(GetCurrentScene(), true); std::string redo_data(obs_data_get_json(rwrapper)); @@ -493,7 +493,7 @@ } }; - auto changedColor = =(const QColor &color) { + auto changedColor = this, selectedItems(const QColor &color) { if (color.isValid()) { ConfirmColor(ui->sources, color, selectedItems); } @@ -527,9 +527,9 @@ QColorDialog *colorDialog = new QColorDialog(this); colorDialog->setOptions(options); colorDialog->setCurrentColor(QColor(customColor)); - connect(colorDialog, &QColorDialog::currentColorChanged, liveChangeColor); - connect(colorDialog, &QColorDialog::colorSelected, changedColor); - connect(colorDialog, &QColorDialog::rejected, rejected); + connect(colorDialog, &QColorDialog::currentColorChanged, this, liveChangeColor); + connect(colorDialog, &QColorDialog::colorSelected, this, changedColor); + connect(colorDialog, &QColorDialog::rejected, this, rejected); colorDialog->open(); } else { for (int x = 0; x < selectedItems.count(); x++) {
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasic_Profiles.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSBasic_Profiles.cpp
Changed
@@ -706,7 +706,7 @@ RefreshProfiles(); UpdateTitleBar(); - UpdateVolumeControlsDecayRate(); + emit profileSettingChanged("Audio", "MeterDecayRate"); Auth::Load(); #ifdef YOUTUBE_ENABLED
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasic_Projectors.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSBasic_Projectors.cpp
Changed
@@ -105,7 +105,7 @@ for (int i = 0; i < screens.size(); i++) { QScreen *screen = screensi; QRect screenGeometry = screen->geometry(); - qreal ratio = screen->devicePixelRatio(); + qreal screenPixelRatio = screen->devicePixelRatio(); QString name = ""; #if defined(__APPLE__) || defined(_WIN32) name = screen->name(); @@ -120,9 +120,12 @@ if (name.length() == 0) { name = QString("%1 %2").arg(QTStr("Display")).arg(QString::number(i + 1)); } + + int screenPixelWidth = std::round((screenGeometry.width() * screenPixelRatio) * 0.5f) * 2; + int screenPixelHeight = std::round((screenGeometry.height() * screenPixelRatio) * 0.5f) * 2; + QString str = QString("%1: %2x%3 @ %4,%5") - .arg(name, QString::number(screenGeometry.width() * ratio), - QString::number(screenGeometry.height() * ratio), + .arg(name, QString::number(screenPixelWidth), QString::number(screenPixelHeight), QString::number(screenGeometry.x()), QString::number(screenGeometry.y())); projectorsFormatted.push_back(str); }
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasic_SceneCollections.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSBasic_SceneCollections.cpp
Changed
@@ -793,44 +793,50 @@ using namespace std; -static void SaveAudioDevice(const char *name, int channel, obs_data_t *parent, vector<OBSSource> &audioSources) -{ - OBSSourceAutoRelease source = obs_get_output_source(channel); - if (!source) - return; - - audioSources.push_back(source.Get()); - - OBSDataAutoRelease data = obs_save_source(source); - - obs_data_set_obj(parent, name, data); -} +namespace { +constexpr std::string_view DESKTOP_AUDIO_1{"DesktopAudioDevice1"}; +constexpr std::string_view DESKTOP_AUDIO_2{"DesktopAudioDevice2"}; +constexpr std::string_view AUX_AUDIO_1{"AuxAudioDevice1"}; +constexpr std::string_view AUX_AUDIO_2{"AuxAudioDevice2"}; +constexpr std::string_view AUX_AUDIO_3{"AuxAudioDevice3"}; +constexpr std::string_view AUX_AUDIO_4{"AuxAudioDevice4"}; +} // namespace -static obs_data_t *GenerateSaveData(obs_data_array_t *sceneOrder, obs_data_array_t *quickTransitionData, - int transitionDuration, obs_data_array_t *transitions, OBSScene &scene, - OBSSource &curProgramScene, obs_data_array_t *savedProjectorList, - obs_data_array_t *savedCanvases) +void OBSBasic::Save(SceneCollection &collection) { - obs_data_t *saveData = obs_data_create(); + OBSDataAutoRelease saveData = obs_data_create(); + // Scene collection name + const char *sceneCollection = config_get_string(App()->GetUserConfig(), "Basic", "SceneCollection"); + obs_data_set_string(saveData, "name", sceneCollection); + + // Global audio sources vector<OBSSource> audioSources; audioSources.reserve(6); - SaveAudioDevice(DESKTOP_AUDIO_1, 1, saveData, audioSources); - SaveAudioDevice(DESKTOP_AUDIO_2, 2, saveData, audioSources); - SaveAudioDevice(AUX_AUDIO_1, 3, saveData, audioSources); - SaveAudioDevice(AUX_AUDIO_2, 4, saveData, audioSources); - SaveAudioDevice(AUX_AUDIO_3, 5, saveData, audioSources); - SaveAudioDevice(AUX_AUDIO_4, 6, saveData, audioSources); + auto SaveAudioDevice = &(const std::string_view &key, int channel) { + if (OBSSourceAutoRelease source = obs_get_output_source(channel)) { + audioSources.emplace_back(source.Get()); + OBSDataAutoRelease data = obs_save_source(source); + obs_data_set_obj(saveData, key.data(), data); + } + }; - /* -------------------------------- */ - /* save non-group sources */ + SaveAudioDevice(DESKTOP_AUDIO_1, 1); + SaveAudioDevice(DESKTOP_AUDIO_2, 2); + SaveAudioDevice(AUX_AUDIO_1, 3); + SaveAudioDevice(AUX_AUDIO_2, 4); + SaveAudioDevice(AUX_AUDIO_3, 5); + SaveAudioDevice(AUX_AUDIO_4, 6); + // Non-global sources + + // Save all non-scene sources first auto FilterAudioSources = &(obs_source_t *source) { - if (obs_source_is_group(source)) + if (obs_source_is_group(source) || obs_source_is_scene(source)) return false; - return find(begin(audioSources), end(audioSources), source) == end(audioSources); + return std::find(begin(audioSources), end(audioSources), source) == end(audioSources); }; using FilterAudioSources_t = decltype(FilterAudioSources); @@ -841,60 +847,78 @@ }, static_cast<void *>(&FilterAudioSources)); - /* -------------------------------- */ - /* save group sources separately */ + // Saving groups separately ensures they won't be loaded in older versions. + // TODO: Get rid of this at some point. Groups were introduced in 22.0 + OBSDataArrayAutoRelease groupsArray = obs_data_array_create(); - /* saving separately ensures they won't be loaded in older versions */ - OBSDataArrayAutoRelease groupsArray = obs_save_sources_filtered( - (void *, obs_source_t *source) { return obs_source_is_group(source); }, nullptr); + auto sourcesAndGroups = std::make_pair(sourcesArray.Get(), groupsArray.Get()); + using sourcesAndGroups_t = decltype(sourcesAndGroups); - /* -------------------------------- */ + auto exportSceneItemsCallback = (void *param, obs_source_t *source) -> bool { + auto sourcesArrays = static_cast<sourcesAndGroups_t *>(param); + OBSDataAutoRelease source_data = obs_save_source(source); - OBSSourceAutoRelease transition = obs_get_output_source(0); - obs_source_t *currentScene = obs_scene_get_source(scene); - const char *sceneName = obs_source_get_name(currentScene); - const char *programName = obs_source_get_name(curProgramScene); + if (obs_source_is_scene(source)) { + obs_data_array_push_back(sourcesArrays->first, source_data); + } else { + obs_data_array_push_back(sourcesArrays->second, source_data); + } + return true; + }; - const char *sceneCollection = config_get_string(App()->GetUserConfig(), "Basic", "SceneCollection"); + obs_enum_scenes(exportSceneItemsCallback, &sourcesAndGroups); - obs_data_set_string(saveData, "current_scene", sceneName); - obs_data_set_string(saveData, "current_program_scene", programName); - obs_data_set_array(saveData, "scene_order", sceneOrder); - obs_data_set_string(saveData, "name", sceneCollection); - obs_data_set_array(saveData, "sources", sourcesArray.Get()); - obs_data_set_array(saveData, "groups", groupsArray.Get()); - obs_data_set_array(saveData, "quick_transitions", quickTransitionData); - obs_data_set_array(saveData, "transitions", transitions); - obs_data_set_array(saveData, "saved_projectors", savedProjectorList); - obs_data_set_array(saveData, "canvases", savedCanvases); + // Iterate over our additional canvases (if any), save their scenes and groups. + for (const auto &canvas : canvases) { + // Do not store sources from ephemeral canvases. + if (obs_canvas_get_flags(canvas) & EPHEMERAL) + continue; - obs_data_set_string(saveData, "current_transition", obs_source_get_name(transition)); - obs_data_set_int(saveData, "transition_duration", transitionDuration); + obs_canvas_enum_scenes(canvas, exportSceneItemsCallback, &sourcesAndGroups); + } - return saveData; -} + obs_data_set_array(saveData, "sources", sourcesArray); + obs_data_set_array(saveData, "groups", groupsArray); -void OBSBasic::Save(SceneCollection &collection) -{ + // UI scene order + OBSDataArrayAutoRelease sceneOrder = SaveSceneListOrder(); + obs_data_set_array(saveData, "scene_order", sceneOrder); + + // Current preview/program scenes OBSScene scene = GetCurrentScene(); OBSSource curProgramScene = OBSGetStrongRef(programScene); if (!curProgramScene) curProgramScene = obs_scene_get_source(scene); - OBSDataArrayAutoRelease sceneOrder = SaveSceneListOrder(); + obs_data_set_string(saveData, "current_scene", obs_source_get_name(obs_scene_get_source(scene))); + obs_data_set_string(saveData, "current_program_scene", obs_source_get_name(curProgramScene)); + + // Canvases + OBSDataArrayAutoRelease savedCanvases = OBS::Canvas::SaveCanvases(canvases); + obs_data_set_array(saveData, "canvases", savedCanvases); + + // Transitions + OBSSourceAutoRelease transition = obs_get_output_source(0); OBSDataArrayAutoRelease transitionsData = SaveTransitions(); - OBSDataArrayAutoRelease quickTrData = SaveQuickTransitions(); + OBSDataArrayAutoRelease quickTransitionData = SaveQuickTransitions(); + + obs_data_set_string(saveData, "current_transition", obs_source_get_name(transition)); + obs_data_set_int(saveData, "transition_duration", transitionDuration); + obs_data_set_array(saveData, "transitions", transitionsData); + obs_data_set_array(saveData, "quick_transitions", quickTransitionData); + + // Projectors OBSDataArrayAutoRelease savedProjectorList = SaveProjectors(); - OBSDataArrayAutoRelease savedCanvases = OBS::Canvas::SaveCanvases(canvases); - OBSDataAutoRelease saveData = GenerateSaveData(sceneOrder, quickTrData, transitionDuration, transitionsData, - scene, curProgramScene, savedProjectorList, savedCanvases); + obs_data_set_array(saveData, "saved_projectors", savedProjectorList); + // UI state obs_data_set_bool(saveData, "preview_locked", ui->preview->Locked()); obs_data_set_bool(saveData, "scaling_enabled", ui->preview->IsFixedScaling()); obs_data_set_int(saveData, "scaling_level", ui->preview->GetScalingLevel()); obs_data_set_double(saveData, "scaling_off_x", ui->preview->GetScrollX()); obs_data_set_double(saveData, "scaling_off_y", ui->preview->GetScrollY()); + // Virtual Cam if (vcamEnabled) { OBSDataAutoRelease obj = obs_data_create(); @@ -915,6 +939,7 @@ obs_data_set_obj(saveData, "virtual-camera", obj); } + // Module-specific data if (api) { if (!collectionModuleData) collectionModuleData = obs_data_create(); @@ -923,6 +948,7 @@ obs_data_set_obj(saveData, "modules", collectionModuleData); } + // Relative coordinates metadata if (lastOutputResolution) { OBSDataAutoRelease res = obs_data_create(); obs_data_set_int(res, "x", lastOutputResolution->first); @@ -930,9 +956,6 @@ obs_data_set_obj(saveData, "resolution", res); } - int sceneCollectionVersion = collection.getVersion(); - obs_data_set_int(saveData, "version", sceneCollectionVersion); - OBS::Rect migrationResolution = collection.getMigrationResolution(); SceneCoordinateMode coordinateMode = collection.getCoordinateMode(); @@ -949,6 +972,10 @@ obs_data_set_obj(saveData, DataKeys::MigrationResolution.data(), resolutionData); } + // Version + int sceneCollectionVersion = collection.getVersion(); + obs_data_set_int(saveData, "version", sceneCollectionVersion); + const std::string collectionFileName = collection.getFilePathString(); bool success = obs_data_save_json_pretty_safe(saveData, collectionFileName.c_str(), "tmp", "bak"); @@ -1202,12 +1229,12 @@ if (!name || !*name) name = curSceneCollection; - LoadAudioDevice(DESKTOP_AUDIO_1, 1, data); - LoadAudioDevice(DESKTOP_AUDIO_2, 2, data); - LoadAudioDevice(AUX_AUDIO_1, 3, data); - LoadAudioDevice(AUX_AUDIO_2, 4, data); - LoadAudioDevice(AUX_AUDIO_3, 5, data); - LoadAudioDevice(AUX_AUDIO_4, 6, data); + LoadAudioDevice(DESKTOP_AUDIO_1.data(), 1, data); + LoadAudioDevice(DESKTOP_AUDIO_2.data(), 2, data); + LoadAudioDevice(AUX_AUDIO_1.data(), 3, data); + LoadAudioDevice(AUX_AUDIO_2.data(), 4, data); + LoadAudioDevice(AUX_AUDIO_3.data(), 5, data); + LoadAudioDevice(AUX_AUDIO_4.data(), 6, data); if (collection_canvases) canvases = OBS::Canvas::LoadCanvases(collection_canvases); @@ -1494,7 +1521,6 @@ CloseDialogs(); - ClearVolumeControls(); ClearListItems(ui->scenes); ui->sources->Clear(); ClearQuickTransitions(); @@ -1524,7 +1550,7 @@ prevFTBSource = nullptr; clipboard.clear(); - copyFiltersSource = nullptr; + copyFiltersSource_ = nullptr; copyFilter = nullptr; auto cb = (void *, obs_source_t *source) {
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasic_SceneItems.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSBasic_SceneItems.cpp
Changed
@@ -20,8 +20,8 @@ #include "OBSBasic.hpp" #include "ColorSelect.hpp" #include "OBSProjector.hpp" -#include "VolControl.hpp" +#include <components/VolumeControl.hpp> #include <dialogs/NameDialog.hpp> #include <dialogs/OBSBasicAdvAudio.hpp> #include <dialogs/OBSBasicSourceSelect.hpp> @@ -35,6 +35,22 @@ using namespace std; +namespace { +bool isHiddenInMixer(obs_source_t *source) +{ + OBSDataAutoRelease priv_settings = obs_source_get_private_settings(source); + bool hidden = obs_data_get_bool(priv_settings, "mixer_hidden"); + + return hidden; +} + +void setHiddenInMixer(obs_source_t *source, bool hidden) +{ + OBSDataAutoRelease priv_settings = obs_source_get_private_settings(source); + obs_data_set_bool(priv_settings, "mixer_hidden", hidden); +} +} // namespace + static inline bool HasAudioDevices(const char *source_id) { const char *output_id = source_id; @@ -109,116 +125,6 @@ UpdatePreviewProgramIndicators(); } -void OBSBasic::GetAudioSourceFilters() -{ - QAction *action = reinterpret_cast<QAction *>(sender()); - VolControl *vol = action->property("volControl").value<VolControl *>(); - obs_source_t *source = vol->GetSource(); - - CreateFiltersWindow(source); -} - -void OBSBasic::GetAudioSourceProperties() -{ - QAction *action = reinterpret_cast<QAction *>(sender()); - VolControl *vol = action->property("volControl").value<VolControl *>(); - obs_source_t *source = vol->GetSource(); - - CreatePropertiesWindow(source); -} - -void OBSBasic::MixerRenameSource() -{ - QAction *action = reinterpret_cast<QAction *>(sender()); - VolControl *vol = action->property("volControl").value<VolControl *>(); - OBSSource source = vol->GetSource(); - - const char *prevName = obs_source_get_name(source); - - for (;;) { - string name; - bool accepted = NameDialog::AskForName(this, QTStr("Basic.Main.MixerRename.Title"), - QTStr("Basic.Main.MixerRename.Text"), name, QT_UTF8(prevName)); - if (!accepted) - return; - - if (name.empty()) { - OBSMessageBox::warning(this, QTStr("NoNameEntered.Title"), QTStr("NoNameEntered.Text")); - continue; - } - - OBSSourceAutoRelease sourceTest = obs_get_source_by_name(name.c_str()); - - if (sourceTest) { - OBSMessageBox::warning(this, QTStr("NameExists.Title"), QTStr("NameExists.Text")); - continue; - } - - obs_source_set_name(source, name.c_str()); - break; - } -} - -void OBSBasic::ActivateAudioSource(OBSSource source) -{ - if (SourceMixerHidden(source)) - return; - if (!obs_source_active(source)) - return; - if (!obs_source_audio_active(source)) - return; - - bool vertical = config_get_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolControl"); - VolControl *vol = new VolControl(source, true, vertical); - - vol->EnableSlider(!SourceVolumeLocked(source)); - - double meterDecayRate = config_get_double(activeConfiguration, "Audio", "MeterDecayRate"); - vol->SetMeterDecayRate(meterDecayRate); - - uint32_t peakMeterTypeIdx = config_get_uint(activeConfiguration, "Audio", "PeakMeterType"); - - enum obs_peak_meter_type peakMeterType; - switch (peakMeterTypeIdx) { - case 0: - peakMeterType = SAMPLE_PEAK_METER; - break; - case 1: - peakMeterType = TRUE_PEAK_METER; - break; - default: - peakMeterType = SAMPLE_PEAK_METER; - break; - } - - vol->setPeakMeterType(peakMeterType); - - vol->setContextMenuPolicy(Qt::CustomContextMenu); - - connect(vol, &QWidget::customContextMenuRequested, this, &OBSBasic::VolControlContextMenu); - connect(vol, &VolControl::ConfigClicked, this, &OBSBasic::VolControlContextMenu); - - InsertQObjectByName(volumes, vol); - - for (auto volume : volumes) { - if (vertical) - ui->vVolControlLayout->addWidget(volume); - else - ui->hVolControlLayout->addWidget(volume); - } -} - -void OBSBasic::DeactivateAudioSource(OBSSource source) -{ - for (size_t i = 0; i < volumes.size(); i++) { - if (volumesi->GetSource() == source) { - delete volumesi; - volumes.erase(volumes.begin() + i); - break; - } - } -} - bool OBSBasic::QueryRemoveSource(obs_source_t *source) { if (obs_source_get_type(source) == OBS_SOURCE_TYPE_SCENE && !obs_source_is_group(source)) { @@ -282,42 +188,6 @@ Q_ARG(OBSSource, OBSSource(source))); } -void OBSBasic::SourceActivated(void *data, calldata_t *params) -{ - obs_source_t *source = (obs_source_t *)calldata_ptr(params, "source"); - uint32_t flags = obs_source_get_output_flags(source); - - if (flags & OBS_SOURCE_AUDIO) - QMetaObject::invokeMethod(static_cast<OBSBasic *>(data), "ActivateAudioSource", - Q_ARG(OBSSource, OBSSource(source))); -} - -void OBSBasic::SourceDeactivated(void *data, calldata_t *params) -{ - obs_source_t *source = (obs_source_t *)calldata_ptr(params, "source"); - uint32_t flags = obs_source_get_output_flags(source); - - if (flags & OBS_SOURCE_AUDIO) - QMetaObject::invokeMethod(static_cast<OBSBasic *>(data), "DeactivateAudioSource", - Q_ARG(OBSSource, OBSSource(source))); -} - -void OBSBasic::SourceAudioActivated(void *data, calldata_t *params) -{ - obs_source_t *source = (obs_source_t *)calldata_ptr(params, "source"); - - if (obs_source_active(source)) - QMetaObject::invokeMethod(static_cast<OBSBasic *>(data), "ActivateAudioSource", - Q_ARG(OBSSource, OBSSource(source))); -} - -void OBSBasic::SourceAudioDeactivated(void *data, calldata_t *params) -{ - obs_source_t *source = (obs_source_t *)calldata_ptr(params, "source"); - QMetaObject::invokeMethod(static_cast<OBSBasic *>(data), "DeactivateAudioSource", - Q_ARG(OBSSource, OBSSource(source))); -} - void OBSBasic::SourceRenamed(void *data, calldata_t *params) { obs_source_t *source = (obs_source_t *)calldata_ptr(params, "source"); @@ -369,7 +239,25 @@ OBSSceneItem sceneItem = GetCurrentSceneItem(); obs_source_t *source = obs_sceneitem_get_source(sceneItem); + obs_deinterlace_mode oldMode = obs_source_get_deinterlace_mode(source); obs_source_set_deinterlace_mode(source, mode); + + auto undo_redo = (const std::string &uuid, obs_deinterlace_mode val) { + OBSSourceAutoRelease source = obs_get_source_by_uuid(uuid.c_str()); + if (source) + obs_source_set_deinterlace_mode(source, val); + }; + + const char *uuid = obs_source_get_uuid(source); + + if (uuid && *uuid) { + QString actionString = QTStr("Undo.DeinterlacingMode").arg(obs_source_get_name(source)); + + auto undoFunction = std::bind(undo_redo, std::placeholders::_1, oldMode); + auto redoFunction = std::bind(undo_redo, std::placeholders::_1, mode); + + undo_s.add_action(actionString, undoFunction, redoFunction, uuid, uuid); + } } void OBSBasic::SetDeinterlacingOrder() @@ -379,7 +267,25 @@ OBSSceneItem sceneItem = GetCurrentSceneItem(); obs_source_t *source = obs_sceneitem_get_source(sceneItem); + obs_deinterlace_field_order oldOrder = obs_source_get_deinterlace_field_order(source); obs_source_set_deinterlace_field_order(source, order); + + auto undo_redo = (const std::string &uuid, obs_deinterlace_field_order val) { + OBSSourceAutoRelease source = obs_get_source_by_uuid(uuid.c_str()); + if (source) + obs_source_set_deinterlace_field_order(source, val); + }; + + const char *uuid = obs_source_get_uuid(source); + + if (uuid && *uuid) { + QString actionString = QTStr("Undo.DeinterlacingOrder").arg(obs_source_get_name(source)); + + auto undoFunction = std::bind(undo_redo, std::placeholders::_1, oldOrder); + auto redoFunction = std::bind(undo_redo, std::placeholders::_1, order); + + undo_s.add_action(actionString, undoFunction, redoFunction, uuid, uuid); + } } QMenu *OBSBasic::AddDeinterlacingMenu(QMenu *menu, obs_source_t *source) @@ -426,7 +332,31 @@ obs_scale_type mode = (obs_scale_type)action->property("mode").toInt(); OBSSceneItem sceneItem = GetCurrentSceneItem(); + obs_scale_type oldMode = obs_sceneitem_get_scale_filter(sceneItem); obs_sceneitem_set_scale_filter(sceneItem, mode); + + auto undo_redo = (const std::string &uuid, int64_t id, obs_scale_type val) { + OBSSourceAutoRelease s = obs_get_source_by_uuid(uuid.c_str()); + obs_scene_t *sc = obs_group_or_scene_from_source(s); + obs_sceneitem_t *si = obs_scene_find_sceneitem_by_id(sc, id); + if (si) + obs_sceneitem_set_scale_filter(si, val); + }; + + OBSSource source = obs_sceneitem_get_source(sceneItem); + OBSSource sceneSource = obs_scene_get_source(obs_sceneitem_get_scene(sceneItem)); + int64_t id = obs_sceneitem_get_id(sceneItem); + const char *name = obs_source_get_name(sceneSource); + const char *uuid = obs_source_get_uuid(sceneSource); + + if (uuid && *uuid) { + QString actionString = QTStr("Undo.ScaleFiltering").arg(obs_source_get_name(source), name); + + auto undoFunction = std::bind(undo_redo, std::placeholders::_1, id, oldMode); + auto redoFunction = std::bind(undo_redo, std::placeholders::_1, id, mode); + + undo_s.add_action(actionString, undoFunction, redoFunction, uuid, uuid); + } } QMenu *OBSBasic::AddScaleFilteringMenu(QMenu *menu, obs_sceneitem_t *item) @@ -457,7 +387,31 @@ obs_blending_method method = (obs_blending_method)action->property("method").toInt(); OBSSceneItem sceneItem = GetCurrentSceneItem(); + obs_blending_method oldMethod = obs_sceneitem_get_blending_method(sceneItem); obs_sceneitem_set_blending_method(sceneItem, method); + + auto undo_redo = (const std::string &uuid, int64_t id, obs_blending_method val) { + OBSSourceAutoRelease s = obs_get_source_by_uuid(uuid.c_str()); + obs_scene_t *sc = obs_group_or_scene_from_source(s); + obs_sceneitem_t *si = obs_scene_find_sceneitem_by_id(sc, id); + if (si) + obs_sceneitem_set_blending_method(si, val); + }; + + OBSSource source = obs_sceneitem_get_source(sceneItem); + OBSSource sceneSource = obs_scene_get_source(obs_sceneitem_get_scene(sceneItem)); + int64_t id = obs_sceneitem_get_id(sceneItem); + const char *name = obs_source_get_name(sceneSource); + const char *uuid = obs_source_get_uuid(sceneSource); + + if (uuid && *uuid) { + QString actionString = QTStr("Undo.BlendingMethod").arg(obs_source_get_name(source), name); + + auto undoFunction = std::bind(undo_redo, std::placeholders::_1, id, oldMethod); + auto redoFunction = std::bind(undo_redo, std::placeholders::_1, id, method); + + undo_s.add_action(actionString, undoFunction, redoFunction, uuid, uuid); + } } QMenu *OBSBasic::AddBlendingMethodMenu(QMenu *menu, obs_sceneitem_t *item) @@ -484,7 +438,31 @@ obs_blending_type mode = (obs_blending_type)action->property("mode").toInt(); OBSSceneItem sceneItem = GetCurrentSceneItem(); + obs_blending_type oldMode = obs_sceneitem_get_blending_mode(sceneItem); obs_sceneitem_set_blending_mode(sceneItem, mode); + + auto undo_redo = (const std::string &uuid, int64_t id, obs_blending_type val) { + OBSSourceAutoRelease s = obs_get_source_by_uuid(uuid.c_str()); + obs_scene_t *sc = obs_group_or_scene_from_source(s); + obs_sceneitem_t *si = obs_scene_find_sceneitem_by_id(sc, id); + if (si) + obs_sceneitem_set_blending_mode(si, val); + }; + + OBSSource source = obs_sceneitem_get_source(sceneItem); + OBSSource sceneSource = obs_scene_get_source(obs_sceneitem_get_scene(sceneItem)); + int64_t id = obs_sceneitem_get_id(sceneItem); + const char *name = obs_source_get_name(sceneSource); + const char *uuid = obs_source_get_uuid(sceneSource); + + if (uuid && *uuid) { + QString actionString = QTStr("Undo.BlendingMode").arg(obs_source_get_name(source), name); + + auto undoFunction = std::bind(undo_redo, std::placeholders::_1, id, oldMode); + auto redoFunction = std::bind(undo_redo, std::placeholders::_1, id, mode); + + undo_s.add_action(actionString, undoFunction, redoFunction, uuid, uuid); + } } QMenu *OBSBasic::AddBlendingModeMenu(QMenu *menu, obs_sceneitem_t *item) @@ -552,7 +530,7 @@ colorButton->setStyleSheet("border: 2px solid black"); colorButton->setProperty("bgColor", i); - select->connect(colorButton, &QPushButton::released, this, &OBSBasic::ColorChange); + connect(colorButton, &QPushButton::released, this, &OBSBasic::ColorChange); } menu->addAction(widgetAction); @@ -654,10 +632,17 @@ popup.addMenu(AddBackgroundColorMenu(colorMenu, colorWidgetAction, colorSelect, sceneItem)); if (hasAudio) { + bool isHidden = isHiddenInMixer(source); + QAction *actionHideMixer = - popup.addAction(QTStr("HideMixer"), this, &OBSBasic::ToggleHideMixer); + popup.addAction(QTStr("HideMixer"), this, source, isHidden() { + setHiddenInMixer(source, !isHidden); + + OBSBasic *main = OBSBasic::Get(); + emit main->mixerStatusChanged(obs_source_get_uuid(source)); + }); actionHideMixer->setCheckable(true); - actionHideMixer->setChecked(SourceMixerHidden(source)); + actionHideMixer->setChecked(isHidden); } popup.addSeparator(); } @@ -743,6 +728,30 @@ popup.exec(QCursor::pos()); } +void OBSBasic::actionOpenSourceFilters() +{ + QAction *action = reinterpret_cast<QAction *>(sender()); + if (!action->property("source").isValid()) { + return; + } + + obs_source_t *source = action->property("source").value<OBSSource>(); + + CreateFiltersWindow(source); +} + +void OBSBasic::actionOpenSourceProperties() +{ + QAction *action = reinterpret_cast<QAction *>(sender()); + if (!action->property("source").isValid()) { + return; + } + + obs_source_t *source = action->property("source").value<OBSSource>(); + + CreatePropertiesWindow(source); +} + void OBSBasic::on_sources_customContextMenuRequested(const QPoint &pos) { if (ui->scenes->count()) { @@ -803,7 +812,7 @@ auto addSource = this, getActionAfter(QMenu *popup, const char *type, const char *name) { QString qname = QT_UTF8(name); QAction *popupItem = new QAction(qname, this); - connect(popupItem, &QAction::triggered, this, type() { AddSource(type); }); + connect(popupItem, &QAction::triggered, this, this, type() { AddSource(type); }); QIcon icon; @@ -839,7 +848,7 @@ popup->addSeparator(); QAction *addGroup = new QAction(QTStr("Group"), this); addGroup->setIcon(GetGroupIcon()); - connect(addGroup, &QAction::triggered, this() { AddSource("group"); }); + connect(addGroup, &QAction::triggered, this, this() { AddSource("group"); }); popup->addAction(addGroup); if (!foundDeprecated) {
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasic_Scenes.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSBasic_Scenes.cpp
Changed
@@ -168,6 +168,7 @@ { obs_scene_t *scene = obs_scene_from_source(source); + bool foundItem = false; QListWidgetItem *sel = nullptr; int count = ui->scenes->count(); @@ -177,6 +178,7 @@ if (cur_scene != scene) continue; + foundItem = true; sel = item; break; } @@ -195,7 +197,9 @@ OBSProjector::UpdateMultiviewProjectors(); } - OnEvent(OBS_FRONTEND_EVENT_SCENE_LIST_CHANGED); + if (foundItem) { + OnEvent(OBS_FRONTEND_EVENT_SCENE_LIST_CHANGED); + } } static bool select_one(obs_scene_t * /* scene */, obs_sceneitem_t *item, void *param) @@ -541,7 +545,7 @@ copyFilters->setEnabled(false); connect(copyFilters, &QAction::triggered, this, &OBSBasic::SceneCopyFilters); QAction *pasteFilters = new QAction(QTStr("Paste.Filters"), this); - pasteFilters->setEnabled(!obs_weak_source_expired(copyFiltersSource)); + pasteFilters->setEnabled(!obs_weak_source_expired(copyFiltersSource())); connect(pasteFilters, &QAction::triggered, this, &OBSBasic::ScenePasteFilters); popup.addSeparator(); @@ -601,7 +605,7 @@ OBSProjector::UpdateMultiviewProjectors(); }; - connect(multiviewAction, &QAction::triggered, std::bind(showInMultiview, data.Get())); + connect(multiviewAction, &QAction::triggered, multiviewAction, std::bind(showInMultiview, data.Get())); copyFilters->setEnabled(obs_source_filter_count(source) > 0); }
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasic_StudioMode.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSBasic_StudioMode.cpp
Changed
@@ -42,7 +42,7 @@ ResizeProgram(ovi.base_width, ovi.base_height); }; - connect(program.data(), &OBSQTDisplay::DisplayResized, displayResize); + connect(program.data(), &OBSQTDisplay::DisplayResized, this, displayResize); auto addDisplay = this(OBSQTDisplay *window) { obs_display_add_draw_callback(window->GetDisplay(), OBSBasic::RenderProgram, this); @@ -52,7 +52,7 @@ ResizeProgram(ovi.base_width, ovi.base_height); }; - connect(program.data(), &OBSQTDisplay::DisplayCreated, addDisplay); + connect(program.data(), &OBSQTDisplay::DisplayCreated, this, addDisplay); program->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); } @@ -146,30 +146,30 @@ action->setToolTip(QTStr("QuickTransitions.DuplicateSceneTT")); action->setCheckable(true); action->setChecked(sceneDuplicationMode); - connect(action, &QAction::triggered, toggleSceneDuplication); - connect(action, &QAction::hovered, showToolTip); + connect(action, &QAction::triggered, this, toggleSceneDuplication); + connect(action, &QAction::hovered, action, showToolTip); action = menu.addAction(QTStr("QuickTransitions.EditProperties")); action->setToolTip(QTStr("QuickTransitions.EditPropertiesTT")); action->setCheckable(true); action->setChecked(editPropertiesMode); action->setEnabled(sceneDuplicationMode); - connect(action, &QAction::triggered, toggleEditProperties); - connect(action, &QAction::hovered, showToolTip); + connect(action, &QAction::triggered, this, toggleEditProperties); + connect(action, &QAction::hovered, action, showToolTip); action = menu.addAction(QTStr("QuickTransitions.SwapScenes")); action->setToolTip(QTStr("QuickTransitions.SwapScenesTT")); action->setCheckable(true); action->setChecked(swapScenesMode); - connect(action, &QAction::triggered, toggleSwapScenesMode); - connect(action, &QAction::hovered, showToolTip); + connect(action, &QAction::triggered, this, toggleSwapScenesMode); + connect(action, &QAction::hovered, action, showToolTip); menu.exec(QCursor::pos()); }; connect(transitionButton.data(), &QAbstractButton::clicked, this, &OBSBasic::TransitionClicked); - connect(addQuickTransition, &QAbstractButton::clicked, onAdd); - connect(configTransitions, &QAbstractButton::clicked, onConfig); + connect(addQuickTransition, &QAbstractButton::clicked, this, onAdd); + connect(configTransitions, &QAbstractButton::clicked, this, onConfig); } void OBSBasic::TogglePreviewProgramMode() @@ -179,15 +179,17 @@ void OBSBasic::SetPreviewProgramMode(bool enabled) { - if (IsPreviewProgramMode() == enabled) + if (IsPreviewProgramMode() == enabled) { return; + } os_atomic_set_bool(&previewProgramMode, enabled); emit PreviewProgramModeChanged(enabled); if (IsPreviewProgramMode()) { - if (!previewEnabled) + if (!previewEnabled) { EnablePreviewDisplay(true); + } CreateProgramDisplay(); CreateProgramOptions(); @@ -217,12 +219,11 @@ RefreshQuickTransitions(); programLabel = new QLabel(QTStr("StudioMode.ProgramSceneLabel"), this); - programLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Preferred); + programLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); programLabel->setProperty("class", "label-preview-title"); programWidget = new QWidget(); programLayout = new QVBoxLayout(); - programLayout->setContentsMargins(0, 0, 0, 0); programLayout->setSpacing(0); @@ -235,6 +236,8 @@ ui->previewLayout->addWidget(programWidget); ui->previewLayout->setAlignment(programOptions, Qt::AlignCenter); + sizeObserver = new PreviewProgramSizeObserver(ui->preview, program, this); + OnEvent(OBS_FRONTEND_EVENT_STUDIO_MODE_ENABLED); blog(LOG_INFO, "Switched to Preview/Program mode"); @@ -242,16 +245,18 @@ "-------------------"); } else { OBSSource actualProgramScene = OBSGetStrongRef(programScene); - if (!actualProgramScene) + if (!actualProgramScene) { actualProgramScene = GetCurrentSceneSource(); - else + } else { SetCurrentScene(actualProgramScene, true); + } TransitionToScene(actualProgramScene, true); delete programOptions; delete program; delete programLabel; delete programWidget; + sizeObserver->deleteLater(); if (lastScene) { OBSSource actualLastScene = OBSGetStrongRef(lastScene); @@ -264,11 +269,13 @@ swapScene = nullptr; prevFTBSource = nullptr; - for (QuickTransition &qt : quickTransitions) + for (QuickTransition &qt : quickTransitions) { qt.button = nullptr; + } - if (!previewEnabled) + if (!previewEnabled) { EnablePreviewDisplay(false); + } ui->transitions->setEnabled(true); tBarActive = false;
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasic_SysTray.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSBasic_SysTray.cpp
Changed
@@ -29,28 +29,26 @@ #else QIcon trayIconFile = QIcon(":/res/images/obs.png"); #endif - trayIcon.reset(new QSystemTrayIcon(QIcon::fromTheme("obs-tray", trayIconFile), this)); + trayIcon = new QSystemTrayIcon(QIcon::fromTheme("obs-tray", trayIconFile), this); trayIcon->setToolTip("OBS Studio"); - showHide = new QAction(QTStr("Basic.SystemTray.Show"), trayIcon.data()); - sysTrayStream = - new QAction(StreamingActive() ? QTStr("Basic.Main.StopStreaming") : QTStr("Basic.Main.StartStreaming"), - trayIcon.data()); - sysTrayRecord = - new QAction(RecordingActive() ? QTStr("Basic.Main.StopRecording") : QTStr("Basic.Main.StartRecording"), - trayIcon.data()); + trayMenu = new QMenu(this); + + showHide = new QAction(QTStr("Basic.SystemTray.Show"), trayMenu); + sysTrayStream = new QAction( + StreamingActive() ? QTStr("Basic.Main.StopStreaming") : QTStr("Basic.Main.StartStreaming"), trayMenu); + sysTrayRecord = new QAction( + RecordingActive() ? QTStr("Basic.Main.StopRecording") : QTStr("Basic.Main.StartRecording"), trayMenu); sysTrayReplayBuffer = new QAction(ReplayBufferActive() ? QTStr("Basic.Main.StopReplayBuffer") : QTStr("Basic.Main.StartReplayBuffer"), - trayIcon.data()); + trayMenu); sysTrayVirtualCam = new QAction(VirtualCamActive() ? QTStr("Basic.Main.StopVirtualCam") : QTStr("Basic.Main.StartVirtualCam"), - trayIcon.data()); - exit = new QAction(QTStr("Exit"), trayIcon.data()); - - trayMenu = new QMenu; + trayMenu); + exit = new QAction(QTStr("Exit"), trayMenu); - previewProjector = new QMenu(QTStr("Projector.Open.Preview")); - studioProgramProjector = new QMenu(QTStr("Projector.Open.Program")); + previewProjector = new QMenu(QTStr("Projector.Open.Preview"), trayMenu); + studioProgramProjector = new QMenu(QTStr("Projector.Open.Program"), trayMenu); OBSBasic::updateSysTrayProjectorMenu(); trayMenu->addAction(showHide);
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSBasic_Transitions.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSBasic_Transitions.cpp
Changed
@@ -127,6 +127,11 @@ void OBSBasic::InitTransition(obs_source_t *transition) { + auto onTransitionStart = (void *data, calldata_t *) { + OBSBasic *window = (OBSBasic *)data; + QMetaObject::invokeMethod(window, "TransitionStarted", Qt::QueuedConnection); + }; + auto onTransitionStop = (void *data, calldata_t *) { OBSBasic *window = (OBSBasic *)data; QMetaObject::invokeMethod(window, "TransitionStopped", Qt::QueuedConnection); @@ -138,6 +143,7 @@ }; signal_handler_t *handler = obs_source_get_signal_handler(transition); + signal_handler_connect(handler, "transition_start", onTransitionStart, this); signal_handler_connect(handler, "transition_video_stop", onTransitionStop, this); signal_handler_connect(handler, "transition_stop", onTransitionFullStop, this); } @@ -228,6 +234,11 @@ TransitionToScene(source, force); } +void OBSBasic::TransitionStarted() +{ + EnableTransitionWidgets(false); +} + void OBSBasic::TransitionStopped() { if (swapScenesMode) { @@ -258,6 +269,8 @@ void OBSBasic::TransitionFullyStopped() { + EnableTransitionWidgets(true); + if (overridingTransition) { OverrideTransition(GetCurrentTransition()); overridingTransition = false; @@ -360,8 +373,6 @@ enum obs_transition_mode mode = manual ? OBS_TRANSITION_MODE_MANUAL : OBS_TRANSITION_MODE_AUTO; - EnableTransitionWidgets(false); - bool success = obs_transition_start(transition, mode, duration, source); if (!success) @@ -387,6 +398,10 @@ { OBSSourceAutoRelease oldTransition = obs_get_output_source(0); + if (oldTransition && obs_transition_is_active(oldTransition)) { + return; + } + if (oldTransition && transition) { std::string uuid = obs_source_get_uuid(transition); obs_transition_swap_begin(transition, oldTransition); @@ -421,7 +436,7 @@ void OBSBasic::AddTransition(const char *id) { - string name; + std::string name; QString placeHolderText = QT_UTF8(obs_source_get_display_name(id)); QString format = placeHolderText + " (%1)"; obs_source_t *source = nullptr; @@ -485,7 +500,7 @@ const char *name = obs_source_get_display_name(id); QAction *action = new QAction(name, this); - connect(action, &QAction::triggered, this, id() { AddTransition(id); }); + connect(action, &QAction::triggered, this, this, id() { AddTransition(id); }); menu.addAction(action); foundConfigurableTransitions = true; @@ -547,14 +562,20 @@ bool accepted = NameDialog::AskForName(this, QTStr("TransitionNameDlg.Title"), QTStr("TransitionNameDlg.Text"), name, placeHolderText); - if (!accepted) + if (!accepted) { return; + } + if (name.empty()) { OBSMessageBox::warning(this, QTStr("NoNameEntered.Title"), QTStr("NoNameEntered.Text")); RenameTransition(transition); return; } + if (name == oldName) { + return; + } + source = FindTransition(name.c_str()); if (source) { OBSMessageBox::warning(this, QTStr("NameExists.Title"), QTStr("NameExists.Text")); @@ -593,11 +614,11 @@ QMenu menu(this); QAction *action = new QAction(QTStr("Rename"), &menu); - connect(action, &QAction::triggered, this, source() { RenameTransition(source); }); + connect(action, &QAction::triggered, this, this, source() { RenameTransition(source); }); menu.addAction(action); action = new QAction(QTStr("Properties"), &menu); - connect(action, &QAction::triggered, properties); + connect(action, &QAction::triggered, this, properties); menu.addAction(action); menu.exec(QCursor::pos()); @@ -757,7 +778,8 @@ tBarActive = true; } - obs_transition_set_manual_time(transition, (float)value / T_BAR_PRECISION_F); + float clampedValue = std::clamp<float>((float)value / T_BAR_PRECISION_F, 0.01f, 0.99f); + obs_transition_set_manual_time(transition, clampedValue); OnEvent(OBS_FRONTEND_EVENT_TBAR_VALUE_CHANGED); } @@ -821,7 +843,7 @@ obs_data_set_int(data, "transition_duration", duration); }; - connect(duration, (void(QSpinBox::*)(int)) & QSpinBox::valueChanged, setDuration); + connect(duration, &QSpinBox::valueChanged, this, setDuration); auto addAction = &(const std::string &uuid = "") { const char *name = ""; @@ -845,7 +867,7 @@ action->setCheckable(true); action->setChecked(match); - connect(action, &QAction::triggered, std::bind(setTransition, action)); + connect(action, &QAction::triggered, this, std::bind(setTransition, action)); }; addAction(); @@ -987,13 +1009,13 @@ OBSSceneItem item = main->GetCurrentSceneItem(); obs_sceneitem_set_transition_duration(item, visible, duration); }; - connect(duration, (void(QSpinBox::*)(int)) & QSpinBox::valueChanged, setDuration); + connect(duration, &QSpinBox::valueChanged, duration, setDuration); action = menu->addAction(QT_UTF8(Str("None"))); action->setProperty("transition_id", QT_UTF8("")); action->setCheckable(true); action->setChecked(!curId); - connect(action, &QAction::triggered, std::bind(setTransition, action, visible)); + connect(action, &QAction::triggered, this, std::bind(setTransition, action, visible)); size_t idx = 0; const char *id; while (obs_enum_transition_types(idx++, &id)) { @@ -1003,7 +1025,7 @@ action->setProperty("transition_id", QT_UTF8(id)); action->setCheckable(true); action->setChecked(match); - connect(action, &QAction::triggered, std::bind(setTransition, action, visible)); + connect(action, &QAction::triggered, this, std::bind(setTransition, action, visible)); } QWidgetAction *durationAction = new QWidgetAction(menu); @@ -1028,7 +1050,7 @@ menu->addSeparator(); action = menu->addAction(QT_UTF8(Str("Copy"))); action->setEnabled(curId != nullptr); - connect(action, &QAction::triggered, std::bind(copyTransition, action, visible)); + connect(action, &QAction::triggered, this, std::bind(copyTransition, action, visible)); auto pasteTransition = this(QAction *, bool show) { OBSBasic *main = OBSBasic::Get(); @@ -1048,7 +1070,7 @@ action = menu->addAction(QT_UTF8(Str("Paste"))); action->setEnabled(!!OBSGetStrongRef(copySourceTransition)); - connect(action, &QAction::triggered, std::bind(pasteTransition, action, visible)); + connect(action, &QAction::triggered, this, std::bind(pasteTransition, action, visible)); return menu; }
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSProjector.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSProjector.cpp
Changed
@@ -74,7 +74,7 @@ obs_display_set_background_color(GetDisplay(), 0x000000); }; - connect(this, &OBSQTDisplay::DisplayCreated, addDrawCallback); + connect(this, &OBSQTDisplay::DisplayCreated, this, addDrawCallback); connect(App(), &QGuiApplication::screenRemoved, this, &OBSProjector::ScreenRemoved); if (type == ProjectorType::Multiview) {
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSQTDisplay.cpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSQTDisplay.cpp
Changed
@@ -102,8 +102,8 @@ obs_display_resize(display, size.width(), size.height()); }; - connect(windowHandle(), &QWindow::visibleChanged, windowVisible); - connect(windowHandle(), &QWindow::screenChanged, screenChanged); + connect(windowHandle(), &QWindow::visibleChanged, this, windowVisible); + connect(windowHandle(), &QWindow::screenChanged, this, screenChanged); windowHandle()->installEventFilter(new SurfaceEventFilter(this)); }
View file
obs-studio-32.0.4.tar.xz/frontend/widgets/OBSQTDisplay.hpp -> obs-studio-32.1.0.tar.xz/frontend/widgets/OBSQTDisplay.hpp
Changed
@@ -14,6 +14,7 @@ OBSDisplay display; bool destroying = false; +protected: virtual void paintEvent(QPaintEvent *event) override; virtual void moveEvent(QMoveEvent *event) override; virtual void resizeEvent(QResizeEvent *event) override;
View file
obs-studio-32.0.4.tar.xz/frontend/wizards/AutoConfigStreamPage.cpp -> obs-studio-32.1.0.tar.xz/frontend/wizards/AutoConfigStreamPage.cpp
Changed
@@ -67,7 +67,7 @@ connect(ui->service, &QComboBox::currentIndexChanged, this, &AutoConfigStreamPage::UpdateKeyLink); connect(ui->service, &QComboBox::currentIndexChanged, this, &AutoConfigStreamPage::UpdateMoreInfoLink); - connect(ui->useStreamKeyAdv, &QPushButton::clicked, &() { + connect(ui->useStreamKeyAdv, &QPushButton::clicked, this, &() { ui->streamKeyWidget->setVisible(true); ui->streamKeyLabel->setVisible(true); ui->useStreamKeyAdv->setVisible(false);
View file
obs-studio-32.0.4.tar.xz/libobs-d3d11/d3d11-shader.cpp -> obs-studio-32.1.0.tar.xz/libobs-d3d11/d3d11-shader.cpp
Changed
@@ -28,7 +28,7 @@ #include <fstream> #include <d3dcompiler.h> -void gs_vertex_shader::GetBuffersExpected(const vector<D3D11_INPUT_ELEMENT_DESC> &inputs) +void gs_vertex_shader::GetBuffersExpected(const std::vector<D3D11_INPUT_ELEMENT_DESC> &inputs) { for (size_t i = 0; i < inputs.size(); i++) { const D3D11_INPUT_ELEMENT_DESC &input = inputsi; @@ -52,7 +52,7 @@ { ShaderProcessor processor(device); ComPtr<ID3D10Blob> shaderBlob; - string outputString; + std::string outputString; HRESULT hr; processor.Process(shaderString, file); @@ -88,7 +88,7 @@ { ShaderProcessor processor(device); ComPtr<ID3D10Blob> shaderBlob; - string outputString; + std::string outputString; HRESULT hr; processor.Process(shaderString, file); @@ -226,26 +226,26 @@ snprintf(hashstr, sizeof(hashstr), "%02llx", hash); BPtr program_data = os_get_program_data_path_ptr("obs-studio/shader-cache"); - auto cachePath = filesystem::u8path(program_data.Get()) / hashstr; + auto cachePath = std::filesystem::u8path(program_data.Get()) / hashstr; // Increment if on-disk format changes cachePath += ".v2"; std::fstream cacheFile; - cacheFile.exceptions(fstream::badbit | fstream::eofbit); + cacheFile.exceptions(std::fstream::badbit | std::fstream::eofbit); - if (filesystem::exists(cachePath) && !filesystem::is_empty(cachePath)) - cacheFile.open(cachePath, ios::in | ios::binary | ios::ate); + if (std::filesystem::exists(cachePath) && !std::filesystem::is_empty(cachePath)) + cacheFile.open(cachePath, std::ios::in | std::ios::binary | std::ios::ate); if (cacheFile.is_open()) { uint64_t checksum; try { - streampos len = cacheFile.tellg(); + std::streampos len = cacheFile.tellg(); // Not enough data for checksum + shader if (len <= sizeof(checksum)) - throw length_error("File truncated"); + throw std::length_error("File truncated"); - cacheFile.seekg(0, ios::beg); + cacheFile.seekg(0, std::ios::beg); len -= sizeof(checksum); D3DCreateBlob(len, shader); @@ -254,14 +254,14 @@ cacheFile.read((char *)&checksum, sizeof(checksum)); if (calculated_checksum != checksum) - throw exception("Checksum mismatch"); + throw std::exception("Checksum mismatch"); is_cached = true; - } catch (const exception &e) { + } catch (const std::exception &e) { // Something went wrong reading the cache file, delete it blog(LOG_WARNING, "Loading shader cache file failed with \"%s\": %s", e.what(), file); cacheFile.close(); - filesystem::remove(cachePath); + std::filesystem::remove(cachePath); } } @@ -275,7 +275,7 @@ throw HRError("Failed to compile shader", hr); } - cacheFile.open(cachePath, ios::out | ios::binary); + cacheFile.open(cachePath, std::ios::out | std::ios::binary); if (cacheFile.is_open()) { try { uint64_t calculated_checksum = @@ -283,10 +283,10 @@ cacheFile.write((char *)(*shader)->GetBufferPointer(), (*shader)->GetBufferSize()); cacheFile.write((char *)&calculated_checksum, sizeof(calculated_checksum)); - } catch (const exception &e) { + } catch (const std::exception &e) { blog(LOG_WARNING, "Writing shader cache file failed with \"%s\": %s", e.what(), file); cacheFile.close(); - filesystem::remove(cachePath); + std::filesystem::remove(cachePath); } } } @@ -303,7 +303,7 @@ #endif } -inline void gs_shader::UpdateParam(vector<uint8_t> &constData, gs_shader_param ¶m, bool &upload) +inline void gs_shader::UpdateParam(std::vector<uint8_t> &constData, gs_shader_param ¶m, bool &upload) { if (param.type != GS_SHADER_PARAM_TEXTURE) { if (!param.curValue.size()) @@ -342,7 +342,7 @@ void gs_shader::UploadParams() { - vector<uint8_t> constData; + std::vector<uint8_t> constData; bool upload = false; constData.reserve(constantSize);
View file
obs-studio-32.0.4.tar.xz/libobs-d3d11/d3d11-shaderprocessor.hpp -> obs-studio-32.1.0.tar.xz/libobs-d3d11/d3d11-shaderprocessor.hpp
Changed
@@ -28,10 +28,10 @@ gs_device_t *device; ShaderParser parser; - void BuildInputLayout(vector<D3D11_INPUT_ELEMENT_DESC> &inputs); - void BuildParams(vector<gs_shader_param> ¶ms); - void BuildSamplers(vector<unique_ptr<ShaderSampler>> &samplers); - void BuildString(string &outputString); + void BuildInputLayout(std::vector<D3D11_INPUT_ELEMENT_DESC> &inputs); + void BuildParams(std::vector<gs_shader_param> ¶ms); + void BuildSamplers(std::vector<std::unique_ptr<ShaderSampler>> &samplers); + void BuildString(std::string &outputString); void Process(const char *shader_string, const char *file); inline ShaderProcessor(gs_device_t *device) : device(device) {}
View file
obs-studio-32.0.4.tar.xz/libobs-d3d11/d3d11-subsystem.cpp -> obs-studio-32.1.0.tar.xz/libobs-d3d11/d3d11-subsystem.cpp
Changed
@@ -479,9 +479,9 @@ } } - string ToString() const + std::string ToString() const { - string status = enabled ? "Enabled" : "Disabled"; + std::string status = enabled ? "Enabled" : "Disabled"; status += " (Default: "; status += enabled_by_default ? "Yes" : "No"; status += ", Driver status: "; @@ -509,9 +509,9 @@ } }; -static optional<HagsStatus> GetAdapterHagsStatus(const DXGI_ADAPTER_DESC *desc) +static std::optional<HagsStatus> GetAdapterHagsStatus(const DXGI_ADAPTER_DESC *desc) { - optional<HagsStatus> ret; + std::optional<HagsStatus> ret; D3DKMT_OPENADAPTERFROMLUID d3dkmt_openluid{}; d3dkmt_openluid.AdapterLuid = desc->AdapterLuid; @@ -586,7 +586,7 @@ void gs_device::InitDevice(uint32_t adapterIdx) { - wstring adapterName; + std::wstring adapterName; DXGI_ADAPTER_DESC desc; D3D_FEATURE_LEVEL levelUsed = D3D_FEATURE_LEVEL_10_0; LARGE_INTEGER umd;
View file
obs-studio-32.0.4.tar.xz/libobs-d3d11/d3d11-subsystem.hpp -> obs-studio-32.1.0.tar.xz/libobs-d3d11/d3d11-subsystem.hpp
Changed
@@ -43,8 +43,6 @@ struct shader_sampler; struct gs_vertex_shader; -using namespace std; - /* * Just to clarify, all structs, and all public. These are exporting only * via encapsulated C bindings, not C++ bindings, so the whole concept of @@ -376,12 +374,12 @@ ComPtr<ID3D11Buffer> normalBuffer; ComPtr<ID3D11Buffer> colorBuffer; ComPtr<ID3D11Buffer> tangentBuffer; - vector<ComPtr<ID3D11Buffer>> uvBuffers; + std::vector<ComPtr<ID3D11Buffer>> uvBuffers; bool dynamic; VBDataPtr vbd; size_t numVerts; - vector<size_t> uvSizes; + std::vector<size_t> uvSizes; void FlushBuffer(ID3D11Buffer *buffer, void *array, size_t elementSize); @@ -516,11 +514,11 @@ bool chroma = false; bool acquired = false; - vector<vector<uint8_t>> data; - vector<D3D11_SUBRESOURCE_DATA> srd; + std::vector<std::vector<uint8_t>> data; + std::vector<D3D11_SUBRESOURCE_DATA> srd; D3D11_TEXTURE2D_DESC td = {}; - void InitSRD(vector<D3D11_SUBRESOURCE_DATA> &srd); + void InitSRD(std::vector<D3D11_SUBRESOURCE_DATA> &srd); void InitTexture(const uint8_t *const *data); void InitResourceView(); void InitRenderTargets(); @@ -571,11 +569,11 @@ bool chroma = false; bool acquired = false; - vector<vector<uint8_t>> data; - vector<D3D11_SUBRESOURCE_DATA> srd; + std::vector<std::vector<uint8_t>> data; + std::vector<D3D11_SUBRESOURCE_DATA> srd; D3D11_TEXTURE3D_DESC td = {}; - void InitSRD(vector<D3D11_SUBRESOURCE_DATA> &srd); + void InitSRD(std::vector<D3D11_SUBRESOURCE_DATA> &srd); void InitTexture(const uint8_t *const *data); void InitResourceView(); void BackupTexture(const uint8_t *const *data); @@ -655,7 +653,7 @@ }; struct gs_shader_param { - string name; + std::string name; gs_shader_param_type type; uint32_t textureID; @@ -665,8 +663,8 @@ size_t pos; - vector<uint8_t> curValue; - vector<uint8_t> defaultValue; + std::vector<uint8_t> curValue; + std::vector<uint8_t> defaultValue; bool changed; gs_shader_param(shader_var &var, uint32_t &texCounter); @@ -681,14 +679,14 @@ struct gs_shader : gs_obj { gs_shader_type type; - vector<gs_shader_param> params; + std::vector<gs_shader_param> params; ComPtr<ID3D11Buffer> constants; size_t constantSize; D3D11_BUFFER_DESC bd = {}; - vector<uint8_t> data; + std::vector<uint8_t> data; - inline void UpdateParam(vector<uint8_t> &constData, gs_shader_param ¶m, bool &upload); + inline void UpdateParam(std::vector<uint8_t> &constData, gs_shader_param ¶m, bool &upload); void UploadParams(); void BuildConstantBuffer(); @@ -705,7 +703,7 @@ }; struct ShaderSampler { - string name; + std::string name; gs_sampler_state sampler; inline ShaderSampler(const char *name, gs_device_t *device, gs_sampler_info *info) @@ -721,7 +719,7 @@ gs_shader_param *world, *viewProj; - vector<D3D11_INPUT_ELEMENT_DESC> layoutData; + std::vector<D3D11_INPUT_ELEMENT_DESC> layoutData; bool hasNormals; bool hasColors; @@ -750,7 +748,7 @@ return count; } - void GetBuffersExpected(const vector<D3D11_INPUT_ELEMENT_DESC> &inputs); + void GetBuffersExpected(const std::vector<D3D11_INPUT_ELEMENT_DESC> &inputs); gs_vertex_shader(gs_device_t *device, const char *file, const char *shaderString); }; @@ -775,7 +773,7 @@ struct gs_pixel_shader : gs_shader { ComPtr<ID3D11PixelShader> shader; - vector<unique_ptr<ShaderSampler>> samplers; + std::vector<std::unique_ptr<ShaderSampler>> samplers; void Rebuild(ID3D11Device *dev); @@ -987,9 +985,9 @@ ZStencilState zstencilState; RasterState rasterState; BlendState blendState; - vector<SavedZStencilState> zstencilStates; - vector<SavedRasterState> rasterStates; - vector<SavedBlendState> blendStates; + std::vector<SavedZStencilState> zstencilStates; + std::vector<SavedRasterState> rasterStates; + std::vector<SavedBlendState> blendStates; ID3D11DepthStencilState *curDepthStencilState = nullptr; ID3D11RasterizerState *curRasterState = nullptr; ID3D11BlendState *curBlendState = nullptr; @@ -997,16 +995,16 @@ gs_rect viewport; - vector<mat4float> projStack; + std::vector<mat4float> projStack; matrix4 curProjMatrix; matrix4 curViewMatrix; matrix4 curViewProjMatrix; - vector<gs_device_loss> loss_callbacks; + std::vector<gs_device_loss> loss_callbacks; gs_obj *first_obj = nullptr; - vector<std::pair<HMONITOR, gs_monitor_color_info>> monitor_to_hdr; + std::vector<std::pair<HMONITOR, gs_monitor_color_info>> monitor_to_hdr; void InitFactory(); void InitAdapter(uint32_t adapterIdx);
View file
obs-studio-32.0.4.tar.xz/libobs-d3d11/d3d11-texture2d.cpp -> obs-studio-32.1.0.tar.xz/libobs-d3d11/d3d11-texture2d.cpp
Changed
@@ -18,7 +18,7 @@ #include <util/base.h> #include "d3d11-subsystem.hpp" -void gs_texture_2d::InitSRD(vector<D3D11_SUBRESOURCE_DATA> &srd) +void gs_texture_2d::InitSRD(std::vector<D3D11_SUBRESOURCE_DATA> &srd) { uint32_t rowSizeBytes = width * gs_get_format_bpp(format); uint32_t texSizeBytes = height * rowSizeBytes / 8; @@ -66,7 +66,7 @@ uint32_t texSize = bbp * w * h / 8; - vector<uint8_t> &subData = this->datai; + std::vector<uint8_t> &subData = this->datai; subData.resize(texSize); memcpy(&subData0, datai, texSize);
View file
obs-studio-32.0.4.tar.xz/libobs-d3d11/d3d11-texture3d.cpp -> obs-studio-32.1.0.tar.xz/libobs-d3d11/d3d11-texture3d.cpp
Changed
@@ -18,7 +18,7 @@ #include <util/base.h> #include "d3d11-subsystem.hpp" -void gs_texture_3d::InitSRD(vector<D3D11_SUBRESOURCE_DATA> &srd) +void gs_texture_3d::InitSRD(std::vector<D3D11_SUBRESOURCE_DATA> &srd) { uint32_t rowSizeBits = width * gs_get_format_bpp(format); uint32_t sliceSizeBytes = height * rowSizeBits / 8; @@ -58,7 +58,7 @@ const uint32_t texSize = bbp * w * h * d / 8; this->datai.resize(texSize); - vector<uint8_t> &subData = this->datai; + std::vector<uint8_t> &subData = this->datai; memcpy(&subData0, datai, texSize); if (w > 1)
View file
obs-studio-32.0.4.tar.xz/libobs-metal/MetalBuffer.swift -> obs-studio-32.1.0.tar.xz/libobs-metal/MetalBuffer.swift
Changed
@@ -272,7 +272,7 @@ /// Sets up buffer objects for the data provided in the provided memory location /// - Parameter data: Pointer to bytes representing index buffer data /// - /// The provided memory location is expected to provide bytes represnting index buffer data as either unsigned + /// The provided memory location is expected to provide bytes representing index buffer data as either unsigned /// 16-bit integers or unsigned 32-bit integers. The size depends on the type used to create the /// ``MetalIndexBuffer`` instance. public func setupBuffers(_ data: UnsafeMutableRawPointer? = nil) {
View file
obs-studio-32.0.4.tar.xz/libobs-metal/MetalDevice.swift -> obs-studio-32.1.0.tar.xz/libobs-metal/MetalDevice.swift
Changed
@@ -175,9 +175,7 @@ encoder.waitForFence(swapChain.fence) encoder.copy(from: renderTarget.texture, to: drawable.texture) - commandBuffer.addScheduledHandler { _ in - drawable.present() - } + commandBuffer.present(drawable) } } @@ -549,7 +547,7 @@ /// /// This is necessary as the final output of projectors needs to be blitted into the drawables provided by the /// `CAMetalLayer` of each ``OBSSwapChain`` at the screen refresh interval, but projectors are usually rendered - /// using tens of seperate little draw calls. + /// using tens of separate little draw calls. /// /// Thus a virtual "display render stage" state is maintained by the Metal renderer, which is started when a /// ``OBSSwapChain`` instance is loaded by `libobs` and ended when `device_end_scene` is called. @@ -628,7 +626,7 @@ /// will fail. /// /// If the source texture has pending writes (e.g., it was used as the render target for a clear or draw command), - /// then the current command buffer will be comitted to ensure that the blit command encoded by this function + /// then the current command buffer will be committed to ensure that the blit command encoded by this function /// happens after the pending commands. /// /// > Important: This function differs from ``copyTexture`` insofar as it will wait for the completion of all @@ -661,7 +659,7 @@ /// textures pixel data. /// /// If the source texture has pending writes (e.g., it was used as the render target for a clear or draw command), - /// then the current command buffer will be comitted to ensure that the blit command encoded by this function + /// then the current command buffer will be committed to ensure that the blit command encoded by this function /// happens after the pending commands. /// /// > Important: This function will wait for the completion of all commands in the command queue to ensure that the @@ -739,7 +737,7 @@ /// otherwise the copy operation will fail. /// /// If the source texture has pending writes (e.g., it was used as the render target for a clear or draw command), - /// then the current command buffer will be comitted to ensure that the blit command encoded by this function + /// then the current command buffer will be committed to ensure that the blit command encoded by this function /// happens after the pending commands. /// func copyTextureRegion(
View file
obs-studio-32.0.4.tar.xz/libobs-metal/OBSShader.swift -> obs-studio-32.1.0.tar.xz/libobs-metal/OBSShader.swift
Changed
@@ -413,7 +413,7 @@ /// Analyzes shader uniform parameters parsed by the ``libobs`` shader parser. /// /// Each global variable declared as a "uniform" is stored as an ``OBSShaderVariable`` struct, which will be - /// extended with additional metadata by later analystics steps. + /// extended with additional metadata by later analysis steps. /// /// This is necessary as MSL does not support global variables and all data needs to be explicitly provided /// via buffer objects, which requires these "unforms" to be wrapped into a single struct and passed as an explicit @@ -465,7 +465,7 @@ /// /// Structured data declarations are used to pass data into and out of shaders. /// - /// Whereas HLSL allows one to use "InOut" structures with attribute mappings (e.g., using the same type defintion + /// Whereas HLSL allows one to use "InOut" structures with attribute mappings (e.g., using the same type definition /// for vertex data going in and out of a vertex shader), MSL does not allow the mixing of input mappings and output /// mappings in the same type definition. /// @@ -663,7 +663,7 @@ /// /// Because MSL does not support global variables, unforms, textures, or samplers need to be passed explicitly to a /// function. This requires scanning the entire function body (recursively in the case of separate function scopes - /// denoted by curvy brackets or parantheses) for any occurrence of a known uniform, texture, or sampler variable + /// denoted by curvy brackets or parentheses) for any occurrence of a known uniform, texture, or sampler variable /// name. /// /// - Parameters:
View file
obs-studio-32.0.4.tar.xz/libobs-metal/metal-indexbuffer.swift -> obs-studio-32.1.0.tar.xz/libobs-metal/metal-indexbuffer.swift
Changed
@@ -141,7 +141,7 @@ /// - Parameter indexBuffer: Opaque pointer to ``MetalIndexBuffer`` instance shared with `libobs` /// - Returns: Index buffer type as identified by the `gs_index_type` enum /// -/// > Warning: As the `gs_index_type` enumeration does not provide an "invalid" value (and thus `0` becomes a valied +/// > Warning: As the `gs_index_type` enumeration does not provide an "invalid" value (and thus `0` becomes a valid /// value), this function has no way to communicate an incompatible index buffer type that might be introduced at a /// later point. @_cdecl("gs_indexbuffer_get_type")
View file
obs-studio-32.0.4.tar.xz/libobs/CMakeLists.txt -> obs-studio-32.1.0.tar.xz/libobs/CMakeLists.txt
Changed
@@ -356,8 +356,7 @@ if(OS_WINDOWS) list( - APPEND - public_headers + APPEND public_headers util/threading-windows.h util/windows/ComPtr.hpp util/windows/CoTaskMemPtr.hpp
View file
obs-studio-32.0.4.tar.xz/libobs/obs-canvas.c -> obs-studio-32.1.0.tar.xz/libobs/obs-canvas.c
Changed
@@ -296,6 +296,9 @@ bool obs_canvas_reset_video_internal(obs_canvas_t *canvas, struct obs_video_info *ovi) { + if (!ovi && !canvas->mix) + return true; + obs_canvas_clear_mix(canvas); if (ovi)
View file
obs-studio-32.0.4.tar.xz/libobs/obs-config.h -> obs-studio-32.1.0.tar.xz/libobs/obs-config.h
Changed
@@ -34,14 +34,14 @@ * * Reset to zero each major version */ -#define LIBOBS_API_MINOR_VER 0 +#define LIBOBS_API_MINOR_VER 1 /* * Increment if backward-compatible bug fix * * Reset to zero each major or minor version */ -#define LIBOBS_API_PATCH_VER 4 +#define LIBOBS_API_PATCH_VER 0 #define MAKE_SEMANTIC_VERSION(major, minor, patch) ((major << 24) | (minor << 16) | patch)
View file
obs-studio-32.0.4.tar.xz/libobs/obs-data.c -> obs-studio-32.1.0.tar.xz/libobs/obs-data.c
Changed
@@ -483,6 +483,11 @@ obs_data_array_release(array); } +static inline void obs_data_add_json_null(obs_data_t *data, const char *key) +{ + obs_data_set_obj(data, key, NULL); +} + static void obs_data_add_json_item(obs_data_t *data, const char *key, json_t *json) { if (json_is_object(json)) @@ -499,6 +504,8 @@ obs_data_set_bool(data, key, true); else if (json_is_false(json)) obs_data_set_bool(data, key, false); + else if (json_is_null(json)) + obs_data_add_json_null(data, key); } /* ------------------------------------------------------------------------- */ @@ -556,6 +563,9 @@ static json_t *obs_data_to_json(obs_data_t *data, bool with_defaults) { + if (!data) + return json_null(); + json_t *json = json_object(); obs_data_item_t *item = NULL;
View file
obs-studio-32.0.4.tar.xz/libobs/obs-encoder.c -> obs-studio-32.1.0.tar.xz/libobs/obs-encoder.c
Changed
@@ -262,6 +262,10 @@ if (!current_mix) return; + /* Store original video_t so it can be restored if scaling is disabled. */ + if (!current_mix->encoder_only_mix) + encoder->original_video = encoder->media; + pthread_mutex_lock(&obs->video.mixes_mutex); for (size_t i = 0; i < obs->video.mixes.num; i++) { struct obs_core_video_mix *current = obs->video.mixes.arrayi; @@ -687,7 +691,7 @@ if (!mix->encoder_only_mix) break; - encoder_set_video(encoder, obs_get_video()); + encoder_set_video(encoder, encoder->original_video); mix->encoder_refs -= 1; if (mix->encoder_refs == 0) { da_erase(obs->video.mixes, i); @@ -2161,3 +2165,12 @@ return false; } + +uint32_t obs_encoder_get_priming_samples(const obs_encoder_t *encoder) +{ + if (encoder->info.get_priming_samples) { + return encoder->info.get_priming_samples(encoder->context.data); + } + + return 0; +}
View file
obs-studio-32.0.4.tar.xz/libobs/obs-encoder.h -> obs-studio-32.1.0.tar.xz/libobs/obs-encoder.h
Changed
@@ -344,6 +344,9 @@ bool (*encode_texture2)(void *data, struct encoder_texture *texture, int64_t pts, uint64_t lock_key, uint64_t *next_key, struct encoder_packet *packet, bool *received_packet); + + /** Audio encoder only: Returns padding, in samples, that must be skipped at the start of the stream. */ + uint32_t (*get_priming_samples)(void *data); }; EXPORT void obs_register_encoder_s(const struct obs_encoder_info *info, size_t size);
View file
obs-studio-32.0.4.tar.xz/libobs/obs-internal.h -> obs-studio-32.1.0.tar.xz/libobs/obs-internal.h
Changed
@@ -1427,6 +1427,8 @@ /* stores the video/audio media output pointer. video_t *or audio_t **/ void *media; + /* Stores the original video if GPU scaling is enabled and `media` can be overwritten. */ + video_t *original_video; pthread_mutex_t callbacks_mutex; DARRAY(struct encoder_callback) callbacks;
View file
obs-studio-32.0.4.tar.xz/libobs/obs-output.c -> obs-studio-32.1.0.tar.xz/libobs/obs-output.c
Changed
@@ -1643,11 +1643,11 @@ * nuh_temporal_id_plus1 u(3) * } */ - const uint8_t prefix_sei_nal_type = 39; + const uint8_t suffix_sei_nal_type = 40; /* The first bit is always 0, so we just need to * save the last bit off the original header and * add the SEI NAL type. */ - uint8_t first_byte = (prefix_sei_nal_type << 1) | (0x01 & hevc_nal_header0); + uint8_t first_byte = (suffix_sei_nal_type << 1) | (0x01 & hevc_nal_header0); hevc_nal_header0 = first_byte; /* The HEVC NAL unit header is 2 byte instead of * one, otherwise everything else is the
View file
obs-studio-32.0.4.tar.xz/libobs/obs-source-transition.c -> obs-studio-32.1.0.tar.xz/libobs/obs-source-transition.c
Changed
@@ -319,6 +319,11 @@ return transition->transitioning_audio || transition->transitioning_video; } +bool obs_transition_is_active(obs_source_t *transition) +{ + return transition_active(transition); +} + bool obs_transition_start(obs_source_t *transition, enum obs_transition_mode mode, uint32_t duration_ms, obs_source_t *dest) { @@ -330,6 +335,10 @@ if (!transition_valid(transition, "obs_transition_start")) return false; + if (transition_active(transition)) { + obs_transition_set(transition, transition->transition_sources1); + } + lock_transition(transition); same_as_source = dest == transition->transition_sources0; same_as_dest = dest == transition->transition_sources1; @@ -383,9 +392,16 @@ void obs_transition_set_manual_time(obs_source_t *transition, float t) { + enum obs_transition_mode mode; + lock_transition(transition); transition->transition_manual_target = t; + mode = transition->transition_mode; unlock_transition(transition); + + if (mode == OBS_TRANSITION_MODE_MANUAL && t == 0.0f) { + obs_transition_set(transition, transition->transition_sources0); + } } void obs_transition_set(obs_source_t *transition, obs_source_t *source) @@ -398,6 +414,10 @@ source = obs_source_get_ref(source); + if (transition_active(transition)) { + obs_source_dosignal(transition, "source_transition_stop", "transition_stop"); + } + lock_transition(transition); for (size_t i = 0; i < 2; i++) { si = transition->transition_sourcesi;
View file
obs-studio-32.0.4.tar.xz/libobs/obs.h -> obs-studio-32.1.0.tar.xz/libobs/obs.h
Changed
@@ -1611,6 +1611,8 @@ EXPORT void obs_transition_set_size(obs_source_t *transition, uint32_t cx, uint32_t cy); EXPORT void obs_transition_get_size(const obs_source_t *transition, uint32_t *cx, uint32_t *cy); +EXPORT bool obs_transition_is_active(obs_source_t *transition); + /* function used by transitions */ /** @@ -2349,6 +2351,9 @@ /** For audio encoders, returns the mixer index */ EXPORT size_t obs_encoder_get_mixer_index(const obs_encoder_t *encoder); +/* For audio encoders, returns the number of samples to skip at the beginning of the stream */ +EXPORT uint32_t obs_encoder_get_priming_samples(const obs_encoder_t *encoder); + /** * Sets the preferred video format for a video encoder. If the encoder can use * the format specified, it will force a conversion to that format if the
View file
obs-studio-32.0.4.tar.xz/libobs/util/pipe-posix.c -> obs-studio-32.1.0.tar.xz/libobs/util/pipe-posix.c
Changed
@@ -77,17 +77,21 @@ posix_spawn_file_actions_addclose(&file_actions, mainfds0); if (mainfds1 != STDOUT_FILENO) { posix_spawn_file_actions_adddup2(&file_actions, mainfds1, STDOUT_FILENO); - posix_spawn_file_actions_addclose(&file_actions, mainfds0); + posix_spawn_file_actions_addclose(&file_actions, mainfds1); } } else { + posix_spawn_file_actions_addclose(&file_actions, mainfds1); if (mainfds0 != STDIN_FILENO) { posix_spawn_file_actions_adddup2(&file_actions, mainfds0, STDIN_FILENO); - posix_spawn_file_actions_addclose(&file_actions, mainfds1); + posix_spawn_file_actions_addclose(&file_actions, mainfds0); } } posix_spawn_file_actions_addclose(&file_actions, errfds0); - posix_spawn_file_actions_adddup2(&file_actions, errfds1, STDERR_FILENO); + if (errfds1 != STDERR_FILENO) { + posix_spawn_file_actions_adddup2(&file_actions, errfds1, STDERR_FILENO); + posix_spawn_file_actions_addclose(&file_actions, errfds1); + } int pid; int ret = posix_spawn(&pid, bin, &file_actions, NULL, (char *const *)argv, environ);
View file
obs-studio-32.0.4.tar.xz/libobs/util/platform-nix-dbus.c -> obs-studio-32.1.0.tar.xz/libobs/util/platform-nix-dbus.c
Changed
@@ -25,7 +25,7 @@ FREEDESKTOP_SS, /* freedesktop screensaver (KDE >= 4, GNOME >= 3.10) */ FREEDESKTOP_PM, /* freedesktop power management (KDE, gnome <= 2.26) */ MATE_SM, /* MATE (>= 1.0) session manager */ - GNOME_SM, /* GNOME 2.26 - 3.4 sessopm mamager */ + GNOME_SM, /* GNOME 2.26 - 3.4 session manager */ }; struct service_info {
View file
obs-studio-32.0.4.tar.xz/libobs/util/threading-windows.h -> obs-studio-32.1.0.tar.xz/libobs/util/threading-windows.h
Changed
@@ -108,7 +108,7 @@ const char c = _InterlockedExchange8((volatile char *)ptr, (char)val); bool b; - /* Avoid unnecesary char to bool conversion. Value known 0 or 1. */ + /* Avoid unnecessary char to bool conversion. Value known 0 or 1. */ memcpy(&b, &c, sizeof(b)); return b; @@ -135,7 +135,7 @@ _ReadWriteBarrier(); #endif - /* Avoid unnecesary char to bool conversion. Value known 0 or 1. */ + /* Avoid unnecessary char to bool conversion. Value known 0 or 1. */ memcpy(&b, &c, sizeof(b)); return b;
View file
obs-studio-32.1.0.tar.xz/plugins/aja/data/locale/lo-LA.ini
Added
@@ -0,0 +1,27 @@ +AJACapture.Device="ອຸປະກອນຈັບພາບ AJA I/O" +AJAOutput.Device="ອຸປະກອນສົ່ງອອກ AJA I/O" +Device="ອຸປະກອນ" +Output="ຂາອອກ" +Input="ຂາເຂົ້າ" +Mode="ໂຫມດ" +VideoFormat="ຮູບແບບວິດີໂອ" +PixelFormat="ຮູບແບບພິກເຊວ" +AutoDetect="ກວດສອບອັດຕະໂນມັດ" +Interlaced="ແບບສອດສະລັບ" +AutoStart="ເລີ່ມອັດຕະໂນມັດເມື່ອເປີດ" +Buffering="ໃຊ້ບັບເຟີ" +DeactivateWhenNotShowing="ປິດການເຮັດວຽກເມື່ອບໍ່ສະແດງຜົນ" +IOSelect="ເລືອກ..." +SDITransport="ການສົ່ງສັນຍານ SDI" +SDITransport4K="ການສົ່ງສັນຍານ SDI 4K" +Auto="ອັດຕະໂນມັດ" +ChannelFormat="ຊ່ອງ" +ChannelFormat.None="ບໍ່ມີ" +ChannelFormat.2_0ch="2 ຊ່ອງ" +ChannelFormat.2_1ch="2.1 ຊ່ອງ" +ChannelFormat.4_0ch="4 ຊ່ອງ" +ChannelFormat.4_1ch="4.1 ຊ່ອງ" +ChannelFormat.5_1ch="5.1 ຊ່ອງ" +ChannelFormat.7_1ch="7.1 ຊ່ອງ" +SwapFC-LFE="ສະລັບ FC ແລະ LFE" +SwapFC-LFE.Tooltip="ສະລັບຊ່ອງໜ້າກາງ ແລະ ຊ່ອງ LFE"
View file
obs-studio-32.1.0.tar.xz/plugins/coreaudio-encoder/data/locale/lo-LA.ini
Added
@@ -0,0 +1,4 @@ +Bitrate="ບິດເຣດ" +AllowHEAAC="ອະນຸຍາດ HE-AAC" +OutputSamplerate="ອັດຕາການສຸ່ມຕົວຢ່າງຂາອອກ" +UseInputSampleRate="ໃຊ້ອັດຕາການສຸ່ມຕົວຢ່າງຂາເຂົ້າ (OBS) (ອາດຈະສະແດງລາຍການບິດເຣດທີ່ບໍ່ຮອງຮັບ)"
View file
obs-studio-32.0.4.tar.xz/plugins/coreaudio-encoder/encoder.cpp -> obs-studio-32.1.0.tar.xz/plugins/coreaudio-encoder/encoder.cpp
Changed
@@ -484,8 +484,7 @@ .bytes_per_packet((UInt32)(1 * bytes_per_frame)) .bits_per_channel((UInt32)bits_per_channel) .format_id(kAudioFormatLinearPCM) - .format_flags(kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked | - kAudioFormatFlagIsFloat | 0) + .format_flags(kAudioFormatFlagsNativeFloatPacked) .asbd; AudioStreamBasicDescription out; @@ -722,6 +721,12 @@ return ca->out_frames_per_packet; } +static uint32_t aac_priming_samples(void *data) +{ + ca_encoder *ca = static_cast<ca_encoder *>(data); + return ca->priming_samples; +} + /* The following code was extracted from encca_aac.c in HandBrake's libhb */ #define MP4ESDescrTag 0x03 #define MP4DecConfigDescrTag 0x04 @@ -858,7 +863,7 @@ return fill_common_asbd_fields(asbd_builder(), true) .sample_rate(44100) .format_id(kAudioFormatLinearPCM) - .format_flags(kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked | kAudioFormatFlagIsFloat | 0) + .format_flags(kAudioFormatFlagsNativeFloatPacked) .asbd; } @@ -1276,6 +1281,7 @@ aac_info.get_extra_data = aac_extra_data; aac_info.get_defaults = aac_defaults; aac_info.get_properties = aac_properties; + aac_info.get_priming_samples = aac_priming_samples; obs_register_encoder(&aac_info); return true;
View file
obs-studio-32.0.4.tar.xz/plugins/coreaudio-encoder/windows-imports.h -> obs-studio-32.1.0.tar.xz/plugins/coreaudio-encoder/windows-imports.h
Changed
@@ -209,7 +209,11 @@ kAppleLosslessFormatFlag_32BitSourceData = 4, }; -enum { kAudioFormatFlagsNativeEndian = 0 }; +enum { + kAudioFormatFlagsNativeEndian = 0, + kAudioFormatFlagsNativeFloatPacked = kAudioFormatFlagIsFloat | kAudioFormatFlagsNativeEndian | + kAudioFormatFlagIsPacked +}; enum { // AudioStreamBasicDescription structure properties
View file
obs-studio-32.1.0.tar.xz/plugins/decklink/data/locale/lo-LA.ini
Added
@@ -0,0 +1,27 @@ +BlackmagicDevice="ອຸປະກອນ Blackmagic" +Device="ອຸປະກອນ" +Mode="ໂໝດ" +Buffering="ໃຊ້ບັບເຟີ" +PixelFormat="ຮູບແບບພິກເຊວ" +ColorSpace="ຍ່ານສີ" +ColorSpace.Default="ຄ່າເລີ່ມຕົ້ນ" +ColorRange="ຊ່ວງສີ" +ColorRange.Default="ຄ່າເລີ່ມຕົ້ນ" +ColorRange.Partial="ຈຳກັດ" +ColorRange.Full="ເຕັມ" +ChannelFormat="ຊ່ອງ" +ChannelFormat.None="ບໍ່ມີ" +ChannelFormat.2_0ch="2 ຊ່ອງ" +ChannelFormat.2_1ch="2.1 ຊ່ອງ" +ChannelFormat.4_0ch="4 ຊ່ອງ" +ChannelFormat.4_1ch="4.1 ຊ່ອງ" +ChannelFormat.5_1ch="5.1 ຊ່ອງ" +ChannelFormat.7_1ch="7.1 ຊ່ອງ" +DeactivateWhenNotShowing="ປິດການເຮັດວຽກເມື່ອບໍ່ໄດ້ສະແດງຜົນ" +AutoStart="ເລີ່ມອັດຕະໂນມັດເມື່ອເປີດ" +ForceSDR="ບັງຄັບ SDR" +SwapFC-LFE="ສະລັບ FC ແລະ LFE" +SwapFC-LFE.Tooltip="ສະລັບຊ່ອງສຽງກາງດ້ານໜ້າ ແລະ ຊ່ອງ LFE" +VideoConnection="ການເຊື່ອມຕໍ່ວິດີໂອ" +AudioConnection="ການເຊື່ອມຕໍ່ສຽງ" +Allow10Bit="ອະນຸຍາດ 10 ບິດ (ຈຳເປັນສຳລັບຄຳບັນຍາຍ SDI, ອາດເຮັດໃຫ້ປະສິດທິພາບຫຼຸດລົງ)"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/af-ZA.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/af-ZA.ini
Changed
@@ -23,7 +23,6 @@ SlideShow.NextSlide="Volgende dia" SlideShow.PreviousSlide="Vorige dia" SlideShow.HideWhenDone="Versteek wanneer diavoorstelline klaar is" -ColorSource="Kleurbron" ColorSource.Color="Kleur" ColorSource.Width="Breedte" ColorSource.Height="Hoogte"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/ar-SA.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/ar-SA.ini
Changed
@@ -32,7 +32,6 @@ SlideShow.PlaybackMode.Once="مرّة" SlideShow.PlaybackMode.Loop="تكرار" SlideShow.PlaybackMode.Random="عشوائي" -ColorSource="مصدر لون" ColorSource.Color="اللون" ColorSource.Width="العرض" ColorSource.Height="الإرتفاع"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/az-AZ.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/az-AZ.ini
Changed
@@ -32,7 +32,7 @@ SlideShow.PlaybackMode.Once="Bir dəfə" SlideShow.PlaybackMode.Loop="Dövr" SlideShow.PlaybackMode.Random="Təsadüfi" -ColorSource="Rəng Mənbəsi" +ColorSource="Rəng" ColorSource.Color="Rəng" ColorSource.Width="En" ColorSource.Height="Hündürlük"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/bg-BG.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/bg-BG.ini
Changed
@@ -16,7 +16,6 @@ SlideShow.PlayPause="Пускане/пауза" SlideShow.Restart="Рестартиране" SlideShow.Stop="Спиране" -ColorSource="Източник за цвят" ColorSource.Color="Цвят" ColorSource.Width="Широчина" ColorSource.Height="Височина"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/bn-BD.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/bn-BD.ini
Changed
@@ -26,7 +26,6 @@ SlideShow.NextSlide="পরবর্তী স্লাইড" SlideShow.PreviousSlide="পূর্ববর্তী স্লাইড" SlideShow.HideWhenDone="স্লাইডশো হয়ে গেলে লুকান" -ColorSource="রঙের উৎস" ColorSource.Color="রং" ColorSource.Width="প্রস্থ" ColorSource.Height="উচ্চতা"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/ca-ES.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/ca-ES.ini
Changed
@@ -32,6 +32,5 @@ SlideShow.PlaybackMode.Once="Un cop" SlideShow.PlaybackMode.Loop="Bucle" SlideShow.PlaybackMode.Random="Aleatori" -ColorSource="Origen del color" ColorSource.Width="Amplada" ColorSource.Height="Alçada"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/cs-CZ.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/cs-CZ.ini
Changed
@@ -32,7 +32,7 @@ SlideShow.PlaybackMode.Once="Jednou" SlideShow.PlaybackMode.Loop="Smyčka" SlideShow.PlaybackMode.Random="Náhodně" -ColorSource="Zdroj barvy" +ColorSource="Barva" ColorSource.Color="Barva" ColorSource.Width="Šířka" ColorSource.Height="Výška"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/da-DK.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/da-DK.ini
Changed
@@ -30,7 +30,6 @@ SlideShow.PlaybackMode="Afspilningstilstand" SlideShow.PlaybackMode.Once="En gang" SlideShow.PlaybackMode.Random="Tilfældig" -ColorSource="Farvekilde" ColorSource.Color="Farve" ColorSource.Width="Bredde" ColorSource.Height="Højde"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/de-DE.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/de-DE.ini
Changed
@@ -30,7 +30,7 @@ SlideShow.PlaybackMode.Once="Einmal" SlideShow.PlaybackMode.Loop="Endlosschleife" SlideShow.PlaybackMode.Random="Zufällig" -ColorSource="Farbquelle" +ColorSource="Farbe" ColorSource.Color="Farbe" ColorSource.Width="Breite" ColorSource.Height="Höhe"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/el-GR.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/el-GR.ini
Changed
@@ -32,7 +32,6 @@ SlideShow.PlaybackMode.Once="Μία φορά" SlideShow.PlaybackMode.Loop="Επανάληψη" SlideShow.PlaybackMode.Random="Τυχαία" -ColorSource="Πηγή χρώματος" ColorSource.Color="Χρώμα" ColorSource.Width="Πλάτος" ColorSource.Height="Ύψος"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/en-GB.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/en-GB.ini
Changed
@@ -1,4 +1,4 @@ SlideShow.Randomize="Randomise Playback" SlideShow.PlaybackBehavior="Visibility Behaviour" -ColorSource="Colour Source" +ColorSource="Colour" ColorSource.Color="Colour"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/en-US.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/en-US.ini
Changed
@@ -34,7 +34,7 @@ SlideShow.PlaybackMode.Loop="Loop" SlideShow.PlaybackMode.Random="Random" -ColorSource="Color Source" +ColorSource="Color" ColorSource.Color="Color" ColorSource.Width="Width" ColorSource.Height="Height"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/es-ES.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/es-ES.ini
Changed
@@ -32,6 +32,5 @@ SlideShow.PlaybackMode.Once="Una vez" SlideShow.PlaybackMode.Loop="Bucle" SlideShow.PlaybackMode.Random="Aleatorio" -ColorSource="Origen de color" ColorSource.Width="Ancho" ColorSource.Height="Alto"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/et-EE.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/et-EE.ini
Changed
@@ -32,7 +32,6 @@ SlideShow.PlaybackMode.Once="Üks kord" SlideShow.PlaybackMode.Loop="Korda" SlideShow.PlaybackMode.Random="Juhuslik" -ColorSource="Värvi allikas" ColorSource.Color="Värv" ColorSource.Width="Laius" ColorSource.Height="Kõrgus"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/eu-ES.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/eu-ES.ini
Changed
@@ -28,7 +28,6 @@ SlideShow.NextSlide="Hurrengo diapositiba" SlideShow.PreviousSlide="Aurreko diapositiba" SlideShow.HideWhenDone="Ezkutatu aurkezpena bukatzean" -ColorSource="Kolorearen iturburua" ColorSource.Color="Kolorea" ColorSource.Width="Zabalera" ColorSource.Height="Altuera"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/fa-IR.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/fa-IR.ini
Changed
@@ -32,7 +32,7 @@ SlideShow.PlaybackMode.Once="یکبار" SlideShow.PlaybackMode.Loop="تکرار" SlideShow.PlaybackMode.Random="تصادفی" -ColorSource="رنگ منبع" +ColorSource="رنگ" ColorSource.Color="رنگ" ColorSource.Width="عرض" ColorSource.Height="ارتفاع"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/fi-FI.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/fi-FI.ini
Changed
@@ -32,7 +32,7 @@ SlideShow.PlaybackMode.Once="Kerran" SlideShow.PlaybackMode.Loop="Toista jatkuvasti" SlideShow.PlaybackMode.Random="Satunnainen" -ColorSource="Värilähde" +ColorSource="Väri" ColorSource.Color="Väri" ColorSource.Width="Leveys" ColorSource.Height="Korkeus"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/fil-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/fil-PH.ini
Changed
@@ -27,7 +27,6 @@ SlideShow.NextSlide="Susunod na Slide" SlideShow.PreviousSlide="Nakaraang Slide" SlideShow.HideWhenDone="Itago kapag tapos na ang slideshow" -ColorSource="Kulay na Source" ColorSource.Color="Kulay" ColorSource.Width="Lapad" ColorSource.Height="Taas"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/fr-FR.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/fr-FR.ini
Changed
@@ -30,7 +30,7 @@ SlideShow.PlaybackMode.Once="Une seule fois" SlideShow.PlaybackMode.Loop="Boucle" SlideShow.PlaybackMode.Random="Aléatoire" -ColorSource="Source de couleur" +ColorSource="Couleur" ColorSource.Color="Couleur" ColorSource.Width="Largeur" ColorSource.Height="Hauteur"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/gd-GB.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/gd-GB.ini
Changed
@@ -26,7 +26,6 @@ SlideShow.NextSlide="An ath-shleamhnag" SlideShow.PreviousSlide="An t-sleamhnag roimhpe" SlideShow.HideWhenDone="Cuir am falach nuair a bhios an taisbeanadh-shleamhnagan deiseil" -ColorSource="Tùs dhathan" ColorSource.Color="Dath" ColorSource.Width="Leud" ColorSource.Height="Àirde"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/gl-ES.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/gl-ES.ini
Changed
@@ -32,7 +32,6 @@ SlideShow.PlaybackMode.Once="Unha vez" SlideShow.PlaybackMode.Loop="Bucle" SlideShow.PlaybackMode.Random="Ao chou" -ColorSource="Orixe da cor" ColorSource.Color="Cor" ColorSource.Width="Largo" ColorSource.Height="Alto"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/he-IL.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/he-IL.ini
Changed
@@ -32,7 +32,7 @@ SlideShow.PlaybackMode.Once="פעם אחת" SlideShow.PlaybackMode.Loop="לולאה" SlideShow.PlaybackMode.Random="אקראי" -ColorSource="מקור צבע" +ColorSource="צבע" ColorSource.Color="צבע" ColorSource.Width="רוחב" ColorSource.Height="גובה"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/hi-IN.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/hi-IN.ini
Changed
@@ -32,7 +32,6 @@ SlideShow.PlaybackMode.Once="एक बार" SlideShow.PlaybackMode.Loop="लूप" SlideShow.PlaybackMode.Random="अव्यवस्थित" -ColorSource="रंग स्रोत" ColorSource.Color="रंग" ColorSource.Width="चौड़ाई" ColorSource.Height="ऊँचाई"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/hr-HR.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/hr-HR.ini
Changed
@@ -32,7 +32,6 @@ SlideShow.PlaybackMode.Once="Jednom" SlideShow.PlaybackMode.Loop="Petlja" SlideShow.PlaybackMode.Random="Nasumično" -ColorSource="Čista boja" ColorSource.Color="Boja" ColorSource.Width="Širina" ColorSource.Height="Visina"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/hu-HU.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/hu-HU.ini
Changed
@@ -32,7 +32,7 @@ SlideShow.PlaybackMode.Once="Egyszer" SlideShow.PlaybackMode.Loop="Ismétlés" SlideShow.PlaybackMode.Random="Véletlenszerű" -ColorSource="Színforrás" +ColorSource="Szín" ColorSource.Color="Szín" ColorSource.Width="Szélesség" ColorSource.Height="Magasság"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/hy-AM.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/hy-AM.ini
Changed
@@ -28,7 +28,6 @@ SlideShow.NextSlide="Հաջորդ սլայդը" SlideShow.PreviousSlide="Նախորդ սլայդը" SlideShow.HideWhenDone="Թաքցնել, երբ ավարտվի սլայդ շոուն" -ColorSource="Ֆոնի գույնը" ColorSource.Color="Գույն" ColorSource.Width="Լայնություն" ColorSource.Height="Բարձրություն"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/id-ID.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/id-ID.ini
Changed
@@ -32,7 +32,7 @@ SlideShow.PlaybackMode.Once="Sekali" SlideShow.PlaybackMode.Loop="Ulangi" SlideShow.PlaybackMode.Random="Acak" -ColorSource="Sumber Warna" +ColorSource="Warna" ColorSource.Color="Warna" ColorSource.Width="Lebar" ColorSource.Height="Tinggi"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/it-IT.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/it-IT.ini
Changed
@@ -30,7 +30,7 @@ SlideShow.PlaybackMode="Modalità riproduzione" SlideShow.PlaybackMode.Once="Una volta" SlideShow.PlaybackMode.Random="Casuale" -ColorSource="Fonte di colore" +ColorSource="Colore" ColorSource.Color="Colore" ColorSource.Width="Larghezza" ColorSource.Height="Altezza"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/ja-JP.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/ja-JP.ini
Changed
@@ -32,7 +32,7 @@ SlideShow.PlaybackMode.Once="1度だけ" SlideShow.PlaybackMode.Loop="ループ (繰り返し)" SlideShow.PlaybackMode.Random="ランダム" -ColorSource="色ソース" +ColorSource="色" ColorSource.Color="色" ColorSource.Width="幅" ColorSource.Height="高さ"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/ka-GE.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/ka-GE.ini
Changed
@@ -32,7 +32,7 @@ SlideShow.PlaybackMode.Once="ერთხელ" SlideShow.PlaybackMode.Loop="დაუსრულებლად გამეორება" SlideShow.PlaybackMode.Random="შემთხვევითი" -ColorSource="ფონის ფერი" +ColorSource="ფერი" ColorSource.Color="ფერი" ColorSource.Width="სიგანე" ColorSource.Height="სიმაღლე"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/kaa.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/kaa.ini
Changed
@@ -15,7 +15,6 @@ SlideShow.Stop="Toqtatıw" SlideShow.NextSlide="Keyingi slayd" SlideShow.PreviousSlide="Aldıńǵı slayd" -ColorSource="Reńli fon" ColorSource.Color="Reń" ColorSource.Width="Eni" ColorSource.Height="Uzınlıǵı"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/kab-KAB.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/kab-KAB.ini
Changed
@@ -25,7 +25,6 @@ SlideShow.NextSlide="Tamaccagt tuḍfirt" SlideShow.PreviousSlide="Tamaccagt tuzwirt" SlideShow.HideWhenDone="Ffer mi ara ifak uskan n tmaccagin" -ColorSource="Aɣbalu n yini" ColorSource.Color="Ini" ColorSource.Width="Tehri" ColorSource.Height="Tattayt"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/kmr-TR.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/kmr-TR.ini
Changed
@@ -28,7 +28,7 @@ SlideShow.NextSlide="Şemitoka pêş" SlideShow.PreviousSlide="Şemitoka paş" SlideShow.HideWhenDone="Gava pêşandana şemitokan diqede veşêre" -ColorSource="Çavkaniya rengê" +ColorSource="Reng" ColorSource.Color="Reng" ColorSource.Width="Pehnî" ColorSource.Height="Bilindî"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/ko-KR.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/ko-KR.ini
Changed
@@ -32,7 +32,6 @@ SlideShow.PlaybackMode.Once="한번" SlideShow.PlaybackMode.Loop="반복" SlideShow.PlaybackMode.Random="랜덤" -ColorSource="색상 소스" ColorSource.Color="색상" ColorSource.Width="너비" ColorSource.Height="높이"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/lo-LA.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/lo-LA.ini
Changed
@@ -1,2 +1,38 @@ ImageInput="ຮູບພາບ" +File="ໄຟລ໌ຮູບພາບ" +UnloadWhenNotShowing="ຍົກເລີກການໂຫຼດຮູບພາບເມື່ອບໍ່ສະແດງ" +LinearAlpha="ນຳໃຊ້ຄ່າອັນຟາໃນພື້ນທີ່ເສັ້ນຊື່" +SlideShow="ສະໄລໂຊຮູບພາບ" +SlideShow.TransitionSpeed="ຄວາມໄວການປ່ຽນ" +SlideShow.SlideTime="ເວລາລະຫວ່າງສະໄລ" +SlideShow.Files="ໄຟລ໌ຮູບພາບ" +SlideShow.CustomSize="ຂະໜາດຂອບເຂດ/ອັດຕາສ່ວນ" +SlideShow.CustomSize.Auto="ອັດຕະໂນມັດ" +SlideShow.Randomize="ສຸ່ມການຫຼິ້ນ" SlideShow.Loop="ວົນວຽນບໍ່ສິ້ນສຸດ" +SlideShow.Transition="ການປ່ຽນຜ່ານ" +SlideShow.Transition.Cut="ຕັດ" +SlideShow.Transition.Fade="ຈາງຫາຍ" +SlideShow.Transition.Swipe="ປັດ" +SlideShow.Transition.Slide="ເລື່ອນ" +SlideShow.PlaybackBehavior="ພຶດຕິກຳການເບິ່ງເຫັນ" +SlideShow.PlaybackBehavior.StopRestart="ຢຸດເມື່ອເບິ່ງບໍ່ເຫັນ, ເລີ່ມໃໝ່ເມື່ອເບິ່ງເຫັນ" +SlideShow.PlaybackBehavior.PauseUnpause="ພັກເມື່ອເບິ່ງບໍ່ເຫັນ, ຫຼິ້ນຕໍ່ເມື່ອເບິ່ງເຫັນ" +SlideShow.PlaybackBehavior.AlwaysPlay="ຫຼິ້ນຕະຫຼອດເວລາເຖິງແມ່ນວ່າຈະເບິ່ງບໍ່ເຫັນ" +SlideShow.SlideMode="ໂໝດສະໄລ" +SlideShow.SlideMode.Auto="ອັດຕະໂນມັດ" +SlideShow.SlideMode.Manual="ກຳນົດເອງ (ໃຊ້ປຸ່ມລັດເພື່ອຄວບຄຸມສະໄລໂຊ)" +SlideShow.PlayPause="ຫຼິ້ນ/ພັກ" +SlideShow.Restart="ເລີ່ມໃໝ່" +SlideShow.Stop="ຢຸດ" +SlideShow.NextSlide="ສະໄລຖັດໄປ" +SlideShow.PreviousSlide="ສະໄລກ່ອນໜ້າ" +SlideShow.HideWhenDone="ເຊື່ອງເມື່ອສະໄລໂຊຈົບ" +SlideShow.PlaybackMode="ໂໝດການຫຼິ້ນ" +SlideShow.PlaybackMode.Once="ຄັ້ງດຽວ" +SlideShow.PlaybackMode.Loop="ວົນຊ້ຳ" +SlideShow.PlaybackMode.Random="ສຸ່ມ" +ColorSource="ແຫຼ່ງສີ" +ColorSource.Color="ສີ" +ColorSource.Width="ຄວາມກວ້າງ" +ColorSource.Height="ຄວາມສູງ"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/lt-LT.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/lt-LT.ini
Changed
@@ -26,7 +26,6 @@ SlideShow.NextSlide="Sekanti Skaidrė" SlideShow.PreviousSlide="Praėjusi Skaidrė" SlideShow.HideWhenDone="Paslėpti, kai skaidrės baigtos" -ColorSource="Spalvos Šaltinis" ColorSource.Color="Spalva" ColorSource.Width="Plotis" ColorSource.Height="Aukštis"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/ms-MY.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/ms-MY.ini
Changed
@@ -32,7 +32,7 @@ SlideShow.PlaybackMode.Once="Sekali" SlideShow.PlaybackMode.Loop="Ulang" SlideShow.PlaybackMode.Random="Rawak" -ColorSource="Sumber Warna" +ColorSource="Warna" ColorSource.Color="Warna" ColorSource.Width="Lebar" ColorSource.Height="Tinggi"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/nb-NO.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/nb-NO.ini
Changed
@@ -29,7 +29,6 @@ SlideShow.HideWhenDone="Skjul når lysbildefremvisning er ferdig" SlideShow.PlaybackMode.Once="Én gang" SlideShow.PlaybackMode.Random="Tilfeldig" -ColorSource="Fargekilde" ColorSource.Color="Farge" ColorSource.Width="Bredde" ColorSource.Height="Høyde"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/nl-NL.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/nl-NL.ini
Changed
@@ -30,7 +30,7 @@ SlideShow.PlaybackMode.Once="Eenmalig" SlideShow.PlaybackMode.Loop="Herhalen" SlideShow.PlaybackMode.Random="Willekeurig" -ColorSource="Kleurbron" +ColorSource="Kleur" ColorSource.Color="Kleur" ColorSource.Width="Breedte" ColorSource.Height="Hoogte"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/nn-NO.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/nn-NO.ini
Changed
@@ -1,6 +1,5 @@ SlideShow.PlayPause="Spel/Pause" SlideShow.Stop="Stopp" -ColorSource="Fargekjelde" ColorSource.Color="Farge" ColorSource.Width="Breidde" ColorSource.Height="Høgde"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/pt-BR.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/pt-BR.ini
Changed
@@ -30,7 +30,7 @@ SlideShow.PlaybackMode="Modo de reprodução" SlideShow.PlaybackMode.Once="Uma vez" SlideShow.PlaybackMode.Random="Aleatório" -ColorSource="Fonte de cor" +ColorSource="Cor" ColorSource.Color="Cor" ColorSource.Width="Largura" ColorSource.Height="Altura"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/pt-PT.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/pt-PT.ini
Changed
@@ -32,7 +32,7 @@ SlideShow.PlaybackMode.Once="Uma vez" SlideShow.PlaybackMode.Loop="Repetir" SlideShow.PlaybackMode.Random="Aleatório" -ColorSource="Fonte de cor" +ColorSource="Cor" ColorSource.Color="Cor" ColorSource.Width="Largura" ColorSource.Height="Altura"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/ro-RO.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/ro-RO.ini
Changed
@@ -32,7 +32,6 @@ SlideShow.PlaybackMode.Once="O dată" SlideShow.PlaybackMode.Loop="Buclă" SlideShow.PlaybackMode.Random="Aleatoriu" -ColorSource="Sursă de culoare" ColorSource.Color="Culoare" ColorSource.Width="Lățime" ColorSource.Height="Înălțime"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/ru-RU.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/ru-RU.ini
Changed
@@ -32,7 +32,7 @@ SlideShow.PlaybackMode.Once="Один раз" SlideShow.PlaybackMode.Loop="Повтор" SlideShow.PlaybackMode.Random="Случайно" -ColorSource="Фоновый цвет" +ColorSource="Цвет" ColorSource.Color="Цвет" ColorSource.Width="Ширина" ColorSource.Height="Высота"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/si-LK.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/si-LK.ini
Changed
@@ -10,7 +10,6 @@ SlideShow.Stop="නවත්වන්න" SlideShow.NextSlide="ඊළඟ චිත්රකාචය" SlideShow.PreviousSlide="කලින් චිත්රකාචය" -ColorSource="වර්ණ මූලාශ්රය" ColorSource.Color="වර්ණය" ColorSource.Width="පළල" ColorSource.Height="උස"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/sl-SI.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/sl-SI.ini
Changed
@@ -28,7 +28,6 @@ SlideShow.NextSlide="Naslednja slika" SlideShow.PreviousSlide="Prejšnja slika" SlideShow.HideWhenDone="Skrij, ko je predstavitev končana" -ColorSource="Barvni vir" ColorSource.Color="Barva" ColorSource.Width="Širina" ColorSource.Height="Višina"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/sr-CS.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/sr-CS.ini
Changed
@@ -25,7 +25,6 @@ SlideShow.NextSlide="Sledeći slajd" SlideShow.PreviousSlide="Prethodni slajd" SlideShow.HideWhenDone="Sakrij kada se prezentacija završi" -ColorSource="Izvor boje" ColorSource.Color="Boja" ColorSource.Width="Širina" ColorSource.Height="Visina"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/sr-SP.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/sr-SP.ini
Changed
@@ -32,7 +32,6 @@ SlideShow.PlaybackMode.Once="Једном" SlideShow.PlaybackMode.Loop="Петља" SlideShow.PlaybackMode.Random="Насумично" -ColorSource="Извор боје" ColorSource.Color="Боја" ColorSource.Width="Ширина" ColorSource.Height="Висина"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/sv-SE.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/sv-SE.ini
Changed
@@ -32,7 +32,7 @@ SlideShow.PlaybackMode.Once="En gång" SlideShow.PlaybackMode.Loop="Slinga" SlideShow.PlaybackMode.Random="Slumpa" -ColorSource="Färgkälla" +ColorSource="Färg" ColorSource.Color="Färg" ColorSource.Width="Bredd" ColorSource.Height="Höjd"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/th-TH.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/th-TH.ini
Changed
@@ -32,7 +32,6 @@ SlideShow.PlaybackMode.Once="ครั้งเดียว" SlideShow.PlaybackMode.Loop="วนซ้ำ" SlideShow.PlaybackMode.Random="สุ่ม" -ColorSource="แหล่งสี" ColorSource.Color="สี" ColorSource.Width="ความกว้าง" ColorSource.Height="ความสูง"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/tl-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/tl-PH.ini
Changed
@@ -25,7 +25,6 @@ SlideShow.NextSlide="Susunod na Slide" SlideShow.PreviousSlide="Ang nakaraang Slide" SlideShow.HideWhenDone="Itago kapag ang pagpapakita ng slide ay tapos na" -ColorSource="Pinagmulan ng kulay" ColorSource.Color="Kulay" ColorSource.Width="Lapad" ColorSource.Height="Taas"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/tr-TR.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/tr-TR.ini
Changed
@@ -32,7 +32,7 @@ SlideShow.PlaybackMode.Once="Bir kere" SlideShow.PlaybackMode.Loop="Döngü" SlideShow.PlaybackMode.Random="Rastgele" -ColorSource="Renk Kaynağı" +ColorSource="Renk" ColorSource.Color="Renk" ColorSource.Width="Genişlik" ColorSource.Height="Yükseklik"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/ug-CN.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/ug-CN.ini
Changed
@@ -32,7 +32,7 @@ SlideShow.PlaybackMode.Once="بىر قېتىم" SlideShow.PlaybackMode.Loop="دەۋرىي" SlideShow.PlaybackMode.Random="ئىختىيارىي" -ColorSource="رەڭ مەنبەسى" +ColorSource="رەڭ" ColorSource.Color="رەڭ" ColorSource.Width="كەڭلىك" ColorSource.Height="ئېگىزلىك"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/uk-UA.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/uk-UA.ini
Changed
@@ -32,7 +32,7 @@ SlideShow.PlaybackMode.Once="Один раз" SlideShow.PlaybackMode.Loop="Повторювати" SlideShow.PlaybackMode.Random="Випадково" -ColorSource="Джерело кольору" +ColorSource="Колір" ColorSource.Color="Колір" ColorSource.Width="Ширина" ColorSource.Height="Висота"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/vi-VN.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/vi-VN.ini
Changed
@@ -32,7 +32,7 @@ SlideShow.PlaybackMode.Once="Một lần" SlideShow.PlaybackMode.Loop="Lặp lại" SlideShow.PlaybackMode.Random="Ngẫu nhiên" -ColorSource="Nguồn màu" +ColorSource="Màu" ColorSource.Color="Màu" ColorSource.Width="Chiều rộng" ColorSource.Height="Chiều cao"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/zh-CN.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/zh-CN.ini
Changed
@@ -32,7 +32,7 @@ SlideShow.PlaybackMode.Once="单次" SlideShow.PlaybackMode.Loop="循环" SlideShow.PlaybackMode.Random="随机" -ColorSource="色源" +ColorSource="颜色" ColorSource.Color="色彩" ColorSource.Width="宽度" ColorSource.Height="高度"
View file
obs-studio-32.0.4.tar.xz/plugins/image-source/data/locale/zh-TW.ini -> obs-studio-32.1.0.tar.xz/plugins/image-source/data/locale/zh-TW.ini
Changed
@@ -32,7 +32,6 @@ SlideShow.PlaybackMode.Once="一次性" SlideShow.PlaybackMode.Loop="循環" SlideShow.PlaybackMode.Random="隨機" -ColorSource="色彩來源" ColorSource.Color="色彩" ColorSource.Width="寬度" ColorSource.Height="高度"
View file
obs-studio-32.0.4.tar.xz/plugins/linux-alsa/data/locale/kmr-TR.ini -> obs-studio-32.1.0.tar.xz/plugins/linux-alsa/data/locale/kmr-TR.ini
Changed
@@ -1,2 +1,5 @@ AlsaInput="Amûra girtina dengê (ALSA)" +Default="Berdest" +Custom="Kesane" Device="Amûr" +Rate="Rêje"
View file
obs-studio-32.1.0.tar.xz/plugins/linux-alsa/data/locale/lo-LA.ini
Added
@@ -0,0 +1,5 @@ +AlsaInput="ອຸປະກອນບັນທຶກສຽງ (ALSA)" +Default="ຄ່າເລີ່ມຕົ້ນ" +Custom="ກຳນົດເອງ" +Device="ອຸປະກອນ" +Rate="ອັດຕາ"
View file
obs-studio-32.0.4.tar.xz/plugins/linux-capture/data/locale/az-AZ.ini -> obs-studio-32.1.0.tar.xz/plugins/linux-capture/data/locale/az-AZ.ini
Changed
@@ -1,7 +1,7 @@ X11SharedMemoryDisplayInput="Ekran Çəkilişi (XSHM)" Display="Ekran" CaptureCursor="Kursoru Yaxala" -AdvancedSettings="Qabaqcıl Tənzimləmələr" +AdvancedSettings="Qabaqcıl Parametrlər" XCCapture="Pəncərə Yaxalama (Xcomposite)" Window="Pəncərə" CropTop="Üstdən Kəs"
View file
obs-studio-32.0.4.tar.xz/plugins/linux-capture/data/locale/fil-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/linux-capture/data/locale/fil-PH.ini
Changed
@@ -1,3 +1,5 @@ +X11SharedMemoryDisplayInput="Dakip ng Displey (XSHM)" +Display="Displey" CaptureCursor="I-Capture ang Cursor" AdvancedSettings="Mga Advanced na Setting" XCCapture="Pagkuha ng Window (Xcomposite)" @@ -7,4 +9,5 @@ CropBottom="I-Crop Ang Ibaba" IncludeXBorder="Isama ang X Border" ExcludeAlpha="Gamitin ang alpha-less texture na format (Mesa workaround)" +SelectADisplay="Pumpili ng displey na idadakip" UnknownWindow="Di-malamang window"
View file
obs-studio-32.0.4.tar.xz/plugins/linux-capture/data/locale/kmr-TR.ini -> obs-studio-32.1.0.tar.xz/plugins/linux-capture/data/locale/kmr-TR.ini
Changed
@@ -1,3 +1,5 @@ +X11SharedMemoryDisplayInput="Dîmenderê bigire (XSHM)" +Display="Dîmender" CaptureCursor="Nîşankerê bigire" AdvancedSettings="Sazkariyên pêşketî" XServer="Rajekara X" @@ -9,3 +11,6 @@ CropBottom="Jêrê qut bike" IncludeXBorder="Sînorê X têxe nav" ExcludeAlpha="Formata tevna alfa-kêm bi kar bîne (çareserkirina mesa)" +SelectAWindow="Bo girtinê çarçoveyekê hilbijêre" +SelectADisplay="Bo girtinê dîmenderekê hilbijêre" +UnknownWindow="Çarçoveya nenas"
View file
obs-studio-32.0.4.tar.xz/plugins/linux-capture/data/locale/lo-LA.ini -> obs-studio-32.1.0.tar.xz/plugins/linux-capture/data/locale/lo-LA.ini
Changed
@@ -1,1 +1,16 @@ -CaptureCursor="ອັດເອົາລູກສອນເມົ້າສ໌ ນຳ" +X11SharedMemoryDisplayInput="ອັດໜ້າຈໍ (XSHM)" +Display="ຈໍສະແດງຜົນ" +CaptureCursor="ອັດເອົາລູກສອນເມົ້າ" +AdvancedSettings="ການຕັ້ງຄ່າຂັ້ນສູງ" +XServer="ເຊີເວີ X" +XCCapture="ອັດປ່ອງຢ້ຽມ (Xcomposite)" +Window="ປ່ອງຢ້ຽມ" +CropTop="ຕັດດ້ານເທິງ" +CropLeft="ຕັດດ້ານຊ້າຍ" +CropRight="ຕັດດ້ານຂວາ" +CropBottom="ຕັດດ້ານລຸ່ມ" +IncludeXBorder="ລວມຂອບ X" +ExcludeAlpha="ໃຊ້ຮູບແບບພື້ນຜິວທີ່ບໍ່ມີອັນຟາ (ແກ້ໄຂບັນຫາ Mesa)" +SelectAWindow="ເລືອກປ່ອງຢ້ຽມທີ່ຈະອັດ" +SelectADisplay="ເລືອກຈໍສະແດງຜົນທີ່ຈະອັດ" +UnknownWindow="ປ່ອງຢ້ຽມທີ່ບໍ່ຮູ້ຈັກ"
View file
obs-studio-32.1.0.tar.xz/plugins/linux-capture/data/locale/lv-LV.ini
Added
@@ -0,0 +1,14 @@ +X11SharedMemoryDisplayInput="Ekrāna Tveršana (XSHM)" +Display="Displejs" +CaptureCursor="Kursora Tveršana" +AdvancedSettings="Paplašinātie Iestatījumi" +XServer="X Serveris" +XCCapture="Loga Tveršana (Xcomposite)" +Window="Logs" +CropTop="Apcirpt Augšu" +CropLeft="Apcirpt Pa Kreisi" +CropRight="Apcirpt Pa Labi" +CropBottom="Apcirpt Apakšu" +IncludeXBorder="Iekļaut X Apmali" +ExcludeAlpha="Izmantot alfa nesaturošu tekstūras formātu (Mesa risinājums)" +UnknownWindow="Nezināms logs"
View file
obs-studio-32.0.4.tar.xz/plugins/linux-capture/data/locale/ro-RO.ini -> obs-studio-32.1.0.tar.xz/plugins/linux-capture/data/locale/ro-RO.ini
Changed
@@ -4,10 +4,10 @@ AdvancedSettings="Setări avansate" XCCapture="Captură de fereastră (Xcomposite)" Window="Fereastră" -CropTop="Trunchiază partea superioară" -CropLeft="Trunchiază partea stângă" -CropRight="Trunchiază partea dreaptă" -CropBottom="Trunchiază partea inferioară" +CropTop="Trunchiază în sus" +CropLeft="Trunchiază în partea stângă" +CropRight="Trunchiază în dreapta" +CropBottom="Trunchiază în jos" IncludeXBorder="Include marginea cu X" ExcludeAlpha="Folosește formatul de texturi fără alpha (soluție de evitare pentru Mesa)" SelectAWindow="Selectează o fereastră pentru captură"
View file
obs-studio-32.0.4.tar.xz/plugins/linux-capture/data/locale/tl-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/linux-capture/data/locale/tl-PH.ini
Changed
@@ -1,5 +1,5 @@ -X11SharedMemoryDisplayInput="Pag-capture sa Display (XSHM)" -Display="Ipakita" +X11SharedMemoryDisplayInput="Dakip ng Tanhgal (XSHM)" +Display="Tanghal" CaptureCursor="I-capture ang Cursor" AdvancedSettings="Mga Advanced na Setting" XServer="X na Server" @@ -10,5 +10,5 @@ IncludeXBorder="Isama ang X na Border" ExcludeAlpha="Gumamit ng alpha-less na format ng texture (Mesa na solusyon)" SelectAWindow="Pumili ng window na para i-capture" -SelectADisplay="Pumili ng display na para i-capture" +SelectADisplay="Pumpili ng tanghal na idadakip" UnknownWindow="Hindi malaman na window"
View file
obs-studio-32.0.4.tar.xz/plugins/linux-jack/data/locale/az-AZ.ini -> obs-studio-32.1.0.tar.xz/plugins/linux-jack/data/locale/az-AZ.ini
Changed
@@ -1,3 +1,3 @@ -StartJACKServer="JACK serveri başlat" -Channels="Kanal sayı" +StartJACKServer="JACK Serveri Başlat" +Channels="Kanal Sayı" JACKInput="JACK Giriş Müştərisi"
View file
obs-studio-32.0.4.tar.xz/plugins/linux-jack/data/locale/ka-GE.ini -> obs-studio-32.1.0.tar.xz/plugins/linux-jack/data/locale/ka-GE.ini
Changed
@@ -1,3 +1,3 @@ -StartJACKServer="JACK სერვერის გაშვება" +StartJACKServer="JACK-სერვერის გაშვება" Channels="არხების რაოდენობა" -JACKInput="JACK შეტანის კლიენტი" +JACKInput="შეტანის JACK-კლიენტი"
View file
obs-studio-32.1.0.tar.xz/plugins/linux-jack/data/locale/lo-LA.ini
Added
@@ -0,0 +1,3 @@ +StartJACKServer="ເລີ່ມເຊີເວີ JACK" +Channels="ຈຳນວນຊ່ອງ" +JACKInput="ລູກຂ່າຍອິນພຸດ JACK"
View file
obs-studio-32.0.4.tar.xz/plugins/linux-pipewire/camera-portal.c -> obs-studio-32.1.0.tar.xz/plugins/linux-pipewire/camera-portal.c
Changed
@@ -321,12 +321,12 @@ { struct param *p; obs_data_t *data = NULL; + struct dstr str = {}; obs_property_list_clear(prop); spa_list_for_each(p, &dev->param_list, link) { - struct dstr str = {}; struct dstr aspect_ratio; uint32_t media_type, media_subtype; uint32_t format = 0; @@ -334,11 +334,6 @@ struct spa_rectangle resolution; const struct spa_pod_prop *framerate_prop = NULL; - struct spa_pod *framerate_pod; - uint32_t n_framerates; - enum spa_choice_type framerate_choice; - const struct spa_fraction *framerate_values; - g_autoptr(GArray) framerates = NULL; if (p->id != SPA_PARAM_EnumFormat || p->param == NULL) continue; @@ -371,44 +366,12 @@ } if (spa_pod_parse_object(p->param, SPA_TYPE_OBJECT_Format, format ? &format : NULL, - SPA_FORMAT_VIDEO_size, SPA_POD_OPT_Rectangle(&resolution)) < 0) + SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle(&resolution)) < 0) continue; obs_data_set_int(data, "width", resolution.width); obs_data_set_int(data, "height", resolution.height); - framerate_prop = spa_pod_find_prop(p->param, NULL, SPA_FORMAT_VIDEO_framerate); - if (!framerate_prop) - continue; - - framerate_pod = spa_pod_get_values(&framerate_prop->value, &n_framerates, &framerate_choice); - if (framerate_pod->type != SPA_TYPE_Fraction) { - blog(LOG_WARNING, "Framerate is not a fraction"); - continue; - } - - framerate_values = SPA_POD_BODY(framerate_pod); - framerates = g_array_new(FALSE, FALSE, sizeof(struct spa_fraction)); - - switch (framerate_choice) { - case SPA_CHOICE_None: - g_array_append_val(framerates, framerate_values0); - break; - case SPA_CHOICE_Range: - blog(LOG_WARNING, "Ranged framerates not supported"); - continue; - case SPA_CHOICE_Step: - blog(LOG_WARNING, "Stepped framerates not supported"); - continue; - case SPA_CHOICE_Enum: - /* i=0 is the default framerate, skip it */ - for (uint32_t i = 1; i < n_framerates; i++) - g_array_append_val(framerates, framerate_valuesi); - break; - default: - continue; - } - dstr_printf(&str, "%ux%u", resolution.width, resolution.height); aspect_ratio = aspect_ratio_from_spa_rectangle(resolution); @@ -417,27 +380,66 @@ dstr_free(&aspect_ratio); } - dstr_cat(&str, " - "); + framerate_prop = spa_pod_find_prop(p->param, NULL, SPA_FORMAT_VIDEO_framerate); + if (framerate_prop) { + struct spa_pod *framerate_pod; + uint32_t n_framerates; + enum spa_choice_type framerate_choice; + const struct spa_fraction *framerate_values; + g_autoptr(GArray) framerates = NULL; + + framerate_pod = spa_pod_get_values(&framerate_prop->value, &n_framerates, &framerate_choice); + if (framerate_pod->type != SPA_TYPE_Fraction) { + blog(LOG_WARNING, "Framerate is not a fraction"); + continue; + } - for (int i = framerates->len - 1; i >= 0; i--) { - const struct spa_fraction *framerate = &g_array_index(framerates, struct spa_fraction, i); + framerate_values = SPA_POD_BODY(framerate_pod); + framerates = g_array_new(FALSE, FALSE, sizeof(struct spa_fraction)); - if (i != (int)framerates->len - 1) - dstr_cat(&str, ", "); + switch (framerate_choice) { + case SPA_CHOICE_None: + g_array_append_val(framerates, framerate_values0); + break; + case SPA_CHOICE_Range: + blog(LOG_WARNING, "Ranged framerates not supported"); + continue; + case SPA_CHOICE_Step: + blog(LOG_WARNING, "Stepped framerates not supported"); + continue; + case SPA_CHOICE_Enum: + /* i=0 is the default framerate, skip it */ + for (uint32_t i = 1; i < n_framerates; i++) + g_array_append_val(framerates, framerate_valuesi); + break; + default: + continue; + } - if (framerate->denom == 1) - dstr_catf(&str, "%u", framerate->num); - else - dstr_catf(&str, "%.2f", framerate->num / (double)framerate->denom); - } + dstr_cat(&str, " - "); - dstr_catf(&str, " FPS - %s", format_name); + for (int i = framerates->len - 1; i >= 0; i--) { + const struct spa_fraction *framerate = + &g_array_index(framerates, struct spa_fraction, i); + if (i != (int)framerates->len - 1) + dstr_cat(&str, ", "); + + if (framerate->denom == 1) + dstr_catf(&str, "%u", framerate->num); + else + dstr_catf(&str, "%.2f", framerate->num / (double)framerate->denom); + } + + dstr_cat(&str, " FPS"); + } + + dstr_catf(&str, " - %s", format_name); obs_property_list_add_string(prop, str.array, obs_data_get_json(data)); - dstr_free(&str); } g_clear_pointer(&data, obs_data_release); + dstr_free(&str); } static bool control_changed(void *data, obs_properties_t *props, obs_property_t *prop, obs_data_t *settings) @@ -635,7 +637,7 @@ return da - db; } -static void framerate_list(struct camera_device *dev, uint32_t pixelformat, const struct spa_rectangle *resolution, +static bool framerate_list(struct camera_device *dev, uint32_t pixelformat, const struct spa_rectangle *resolution, obs_property_t *prop) { g_autoptr(GArray) framerates = NULL; @@ -647,7 +649,6 @@ spa_list_for_each(p, &dev->param_list, link) { const struct spa_fraction *framerate_values; - struct obs_pw_video_format obs_pw_video_format; enum spa_choice_type choice; const struct spa_pod_prop *prop; struct spa_rectangle this_resolution; @@ -672,14 +673,11 @@ format = SPA_VIDEO_FORMAT_ENCODED; } - if (!obs_pw_video_format_from_spa_format(format, &obs_pw_video_format)) - continue; - - if (obs_pw_video_format.video_format != pixelformat) + if (format != pixelformat) continue; if (spa_pod_parse_object(p->param, SPA_TYPE_OBJECT_Format, NULL, SPA_FORMAT_VIDEO_size, - SPA_POD_OPT_Rectangle(&this_resolution)) < 0) + SPA_POD_Rectangle(&this_resolution)) < 0) continue; if (this_resolution.width != resolution->width || this_resolution.height != resolution->height) @@ -739,6 +737,8 @@ dstr_free(&str); } obs_data_release(data); + + return framerates->len != 0; } static bool parse_framerate(struct spa_fraction *dest, const char *json) @@ -826,6 +826,7 @@ struct camera_device *device; enum spa_media_subtype last_subtype = camera_source->subtype; enum spa_video_format last_format = camera_source->format.spa_format; + bool has_framerates; blog(LOG_INFO, "camera-portal Selected format for '%s'", camera_source->device_id); @@ -845,7 +846,18 @@ } property = obs_properties_get(properties, "framerate"); - framerate_list(device, camera_source->format.spa_format, &camera_source->resolution.rect, property); + obs_property_set_modified_callback2(property, NULL, NULL); + + has_framerates = + framerate_list(device, camera_source->format.spa_format, &camera_source->resolution.rect, property); + obs_property_set_enabled(property, has_framerates); + + if (has_framerates) { + obs_property_set_modified_callback2(property, framerate_selected, camera_source); + obs_property_modified(property, settings); + } else if (camera_source->obs_pw_stream) { + obs_pipewire_stream_set_framerate(camera_source->obs_pw_stream, NULL); + } return true; } @@ -1260,7 +1272,6 @@ obs_property_set_modified_callback2(device_list, device_selected, camera_source); obs_property_set_modified_callback2(format_list, format_selected, camera_source); - obs_property_set_modified_callback2(framerate_list, framerate_selected, camera_source); return props; }
View file
obs-studio-32.0.4.tar.xz/plugins/linux-pipewire/data/locale/kmr-TR.ini -> obs-studio-32.1.0.tar.xz/plugins/linux-pipewire/data/locale/kmr-TR.ini
Changed
@@ -1,5 +1,11 @@ +CameraControls="Kontrolên kamerayê" +FrameRate="Rêjeya Frame" +PipeWireCamera="Amûra girtina vîdyoyê (PipeWire) (BETA)" +PipeWireCameraDevice="Amûr" PipeWireDesktopCapture="Giritina diîmenderê (PipeWire)" PipeWireSelectMonitor="Dîmenderê hilbijêre" PipeWireSelectWindow="Çarçoveyê hilbijêre" PipeWireWindowCapture="Girtina çarçoveyê (PipeWire)" +PipeWireSelectScreenCast="Hilbijêr veke" ShowCursor="Nîşankerê nîşan bide" +VideoFormat="Formata vîdyoyê"
View file
obs-studio-32.1.0.tar.xz/plugins/linux-pipewire/data/locale/lo-LA.ini
Added
@@ -0,0 +1,11 @@ +CameraControls="ການຄວບຄຸມກ້ອງ" +FrameRate="ອັດຕາເຟຣມ" +PipeWireCamera="ອຸປະກອນຈັບພາບວິດີໂອ (PipeWire) (BETA)" +PipeWireCameraDevice="ອຸປະກອນ" +PipeWireDesktopCapture="ການຈັບພາບໜ້າຈໍ (PipeWire)" +PipeWireSelectMonitor="ເລືອກຈໍພາບ" +PipeWireSelectWindow="ເລືອກໜ້າຕ່າງ" +PipeWireWindowCapture="ການຈັບພາບໜ້າຕ່າງ (PipeWire)" +PipeWireSelectScreenCast="ເປີດຕົວເລືອກ" +ShowCursor="ສະແດງເຄີເຊີ" +VideoFormat="ຮູບແບບວິດີໂອ"
View file
obs-studio-32.0.4.tar.xz/plugins/linux-pulseaudio/data/locale/az-AZ.ini -> obs-studio-32.1.0.tar.xz/plugins/linux-pulseaudio/data/locale/az-AZ.ini
Changed
@@ -1,4 +1,4 @@ PulseInput="Səs Girişi Yaxalama (PulseAudio)" -PulseOutput="Səs Çıxışi Yaxalama (PulseAudio)" -Device="Cihaz" +PulseOutput="Səs Çıxışı Yaxalama (PulseAudio)" +Device="Qurğu" Default="İlkin təyin olunan"
View file
obs-studio-32.0.4.tar.xz/plugins/linux-pulseaudio/data/locale/kmr-TR.ini -> obs-studio-32.1.0.tar.xz/plugins/linux-pulseaudio/data/locale/kmr-TR.ini
Changed
@@ -1,3 +1,4 @@ PulseInput="Girtina têketina dengê (PulseAudio)" PulseOutput="Girtina derketina dengê (PulseAudio)" Device="Amûr" +Default="Berdest"
View file
obs-studio-32.1.0.tar.xz/plugins/linux-pulseaudio/data/locale/lo-LA.ini
Added
@@ -0,0 +1,4 @@ +PulseInput="ການຈັບສຽງຂາເຂົ້າ (PulseAudio)" +PulseOutput="ການຈັບສຽງຂາອອກ (PulseAudio)" +Device="ອຸປະກອນ" +Default="ຄ່າເລີ່ມຕົ້ນ"
View file
obs-studio-32.0.4.tar.xz/plugins/linux-pulseaudio/pulse-input.c -> obs-studio-32.1.0.tar.xz/plugins/linux-pulseaudio/pulse-input.c
Changed
@@ -264,7 +264,7 @@ { UNUSED_PARAMETER(c); PULSE_DATA(userdata); - // An error occured + // An error occurred if (eol < 0) { data->format = PA_SAMPLE_INVALID; goto skip; @@ -292,9 +292,7 @@ if (pulse_channels_to_obs_speakers(channels) == SPEAKERS_UNKNOWN) { channels = 2; - blog(LOG_INFO, - "%c channels not supported by OBS," - "using %c instead for recording", + blog(LOG_INFO, "%" PRIu8 " channels not supported by OBS, using %" PRIu8 " instead for recording", i->sample_spec.channels, channels); }
View file
obs-studio-32.0.4.tar.xz/plugins/linux-pulseaudio/pulse-wrapper.h -> obs-studio-32.1.0.tar.xz/plugins/linux-pulseaudio/pulse-wrapper.h
Changed
@@ -64,7 +64,7 @@ /** * Wait for accept signal from calling thread * - * This function tells the pulseaudio mainloop wheter the data provided to + * This function tells the pulseaudio mainloop whether the data provided to * the callback should be retained until the calling thread executes * pulse_accept() *
View file
obs-studio-32.0.4.tar.xz/plugins/linux-v4l2/data/locale/az-AZ.ini -> obs-studio-32.1.0.tar.xz/plugins/linux-v4l2/data/locale/az-AZ.ini
Changed
@@ -5,7 +5,7 @@ VideoStandard="Video Standartı" DVTiming="DV zamanlama" Resolution="Rezolyusiya" -FrameRate="Kadr Rürəti" +FrameRate="Kadr Sürəti" LeaveUnchanged="Dəyişmədən çıx" UseBuffering="Buferləşdirmədən istifadə et" ColorRange="Rəng Aralığı"
View file
obs-studio-32.0.4.tar.xz/plugins/linux-v4l2/data/locale/fil-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/linux-v4l2/data/locale/fil-PH.ini
Changed
@@ -1,5 +1,6 @@ VideoFormat="Format ng Video" VideoStandard="Standard Video" +Resolution="Resolusyon" FrameRate="Frame rate" LeaveUnchanged="Mag-iwan ng hindi nabago" UseBuffering="Gamitin ang Buffering"
View file
obs-studio-32.0.4.tar.xz/plugins/linux-v4l2/data/locale/ka-GE.ini -> obs-studio-32.1.0.tar.xz/plugins/linux-v4l2/data/locale/ka-GE.ini
Changed
@@ -3,7 +3,7 @@ Input="შეტანა" VideoFormat="ვიდეოს ფორმატი" VideoStandard="ვიდეოს სტანდარტი" -DVTiming="ციფრული ვიდეოს სინქრონიზაცია" +DVTiming="ციფრ. ვიდეოს დროები" Resolution="გარჩევადობა" FrameRate="კადრის სიხშირე" LeaveUnchanged="უცვლელად დატოვება"
View file
obs-studio-32.1.0.tar.xz/plugins/linux-v4l2/data/locale/lo-LA.ini
Added
@@ -0,0 +1,17 @@ +V4L2Input="ອຸປະກອນຈັບພາບວິດີໂອ (V4L2)" +Device="ອຸປະກອນ" +Input="ອິນພຸດ" +VideoFormat="ຮູບແບບວິດີໂອ" +VideoStandard="ມາດຕະຖານວິດີໂອ" +DVTiming="ການກຳນົດເວລາ DV" +Resolution="ຄວາມລະອຽດ" +FrameRate="ອັດຕາເຟຣມ" +LeaveUnchanged="ບໍ່ປ່ຽນແປງ" +UseBuffering="ໃຊ້ບັບເຟີຣິງ" +ColorRange="ຊ່ວງສີ" +ColorRange.Default="ຄ່າເລີ່ມຕົ້ນ" +ColorRange.Partial="ຈຳກັດ" +ColorRange.Full="ເຕັມ" +CameraCtrls="ການຄວບຄຸມກ້ອງ" +AutoresetOnTimeout="ຕັ້ງຄ່າໃໝ່ອັດຕະໂນມັດເມື່ອໝົດເວລາ" +FramesUntilTimeout="ຈຳນວນເຟຣມກ່ອນໝົດເວລາ"
View file
obs-studio-32.0.4.tar.xz/plugins/linux-v4l2/data/locale/tl-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/linux-v4l2/data/locale/tl-PH.ini
Changed
@@ -4,7 +4,7 @@ VideoFormat="Ang Format ng Video" VideoStandard="Ang Pamantayan ng Video" DVTiming="Ang Tiyempong DV" -Resolution="Resulusyon" +Resolution="Hisikot" FrameRate="Pag-Rate ng Frame" LeaveUnchanged="Iniwa ng hindi nabago" UseBuffering="Gamitin ang Buffering"
View file
obs-studio-32.0.4.tar.xz/plugins/linux-v4l2/v4l2-helpers.c -> obs-studio-32.1.0.tar.xz/plugins/linux-v4l2/v4l2-helpers.c
Changed
@@ -15,6 +15,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <inttypes.h> + #include <sys/mman.h> #include <util/bmem.h> @@ -77,18 +79,19 @@ { struct v4l2_buffer buf; - blog(LOG_DEBUG, "attempting to read buffer data for %ld buffers", buf_data->count); + blog(LOG_DEBUG, "attempting to read buffer data for %" PRIuFAST32 " buffers", buf_data->count); for (uint_fast32_t i = 0; i < buf_data->count; i++) { buf.index = i; buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; if (v4l2_ioctl(dev, VIDIOC_QUERYBUF, &buf) < 0) { - blog(LOG_DEBUG, "failed to read buffer data for buffer #%ld", i); + blog(LOG_DEBUG, "failed to read buffer data for buffer #%" PRIuFAST32, i); } else { blog(LOG_DEBUG, - "query buf #%ld info: ts: %06ld buf id #%d, flags 0x%08X, seq #%d, len %d, used %d", i, - buf.timestamp.tv_usec, buf.index, buf.flags, buf.sequence, buf.length, buf.bytesused); + "query buf #%" PRIuFAST32 + " info: ts: %06ld buf id #%d, flags 0x%08X, seq #%d, len %d, used %d", + i, buf.timestamp.tv_usec, buf.index, buf.flags, buf.sequence, buf.length, buf.bytesused); } }
View file
obs-studio-32.0.4.tar.xz/plugins/linux-v4l2/v4l2-output.c -> obs-studio-32.1.0.tar.xz/plugins/linux-v4l2/v4l2-output.c
Changed
@@ -27,7 +27,10 @@ static void virtualcam_destroy(void *data) { struct virtualcam_data *vcam = (struct virtualcam_data *)data; - close(vcam->device); + + if (vcam->device >= 0) + close(vcam->device); + bfree(data); } @@ -133,6 +136,7 @@ { struct virtualcam_data *vcam = (struct virtualcam_data *)bzalloc(sizeof(*vcam)); vcam->output = output; + vcam->device = -1; UNUSED_PARAMETER(settings); return vcam; @@ -256,6 +260,7 @@ fail_close_device: close(vcam->device); + vcam->device = -1; return false; } @@ -331,6 +336,7 @@ } close(vcam->device); + vcam->device = -1; blog(LOG_INFO, "Virtual camera stopped"); UNUSED_PARAMETER(ts);
View file
obs-studio-32.0.4.tar.xz/plugins/linux-v4l2/v4l2-udev.c -> obs-studio-32.1.0.tar.xz/plugins/linux-v4l2/v4l2-udev.c
Changed
@@ -63,7 +63,7 @@ /** * Call all registered callbacks with the event * - * @param dev udev device that had an event occuring + * @param dev udev device that had an event occurring */ static inline void udev_signal_event(struct udev_device *dev) {
View file
obs-studio-32.0.4.tar.xz/plugins/mac-avcapture/OBSAVCapture.h -> obs-studio-32.1.0.tar.xz/plugins/mac-avcapture/OBSAVCapture.h
Changed
@@ -180,7 +180,7 @@ /// Reads a C-character pointer from user settings and converts it into an NSString(https://developer.apple.com/documentation/foundation/nsstring?language=objc) instance. /// - Parameters: /// - settings: Pointer to user settings struct used by ``libobs`` -/// - setting: String identifer for setting +/// - setting: String identifier for setting /// - widthDefault: Optional fallback value to use if C-character pointer read from settings is invalid /// - Returns: New NSString(https://developer.apple.com/documentation/foundation/nsstring?language=objc) instance created from user setting if setting represented a valid C character pointer. + (NSString *)stringFromSettings:(void *)settings withSetting:(NSString *)setting withDefault:(NSString *)defaultValue;
View file
obs-studio-32.0.4.tar.xz/plugins/mac-avcapture/OBSAVCapture.m -> obs-studio-32.1.0.tar.xz/plugins/mac-avcapture/OBSAVCapture.m
Changed
@@ -8,7 +8,7 @@ #import "OBSAVCapture.h" #import "AVCaptureDeviceFormat+OBSListable.h" -/// Tthe maximum number of frame rate ranges to show complete information for before providing a more generic description of the supported frame rates inside of a device format description. +/// The maximum number of frame rate ranges to show complete information for before providing a more generic description of the supported frame rates inside of a device format description. static const UInt32 kMaxFrameRateRangesInDescription = 10; @implementation OBSAVCapture
View file
obs-studio-32.0.4.tar.xz/plugins/mac-avcapture/data/locale/ar-SA.ini -> obs-studio-32.1.0.tar.xz/plugins/mac-avcapture/data/locale/ar-SA.ini
Changed
@@ -15,3 +15,9 @@ Unknown="غير معرّف (%1)" EnableAudio="تمكين الصوت إذا كان مدعوما من قبل الجهاز" Resolution="الدقة" +Warning.Effect.Portrait="تأثير نظام البورتريه نشط على الجهاز المحدد" +Warning.Effect.CenterStage="تأثير نظام المنصة المركزية نشط على الجهاز المحدد" +Warning.Effect.StudioLight="تأثير نظام ضوء الأستوديو نشط على الجهاز المحدد" +Warning.Effect.Reactions="تأثير نظام التفاعلات نشط على الجهاز المحدد" +Warning.Effect.BackgroundReplacement="تأثير نظام استبدال الخلفية نشط على الجهاز المحدد" +Warning.Effect.Multiple="العديد من تأثيرات النظام نشطة علي الجهاز المحدد"
View file
obs-studio-32.0.4.tar.xz/plugins/mac-avcapture/data/locale/et-EE.ini -> obs-studio-32.1.0.tar.xz/plugins/mac-avcapture/data/locale/et-EE.ini
Changed
@@ -15,3 +15,9 @@ Unknown="Tundmatu (%1)" EnableAudio="Luba heli, kui seade seda toetab" Resolution="Resolutsioon" +Warning.Effect.Portrait="Valitud seadmes on portreesüsteemi efekt aktiivne" +Warning.Effect.CenterStage="Valitud seadmes on Center Stage'i süsteemiefekt aktiivne" +Warning.Effect.StudioLight="Stuudiovalgustuse süsteemi efekt on valitud seadmes aktiivne" +Warning.Effect.Reactions="Reaktsioonisüsteemi efekt on valitud seadmes aktiivne" +Warning.Effect.BackgroundReplacement="Valitud seadmes on tausta asendamise süsteemiefekt aktiivne" +Warning.Effect.Multiple="Valitud seadmel on aktiivsed mitu süsteemiefekti"
View file
obs-studio-32.0.4.tar.xz/plugins/mac-avcapture/data/locale/kmr-TR.ini -> obs-studio-32.1.0.tar.xz/plugins/mac-avcapture/data/locale/kmr-TR.ini
Changed
@@ -1,4 +1,6 @@ AVCapture="Amûra girtina vîdyo" +AVCapture_Fast="Amûra kerta girtinê" +AVCapture_Legacy="Amûra girtina vîdyoyê (Legacy)" Device="Amûr" UsePreset="Pêş sazkirî bi kar bîne" Preset="Pêş sazkirî" @@ -12,3 +14,4 @@ Auto="Xweber" Unknown="Nenas (%1)" EnableAudio="Dengê çalak bike ku ji aliyê amûrê ve tê piştgirîkirin" +Resolution="Çareserî"
View file
obs-studio-32.0.4.tar.xz/plugins/mac-avcapture/data/locale/lo-LA.ini -> obs-studio-32.1.0.tar.xz/plugins/mac-avcapture/data/locale/lo-LA.ini
Changed
@@ -1,3 +1,23 @@ AVCapture="ອຸປະກອນປະເພດວີດີໂອ" +AVCapture_Fast="ອຸປະກອນກາດຈັບພາບ" +AVCapture_Legacy="ອຸປະກອນຈັບພາບວິດີໂອ (ແບບເກົ່າ)" Device="ອຸປະກອນ" +UsePreset="ໃຊ້ຄ່າທີ່ຕັ້ງໄວ້ລ່ວງໜ້າ" +Preset="ຄ່າທີ່ຕັ້ງໄວ້ລ່ວງໜ້າ" +Buffering="ໃຊ້ການພັກຂໍ້ມູນ" FrameRate="ອັດຕາເລັ່ງພາບ" +InputFormat="ຮູບແບບການນຳເຂົ້າ" +ColorSpace="ພື້ນທີ່ສີ" +VideoRange="ໄລຍະວິດີໂອ" +VideoRange.Partial="ຈຳກັດ" +VideoRange.Full="ເຕັມ" +Auto="ອັດຕະໂນມັດ" +Unknown="ບໍ່ຮູ້ຈັກ (%1)" +EnableAudio="ເປີດໃຊ້ສຽງ ຖ້າອຸປະກອນຮອງຮັບ" +Resolution="ຄວາມລະອຽດ" +Warning.Effect.Portrait="ເອັບເຟັກລະບົບ Portrait ກຳລັງຖືກໃຊ້ງານຢູ່ໃນອຸປະກອນທີ່ເລືອກ" +Warning.Effect.CenterStage="ເອັບເຟັກລະບົບ Center Stage ກຳລັງຖືກໃຊ້ງານຢູ່ໃນອຸປະກອນທີ່ເລືອກ" +Warning.Effect.StudioLight="ເອັບເຟັກລະບົບ Studio Light ກຳລັງຖືກໃຊ້ງານຢູ່ໃນອຸປະກອນທີ່ເລືອກ" +Warning.Effect.Reactions="ເອັບເຟັກລະບົບ Reactions ກຳລັງຖືກໃຊ້ງານຢູ່ໃນອຸປະກອນທີ່ເລືອກ" +Warning.Effect.BackgroundReplacement="ເອັບເຟັກລະບົບປ່ຽນພື້ນຫຼັງກຳລັງຖືກໃຊ້ງານຢູ່ໃນອຸປະກອນທີ່ເລືອກ" +Warning.Effect.Multiple="ມີເອັບເຟັກລະບົບຫຼາຍຢ່າງກຳລັງຖືກໃຊ້ງານຢູ່ໃນອຸປະກອນທີ່ເລືອກ"
View file
obs-studio-32.0.4.tar.xz/plugins/mac-avcapture/data/locale/pt-BR.ini -> obs-studio-32.1.0.tar.xz/plugins/mac-avcapture/data/locale/pt-BR.ini
Changed
@@ -15,9 +15,9 @@ Unknown="Desconhecido (%1)" EnableAudio="Habilitar áudio se suportado pelo dispositivo" Resolution="Resolução" -Warning.Effect.Portrait="O efeito do sistema Retrato está ativo no dispositivo selecionado" -Warning.Effect.CenterStage="O efeito do sistema Palco Central está ativo no dispositivo selecionado" -Warning.Effect.StudioLight="O efeito do sistema Luz de Estúdio está ativo no dispositivo selecionado" -Warning.Effect.Reactions="O efeito do sistema Reações está ativo no dispositivo selecionado" -Warning.Effect.BackgroundReplacement="O efeito do sistema Substituição de fundo está ativo no dispositivo selecionado" -Warning.Effect.Multiple="Múltiplos efeitos de sistema estão ativo no dispositivo selecionado" +Warning.Effect.Portrait="O efeito Modo Retrato está ativo no sistema do dispositivo selecionado" +Warning.Effect.CenterStage="O efeito Center Stage está ativo no sistema do dispositivo selecionado" +Warning.Effect.StudioLight="O efeito Luz de Estúdio está ativo no sistema do dispositivo selecionado" +Warning.Effect.Reactions="O efeito Reações está ativo no sistema do dispositivo selecionado" +Warning.Effect.BackgroundReplacement="O efeito Substituição de Fundo está ativo no sistema do dispositivo selecionado" +Warning.Effect.Multiple="Múltiplos efeitos estão ativos no sistema do dispositivo selecionado"
View file
obs-studio-32.0.4.tar.xz/plugins/mac-avcapture/data/locale/vi-VN.ini -> obs-studio-32.1.0.tar.xz/plugins/mac-avcapture/data/locale/vi-VN.ini
Changed
@@ -15,3 +15,9 @@ Unknown="Không xác định (%1)" EnableAudio="Bật âm thanh nếu được thiết bị tương ứng hỗ trợ" Resolution="Độ phân giải" +Warning.Effect.Portrait="Hiệu ứng hệ thống chân dung đang hoạt động trên thiết bị đã chọn" +Warning.Effect.CenterStage="Hiệu ứng hệ thống Center Stage đang hoạt động trên thiết bị đã chọn" +Warning.Effect.StudioLight="Hiệu ứng hệ thống Studio Light đang hoạt động trên thiết bị đã chọn" +Warning.Effect.Reactions="Hiệu ứng hệ thống phản ứng đang hoạt động trên thiết bị đã chọn" +Warning.Effect.BackgroundReplacement="Hiệu ứng hệ thống thay thế nền đang hoạt động trên thiết bị đã chọn" +Warning.Effect.Multiple="Nhiều hiệu ứng hệ thống đang hoạt động trên thiết bị đã chọn"
View file
obs-studio-32.0.4.tar.xz/plugins/mac-avcapture/legacy/av-capture.mm -> obs-studio-32.1.0.tar.xz/plugins/mac-avcapture/legacy/av-capture.mm
Changed
@@ -1548,6 +1548,16 @@ using frame_rates_t = vector<pair<media_frames_per_second, media_frames_per_second>>; +static bool operator==(const media_frames_per_second &a, const media_frames_per_second &b) +{ + return a.numerator == b.numerator && a.denominator == b.denominator; +} + +static bool operator!=(const media_frames_per_second &a, const media_frames_per_second &b) +{ + return !(a == b); +} + static frame_rates_t enumerate_frame_rates(AVCaptureDevice *dev, const CMVideoDimensions *dims = nullptr) { frame_rates_t res; @@ -1588,16 +1598,6 @@ return res; } -static bool operator==(const media_frames_per_second &a, const media_frames_per_second &b) -{ - return a.numerator == b.numerator && a.denominator == b.denominator; -} - -static bool operator!=(const media_frames_per_second &a, const media_frames_per_second &b) -{ - return !(a == b); -} - static bool frame_rate_property_needs_update(obs_property_t *p, const frame_rates_t &frame_rates) { auto fps_num = frame_rates.size();
View file
obs-studio-32.0.4.tar.xz/plugins/mac-capture/data/locale/fil-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/mac-capture/data/locale/fil-PH.ini
Changed
@@ -3,9 +3,10 @@ CoreAudio.Device="Aparato" CoreAudio.Device.Default="Pumalya" ApplicationCapture="Pagkuha ng Application" -DisplayCapture="Ipakita paghuli" -DisplayCapture.Display="Ihayag" -DisplayCapture.ShowCursor="Ipakita ang Cursor" +DisplayCapture="Dakip ng Displey" +DisplayCapture.Display="Displey" +DisplayCapture.ShowCursor="Ipakita ang cursor" +DisplayCapture.HideOBS="Itago ang OBS sa dakip" WindowCapture="Pagkuha ng Window" WindowCapture.ShowShadow="Ipakita ang anino ng Window" Application="Aplikasyon"
View file
obs-studio-32.0.4.tar.xz/plugins/mac-capture/data/locale/lo-LA.ini -> obs-studio-32.1.0.tar.xz/plugins/mac-capture/data/locale/lo-LA.ini
Changed
@@ -1,13 +1,39 @@ -CoreAudio.InputCapture="ສຽບອຸປະກອນປະເພດສຽງ" -CoreAudio.OutputCapture="ສຽບອຸປະກອນປະເພດສຽງ" +CoreAudio.InputCapture="ການບັນທຶກສຽງຂາເຂົ້າ" +CoreAudio.OutputCapture="ການບັນທຶກສຽງຂາອອກ" CoreAudio.Device="ອຸປະກອນ" CoreAudio.Device.Default="ຄ່າເລີ່ມຕົ້ນ" -DisplayCapture="ຕຽມບັນທຶກໜ້າຈໍປະຈຸບັນ" +CoreAudio.Channel="ຊ່ອງສຽງ" +CoreAudio.Channel.Default="ຄ່າເລີ່ມຕົ້ນ" +CoreAudio.Channel.Unnamed="ບໍ່ມີຊື່" +CoreAudio.Channel.Device="ຊ່ອງສຽງຂອງອຸປະກອນ" +CoreAudio.None="ບໍ່ມີ" +CoreAudio.Downmix="ເປີດໃຊ້ງານການຮວມສຽງ (Downmix)" +ApplicationCapture="ການບັນທຶກແອັບພລິເຄຊັນ" +ApplicationAudioCapture="ການບັນທຶກສຽງແອັບພລິເຄຊັນ" +DesktopAudioCapture="ການບັນທຶກສຽງເດັສທັອບ" +DisplayCapture="ການບັນທຶກໜ້າຈໍ" DisplayCapture.Display="ຈໍສະແດງຜົນ" -WindowCapture="ຕຽມບັນທຶກໜ້າຕ່າງໂປຼແກຼມ" +DisplayCapture.ShowCursor="ສະແດງເຄີເຊີ" +DisplayCapture.HideOBS="ຊ່ອນ OBS ຈາກການບັນທຶກ" +WindowCapture="ການບັນທຶກໜ້າຕ່າງ" +WindowCapture.ShowShadow="ສະແດງເງົາຂອງໜ້າຕ່າງ" +Application="ແອັບພລິເຄຊັນ" WindowUtils.Window="ໜ້າຕ່າງ" +WindowUtils.ShowEmptyNames="ສະແດງໜ້າຕ່າງທີ່ບໍ່ມີຊື່" +WindowUtils.ShowHidden="ສະແດງໜ້າຕ່າງທີ່ເຕັມຈໍ ແລະ ຖືກຊ່ອນໄວ້ / ແອັບພລິເຄຊັນ" CropMode="ເລັມຂອບ" -Crop.origin.x="ເລັມຂອບຊ້າຍ" -Crop.origin.y="ເລັມຂອບຂອບເທິງ" -Crop.size.width="ເລັມຂອບຂວາ" -Crop.size.height="ເລັມຂອບລຸ່ມ" +CropMode.None="ບໍ່ມີ" +CropMode.Manual="ກຳນົດເອງ" +CropMode.ToWindow="ຕາມໜ້າຕ່າງ" +CropMode.ToWindowAndManual="ຕາມໜ້າຕ່າງ ແລະ ກຳນົດເອງ" +Crop.origin.x="ຊ້າຍ (X)" +Crop.origin.y="ເທິງ (Y)" +Crop.size.width="ຄວາມກວ້າງ" +Crop.size.height="ຄວາມສູງ" +SCK.Name="ການບັນທຶກໜ້າຈໍ macOS" +SCK.Name.Beta="ການບັນທຶກໜ້າຈໍ macOS (BETA)" +SCK.Audio.Name="ການບັນທຶກສຽງ macOS" +SCK.AudioUnavailable="ການບັນທຶກສຽງຮອງຮັບສະເພາະ macOS 13 ຫຼື ໃໝ່ກວ່າ" +SCK.CaptureTypeUnavailable="ປະເພດການບັນທຶກທີ່ເລືອກຮອງຮັບສະເພາະ macOS 13 ຫຼື ໃໝ່ກວ່າ" +SCK.Method="ວິທີການ" +SCK.Restart="ເລີ່ມການບັນທຶກໃໝ່"
View file
obs-studio-32.0.4.tar.xz/plugins/mac-capture/data/locale/tl-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/mac-capture/data/locale/tl-PH.ini
Changed
@@ -2,8 +2,10 @@ CoreAudio.OutputCapture="Panglabas na pagkuha ng Audio" CoreAudio.Device="Aparato" CoreAudio.Device.Default="I-default" -DisplayCapture="Ipakita ang nakuha" -DisplayCapture.Display="Ipakita" +DisplayCapture="Dakip ng Tanghal" +DisplayCapture.Display="Tanghal" +DisplayCapture.ShowCursor="Ipakita ang panturo" +DisplayCapture.HideOBS="Itago ang OBS sa dakip" WindowCapture="Nakuhang bintana" WindowUtils.Window="Bintana" CropMode="I-crop"
View file
obs-studio-32.0.4.tar.xz/plugins/mac-capture/mac-sck-common.m -> obs-studio-32.1.0.tar.xz/plugins/mac-capture/mac-sck-common.m
Changed
@@ -83,6 +83,10 @@ obs_property_t *display_list = obs_properties_get(props, "display_uuid"); obs_property_list_clear(display_list); + // Add null entry to the top of the content list, to avoid inadvertent capture of the first enumerated display + // when opening the source's properties window + obs_property_list_add_string(display_list, " ", NULL); + for (SCDisplay *display in sc->shareable_content.displays) { NSScreen *display_screen = nil; for (NSScreen *screen in NSScreen.screens) { @@ -127,6 +131,10 @@ obs_property_t *window_list = obs_properties_get(props, "window"); obs_property_list_clear(window_list); + // Add null entry to the top of the content list, to avoid inadvertent capture of the first enumerated window + // when opening the source's properties window + obs_property_list_add_int(window_list, " ", kCGNullWindowID); + NSPredicate *filteredWindowPredicate = NSPredicate predicateWithBlock:^BOOL(SCWindow *window, NSDictionary *bindings __unused) { NSString *app_name = window.owningApplication.applicationName; @@ -173,6 +181,10 @@ obs_property_t *application_list = obs_properties_get(props, "application"); obs_property_list_clear(application_list); + // Add null entry to the top of the content list, to avoid inadvertent capture of the first enumerated application + // when opening the source's properties window + obs_property_list_add_string(application_list, " ", 0); + NSArray<SCRunningApplication *> *filteredApplications; filteredApplications = sc->shareable_content.applications filteredArrayUsingPredicate:NSPredicate predicateWithBlock:^BOOL(SCRunningApplication *app,
View file
obs-studio-32.0.4.tar.xz/plugins/mac-capture/mac-sck-video-capture.m -> obs-studio-32.1.0.tar.xz/plugins/mac-capture/mac-sck-video-capture.m
Changed
@@ -392,24 +392,8 @@ static void sck_video_capture_defaults(obs_data_t *settings) { - CGDirectDisplayID initial_display = 0; - { - NSScreen *mainScreen = NSScreen mainScreen; - if (mainScreen) { - NSNumber *screen_num = mainScreen.deviceDescription@"NSScreenNumber"; - if (screen_num) { - initial_display = (CGDirectDisplayID) (uintptr_t) screen_num.pointerValue; - } - } - } - - CFUUIDRef display_uuid = CGDisplayCreateUUIDFromDisplayID(initial_display); - CFStringRef uuid_string = CFUUIDCreateString(kCFAllocatorDefault, display_uuid); - obs_data_set_default_string(settings, "display_uuid", CFStringGetCStringPtr(uuid_string, kCFStringEncodingUTF8)); - CFRelease(uuid_string); - CFRelease(display_uuid); - obs_data_set_default_string(settings, "application", NULL); + obs_data_set_default_string(settings, "display_uuid", NULL); obs_data_set_default_int(settings, "type", ScreenCaptureDisplayStream); obs_data_set_default_int(settings, "window", kCGNullWindowID); obs_data_set_default_bool(settings, "show_cursor", true);
View file
obs-studio-32.0.4.tar.xz/plugins/mac-capture/window-utils.m -> obs-studio-32.1.0.tar.xz/plugins/mac-capture/window-utils.m
Changed
@@ -267,7 +267,7 @@ } const char *display_uuid = obs_data_get_string(settings, "display_uuid"); - if (display_uuid) { + if (display_uuid && *display_uuid) { CFStringRef uuid_string = CFStringCreateWithCString(kCFAllocatorDefault, display_uuid, kCFStringEncodingUTF8); CFUUIDRef uuid_ref = CFUUIDCreateFromString(kCFAllocatorDefault, uuid_string); CGDirectDisplayID display = CGDisplayGetDisplayIDFromUUID(uuid_ref);
View file
obs-studio-32.0.4.tar.xz/plugins/mac-syphon/data/locale/az-AZ.ini -> obs-studio-32.1.0.tar.xz/plugins/mac-syphon/data/locale/az-AZ.ini
Changed
@@ -1,9 +1,9 @@ Syphon="Syphon Müştərisi" Source="Mənbə" SyphonLicense="Syphon Lisenziyası" -Crop="Götür" -Crop.origin.x="Soldan götür" -Crop.origin.y="Üstdən götür" -Crop.size.width="Sağdan götür" -Crop.size.height="Altdan götür" -AllowTransparency="Şəffaflığa icazə ver" +Crop="Kəs" +Crop.origin.x="Soldan kəs" +Crop.origin.y="Üstdən kəs" +Crop.size.width="Sağdan kəs" +Crop.size.height="Altdan kəs" +AllowTransparency="Şəffaflığa İcazə Ver"
View file
obs-studio-32.1.0.tar.xz/plugins/mac-syphon/data/locale/lo-LA.ini
Added
@@ -0,0 +1,9 @@ +Syphon="ລູກຂ່າຍ Syphon" +Source="ແຫຼ່ງສັນຍານ" +SyphonLicense="ໃບອະນຸຍາດ Syphon" +Crop="ຕັດຂອບ" +Crop.origin.x="ຕັດຂອບເບື້ອງຊ້າຍ" +Crop.origin.y="ຕັດຂອບດ້ານເທິງ" +Crop.size.width="ຕັດຂອບເບື້ອງຂວາ" +Crop.size.height="ຕັດຂອບດ້ານລຸ່ມ" +AllowTransparency="ອະນຸຍາດໃຫ້ມີຄວາມໂປ່ງໃສ"
View file
obs-studio-32.0.4.tar.xz/plugins/mac-videotoolbox/data/locale/et-EE.ini -> obs-studio-32.1.0.tar.xz/plugins/mac-videotoolbox/data/locale/et-EE.ini
Changed
@@ -13,6 +13,10 @@ KeyframeIntervalSec="Võtmekaadri intervall (0=automaatne)" Profile="Profiil" UseBFrames="Kasuta B-kaadreid" +SpatialAQ="Ruumiline õhukvaliteet" +SpatialAQ.Auto="Automaatne" +SpatialAQ.Disabled="Puudega" +SpatialAQ.Enabled="Lubatud" RateControl="Kiiruse kontroll" ColorFormatUnsupported="Apple VT kodeerija ei toeta valitud värvivormingut. Vali ühilduv värvivorming Seaded -> Täpsemad või kasuta teist kodeerijat." FullRangeUnsupported="16-bitised Apple'i VT-koodrid ei toeta täisvaliku värve. Valige menüüs Seaded -> Täpsemalt piiratud värvivahemik."
View file
obs-studio-32.1.0.tar.xz/plugins/mac-videotoolbox/data/locale/lo-LA.ini
Added
@@ -0,0 +1,22 @@ +VTH264EncHW="ຕົວເຂົ້າລະຫັດຮາດແວ Apple VT H264" +VTH264EncSW="ຕົວເຂົ້າລະຫັດຊອບແວ Apple VT H264" +VTHEVCEncHW="ຕົວເຂົ້າລະຫັດຮາດແວ Apple VT HEVC" +VTHEVCEncT2="ຕົວເຂົ້າລະຫັດຮາດແວ Apple VT HEVC T2" +VTHEVCEncSW="ຕົວເຂົ້າລະຫັດຊອບແວ Apple VT HEVC" +VTProResEncHW="ຕົວເຂົ້າລະຫັດຮາດແວ Apple VT ProRes" +VTProResEncSW="ຕົວເຂົ້າລະຫັດຊອບແວ Apple VT ProRes" +Bitrate="ບິດເຣດ" +Quality="ຄຸນນະພາບ" +UseMaxBitrate="ຈຳກັດບິດເຣດ" +MaxBitrate="ບິດເຣດສູງສຸດ" +MaxBitrateWindow="ວິນໂດບິດເຣດສູງສຸດ" +KeyframeIntervalSec="ໄລຍະຫ່າງຄີເຟຣມ (0=ອັດຕະໂນມັດ)" +Profile="ໂປຣໄຟລ໌" +UseBFrames="ໃຊ້ B-Frames" +SpatialAQ.Auto="ອັດຕະໂນມັດ" +SpatialAQ.Disabled="ປິດໃຊ້ງານ" +SpatialAQ.Enabled="ເປີດໃຊ້ງານ" +RateControl="ການຄວບຄຸມອັດຕາ" +ColorFormatUnsupported="ຮູບແບບສີທີ່ເລືອກບໍ່ຮອງຮັບໂດຍຕົວເຂົ້າລະຫັດ Apple VT ທີ່ເລືອກ. ໃຫ້ເລືອກຮູບແບບສີທີ່ເຂົ້າກັນໄດ້ໃນ ການຕັ້ງຄ່າ -> ຂັ້ນສູງ ຫຼື ໃຊ້ຕົວເຂົ້າລະຫັດອື່ນ." +FullRangeUnsupported="ສີແບບເຕັມຊ່ວງ (Full Range) ບໍ່ຮອງຮັບໂດຍຕົວເຂົ້າລະຫັດ Apple VT ແບບ 16 ບິດ. ໃຫ້ເລືອກສີແບບຈຳກັດຊ່ວງ (Limited Range) ໃນ ການຕັ້ງຄ່າ -> ຂັ້ນສູງ." +ProResCodec="ໂຄເດັກ ProRes"
View file
obs-studio-32.0.4.tar.xz/plugins/mac-videotoolbox/data/locale/pt-BR.ini -> obs-studio-32.1.0.tar.xz/plugins/mac-videotoolbox/data/locale/pt-BR.ini
Changed
@@ -13,7 +13,7 @@ KeyframeIntervalSec="Intervalo de keyframes (0=auto)" Profile="Perfil" UseBFrames="Usar B-Frames" -SpatialAQ="AQ Espacial" +SpatialAQ="QA espacial" SpatialAQ.Auto="Automático" SpatialAQ.Disabled="Desativado" SpatialAQ.Enabled="Ativado"
View file
obs-studio-32.0.4.tar.xz/plugins/mac-videotoolbox/encoder.c -> obs-studio-32.1.0.tar.xz/plugins/mac-videotoolbox/encoder.c
Changed
@@ -1375,10 +1375,10 @@ obs_data_set_default_string(settings, "rate_control", "CBR"); } } - obs_data_set_default_int(settings, "bitrate", 2500); + obs_data_set_default_int(settings, "bitrate", 6000); obs_data_set_default_int(settings, "quality", 60); obs_data_set_default_bool(settings, "limit_bitrate", false); - obs_data_set_default_int(settings, "max_bitrate", 2500); + obs_data_set_default_int(settings, "max_bitrate", 6000); obs_data_set_default_double(settings, "max_bitrate_window", 1.5f); obs_data_set_default_int(settings, "keyint_sec", 2); obs_data_set_default_string(settings, "profile",
View file
obs-studio-32.0.4.tar.xz/plugins/mac-virtualcam/src/common/MachProtocol.h -> obs-studio-32.1.0.tar.xz/plugins/mac-virtualcam/src/common/MachProtocol.h
Changed
@@ -8,7 +8,7 @@ #define MACH_SERVICE_NAME "com.obsproject.obs-mac-virtualcam.server" typedef enum { - //! Initial connect message sent from the client to the server to initate a connection + //! Initial connect message sent from the client to the server to initiate a connection MachMsgIdConnect = 1, //! Message containing data for a frame MachMsgIdFrame = 2,
View file
obs-studio-32.0.4.tar.xz/plugins/mac-virtualcam/src/obs-plugin/data/locale/az-AZ.ini -> obs-studio-32.1.0.tar.xz/plugins/mac-virtualcam/src/obs-plugin/data/locale/az-AZ.ini
Changed
@@ -1,1 +1,10 @@ -Plugin_Name="macOS Əyani Veb Kamera" +Plugin_Name="macOS Virtual Veb-kamera" +Error.SystemExtension.NotInstalled="Virtual kamera quraşdırılmayıb.\n\nZəhmət olmasa, Sistem Sazlamaları → Məxfilik və Təhlükəsizlik → Təhlükəsizlik bölməsində OBS-ə sistem proqram təminatını quraşdırmağa icazə verin.\n\nƏgər bu mesaj bundan sonra da görünsə, OBS-i yenidən başlatmağınız lazım gələ bilər." +Error.SystemExtension.NotInstalled.MacOS15="Virtual kamera quraşdırılmayıb.\n\nZəhmət olmasa, Sistem Sazlamaları → Ümumi → Giriş Obyektləri və Genişləndirmələr → Kamera Genişləndirmələri bölməsində OBS-ə kamera sistem genişləndirməsini quraşdırmağa icazə verin.\n\nƏgər bu mesaj bundan sonra da görünsə, OBS-i yenidən başlatmağınız lazım gələ bilər." +Error.SystemExtension.CameraUnavailable="Virtual kamera sistem prosesi tapılmadı.\n\nBu, macOS istifadəçi hesabınızdan çıxıb yenidən daxil olmaqla və ya kompüterinizi yenidən başlatmaqla həll edilə bilər." +Error.SystemExtension.CameraNotStarted="Virtual kameranı başlatmaq mümkün olmadı.\n\nZəhmət olmasa, yenidən cəhd edin." +Error.SystemExtension.InstallationError="Virtual kamera quraşdırılarkən xəta baş verdi:" +Error.SystemExtension.WrongLocation="OBS, \"/Applications\" qovluğunda deyilsə, virtual kameranı quraşdıra bilməz. Zəhmət olmasa, OBS-i \"/Applications\" qovluğuna köçürün." +Error.SystemExtension.CompleteAfterReboot="Virtual kameranın quraşdırılması sistem yenidən başladıqdan sonra tamamlanacaq." +Error.DAL.NotInstalled="Virtual kameranı quraşdırmaq və ya yeniləmək mümkün olmadı.\n\nZəhmət olmasa, yenidən cəhd edin və tələb olunduqda administrator adı və şifrəsini daxil edin." +Error.DAL.NotUninstalled="Köhnə virtual kameranı silmək mümkün olmadı.\n\nZəhmət olmasa, yenidən cəhd edin və tələb olunduqda administrator adı və şifrəsini daxil edin."
View file
obs-studio-32.0.4.tar.xz/plugins/mac-virtualcam/src/obs-plugin/data/locale/de-DE.ini -> obs-studio-32.1.0.tar.xz/plugins/mac-virtualcam/src/obs-plugin/data/locale/de-DE.ini
Changed
@@ -1,6 +1,6 @@ Plugin_Name="Virtuelle Kamera für macOS" -Error.SystemExtension.NotInstalled="Die virtuelle Kamera ist nicht installiert.\n\nBitte erlauben Sie OBS Systemsoftware zu installieren. (Systemeinstellungen → „Datenschutz & Sicherheit“ → „Sicherheit“)\n\nStarten Sie OBS neu, falls diese Nachricht weiterhin erscheint." -Error.SystemExtension.NotInstalled.MacOS15="Die virtuelle Kamera ist nicht installiert.\n\nBitte erlauben Sie OBS die Kamerasystemerweiterung zu installieren. (Systemeinstellungen → „Allgemein“ → „Anmeldeobjekte & Erweiterungen“ → „Kameraerweiterungen“)\n\nStarten Sie OBS neu, falls diese Nachricht weiterhin erscheint." +Error.SystemExtension.NotInstalled="Die virtuelle Kamera ist nicht installiert.\n\nBitte erlauben Sie OBS Systemsoftware zu installieren. („Systemeinstellungen“ → „Datenschutz & Sicherheit“ → „Sicherheit“)\n\nStarten Sie OBS neu, falls diese Nachricht weiterhin erscheint." +Error.SystemExtension.NotInstalled.MacOS15="Die virtuelle Kamera ist nicht installiert.\n\nBitte erlauben Sie OBS die Kamerasystemerweiterung zu installieren. („Systemeinstellungen“ → „Allgemein“ → „Anmeldeobjekte & Erweiterungen“ → „Kameraerweiterungen“)\n\nStarten Sie OBS neu, falls diese Nachricht weiterhin erscheint." Error.SystemExtension.CameraUnavailable="Der Systemprozess der virtuellen Kamera konnte nicht gefunden werden.\n\nDas Problem lässt sich möglicherweise beheben, indem Sie sich von Ihrem macOS-Benutzerkonto ab- und wieder anmelden oder Ihren Computer neu starten." Error.SystemExtension.CameraNotStarted="Die virtuelle Kamera konnte nicht gestartet werden.\n\nBitte versuchen Sie es erneut." Error.SystemExtension.InstallationError="Ein Fehler ist während der Installation der virtuellen Kamera aufgetreten:"
View file
obs-studio-32.1.0.tar.xz/plugins/mac-virtualcam/src/obs-plugin/data/locale/lo-LA.ini
Added
@@ -0,0 +1,10 @@ +Plugin_Name="macOS ເວັບແຄັມຈຳລອງ" +Error.SystemExtension.NotInstalled="ກ້ອງຈຳລອງຍັງບໍ່ໄດ້ຕິດຕັ້ງ.\n\nກະລຸນາອະນຸຍາດໃຫ້ OBS ຕິດຕັ້ງຊອບແວລະບົບໃນ ການຕັ້ງຄ່າລະບົບ → ຄວາມເປັນສ່ວນຕົວ ແລະ ຄວາມປອດໄພ → ຄວາມປອດໄພ.\n\nເຈົ້າອາດຈະຕ້ອງເລີ່ມຕົ້ນ OBS ໃໝ່ ຖ້າຂໍ້ຄວາມນີ້ຍັງປະກົດຂຶ້ນຫຼັງຈາກນັ້ນ." +Error.SystemExtension.NotInstalled.MacOS15="ກ້ອງຈຳລອງຍັງບໍ່ໄດ້ຕິດຕັ້ງ.\n\nກະລຸນາອະນຸຍາດໃຫ້ OBS ຕິດຕັ້ງສ່ວນຂະຫຍາຍລະບົບກ້ອງໃນ ການຕັ້ງຄ່າລະບົບ → ທົ່ວໄປ → ລາຍການເຂົ້າລະບົບ ແລະ ສ່ວນຂະຫຍາຍ → ສ່ວນຂະຫຍາຍກ້ອງ.\n\nເຈົ້າອາດຈະຕ້ອງເລີ່ມຕົ້ນ OBS ໃໝ່ ຖ້າຂໍ້ຄວາມນີ້ຍັງປະກົດຂຶ້ນຫຼັງຈາກນັ້ນ." +Error.SystemExtension.CameraUnavailable="ບໍ່ພົບຂະບວນການລະບົບຂອງກ້ອງຈຳລອງ.\n\nບັນຫານີ້ອາດແກ້ໄຂໄດ້ໂດຍການອອກຈາກລະບົບ ແລະ ເຂົ້າສູ່ລະບົບຄືນໃໝ່ໃນບັນຊີຜູ້ໃຊ້ macOS ຂອງເຈົ້າ, ຫຼື ໂດຍການເລີ່ມຕົ້ນຄອມພິວເຕີໃໝ່." +Error.SystemExtension.CameraNotStarted="ບໍ່ສາມາດເລີ່ມຕົ້ນກ້ອງຈຳລອງໄດ້.\n\nກະລຸນາລອງໃໝ່ອີກຄັ້ງ." +Error.SystemExtension.InstallationError="ເກີດຂໍ້ຜິດພາດຂຶ້ນໃນຂະນະທີ່ກຳລັງຕິດຕັ້ງກ້ອງຈຳລອງ:" +Error.SystemExtension.WrongLocation="OBS ບໍ່ສາມາດຕິດຕັ້ງກ້ອງຈຳລອງໄດ້ ຖ້າມັນບໍ່ຢູ່ໃນ \"/Applications\". ກະລຸນາຍ້າຍ OBS ໄປໃສ່ໄດເຣັກທໍຣີ \"/Applications\"." +Error.SystemExtension.CompleteAfterReboot="ການຕິດຕັ້ງກ້ອງຈຳລອງຈະສຳເລັດຫຼັງຈາກມີການເລີ່ມຕົ້ນລະບົບໃໝ່." +Error.DAL.NotInstalled="ບໍ່ສາມາດຕິດຕັ້ງ ຫຼື ອັບເດດກ້ອງຈຳລອງໄດ້.\n\nກະລຸນາລອງໃໝ່ອີກຄັ້ງ ແລະ ປ້ອນຊື່ ແລະ ລະຫັດຜ່ານຂອງຜູ້ບໍລິຫານລະບົບ ເມື່ອມີການຮ້ອງຂໍ." +Error.DAL.NotUninstalled="ບໍ່ສາມາດລຶບກ້ອງຈຳລອງແບບເກົ່າອອກໄດ້.\n\nກະລຸນາລອງໃໝ່ອີກຄັ້ງ ແລະ ປ້ອນຊື່ ແລະ ລະຫັດຜ່ານຂອງຜູ້ບໍລິຫານລະບົບ ເມື່ອມີການຮ້ອງຂໍ."
View file
obs-studio-32.0.4.tar.xz/plugins/nv-filters/data/locale/ar-SA.ini -> obs-studio-32.1.0.tar.xz/plugins/nv-filters/data/locale/ar-SA.ini
Changed
@@ -6,10 +6,13 @@ Nvafx.Method.Dereverb="NVIDIA إزالة صدى الغرفة " Nvafx.Method.DenoiserPlusDereverb="NVIDIA إزالة الضوضاء + إزالة صدى الغرفة" Nvafx.OutdatedSDK="تحذير: الرجاء ترقية كل من الفيديو والـ SDK NVIDIA . الإصدار الحالي من ملف SDK للصوت قديم ." +Nvafx.VAD="صوت محسّن" Nvvfx.Method.Greenscreen="NVIDIA إزالة الخلفية " Nvvfx.Method.Greenscreen.Mode="النمط" Nvvfx.Method.Greenscreen.Quality="الجودة (استخدام عالي لكرت الشاشة، لكن جودة أفضل)" Nvvfx.Method.Greenscreen.Performance="الأداء (استخدام أقل لكرت الشاشة، جودة عادية)" +Nvvfx.Method.Greenscreen.Quality.Chair="الجودة (إستخدام أعلى لكارت الشاشة، جودة أفضل) + إزالة Chair" +Nvvfx.Method.Greenscreen.Performance.Chair="الجودة (إستخدام أقل لكارت الشاشة، جودة جيدة) + Chair" Nvvfx.Method.Greenscreen.Threshold="الحد الاقصى" Nvvfx.OutdatedSDK="تحذير: يرجى ترقية مجموعة أدوات تطوير البرامج لـNVIDIA لكل من الفيديو والصوت. نسختك الحالية لمجموعة أدوات تطوير البرامج للفيديو قديمة." Nvvfx.Method.Greenscreen.Processing="إقناع تردد التحديث في الأطر"
View file
obs-studio-32.0.4.tar.xz/plugins/nv-filters/data/locale/de-DE.ini -> obs-studio-32.1.0.tar.xz/plugins/nv-filters/data/locale/de-DE.ini
Changed
@@ -9,7 +9,7 @@ Nvafx.VAD="Stimme optimiert" Nvvfx.Method.Greenscreen="NVIDIA-Hintergrundentfernung" Nvvfx.Method.Greenscreen.Mode="Modus" -Nvvfx.Method.Greenscreen.Quality="Qualität (Höhere GPU-Nutzung, bessere Qualität)" +Nvvfx.Method.Greenscreen.Quality="Qualität (höhere GPU-Nutzung, bessere Qualität)" Nvvfx.Method.Greenscreen.Performance="Performance (Niedrigere GPU-Nutzung, gute Qualität)" Nvvfx.Method.Greenscreen.Quality.Chair="Qualität (höhere GPU-Nutzung, bessere Qualität) + Stuhlentfernung" Nvvfx.Method.Greenscreen.Performance.Chair="Leistung (niedrigere GPU-Nutzung, gute Qualität) + Stuhlentfernung"
View file
obs-studio-32.0.4.tar.xz/plugins/nv-filters/data/locale/el-GR.ini -> obs-studio-32.1.0.tar.xz/plugins/nv-filters/data/locale/el-GR.ini
Changed
@@ -1,3 +1,14 @@ +Nvafx="Ηχητικά Εφέ NVIDIA" +Nvafx.SuppressLevel="Επίπεδο Καταστολής" +Nvafx.Intensity="Ένταση Καταστολής" Nvafx.Method="Μέθοδος" +Nvafx.Method.Denoiser="Αφαίρεση Θορύβου NVIDIA" +Nvafx.Method.Dereverb="Αφαίρεση Ήχου Δωματίου NVIDIA" +Nvafx.Method.DenoiserPlusDereverb="Αφαίρεση Θορύβου + Αφαίρεση Ήχου Δωματίου NVIDIA" +Nvafx.VAD="Βελτιστοποιημένη Φωνή" +Nvvfx.Method.Greenscreen="Αφαίρεση Φόντου NVIDIA" Nvvfx.Method.Greenscreen.Mode="Λειτουργία" Nvvfx.Method.Greenscreen.Threshold="Κατώφλι" +Nvvfx.Method.BlurFilter="Φίλτρο Θολώματος NVIDIA" +Nvvfx.Method.BackgroundBlurFilter="Φίλτρο Θολώματος Φόντου NVIDIA" +Nvvfx.Method.Blur.Strength="Ένταση Θολώματος"
View file
obs-studio-32.0.4.tar.xz/plugins/nv-filters/data/locale/en-GB.ini -> obs-studio-32.1.0.tar.xz/plugins/nv-filters/data/locale/en-GB.ini
Changed
@@ -1,1 +1,3 @@ -# \ No newline at end of file +Nvafx.VAD="Voice Optimised" +Nvvfx.Method.Greenscreen.Quality.Chair="Quality (higher GPU usage, better quality) + chair removal" +Nvvfx.Method.Greenscreen.Performance.Chair="Performance (lower GPU usage, good quality) + chair removal"
View file
obs-studio-32.0.4.tar.xz/plugins/nv-filters/data/locale/fi-FI.ini -> obs-studio-32.1.0.tar.xz/plugins/nv-filters/data/locale/fi-FI.ini
Changed
@@ -6,10 +6,13 @@ Nvafx.Method.Dereverb="NVIDIA-huonekaiun poisto" Nvafx.Method.DenoiserPlusDereverb="NVIDIA-kohinanpoisto + huonekaiun poisto" Nvafx.OutdatedSDK="VAROITUS: Päivitä molemmat NVIDIA Video & Audio SDK. Nykyinen Audio SDK versiosi on vanhentunut." +Nvafx.VAD="Äänioptimoitu" Nvvfx.Method.Greenscreen="NVIDIA-taustanpoisto" Nvvfx.Method.Greenscreen.Mode="Tila" Nvvfx.Method.Greenscreen.Quality="Laatu (suurempi GPU-kuormitus, parempi kuvanlaatu)" Nvvfx.Method.Greenscreen.Performance="Suorituskyky (pienempi GPU:n käyttö, hyvä laatu)" +Nvvfx.Method.Greenscreen.Quality.Chair="Laatu (suurempi GPU-kuormitus, parempi kuvanlaatu) + tuolin poisto" +Nvvfx.Method.Greenscreen.Performance.Chair="Suorituskyky (pienempi GPU-kuormitus, hyvä kuvanlaatu) + tuolin poisto" Nvvfx.Method.Greenscreen.Threshold="Kynnysarvo" Nvvfx.OutdatedSDK="VAROITUS: Päivitä molemmat NVIDIA Video & Audio SDK. Nykyinen Audio SDK versiosi on vanhentunut." Nvvfx.Method.Greenscreen.Processing="Maskin päivitysväli ruuduissa"
View file
obs-studio-32.0.4.tar.xz/plugins/nv-filters/data/locale/hu-HU.ini -> obs-studio-32.1.0.tar.xz/plugins/nv-filters/data/locale/hu-HU.ini
Changed
@@ -6,10 +6,13 @@ Nvafx.Method.Dereverb="NVIDIA szobavisszhang-eltávolító" Nvafx.Method.DenoiserPlusDereverb="NVIDIA zajeltávolító + szobavisszhang-eltávolító" Nvafx.OutdatedSDK="FIGYELMEZTETÉS: Frissítse az NVIDIA Video & Audio SDK-t. Az Audio SDK jelenlegi verziója elavult." +Nvafx.VAD="Optimalizált beszédhang" Nvvfx.Method.Greenscreen="NVIDIA háttéreltávolító" Nvvfx.Method.Greenscreen.Mode="Mód" Nvvfx.Method.Greenscreen.Quality="Minőség (magasabb GPU-használat, jobb minőség)" Nvvfx.Method.Greenscreen.Performance="Teljesítmény (alacsonyabb GPU-használat, jó minőség)" +Nvvfx.Method.Greenscreen.Quality.Chair="Minőség (magasabb GPU-használat, jobb minőség) + székeltávolítás" +Nvvfx.Method.Greenscreen.Performance.Chair="Teljesítmény (alacsonyabb GPU-használat, jó minőség) + székeltávolítás" Nvvfx.Method.Greenscreen.Threshold="Küszöbérték" Nvvfx.OutdatedSDK="FIGYELMEZTETÉS: Frissítse az NVIDIA Video és Audio SDK-t. A Video SDK jelenlegi verziója elavult." Nvvfx.Method.Greenscreen.Processing="Maszkfrissítés gyakorisága képkockaszámban"
View file
obs-studio-32.1.0.tar.xz/plugins/nv-filters/data/locale/kmr-TR.ini
Added
@@ -0,0 +1,4 @@ +Nvafx.Method="Rêbaz" +Nvvfx.Method.Greenscreen.Mode="Awa" +Nvvfx.Method.Greenscreen.Quality="Kalîte (bilindtir bikaranîna YKG, çêtir kalîte)" +Nvvfx.Method.Greenscreen.Performance="Pêkanîn (kêmtir bikaranîna YKG, çêtir kalîte)"
View file
obs-studio-32.1.0.tar.xz/plugins/nv-filters/data/locale/lo-LA.ini
Added
@@ -0,0 +1,22 @@ +Nvafx="ເອັບເຟັກສຽງ NVIDIA" +Nvafx.SuppressLevel="ລະດັບການສະກັດກັ້ນ" +Nvafx.Intensity="ຄວາມເຂັ້ມຂຸ້ນຂອງການສະກັດກັ້ນ" +Nvafx.Method="ວິທີການ" +Nvafx.Method.Denoiser="ການລົບສຽງລົບກວນ NVIDIA" +Nvafx.Method.Dereverb="ການລົບສຽງສະທ້ອນໃນຫ້ອງ NVIDIA" +Nvafx.Method.DenoiserPlusDereverb="ການລົບສຽງລົບກວນ NVIDIA + ການລົບສຽງສະທ້ອນໃນຫ້ອງ" +Nvafx.OutdatedSDK="ຄຳເຕືອນ: ກະລຸນາອັບເກຣດທັງ NVIDIA Video & Audio SDK. ລຸ້ນ Audio SDK ປັດຈຸບັນຂອງທ່ານນັ້ນລ້າສະໄໝແລ້ວ." +Nvafx.VAD="ປັບໃຫ້ເໝາະສົມກັບສຽງເວົ້າ" +Nvvfx.Method.Greenscreen="ການລົບພື້ນຫຼັງ NVIDIA" +Nvvfx.Method.Greenscreen.Mode="ໂໝດ" +Nvvfx.Method.Greenscreen.Quality="ຄຸນນະພາບ (ການໃຊ້ງານ GPU ສູງກວ່າ, ຄຸນນະພາບດີກວ່າ)" +Nvvfx.Method.Greenscreen.Performance="ປະສິດທິພາບ (ການໃຊ້ງານ GPU ຕ່ຳກວ່າ, ຄຸນນະພາບດີ)" +Nvvfx.Method.Greenscreen.Quality.Chair="ຄຸນນະພາບ (ການໃຊ້ງານ GPU ສູງກວ່າ, ຄຸນນະພາບດີກວ່າ) + ການລົບຕັ່ງ" +Nvvfx.Method.Greenscreen.Performance.Chair="ປະສິດທິພາບ (ການໃຊ້ງານ GPU ຕ່ຳກວ່າ, ຄຸນນະພາບດີ) + ການລົບຕັ່ງ" +Nvvfx.Method.Greenscreen.Threshold="ເກນ" +Nvvfx.OutdatedSDK="ຄຳເຕືອນ: ກະລຸນາອັບເກຣດທັງ NVIDIA Video & Audio SDK. ລຸ້ນ Video SDK ປັດຈຸບັນຂອງທ່ານນັ້ນລ້າສະໄໝແລ້ວ." +Nvvfx.Method.Greenscreen.Processing="ຄວາມຖີ່ຂອງການໂຫຼດໜ້າກາກຄືນໃໝ່ເປັນເຟຣມ" +Nvvfx.Method.Greenscreen.Processing.Hint="ສິ່ງນີ້ຊ່ວຍຫຼຸດຜ່ອນພາລະຂອງ GPU ໂດຍການສ້າງໜ້າກາກທຸກໆ N ເຟຣມເທົ່ານັ້ນ (ຄ່າເລີ່ມຕົ້ນແມ່ນ 2)." +Nvvfx.Method.BlurFilter="ໂຕກອງຄວາມມົວ NVIDIA" +Nvvfx.Method.BackgroundBlurFilter="ໂຕກອງພື້ນຫຼັງມົວ NVIDIA" +Nvvfx.Method.Blur.Strength="ຄວາມເຂັ້ມຂຸ້ນຂອງຄວາມມົວ"
View file
obs-studio-32.0.4.tar.xz/plugins/nv-filters/data/locale/sk-SK.ini -> obs-studio-32.1.0.tar.xz/plugins/nv-filters/data/locale/sk-SK.ini
Changed
@@ -6,10 +6,13 @@ Nvafx.Method.Dereverb="NVIDIA Odstránenie echa miestnosti" Nvafx.Method.DenoiserPlusDereverb="NVIDIA Odstránenie šumu + Odstránenie echa miestnosti" Nvafx.OutdatedSDK="VAROVANIE: Prosím inovujte obe NVIDIA Video & Audio SDK. Vaša momentálna verzia Audio SDK je zastaralá." +Nvafx.VAD="Optimalizovaný hlas" Nvvfx.Method.Greenscreen="NVIDIA Odstránenie pozadia" Nvvfx.Method.Greenscreen.Mode="Režim" Nvvfx.Method.Greenscreen.Quality="Kvalita (vyššie využitie GPU, lepšia kvalita)" Nvvfx.Method.Greenscreen.Performance="Výkon (nižšie využitie GPU, dobrá kvalita)" +Nvvfx.Method.Greenscreen.Quality.Chair="Kvalita (vyššie využitie GPU, lepšia kvalita) + Odstránenie stoličky" +Nvvfx.Method.Greenscreen.Performance.Chair="Výkon (nižšie využitie GPU, dobrá kvalita) + Odstránenie stoličky" Nvvfx.Method.Greenscreen.Threshold="Hranica" Nvvfx.OutdatedSDK="VAROVANIE: Prosím inovujte obe NVIDIA Video & Audio SDK. Vaša momentálna verzia Video SDK je zastaralá." Nvvfx.Method.Greenscreen.Processing="Obnovovacia frekvencia masky v snímkoch"
View file
obs-studio-32.0.4.tar.xz/plugins/nv-filters/data/locale/vi-VN.ini -> obs-studio-32.1.0.tar.xz/plugins/nv-filters/data/locale/vi-VN.ini
Changed
@@ -6,10 +6,13 @@ Nvafx.Method.Dereverb="Loại bỏ tiếng vang phòng NVIDIA" Nvafx.Method.DenoiserPlusDereverb="Loại bỏ tiếng ồn + Loại bỏ tiếng vang trong phòng NVIDIA" Nvafx.OutdatedSDK="CẢNH BÁO: Hãy cập nhật SDK NVIDIA hình ảnh và âm thanh. Phiên bản hiện tại của SDK âm thanh đã cũ." +Nvafx.VAD="Tối ưu cho giọng nói" Nvvfx.Method.Greenscreen="Xóa nền NVIDIA" Nvvfx.Method.Greenscreen.Mode="Chế độ" Nvvfx.Method.Greenscreen.Quality="Chất lượng (sử dụng GPU cao hơn, chất lượng tốt hơn)" Nvvfx.Method.Greenscreen.Performance="Hiệu suất (sử dụng GPU thấp hơn, chất lượng tốt)" +Nvvfx.Method.Greenscreen.Quality.Chair="Chất lượng (sử dụng nhiều GPU hơn, chất lượng tốt hơn) + Xoá ghế" +Nvvfx.Method.Greenscreen.Performance.Chair="Hiệu năng (sử dụng ít GPU hơn, chất lượng tốt) + Xoá ghế" Nvvfx.Method.Greenscreen.Threshold="Ngưỡng" Nvvfx.OutdatedSDK="CẢNH BÁO: Hãy cập nhật SDK NVIDIA hình ảnh và âm thanh. Phiên bản hiện tại của SDK hình ảnh đã cũ." Nvvfx.Method.Greenscreen.Processing="Tần suất làm mới Mặt-nạ trong Khung"
View file
obs-studio-32.0.4.tar.xz/plugins/nv-filters/data/rtx_blur.effect -> obs-studio-32.1.0.tar.xz/plugins/nv-filters/data/rtx_blur.effect
Changed
@@ -3,7 +3,7 @@ uniform float4x4 ViewProj; uniform texture2d image; uniform float multiplier; - +uniform texture2d mask; uniform texture2d blurred; sampler_state texSampler { @@ -54,15 +54,11 @@ float4 Mask(FragData f_in) { float4 rgba = image.Sample(texSampler, f_in.uv); - float3 blur = blurred.SampleLevel(texSampler, f_in.uv, 0).rgb; - float A = rgba.a; - return float4(blur * A, A); -} - -float4 PSMask(FragData f_in) : TARGET -{ - float4 rgba = Mask(f_in); - return rgba; + float3 blur = srgb_nonlinear_to_linear(blurred.Sample(texSampler, f_in.uv).rgb); + // Between blurred and unblurred area we interpolate to have a smooth transition. + float m = smoothstep(0.85, 0.95, mask.Sample(texSampler, f_in.uv).a); + float3 out_lin = lerp(blur, rgba.rgb, m); + return float4(out_lin, rgba.a); } float4 PSMaskMultiply(FragData f_in) : TARGET @@ -91,16 +87,42 @@ return rgba; } +float4 PSMask(FragData f_in) : TARGET +{ + return Mask(f_in); +} + float4 PSDefault(FragPos f_in) : TARGET { float4 rgba = image.Load(int3(f_in.pos.xy, 0)); return rgba; } -float4 PSConvertMultiply(FragPos f_in) : TARGET +float4 PSConvertUnorm(FragPos f_in) : TARGET +{ + float4 rgba = image.Load(int3(f_in.pos.xy, 0)); + rgba.rgb = srgb_linear_to_nonlinear(rgba.rgb); + return rgba; +} + +float4 PSConvertUnormTonemap(FragPos f_in) : TARGET +{ + float4 rgba = image.Load(int3(f_in.pos.xy, 0)); + rgba.rgb = rec709_to_rec2020(rgba.rgb); + rgba.rgb = reinhard(rgba.rgb); + rgba.rgb = rec2020_to_rec709(rgba.rgb); + rgba.rgb = srgb_linear_to_nonlinear(rgba.rgb); + return rgba; +} + +float4 PSConvertUnormMultiplyTonemap(FragPos f_in) : TARGET { float4 rgba = image.Load(int3(f_in.pos.xy, 0)); rgba.rgb *= multiplier; + rgba.rgb = rec709_to_rec2020(rgba.rgb); + rgba.rgb = reinhard(rgba.rgb); + rgba.rgb = rec2020_to_rec709(rgba.rgb); + rgba.rgb = srgb_linear_to_nonlinear(rgba.rgb); return rgba; } @@ -145,15 +167,24 @@ pass { vertex_shader = VSConvertUnorm(id); - pixel_shader = PSDefault(f_in); + pixel_shader = PSConvertUnorm(f_in); + } +} + +technique ConvertUnormTonemap +{ + pass + { + vertex_shader = VSConvertUnorm(id); + pixel_shader = PSConvertUnormTonemap(f_in); } } -technique ConvertUnormMultiply +technique ConvertUnormMultiplyTonemap { pass { vertex_shader = VSConvertUnorm(id); - pixel_shader = PSConvertMultiply(f_in); + pixel_shader = PSConvertUnormMultiplyTonemap(f_in); } }
View file
obs-studio-32.0.4.tar.xz/plugins/nv-filters/nvidia-videofx-filter.c -> obs-studio-32.1.0.tar.xz/plugins/nv-filters/nvidia-videofx-filter.c
Changed
@@ -68,7 +68,6 @@ NvCVImage *BGR_src_img; // src img in BGR on GPU NvCVImage *A_dst_img; // mask img on GPU NvCVImage *dst_img; // Greenscreen: alpha mask texture; blur: texture initialized from d3d11 (RGBA, chunky, u8) - NvCVImage *stage; // used for transfer to texture unsigned int version; NvVFX_StateObjectHandle stateObjectHandle; @@ -176,7 +175,6 @@ NvCVImage_Destroy(filter->BGR_src_img); NvCVImage_Destroy(filter->A_dst_img); NvCVImage_Destroy(filter->dst_img); - NvCVImage_Destroy(filter->stage); if (filter->filter_id != S_FX_AIGS) { NvCVImage_Destroy(filter->blur_BGR_dst_img); NvCVImage_Destroy(filter->RGBA_dst_img); @@ -334,13 +332,12 @@ bfree(effect_path); if (filter->effect) { if (id == S_FX_AIGS) { - filter->mask_param = gs_effect_get_param_by_name(filter->effect, "mask"); filter->threshold_param = gs_effect_get_param_by_name(filter->effect, "threshold"); } else { filter->blur_param = gs_effect_get_param_by_name(filter->effect, "blurred"); } + filter->mask_param = gs_effect_get_param_by_name(filter->effect, "mask"); filter->image_param = gs_effect_get_param_by_name(filter->effect, "image"); - filter->multiplier_param = gs_effect_get_param_by_name(filter->effect, "multiplier"); } obs_leave_graphics(); @@ -589,20 +586,13 @@ NvCVImage_Alloc(filter->A_dst_img, width, height, NVCV_A, NVCV_U8, NVCV_CHUNKY, NVCV_GPU, 1); } - /* 6. Create stage NvCVImage which will be used as buffer for transfer */ - vfxErr = NvCVImage_Create(width, height, NVCV_RGBA, NVCV_U8, NVCV_CHUNKY, NVCV_GPU, 1, &filter->stage); - vfxErr = NvCVImage_Alloc(filter->stage, width, height, NVCV_RGBA, NVCV_U8, NVCV_CHUNKY, NVCV_GPU, 1); - if (vfxErr != NVCV_SUCCESS) { - goto fail; - } - - /* 7. Init blur images */ + /* 6. Init blur images */ if (filter->filter_id == S_FX_BLUR || filter->filter_id == S_FX_BG_BLUR) { if (!init_blur_images(filter)) goto fail; } - /* 8. Pass settings for AIGS (AI Greenscreen) FX */ + /* 7. Pass settings for AIGS (AI Greenscreen) FX */ if (filter->filter_id == S_FX_BG_BLUR || filter->filter_id == S_FX_AIGS) { NvVFX_SetImage(filter->handle, NVVFX_INPUT_IMAGE, filter->BGR_src_img); NvVFX_SetImage(filter->handle, NVVFX_OUTPUT_IMAGE, filter->A_dst_img); @@ -639,7 +629,7 @@ } /* 2. Convert to BGR. */ - vfxErr = NvCVImage_Transfer(filter->src_img, filter->BGR_src_img, 1.0f, process_stream, filter->stage); + vfxErr = NvCVImage_Transfer(filter->src_img, filter->BGR_src_img, 1.0f, process_stream, NULL); if (vfxErr != NVCV_SUCCESS) { const char *errString = NvCV_GetErrorStringFromCode(vfxErr); error("Error converting src to BGR img; error %i: %s", vfxErr, errString); @@ -661,64 +651,62 @@ if (vfxErr == NVCV_ERR_CUDA) nvvfx_filter_reset(filter, NULL); } - } - if (id != S_FX_AIGS) { - /* 4. BLUR FX */ - /* 4a. Run BLUR FX except for AIGS */ - vfxErr = NvVFX_Run(filter->handle_blur, SYNC); - if (vfxErr != NVCV_SUCCESS) { - const char *errString = NvCV_GetErrorStringFromCode(vfxErr); - error("Error running the BLUR FX; error %i: %s", vfxErr, errString); - if (vfxErr == NVCV_ERR_CUDA) - nvvfx_filter_reset(filter, NULL); - } - /* 4b. Transfer blur result to an intermediate dst RGBA, chunky, u8 */ - vfxErr = NvCVImage_Transfer(filter->blur_BGR_dst_img, filter->RGBA_dst_img, 1.0f, filter->stream, - filter->stage); - if (vfxErr != NVCV_SUCCESS) { - error("Error transferring blurred to intermediate img RGBA, chunky, u8, error %i, ", vfxErr); - goto fail; - } - /* 5. Map blur dst texture before transfer from dst img provided by FX */ - vfxErr = NvCVImage_MapResource(filter->blur_dst_img, filter->stream); + /* 4. Map dst alpha texture before transfer from dst img provided by AIGS FX */ + vfxErr = NvCVImage_MapResource(filter->dst_img, filter->stream); if (vfxErr != NVCV_SUCCESS) { const char *errString = NvCV_GetErrorStringFromCode(vfxErr); error("Error mapping resource for dst texture; error %i: %s", vfxErr, errString); goto fail; } - vfxErr = NvCVImage_Transfer(filter->RGBA_dst_img, filter->blur_dst_img, 1.0f, filter->stream, - filter->stage); + vfxErr = NvCVImage_Transfer(filter->A_dst_img, filter->dst_img, 1.0f, filter->stream, NULL); if (vfxErr != NVCV_SUCCESS) { const char *errString = NvCV_GetErrorStringFromCode(vfxErr); error("Error transferring mask to alpha texture; error %i: %s ", vfxErr, errString); goto fail; } - vfxErr = NvCVImage_UnmapResource(filter->blur_dst_img, filter->stream); + vfxErr = NvCVImage_UnmapResource(filter->dst_img, filter->stream); if (vfxErr != NVCV_SUCCESS) { const char *errString = NvCV_GetErrorStringFromCode(vfxErr); error("Error unmapping resource for dst texture; error %i: %s", vfxErr, errString); goto fail; } - } else { - /* 4. Map dst texture before transfer from dst img provided by AIGS FX */ - vfxErr = NvCVImage_MapResource(filter->dst_img, filter->stream); + } + /* 5. BLUR FX */ + if (id != S_FX_AIGS) { + /* 5a. Run BLUR FX except for AIGS */ + vfxErr = NvVFX_Run(filter->handle_blur, SYNC); + if (vfxErr != NVCV_SUCCESS) { + const char *errString = NvCV_GetErrorStringFromCode(vfxErr); + error("Error running the BLUR FX; error %i: %s", vfxErr, errString); + if (vfxErr == NVCV_ERR_CUDA) + nvvfx_filter_reset(filter, NULL); + } + /* 5b. Transfer blur result to an intermediate dst RGBA, chunky, u8 */ + vfxErr = NvCVImage_Transfer(filter->blur_BGR_dst_img, filter->RGBA_dst_img, 1.0f, filter->stream, NULL); + if (vfxErr != NVCV_SUCCESS) { + error("Error transferring blurred to intermediate img RGBA, chunky, u8, error %i, ", vfxErr); + goto fail; + } + + /* 5c. Map blur dst texture before transfer from dst img provided by FX */ + vfxErr = NvCVImage_MapResource(filter->blur_dst_img, filter->stream); if (vfxErr != NVCV_SUCCESS) { const char *errString = NvCV_GetErrorStringFromCode(vfxErr); error("Error mapping resource for dst texture; error %i: %s", vfxErr, errString); goto fail; } - vfxErr = NvCVImage_Transfer(filter->A_dst_img, filter->dst_img, 1.0f, filter->stream, filter->stage); + vfxErr = NvCVImage_Transfer(filter->RGBA_dst_img, filter->blur_dst_img, 1.0f, filter->stream, NULL); if (vfxErr != NVCV_SUCCESS) { const char *errString = NvCV_GetErrorStringFromCode(vfxErr); error("Error transferring mask to alpha texture; error %i: %s ", vfxErr, errString); goto fail; } - vfxErr = NvCVImage_UnmapResource(filter->dst_img, filter->stream); + vfxErr = NvCVImage_UnmapResource(filter->blur_dst_img, filter->stream); if (vfxErr != NVCV_SUCCESS) { const char *errString = NvCV_GetErrorStringFromCode(vfxErr); error("Error unmapping resource for dst texture; error %i: %s", vfxErr, errString); @@ -835,16 +823,16 @@ float multiplier; const char *technique = get_tech_name_and_multiplier(gs_get_color_space(), source_space, &multiplier); const enum gs_color_format format = gs_get_format_from_space(source_space); + if (obs_source_process_filter_begin_with_color_space(filter->context, format, source_space, OBS_ALLOW_DIRECT_RENDERING)) { + gs_effect_set_texture(filter->mask_param, filter->alpha_texture); if (has_blur) { gs_effect_set_texture_srgb(filter->blur_param, filter->blur_texture); } else { - gs_effect_set_texture(filter->mask_param, filter->alpha_texture); gs_effect_set_float(filter->threshold_param, min(filter->threshold, 0.95f)); } gs_effect_set_texture_srgb(filter->image_param, gs_texrender_get_texture(filter->render)); - gs_effect_set_float(filter->multiplier_param, multiplier); gs_blend_state_push(); @@ -902,6 +890,12 @@ const enum gs_color_space source_space = obs_source_get_color_space(target, OBS_COUNTOF(preferred_spaces), preferred_spaces); + enum nvvfx_fx_id id = filter->filter_id; + if (id == S_FX_BLUR && (source_space == GS_CS_709_EXTENDED || source_space == GS_CS_709_SCRGB)) { + obs_source_skip_video_filter(filter->context); + return; + } + if (filter->space != source_space) { filter->space = source_space; init_images(filter); @@ -938,22 +932,15 @@ const char *tech_name = "ConvertUnorm"; float multiplier = 1.f; - if (!has_blur) { - switch (source_space) { - case GS_CS_709_EXTENDED: - tech_name = "ConvertUnormTonemap"; - break; - case GS_CS_709_SCRGB: - tech_name = "ConvertUnormMultiplyTonemap"; - multiplier = 80.0f / obs_get_video_sdr_white_level(); - } - } else { - switch (source_space) { - case GS_CS_709_SCRGB: - tech_name = "ConvertUnormMultiply"; - multiplier = 80.0f / obs_get_video_sdr_white_level(); - } + switch (source_space) { + case GS_CS_709_EXTENDED: + tech_name = "ConvertUnormTonemap"; + break; + case GS_CS_709_SCRGB: + tech_name = "ConvertUnormMultiplyTonemap"; + multiplier = 80.0f / obs_get_video_sdr_white_level(); } + gs_effect_set_texture_srgb(filter->image_param, gs_texrender_get_texture(render)); gs_effect_set_float(filter->multiplier_param, multiplier);
View file
obs-studio-32.0.4.tar.xz/plugins/obs-browser/CMakeLists.txt -> obs-studio-32.1.0.tar.xz/plugins/obs-browser/CMakeLists.txt
Changed
@@ -31,6 +31,7 @@ cef-headers.hpp deps/base64/base64.cpp deps/base64/base64.hpp + deps/ip-string.hpp deps/signal-restore.cpp deps/signal-restore.hpp deps/wide-string.cpp
View file
obs-studio-32.0.4.tar.xz/plugins/obs-browser/browser-scheme.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-browser/browser-scheme.cpp
Changed
@@ -17,6 +17,7 @@ ******************************************************************************/ #include "browser-scheme.hpp" +#include "ip-string.hpp" #include "wide-string.hpp" #include <include/wrapper/cef_stream_resource_handler.h> @@ -41,18 +42,30 @@ if (fileExtension.compare("woff2") == 0) fileExtension = "woff"; -#ifdef _WIN32 - CefRefPtr<CefStreamReader> stream = CefStreamReader::CreateForFile(path.substr(1)); -#else - CefRefPtr<CefStreamReader> stream = CefStreamReader::CreateForFile(path); -#endif - - if (stream) { - CefString mimeType = CefGetMimeType(fileExtension); - if (mimeType.empty()) - mimeType = "application/octet-stream"; - return new CefStreamResourceHandler(mimeType, stream); - } else { + std::string filePath = path.substr(1); + + std::string checkString = path.substr(path.find_first_not_of("/")); + checkString = checkString.substr(0, checkString.find_first_of("/")); + + // An IP address should never be a valid path for CreateForFile normally, but in some cases an OS + // can resolve one as such. As an extra safeguard, we prevent any IP addresses in the path. + if (checkForIpv4String(checkString)) { + return nullptr; + } + + if (checkForIpv6String(checkString)) { return nullptr; } + + CefRefPtr<CefStreamReader> stream = CefStreamReader::CreateForFile(filePath); + if (!stream) { + return nullptr; + } + + CefString mimeType = CefGetMimeType(fileExtension); + if (mimeType.empty()) { + mimeType = "application/octet-stream"; + } + + return new CefStreamResourceHandler(mimeType, stream); }
View file
obs-studio-32.0.4.tar.xz/plugins/obs-browser/browser-version.h -> obs-studio-32.1.0.tar.xz/plugins/obs-browser/browser-version.h
Changed
@@ -2,7 +2,7 @@ #define OBS_BROWSER_VERSION_MAJOR 2 #define OBS_BROWSER_VERSION_MINOR 26 -#define OBS_BROWSER_VERSION_PATCH 3 +#define OBS_BROWSER_VERSION_PATCH 8 #ifndef MAKE_SEMANTIC_VERSION #define MAKE_SEMANTIC_VERSION(major, minor, patch) ((major << 24) | (minor << 16) | patch)
View file
obs-studio-32.0.4.tar.xz/plugins/obs-browser/cmake/os-linux.cmake -> obs-studio-32.1.0.tar.xz/plugins/obs-browser/cmake/os-linux.cmake
Changed
@@ -21,6 +21,8 @@ target_link_libraries(browser-helper PRIVATE CEF::Wrapper CEF::Library) +target_sources(obs-browser PRIVATE deps/ip-string-posix.cpp) + set(OBS_EXECUTABLE_DESTINATION "${OBS_PLUGIN_DESTINATION}") # cmake-format: off
View file
obs-studio-32.0.4.tar.xz/plugins/obs-browser/cmake/os-macos.cmake -> obs-studio-32.1.0.tar.xz/plugins/obs-browser/cmake/os-macos.cmake
Changed
@@ -54,6 +54,8 @@ "${CMAKE_CURRENT_SOURCE_DIR}/cmake/macos/entitlements-helper${helper_plist}.plist") endforeach() +target_sources(obs-browser PRIVATE deps/ip-string-posix.cpp) + set_target_properties( obs-browser PROPERTIES AUTOMOC ON
View file
obs-studio-32.0.4.tar.xz/plugins/obs-browser/cmake/os-windows.cmake -> obs-studio-32.1.0.tar.xz/plugins/obs-browser/cmake/os-windows.cmake
Changed
@@ -22,6 +22,9 @@ target_link_libraries(obs-browser-helper PRIVATE CEF::Wrapper CEF::Library nlohmann_json::nlohmann_json) target_link_options(obs-browser-helper PRIVATE /IGNORE:4099 /SUBSYSTEM:WINDOWS) +target_link_libraries(obs-browser PRIVATE Ws2_32) +target_sources(obs-browser PRIVATE deps/ip-string-windows.cpp) + set(OBS_EXECUTABLE_DESTINATION "${OBS_PLUGIN_DESTINATION}") set_target_properties_obs( obs-browser-helper
View file
obs-studio-32.0.4.tar.xz/plugins/obs-browser/data/locale/az-AZ.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-browser/data/locale/az-AZ.ini
Changed
@@ -1,4 +1,4 @@ -LocalFile="Yerli fayl" +LocalFile="Lokal fayl" Width="En" Height="Hündürlük" CSS="Fərdi CSS"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-browser/data/locale/el-GR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-browser/data/locale/el-GR.ini
Changed
@@ -10,6 +10,7 @@ BrowserSource="Πρόγραμμα περιήγησης" CustomFrameRate="Χρήση προσαρμοσμένου ρυθμού καρέ" RerouteAudio="Έλεγχος ήχου μέσω OBS" +Inspect="Επιθεώρηση" CopyUrl="Αντιγραφή τρέχουσας διεύθυνσης" WebpageControlLevel="Δικαιώματα σελίδας" WebpageControlLevel.Level.None="Καμία πρόσβαση στο OBS"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-browser/data/locale/eo-UY.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-browser/data/locale/eo-UY.ini
Changed
@@ -6,6 +6,8 @@ Error.Description="Certu ke la adreso ĝustas, kaj ke la reto ne havas problemojn" Error.Retry="Klaku ĉi tie por reprovi" Error.Code="Eraro: %1" +Zoom.Reset="Reagordi zomon" +Zoom.Out="Elzoomi" ErrorCode.ERR_CONNECTION_REFUSED="Servilo rifuzis la konekton" ErrorCode.ERR_NAME_NOT_RESOLVED="IP adreso de servilo ne trovita" ErrorCode.ERR_CONNECTION_TIMED_OUT="Tempolimo de konekto"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-browser/data/locale/et-EE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-browser/data/locale/et-EE.ini
Changed
@@ -2,11 +2,19 @@ Width="Laius" Height="Kõrgus" CSS="Kohandatud CSS" +ShutdownSourceNotVisible="Väljalülitusallikas, kui see pole nähtav" RefreshBrowserActive="Värskenda brauserit, kui stseen muutub aktiivseks" +RefreshNoCache="Värskenda praeguse lehe vahemälu" BrowserSource="Brauser" CustomFrameRate="Kasuta kohandatud kaadrisagedust" +RerouteAudio="Heli juhtimine OBS-i kaudu" Inspect="Kontrolli" DevTools="Kontrolli brauseri dokki \"%1\"" +CopyUrl="Kopeeri praegune aadress" +WebpageControlLevel="Lehekülje õigused" +WebpageControlLevel.Level.None="OBS-ile ligipääs puudub" +WebpageControlLevel.Level.ReadObs="Lugemisõigus OBS-i olekuteabele" +WebpageControlLevel.Level.ReadUser="Kasutajateabe lugemisõigus (praegune stseenide kogu, üleminekud)" WebpageControlLevel.Level.Basic="Baasjuurdepääs OBS-le (salvesta taasesituse puhver jne)" WebpageControlLevel.Level.Advanced="Täiustatud juurdepääs OBS-ile (stseenide muutmine, taasesituse puhvri käivitamine/peatamine jne)" WebpageControlLevel.Level.All="Täielik juurdepääs OBS-ile (alusta/lõpeta voogedastust ilma hoiatuseta jne)" @@ -14,14 +22,21 @@ Dialog.Confirm="JavaScript kinnitus" Dialog.Prompt="JavaScript küsimus" Dialog.BrowserDock="Brauseri dokk" +Dialog.ReceivedFrom="Saadud kasutajalt '%1'" +Error.Title="Seda lehte ei saanud laadida!" +Error.Description="Veenduge, et aadress on õige ja saidil pole probleeme." +Error.Retry="Uuesti proovimiseks klõpsa siia" Error.Code="Viga: %1" +Zoom.Reset="Lähtesta suum" Zoom.Out="Vähenda" Zoom.In="Suurenda" +ErrorCode.ERR_CONNECTION_REFUSED="Server keeldus ühendusest" ErrorCode.ERR_NAME_NOT_RESOLVED="Server IP aadressi ei leitud" ErrorCode.ERR_CONNECTION_TIMED_OUT="Ühendus on aegunud" ErrorCode.ERR_TIMED_OUT="Toiming on aegunud" ErrorCode.ERR_FILE_NOT_FOUND="Faili ei leitud" ErrorCode.ERR_FAILED="Ühendamine ei õnnestunud" +ErrorCode.ERR_NETWORK_CHANGED="Võrk on muutunud" ErrorCode.ERR_SSL_VERSION_INTERFERENCE="SSL-i versiooni häired. TLS 1.3 võib olla blokeeritud või muudetud." ErrorCode.ERR_SSL_PROTOCOL_ERROR="SSL protokolli viga. Ei õnnestunud luua turvalist ühendust." ErrorCode.ERR_CERT_DATE_INVALID="Serveri SSL-sertifikaat on vananenud või sinu arvuti kellaaeg on vale."
View file
obs-studio-32.1.0.tar.xz/plugins/obs-browser/data/locale/lo-LA.ini
Added
@@ -0,0 +1,42 @@ +LocalFile="ໄຟລ໌ໃນເຄື່ອງ" +Width="ຄວາມກວ້າງ" +Height="ຄວາມສູງ" +CSS="CSS ແບບກຳນົດເອງ" +ShutdownSourceNotVisible="ປິດແຫຼ່ງຂໍ້ມູນເມື່ອເບິ່ງບໍ່ເຫັນ" +RefreshBrowserActive="ໂຫຼດບຣາວເຊີຄືນໃໝ່ເມື່ອສາກເລີ່ມເຮັດວຽກ" +RefreshNoCache="ໂຫຼດແຄດຂອງໜ້າປັດຈຸບັນຄືນໃໝ່" +BrowserSource="ບຣາວເຊີ" +CustomFrameRate="ໃຊ້ອັດຕາເຟຣມແບບກຳນົດເອງ" +RerouteAudio="ຄວບຄຸມສຽງຜ່ານ OBS" +Inspect="ກວດສອບ" +DevTools="ກວດສອບ ດັອກບຣາວເຊີ '%1'" +CopyUrl="ສຳເນົາທີ່ຢູ່ປັດຈຸບັນ" +WebpageControlLevel="ສິດທິຂອງໜ້າເວັບ" +WebpageControlLevel.Level.None="ບໍ່ສາມາດເຂົ້າເຖິງ OBS ໄດ້" +WebpageControlLevel.Level.ReadObs="ສິດທິການອ່ານຂໍ້ມູນສະຖານະ OBS" +WebpageControlLevel.Level.ReadUser="ສິດທິການອ່ານຂໍ້ມູນຜູ້ໃຊ້ (ຊຸດສາກປັດຈຸບັນ, ການປ່ຽນສາກ)" +WebpageControlLevel.Level.Basic="ການເຂົ້າເຖິງ OBS ຂັ້ນພື້ນຖານ (ບັນທຶກບັບເຟີການຫຼິ້ນຄືນ, ແລະ ອື່ນໆ)" +WebpageControlLevel.Level.Advanced="ການເຂົ້າເຖິງ OBS ຂັ້ນສູງ (ປ່ຽນສາກ, ເລີ່ມ/ຢຸດ ບັບເຟີການຫຼິ້ນຄືນ, ແລະ ອື່ນໆ)" +WebpageControlLevel.Level.All="ການເຂົ້າເຖິງ OBS ຢ່າງເຕັມທີ່ (ເລີ່ມ/ຢຸດ ການສະຕຣີມໂດຍບໍ່ມີການແຈ້ງເຕືອນ, ແລະ ອື່ນໆ)" +Dialog.Alert="ແຈ້ງເຕືອນ JavaScript" +Dialog.Confirm="ຢືນຢັນ JavaScript" +Dialog.Prompt="ຂໍ້ຄວາມສັ່ງ JavaScript" +Dialog.BrowserDock="ດັອກບຣາວເຊີ" +Dialog.ReceivedFrom="ໄດ້ຮັບຈາກ '%1'" +Error.Title="ບໍ່ສາມາດໂຫຼດໜ້ານັ້ນໄດ້!" +Error.Description="ກະລຸນາກວດສອບວ່າທີ່ຢູ່ຖືກຕ້ອງ ແລະ ເວັບໄຊບໍ່ມີບັນຫາ." +Error.Retry="ຄິກບ່ອນນີ້ເພື່ອລອງໃໝ່" +Error.Code="ຂໍ້ຜິດພາດ: %1" +Zoom.Reset="ຕັ້ງຄ່າການຊູມຄືນ" +Zoom.Out="ຊູມອອກ" +Zoom.In="ຊູມເຂົ້າ" +ErrorCode.ERR_CONNECTION_REFUSED="ເຊີເວີປະຕິເສດການເຊື່ອມຕໍ່" +ErrorCode.ERR_NAME_NOT_RESOLVED="ບໍ່ພົບທີ່ຢູ່ IP ຂອງເຊີເວີ" +ErrorCode.ERR_CONNECTION_TIMED_OUT="ການເຊື່ອມຕໍ່ໝົດເວລາ" +ErrorCode.ERR_TIMED_OUT="ການດຳເນີນການໝົດເວລາ" +ErrorCode.ERR_FILE_NOT_FOUND="ບໍ່ພົບໄຟລ໌" +ErrorCode.ERR_FAILED="ການເຊື່ອມຕໍ່ລົ້ມເຫຼວ" +ErrorCode.ERR_NETWORK_CHANGED="ເຄືອຂ່າຍມີການປ່ຽນແປງ" +ErrorCode.ERR_SSL_VERSION_INTERFERENCE="ການລົບກວນເວີຊັນ SSL. TLS 1.3 ອາດຖືກປິດກັ້ນ ຫຼື ຖືກດັດແກ້." +ErrorCode.ERR_SSL_PROTOCOL_ERROR="ຂໍ້ຜິດພາດໂປຣໂຕຄໍ SSL. ບໍ່ສາມາດສ້າງການເຊື່ອມຕໍ່ທີ່ປອດໄພໄດ້." +ErrorCode.ERR_CERT_DATE_INVALID="ໃບຮັບຮອງ SSL ຂອງເຊີເວີໝົດອາຍຸ ຫຼື ເວລາໃນຄອມພິວເຕີຂອງທ່ານບໍ່ຖືກຕ້ອງ."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-browser/data/locale/pt-BR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-browser/data/locale/pt-BR.ini
Changed
@@ -28,8 +28,8 @@ Error.Retry="Tentar novamente" Error.Code="Erro: %1" Zoom.Reset="Redefinir zoom" -Zoom.Out="Diminuir zoom" -Zoom.In="Aumentar zoom" +Zoom.Out="Reduzir" +Zoom.In="Ampliar" ErrorCode.ERR_CONNECTION_REFUSED="Conexão recusada pelo servidor" ErrorCode.ERR_NAME_NOT_RESOLVED="Endereço IP do servidor não encontrado" ErrorCode.ERR_CONNECTION_TIMED_OUT="Conexão expirada"
View file
obs-studio-32.1.0.tar.xz/plugins/obs-browser/deps/ip-string-posix.cpp
Added
@@ -0,0 +1,35 @@ +/****************************************************************************** + Copyright (C) 2026 by Warchamp7 <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + ******************************************************************************/ + +#include "ip-string.hpp" + +#include <arpa/inet.h> +#include <stdio.h> + +bool checkForIpv4String(const std::string &path) +{ + sockaddr_in sa4; + + return inet_pton(AF_INET, path.c_str(), &sa4.sin_addr) == 1; +} + +bool checkForIpv6String(const std::string &path) +{ + sockaddr_in6 sa6; + + return inet_pton(AF_INET6, path.c_str(), &sa6.sin6_addr) == 1; +}
View file
obs-studio-32.1.0.tar.xz/plugins/obs-browser/deps/ip-string-windows.cpp
Added
@@ -0,0 +1,37 @@ +/****************************************************************************** + Copyright (C) 2026 by Warchamp7 <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + ******************************************************************************/ + +#include "ip-string.hpp" + +#include <stdio.h> +#define WIN32_LEAN_AND_MEAN +#include <winsock2.h> +#include <ws2tcpip.h> + +bool checkForIpv4String(const std::string &path) +{ + sockaddr_in sa4; + + return inet_pton(AF_INET, path.c_str(), &sa4.sin_addr) == 1; +} + +bool checkForIpv6String(const std::string &path) +{ + sockaddr_in6 sa6; + + return inet_pton(AF_INET6, path.c_str(), &sa6.sin6_addr) == 1; +}
View file
obs-studio-32.1.0.tar.xz/plugins/obs-browser/deps/ip-string.hpp
Added
@@ -0,0 +1,23 @@ +/****************************************************************************** + Copyright (C) 2026 by Warchamp7 <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + ******************************************************************************/ + +#pragma once + +#include <string> + +extern bool checkForIpv4String(const std::string &path); +extern bool checkForIpv6String(const std::string &path);
View file
obs-studio-32.0.4.tar.xz/plugins/obs-browser/obs-browser-plugin.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-browser/obs-browser-plugin.cpp
Changed
@@ -388,8 +388,7 @@ return; } - /* Register http://absolute/ scheme handler for older - * CEF builds which do not support file:// URLs */ + // Register custom scheme handler for local browser sources CefRegisterSchemeHandlerFactory("http", "absolute", new BrowserSchemeHandlerFactory()); os_event_signal(cef_started_event);
View file
obs-studio-32.0.4.tar.xz/plugins/obs-browser/obs-browser-source.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-browser/obs-browser-source.cpp
Changed
@@ -498,7 +498,7 @@ while (n_url.find("%2F") != std::string::npos) n_url.replace(n_url.find("%2F"), 3, "/"); - /* http://absolute/ based mapping for older CEF */ + // Local files are routed through our custom scheme handler to give them acess to other local files n_url = "http://absolute/" + n_url; }
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/af-ZA.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/af-ZA.ini
Changed
@@ -39,7 +39,6 @@ AMF.Preset.balanced="Gebalanseer" AMF.Preset.quality="Kwaliteit" AMF.Preset.highQuality="Hoë kwaliteit" -FFmpegSource="Mediabron" LocalFile="Lokale lêer" Looping="Herhaal" BufferingMB="Netwerkbufferwerking"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/ar-SA.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/ar-SA.ini
Changed
@@ -21,6 +21,8 @@ FilePath="مسار الملف" AMFOpts="خيارات AMF/FFmpeg" AMFOpts.ToolTip="استخدم لتحديد خيارات AMF أو FFmpeg المخصّصة. على سبيل المثال، \"level=5.2 profile=main\". تحقق من مستندات الترميز AMF للحصول على مزيد من التفاصيل." +AMF.PreAnalysis="التحليل المسبق" +AMF.PreAnalysis.ToolTip="يتيح تحسين جودة الترميز على حساب الأداء من خلال حساب مقاييس إضافية مثل النشاط والتعقيد المكاني." GPU="كرت الشاشة" VAAPI.Device="جهاز VAAPI" NVENC.LookAhead="نظرة المستقبل" @@ -52,7 +54,6 @@ AMF.Preset.balanced="متوازن" AMF.Preset.quality="الجودة" AMF.Preset.highQuality="جودة عالية" -FFmpegSource="مصدر وسائط" LocalFile="ملف محلي" Looping="تكرار حلقي" Input="ادخال"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/az-AZ.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/az-AZ.ini
Changed
@@ -49,7 +49,6 @@ AMF.Preset.balanced="Balanslı" AMF.Preset.quality="Keyfiyyət" AMF.Preset.highQuality="Yüksək Keyfiyyət" -FFmpegSource="Media Mənbəyi" LocalFile="Lokal Fayl" Looping="Dövrə" Input="Giriş"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/be-BY.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/be-BY.ini
Changed
@@ -54,7 +54,7 @@ AMF.Preset.balanced="Баланс" AMF.Preset.quality="Якасць" AMF.Preset.highQuality="Высокая якасць" -FFmpegSource="Крыніца мультымедыя" +FFmpegSource="Медыя" LocalFile="Файл на дыску" Looping="Зацыкліць" Input="Увод"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/bg-BG.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/bg-BG.ini
Changed
@@ -28,7 +28,6 @@ AMF.Preset.balanced="Балансирано" AMF.Preset.quality="Качество" AMF.Preset.highQuality="Високо качество" -FFmpegSource="Източник на медията" LocalFile="Локален файл" Looping="Преповтаряне" Input="Вход"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/bn-BD.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/bn-BD.ini
Changed
@@ -13,7 +13,6 @@ NVENC.PsychoVisualTuning="সাইকো ভিজ্যুয়াল টিউনিং" NVENC.PsychoVisualTuning.ToolTip="বর্ধিত দৃশ্যমান মানের জন্য বিটরেটের ব্যবহারকে অনুকূলিত করে এমন এনকোডার সেটিংস সক্ষম করে,\nবিশেষত উচ্চ গতির পরিস্থিতিতে,জিপিইউ বর্ধিত ব্যবহারের ব্যয়ে।" NVENC.CQLevel="চিকিউ মাত্রা" -FFmpegSource="মিডিয়া উৎস" LocalFile="স্থানীয় ফাইল" Looping="চক্রাকারে চালান" Input="ইনপুট"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/ca-ES.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/ca-ES.ini
Changed
@@ -21,7 +21,7 @@ FilePath="Camí del fitxer" AMFOpts="Opcions AMF/FFmpeg" AMFOpts.ToolTip="Utilitzeu-lo per especificar opcions AMF o FFmpeg personalitzades. Per exemple, \"level=5.2 profile=main\". Consulteu la documentació del codificador AMF per obtenir més detalls." -AMF.PreAnalysis="Pre-anàlisi" +AMF.PreAnalysis="Preanàlisi" AMF.PreAnalysis.ToolTip="Permet millorar la qualitat de codificació a costa del rendiment mitjançant el càlcul de mètriques addicionals com l'activitat i la complexitat espacial." BFrames="Fotogrames-B màxims" VAAPI.Device="Dispositiu VAAPI" @@ -54,7 +54,7 @@ AMF.Preset.balanced="Equilibrat" AMF.Preset.quality="Qualitat" AMF.Preset.highQuality="Qualitat alta" -FFmpegSource="Font multimèdia" +FFmpegSource="Contingut" LocalFile="Fitxer local" Looping="Bucle" Input="Entrada"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/cs-CZ.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/cs-CZ.ini
Changed
@@ -51,7 +51,7 @@ AMF.Preset.balanced="Vyvážený" AMF.Preset.quality="Kvalita" AMF.Preset.highQuality="Vysoká kvalita" -FFmpegSource="Médium" +FFmpegSource="Média" LocalFile="Místní soubor" Looping="Opakovat" Input="Vstup"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/da-DK.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/da-DK.ini
Changed
@@ -41,7 +41,6 @@ AMF.Preset.balanced="Balanceret" AMF.Preset.quality="Kvalitet" AMF.Preset.highQuality="Høj kvalitet" -FFmpegSource="Mediekilde" LocalFile="Lokal fil" Looping="Gentagelse" InputFormat="Inputformat"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/de-DE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/de-DE.ini
Changed
@@ -50,7 +50,7 @@ AMF.Preset.balanced="Ausgeglichen" AMF.Preset.quality="Qualität" AMF.Preset.highQuality="Hohe Qualität" -FFmpegSource="Medienquelle" +FFmpegSource="Medien" LocalFile="Lokale Datei" Looping="Endlosschleife" Input="Eingabe" @@ -80,7 +80,7 @@ ReplayBuffer.Save="Wiederholung speichern" HelperProcessFailed="Der Aufnahme-Helfer-Prozess kann nicht gestartet werden. Überprüfen Sie, ob OBS-Dateien nicht von einer Drittanbieter-Antiviren-/Sicherheitssoftware blockiert oder entfernt werden." UnableToWritePath="Es kann nicht zu %1 geschrieben werden. Stellen Sie sicher, dass Sie einen Aufnahmepfad verwenden, für den Ihr Konto Schreibrechte hat und genügend Speicherplatz zur Verfügung steht." -WarnWindowsDefender="Der Fehler kann auch durch den Windows-10-Ransomware-Schutz verursacht werden, falls dieser aktiviert ist. Versuchen Sie, den überwachten Ordnerzugriff in „Windows-Sicherheit“ → „Viren- & Bedrohungsschutz“ auszuschalten." +WarnWindowsDefender="Der Fehler kann auch durch den Windows 10-Ransomware-Schutz verursacht werden, falls dieser aktiviert ist. Versuchen Sie, den überwachten Ordnerzugriff in „Windows-Sicherheit“ → „Viren- & Bedrohungsschutz“ auszuschalten." Encoder.Error="Öffnen von %1 fehlgeschlagen: %2" Encoder.Timeout="Der Kodierer %1 braucht zu lange bei der Kodierung (Zeitüberschreitung: %2 Sekunden)" AMF.8bitUnsupportedHdr="Die Ausgabe von 8-Bit von Rec. 2100 wird nicht unterstützt."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/el-GR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/el-GR.ini
Changed
@@ -8,11 +8,12 @@ Profile="Προφίλ" RateControl="Έλεγχος ρυθμού" KeyframeIntervalSec="Διάστημα Πλαισίου Αναφοράς (0=αυτόματο)" -Lossless="Χωρίς απώλειες" +Lossless="Μη απωλεστική" Level="Επίπεδο" FilePath="Διαδρομή Αρχείου" AMFOpts="Επιλογές AMF/FFmpeg" AMFOpts.ToolTip="Χρησιμοποιήστε για να ορίσετε προσαρμοσμένες ρυθμίσεις για AMF ή FFmpeg. Για παράδειγμα, \"level=5.2 profile=main\". Ελέγξτε την τεκμηρίωση του κωδικοποιητή AMF για περισσότερες λεπτομέρειες." +AMF.PreAnalysis="Προανάλυση" BFrames="Μέγιστα B-frames" VAAPI.Device="Συσκευή VAAPI" NVENC.LookAhead="Δες-Απεναντι" @@ -38,7 +39,6 @@ AMF.Preset.balanced="Ισορροπημένο" AMF.Preset.quality="Ποιότητα" AMF.Preset.highQuality="Υψηλή Ποιότητα" -FFmpegSource="Πηγή Πολυμέσων" LocalFile="Τοπικό αρχείο" Looping="Επανάληψη" Input="Είσοδος"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/en-GB.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/en-GB.ini
Changed
@@ -1,4 +1,5 @@ AMFOpts.ToolTip="Use to specify custom AMF or FFmpeg options. For example, \"level=5.2 profile=main\". Check the AMF encoder docs for more details." +AMF.PreAnalysis.ToolTip="Enables improved encoding quality at the cost of performance by calculating additional metrics, such as activity and spatial complexity." NVENC.LookAhead.ToolTip="Enables dynamic B-frames.\n\nIf disabled, the encoder will always use the number of B-frames specified in the 'Max B-frames' setting.\n\nIf enabled, it will increase visual quality by only using however many B-frames are necessary, up to the maximum,\nat the cost of increased GPU utilisation." NVENC.PsychoVisualTuning.ToolTip="Enables encoder settings that optimise the use of bitrate for increased perceived visual quality,\nespecially in situations with high motion, at the cost of increased GPU utilisation." ColorRange="YUV Colour Range"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/en-US.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/en-US.ini
Changed
@@ -71,7 +71,7 @@ AMF.Preset.quality="Quality" AMF.Preset.highQuality="High Quality" -FFmpegSource="Media Source" +FFmpegSource="Media" LocalFile="Local File" Looping="Loop" Input="Input"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/es-ES.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/es-ES.ini
Changed
@@ -49,7 +49,7 @@ AMF.Preset.balanced="Equilibrado" AMF.Preset.quality="Calidad" AMF.Preset.highQuality="Calidad alta" -FFmpegSource="Fuente multimedia" +FFmpegSource="Multimedia" LocalFile="Archivo local" Looping="Bucle" Input="Entrada"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/et-EE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/et-EE.ini
Changed
@@ -2,7 +2,9 @@ FFmpegMuxer="FFmpeg pakkija" FFmpegHlsMuxer="FFmpeg HLS pakkija" FFmpegMpegtsMuxer="FFmpeg MPEG-TS pakkija" +FFmpegPCM32BitFloat="FFmpeg PCM (32-bitine ujukoma)" FFmpegOpts="FFmpeg valikud" +FFmpegOpts.ToolTip.Source="Võimaldab määrata FFmpeg-i valikuid. See aktsepteerib ainult valikuid vormingus option=value.\nMitu valikut saab määrata, eraldades need tühikuga.\nNäide: rtsp_transport=tcp rtsp_flags=prefer_tcp" Bitrate="Bitikiirus" MaxBitrate="Maksimaalne bitikiirus" Preset="Eelseadistus" @@ -19,13 +21,17 @@ AMF.PreAnalysis.ToolTip="Võimaldab paremat kodeerimiskvaliteeti jõudluse arvelt, arvutades täiendavaid näitajaid, nagu aktiivsus ja ruumiline keerukus." BFrames="Maksimum B-kaadrid" VAAPI.Device="VAAPI seade" +NVENC.LookAhead="Ettevaade" NVENC.LookAhead.ToolTip="Võimaldab dünaamilised B-kaadrid.\n\nKui see on välja lülitatud, kasutab kodeerija alati B-kaadrite arvu, mis on määratud seadistuses \"Maksimum B-kaadrid\".\n\nKui see on sisse lülitatud, suurendab see visuaalset kvaliteeti, kasutades ainult nii palju B-kaadreid, kui on vaja, kuni maksimumini,\naga GPU suurema kasutuse arvelt." +NVENC.PsychoVisualTuning="Psühho visuaalne häälestamine" NVENC.PsychoVisualTuning.ToolTip="Võimaldab kodeerija seadeid, mis optimeerivad bitikiiruse kasutamist, et suurendada tajutavat visuaalset kvaliteeti,\neriti suure liikumisega olukordades, kuid seda GPU suurema kasutamise arvelt." NVENC.CQLevel="CQ tase" NVENC.8bitUnsupportedHdr="OBS ei toeta Rec. 2100 8-bitist väljundit." NVENC.I010Unsupported="NVENC ei toeta I010. Kasutsa selle asemel P010." NVENC.10bitUnsupported="Selle kodeerijaga ei saa teha 10-bitist kodeerimist." NVENC.16bitUnsupported="Selle kodeerijaga ei saa teha 16-bitist kodeerimist." +NVENC.444Unsupported="Sellel kodeerijal ei saa 4:4:4 kodeeringut teostada." +NVENC.NoAV1FallbackPossible="AV1 kodeering pole praeguste sätetega saadaval. Proovige keelata kõik ümberskaleerimise või GPU valikud, mis võivad olla seatud. Lisateabe saamiseks vaadake logi." NVENC.Preset2.p1="P1: Kiireim (madalaim kvaliteet)" NVENC.Preset2.p2="P2: Kiirem (madal kvaliteet)" NVENC.Preset2.p3="P3: Kiire (madal kvaliteet)" @@ -43,20 +49,24 @@ AMF.Preset.balanced="Tasakaalustatud" AMF.Preset.quality="Kvaliteet" AMF.Preset.highQuality="Kõrge kvaliteet" -FFmpegSource="Meedia allikas" LocalFile="Kohalik fail" Looping="Korda" Input="Sisend" InputFormat="Sisestus formaat" +BufferingMB="Võrgu puhverdamine" HardwareDecode="Kasuta riistvara dekodeerimist, kui see on saadaval" +ClearOnMediaEnd="Näidake taasesituse lõppedes midagi" RestartWhenActivated="Taaskäivita taasesitus, kui allikas muutub aktiivseks" +CloseFileWhenInactive="Sulge fail, kui see pole aktiivne" CloseFileWhenInactive.ToolTip="Sulgeb faili, kui allikat ei kuvata voogedastuse või \nsalvestuse ajal. See võimaldab faili muuta, kui allikas ei ole aktiivne,\n kuid võib tekkida mõningane viivitus käivitamisel, kui allikas uuesti aktiveerub." ColorRange="YUV värviruumi vahemik" ColorRange.Auto="Automaatne" ColorRange.Partial="Piiratud" ColorRange.Full="Täielik" +LinearAlpha="Rakenda alfa lineaarses ruumis" RestartMedia="Taaskäivita" SpeedPercentage="Kiirus" +Seekable="Otsitav" Play="Esita" Pause="Peata" Stop="Lõpeta" @@ -66,10 +76,22 @@ MediaFileFilter.AllFiles="Kõik failid" ReplayBuffer="Taasesituse puhver" ReplayBuffer.Save="Salvesta Taasesitus" +HelperProcessFailed="Salvestusabilise protsessi käivitamine ebaõnnestus. Kontrollige, et OBS-faile poleks blokeerinud ega eemaldanud ükski kolmanda osapoole viirusetõrje-/turvatarkvara." +UnableToWritePath="Kausta %1 kirjutamine ebaõnnestus. Veenduge, et kasutate salvestusrada, millele teie kasutajakontol on kirjutamisõigus ja et kettaruumi on piisavalt." +WarnWindowsDefender="Kui Windows 10 lunavaratõrje on lubatud, võib see samuti seda viga põhjustada. Proovige Windowsi turvalisuse / viiruste ja ohtude kaitse sätetes kontrollitud kaustadele juurdepääsu keelata." Encoder.Error="%1 avamine ei õnnestunud: %2" +Encoder.Timeout="Kodeerija %1 kodeerimine võtab liiga kaua aega (aegumine: %2 sekundit)" AMF.8bitUnsupportedHdr="OBS ei toeta Rec. 2100 8-bitist väljundit." AMF.10bitUnsupportedAvc="AMD H.264 kodeerijal ei ole võimalik 10-bitist kodeerimist teostada." AMF.16bitUnsupported="Selle kodeerijaga ei saa teha 16-bitist kodeerimist." NVENC.Error="NVENC kodeerija avamine ebaõnnestus: %1" +NVENC.GenericError="Proovige installida uusim <a href=\"https://obsproject.com/go/nvidia-drivers\">NVIDIA draiver</a> ja sulgege muu salvestustarkvara, mis võib NVENC-i kasutada, näiteks NVIDIA ShadowPlay või Windows Game DVR." NVENC.BadGPUIndex="Oled valinud GPU %1 oma väljundkodeerija seadetes. Sea see tagasi 0-le ja proovi uuesti." +NVENC.OutdatedDriver="Installitud NVIDIA draiver ei toeta seda NVENC versiooni, proovige <a href=\"https://obsproject.com/go/nvidia-drivers\">draiverit värskendada</a>." +NVENC.UnsupportedDevice="NVENC viga: Toetamata seade. Kontrollige, kas teie videokaart <a href=\"https://obsproject.com/go/nvenc-matrix\">toetab NVENC-i</a> ja proovige <a href=\"https://obsproject.com/go/nvidia-drivers\">draiverit värskendada</a>." +NVENC.TooManySessions="NVENCi viga: Liiga palju samaaegseid seansse. Proovige sulgeda muud salvestustarkvarad, mis võivad NVENCi kasutada, näiteks NVIDIA ShadowPlay või Windows Game DVR." +NVENC.CheckDrivers="Proovige installida uusim <a href=\"https://obsproject.com/go/nvidia-drivers\">NVIDIA draiver</a>." AV1.8bitUnsupportedHdr="OBS ei toeta Rec. 2100 8-bitist väljundit." +H264.UnsupportedVideoFormat="Toetatud on ainult 8-bitist värvilahendust kasutavad videoformaadid." +H264.UnsupportedColorSpace="Toetatud on ainult Rec. 709 värviruum." +ReconnectDelayTime="Taasühendamise viivitus"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/eu-ES.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/eu-ES.ini
Changed
@@ -43,7 +43,6 @@ AMF.Preset.balanced="Orekatua" AMF.Preset.quality="Kalitatea" AMF.Preset.highQuality="Kalitate handia" -FFmpegSource="Multimedia iturburua" LocalFile="Tokiko fitxategia" Looping="Begizta" Input="Sarrera"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/fa-IR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/fa-IR.ini
Changed
@@ -55,7 +55,7 @@ AMF.Preset.balanced="متعادل شد" AMF.Preset.quality="کیفیت" AMF.Preset.highQuality="کیفیت بالا" -FFmpegSource="منبع رسانه" +FFmpegSource="رسانه" LocalFile="پروندهٔ محلی" Looping="چرخه" Input="ورودی"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/fi-FI.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/fi-FI.ini
Changed
@@ -17,6 +17,8 @@ FilePath="Tiedostopolku" AMFOpts="AMF:n/FFmpegin asetukset" AMFOpts.ToolTip="Käytä AMF tai FFmpeg vaihtoehtoja esim. \"level=5.2 profile=main\". Tarkista AMF enkooderin ohjeet saadaksesi enemmän lisätietoja." +AMF.PreAnalysis="Etukäteisanalyysi" +AMF.PreAnalysis.ToolTip="Kytkee parannellun enkoodauksen laadun tehokkuuden kustannuksella, laskemalla lisämetriikkaa kuten aktiivisuutta ja tilallista monimutkaisuutta." BFrames="Maksimi-B-ruudut" VAAPI.Device="VAAPI-laite" NVENC.LookAhead.ToolTip="Käytä dynaamisia B-ruutuja.\n\nPois päältä pidettäessä enkooderi käyttää aina B-ruutuja sen verran kuin asetuksessa 'Maksimi-B-ruudut' on määritetty.\n\nKäytössä ollessaan asetus parantaa visuaalista laatua käyttäen vain tarvittavan määrän B-ruutuja maksimiin asti,\nGPU:n käytön kustannuksella." @@ -47,7 +49,6 @@ AMF.Preset.balanced="Tasapainotettu" AMF.Preset.quality="Laatu" AMF.Preset.highQuality="Korkea laatu" -FFmpegSource="Lisää media" LocalFile="Paikallinen tiedosto" Looping="Toista jatkuvasti" Input="Sisääntulo"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/fil-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/fil-PH.ini
Changed
@@ -8,7 +8,7 @@ RateControl="Kontrolin ang Antas" KeyframeIntervalSec="Interval Ng Keyframe (0=auto)" Level="Antas" -FilePath="Ang Landas ng File" +FilePath="Landas ng File" AMFOpts="Options Ng AMF/FFmpeg" AMFOpts.ToolTip="Gamitin upang tukuyin ang custom na opsyon ng AMF o FFmpeg. Halimbawa, \"level=5.2 profile=main\". Tingnan ang AMF encoder docs para sa higit pang mga detalye." BFrames="Pinakamaraming B-frames" @@ -31,13 +31,12 @@ NVENC.Tuning.hq="Mataas na kalidad" NVENC.Tuning.ll="Mababa na Latency" NVENC.Tuning.ull="Napakababang Latency" -NVENC.Multipass.qres="Dalawang Passes (Quarter na Resolusyon)" -NVENC.Multipass.fullres="Dalawang Passes (Buong Resolusyon)" +NVENC.Multipass.qres="Dalawang Pagpasa (Quarter na Resolusyon)" +NVENC.Multipass.fullres="Dalawang Pagpasa (Buong Resolusyon)" AMF.Preset.speed="Bilis" AMF.Preset.balanced="Balanse" AMF.Preset.quality="Kalidad" AMF.Preset.highQuality="Mataas na kalidad" -FFmpegSource="Pagkunan ng Media" LocalFile="Ang File na lokal" Looping="I-Loop" Input="Ang Input" @@ -47,7 +46,7 @@ ClearOnMediaEnd="Walang ipakita kapag tapos na ang playback" RestartWhenActivated="Simulan mulang ang playback kapag aktibo ang pinagmulan" CloseFileWhenInactive="Isarado ang file pag di aktibo" -CloseFileWhenInactive.ToolTip="Isarado ang file kapag ang pinagmulan ay di ipinapakita ang stream or\nrecording. Ito nagpapahintulot na baguhin ang pinagmulang pag hindi aktibo,'\n pero dapat mayroong startup delay kapang ang pinagmulan muliang aktibo." +CloseFileWhenInactive.ToolTip="Isasarado ang file kapag hindi ipinapakita sa stream o\nsa recording ang pinagmulan. Pinahihintulotan ang mga pagbabago sa file kapag hindi aktibo ang pinagmulan,\nngunit maaring maaantala ang pagsisimula tuwing magiging aktibo muli ang pinagmulan." ColorRange="Antas ng kulay ng YUV" ColorRange.Auto="I-Auto" ColorRange.Partial="Limitado" @@ -65,7 +64,7 @@ ReplayBuffer="Ang Replay Buffer" ReplayBuffer.Save="I-Save ang Replay" HelperProcessFailed="Hindi pwedeng simulan ang pag proseso ng recording helper. Tingan kung OBS file ay hindi hinarangan o tinanggal ng anumang 3rd part antivirus / security software." -UnableToWritePath="Hindi pwedeng sumulat sa %1. Siguraduhin na gamit ang recording path kung saan ang user account mo ay tanggap ang pagsulat at mayroon sapat na espasyo sa disk." +UnableToWritePath="Bigong magapagsulat sa %1. Siguraduhin na gamit ang recording path kung saan ang user account mo ay tanggap ang pagsulat at mayroon sapat na espasyo sa disk." WarnWindowsDefender="Kung ang Proteksyon ng Windows 10 laban sa Ransomware ay nakabukas, maaring maging sanhi ito ng error na ito. Subukan buwagin ang pag-access ng controlled folder sa settings ng Windows Security / Virus & Threat." Encoder.Error="Nabigong Buksan %1: %2" Encoder.Timeout="Masyadong mahaba ang pag-encode ng encoder %1 (timeout: %2 segundo)"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/fr-FR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/fr-FR.ini
Changed
@@ -49,7 +49,7 @@ AMF.Preset.balanced="Équilibré" AMF.Preset.quality="Qualité" AMF.Preset.highQuality="Haute qualité" -FFmpegSource="Source média" +FFmpegSource="Média" LocalFile="Fichier local" Looping="Lire en boucle" Input="Entrée"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/gd-GB.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/gd-GB.ini
Changed
@@ -13,7 +13,6 @@ NVENC.PsychoVisualTuning="Gleusadh lèirsinneach saidhg-eòlach" NVENC.PsychoVisualTuning.ToolTip="Cuiridh seo roghainnean an inneil-chòdachaidh an comas a bheir piseach air cleachdadh an reat bhiotaichean airson coltas nas fheàrr air a’ chàileachd lèirsinneach,\ngu h-àraidh nuair a bhios tòrr gluasaid ann agus pàighidh thu dha le barrachd cleachdadh a’ GPU." NVENC.CQLevel="Leibheil a’ CQ" -FFmpegSource="Tùs a’ mheadhain" LocalFile="Faidhle ionadail" Looping="Lùb" Input="Ion-chur"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/gl-ES.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/gl-ES.ini
Changed
@@ -50,7 +50,6 @@ AMF.Preset.balanced="Equilibrada" AMF.Preset.quality="Calidade" AMF.Preset.highQuality="Alta Calidade" -FFmpegSource="Fonte multimedia" LocalFile="Ficheiro local" Looping="Bucle" Input="Entrada"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/he-IL.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/he-IL.ini
Changed
@@ -53,7 +53,7 @@ AMF.Preset.balanced="מאוזן" AMF.Preset.quality="איכות" AMF.Preset.highQuality="איכות גבוהה" -FFmpegSource="מקור מדיה" +FFmpegSource="מדיה" LocalFile="קובץ מקומי" Looping="לולאה" Input="קלט"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/hi-IN.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/hi-IN.ini
Changed
@@ -52,7 +52,6 @@ AMF.Preset.balanced="संतुलित" AMF.Preset.quality="गुणवत्ता" AMF.Preset.highQuality="उच्च गुणवत्ता" -FFmpegSource="मीडिया स्रोत" LocalFile="स्थानीय फ़ाइल" Looping="लूप" Input="इनपुट"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/hr-HR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/hr-HR.ini
Changed
@@ -52,7 +52,6 @@ AMF.Preset.balanced="Uravnoteženo" AMF.Preset.quality="Kvaliteta" AMF.Preset.highQuality="Visoka kvaliteta" -FFmpegSource="Medija izvor" LocalFile="Lokalna datoteka" Looping="Ponavljanje" Input="Ulaz"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/hu-HU.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/hu-HU.ini
Changed
@@ -21,6 +21,8 @@ FilePath="Fájl elérési útja" AMFOpts="AMF/FFmpeg beállítások" AMFOpts.ToolTip="Egyéni AMF vagy FFmpeg beállítások megadására használható. Például: \"level=5.2 profile=main\". További részletekért tekintse meg az AMF kódoló dokumentumait." +AMF.PreAnalysis="Előzetes elemzés" +AMF.PreAnalysis.ToolTip="Javítja a kódolás minőségét a teljesítmény rovására, olyan további mutatók kiszámításával, mint az aktivitás és a térbeli komplexitás." BFrames="Max B-kockák" VAAPI.Device="VAAPI Eszköz" NVENC.LookAhead="Előretekintés" @@ -52,7 +54,7 @@ AMF.Preset.balanced="Kiegyensúlyozott" AMF.Preset.quality="Minőség" AMF.Preset.highQuality="Magas minőség" -FFmpegSource="Médiaforrás" +FFmpegSource="Média" LocalFile="Helyi fájl" Looping="Ismétlés" Input="Bemenet"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/hy-AM.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/hy-AM.ini
Changed
@@ -48,7 +48,6 @@ AMF.Preset.balanced="Հաշվեկշիռ" AMF.Preset.quality="Որակ" AMF.Preset.highQuality="Բարձր որակ" -FFmpegSource="Լրատվամիջոցի աղբյուր" LocalFile="Տեղային ֆայլ" Looping="Պտտում" Input="Մուտքագրում"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/id-ID.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/id-ID.ini
Changed
@@ -42,7 +42,6 @@ AMF.Preset.balanced="Seimbang" AMF.Preset.quality="Kualitas" AMF.Preset.highQuality="Kualitas Tinggi" -FFmpegSource="Sumber Media" LocalFile="Berkas Lokal" Looping="Berulang" InputFormat="Format Input"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/it-IT.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/it-IT.ini
Changed
@@ -51,7 +51,6 @@ AMF.Preset.balanced="Bilanciato" AMF.Preset.quality="Qualità" AMF.Preset.highQuality="Alta qualità" -FFmpegSource="Fonte multimediale" LocalFile="File locale" Looping="Ripeti" InputFormat="Formato dell'input"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/ja-JP.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/ja-JP.ini
Changed
@@ -14,7 +14,7 @@ AMFOpts="AMF/FFmpeg オプション" AMFOpts.ToolTip="カスタムAMF または FFmpegオプション を指定するために使用します。 例えば \"level=5.2 profile=main\" です。 詳細については AMFエンコーダ のドキュメントを確認してください。" AMF.PreAnalysis="事前解析" -AMF.PreAnalysis.ToolTip="アクティビティや空間的複雑さなどの追加のメトリクスを計算することでパフォーマンスを犠牲にしてエンコード品質を向上させることができます。" +AMF.PreAnalysis.ToolTip="アクティビティや空間的複雑さなどの追加メトリクスを計算することでパフォーマンスを犠牲にしてエンコード品質を向上させます。" BFrames="最大Bフレーム" VAAPI.Device="VAAPI デバイス" NVENC.LookAhead.ToolTip="動的Bフレームを有効にします。\n\n無効にすると、エンコーダは常に '最大Bフレーム' 設定で指定された数のBフレームを使用します。\n\n有効にすると、GPU使用率の増加を犠牲にして、\n必要な数のBフレームを最大限に使用することで視覚的な品質が向上します。" @@ -41,7 +41,7 @@ NVENC.Multipass.disabled="1パス" NVENC.Multipass.qres="2パス (1/4解像度)" NVENC.Multipass.fullres="2パス (フル解像度)" -FFmpegSource="メディアソース" +FFmpegSource="メディア" LocalFile="ローカルファイル" Looping="ループ (繰り返し)" Input="入力"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/ka-GE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/ka-GE.ini
Changed
@@ -12,7 +12,7 @@ FFmpegOpts.ToolTip.Source="საშუალებას იძლევა FFmpeg-პარამეტრების მითითების. მისაღებია, მხოლოდ პარამეტრი=მნიშვნელობის სახით ჩაწერა.\nრამდენიმე პარამეტრის მითითება შეიძლება ადგილის გამოტოვებით.\nმაგალითად: rtsp_transport=tcp rtsp_flags=prefer_tcp" Bitrate="ბიტსიხშირე" MaxBitrate="ბიტსიხშირე არაუმეტეს" -Preset="მზა პარამეტრები" +Preset="მზა პარამეტრ." Tuning="მომართვა" Profile="პროფილი" RateControl="სიხშირის მართვა" @@ -26,9 +26,9 @@ AMF.PreAnalysis.ToolTip="აუმჯობესებს გაშიფვრის ხარისხს წარმადობის ხარჯზე დამატებითი აზომვების გამოთვლით, როგორებიცაა მოძრაობისა და გამოსახულების სირთულე." BFrames="B-კადრების რაოდ. არაუმეტეს" VAAPI.Device="VAAPI-მოწყობილობა" -NVENC.LookAhead="თვითგანსაზღვრა" -NVENC.LookAhead.ToolTip="გამოიყენებს ცვალებადი რაოდენობის B-კადრებს.\n\nგამორთვისას, მშიფრავს მიეთითება „B-კადრების რაოდ. არაუმეტეს“ ველით.\n\nჩართვისას კი გაიზრდება გამოსახულების ხარისხი საჭირო რაოდენობის B-კადრების დამატებით უმაღლეს ზღვრამდე\nგრაფიკული პროცესორის გაზრდილი დატვირთვის ხარჯზე." -NVENC.PsychoVisualTuning="ფსიქოვიზუალური გაუმჯობესება" +NVENC.LookAhead="წინსწრებითი" +NVENC.LookAhead.ToolTip="იძლევა ცვალებადი რაოდენობის B-კადრებს.\n\nთუ გამორთულია, მშიფრავი გამოიყენებს ველს „B-კადრების რაოდ. არაუმეტეს“.\n\nჩართვისას კი აუმჯობესებს გამოსახულების ხარისხს საჭირო რაოდენობის B-კადრების დამატებით უმაღლეს ზღვრამდე\nგრაფიკული პროცესორის გაზრდილი დატვირთვის ხარჯზე." +NVENC.PsychoVisualTuning="თვალით აღსაქმელი გაუმჯობესება" NVENC.PsychoVisualTuning.ToolTip="საშუალებას აძლევს დამშიფრავს, საუკეთესოდ შეარჩიოს ბიტსიხშირე გამოსახულების ხარისხის უკეთ აღქმისთვის,\nგანსაკუთრებით მოძრავ სცენებში, გრაფიკული პროცესორის გაზრდილი დატვირთვის ხარჯზე." NVENC.CQLevel="CQ-დონე (მუდმივ ნაწილაკებად დაყოფა)" NVENC.8bitUnsupportedHdr="OBS-ში ვერ იქნება გამოყენებული 8-ბიტიანი გამოტანა და Rec. 2100." @@ -55,7 +55,7 @@ AMF.Preset.balanced="წონასწორული" AMF.Preset.quality="ხარისხი" AMF.Preset.highQuality="მაღალი ხარისხი" -FFmpegSource="მასალის წყარო" +FFmpegSource="მედიაფაილი" LocalFile="ადგილობრივი ფაილი" Looping="დაუსრულებლად გამეორება" Input="შეტანა" @@ -84,7 +84,7 @@ ReplayBuffer="გადახვევა" ReplayBuffer.Save="გადახვევის შენახვა" HelperProcessFailed="ჩაწერის პროცესის გაშვება ვერ ხერხდება. გადაამოწმეთ, ხომ არ არის OBS ფაილები შეზღუდული ან წაშლილი ანტივირუსის / უსაფრთხოების სხვა პროგრამების მიერ." -UnableToWritePath="%1-ში ჩაწერა ვერ ხერხდება. დარწმუნდით, რომ ჩაწერისთვის მითითებულ მისამართზე ნებადართულია ჩაწერა თქვენი ანგარიშით და ამასთანავე, არის საკმარისი ადგილი დისკზე." +UnableToWritePath="%1 ვერ ახერხებს ჩაწერას. დარწმუნდით, რომ ჩაწერისთვის მითითებულ მისამართზე ნებადართულია ჩაწერა თქვენი მომხმარებლით და, ამასთანავე, საკმარისი ადგილია დისკზე." WarnWindowsDefender="თუ ჩართულია Windows 10-ის დაცვა ფაილების მიმტაცებელი პროგრამებისგან (Ransomware), ამ შეცდომას ეგეც შეიძლება იწვევდეს. სცადეთ საქაღალდეებთან წვდომის შეზღუდვის მოხსნა, Windows-ის უსაფრთხოების ან ანტივირუსის პარამეტრებიდან." Encoder.Error="ვერ გაიხსნა %1: %2" Encoder.Timeout="დამშიფრავი %1 დიდხანს ანდომებს დაშიფვრას (დროის ამოწურვამდე: %2 წამი)"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/kaa.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/kaa.ini
Changed
@@ -18,7 +18,6 @@ AMF.Preset.speed="Tezlik" AMF.Preset.quality="Sapası" AMF.Preset.highQuality="Joqarı dárejeli sapa" -FFmpegSource="Media deregi" Looping="Qaytalaw" ColorRange="YUV reń aralıǵı" ColorRange.Auto="Avtomat tárizde"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/kab-KAB.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/kab-KAB.ini
Changed
@@ -7,7 +7,6 @@ Lossless="War asṛuḥu" BFrames="Amḍan afellay n yikataren B" NVENC.CQLevel="Aswir CQ" -FFmpegSource="Aɣbalu amidya" LocalFile="Afaylu adigan" Looping="Tineddict" Input="Anekcum"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/kmr-TR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/kmr-TR.ini
Changed
@@ -11,6 +11,7 @@ KeyframeIntervalSec="Dabeşkera demkî di navbera çarçoveyan de (0=xweber)" Lossless="Bêwindahî" Level="Ast" +FilePath="Riya pelê" AMFOpts="Vebijêrkên AMF/FFmpeg" AMFOpts.ToolTip="Ji bo destnîşankirina vebijêrkên kesane yên AMF an FFmpeg bi kar bîne. Mînak, \"ast=5.2 profîl=sereke\". Ji bo bêtir zanyarî, pelbendên encoder AMF kontrol bike." BFrames="Herî zêde B-Çarçove" @@ -42,7 +43,7 @@ AMF.Preset.balanced="Hevsengî" AMF.Preset.quality="Kalîte" AMF.Preset.highQuality="Kalîteya bilind" -FFmpegSource="Çavkaniya medyayê" +FFmpegSource=" Medya" LocalFile="Pelê herêmî" Looping="Bêdawî" Input="Ketan"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/ko-KR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/ko-KR.ini
Changed
@@ -49,7 +49,6 @@ AMF.Preset.balanced="균형" AMF.Preset.quality="품질" AMF.Preset.highQuality="높음 품질" -FFmpegSource="미디어 소스" LocalFile="로컬 파일" Looping="루프 반복" Input="입력"
View file
obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/lo-LA.ini
Added
@@ -0,0 +1,90 @@ +FFmpegOpts="ທາງເລືອກ FFmpeg" +FFmpegOpts.ToolTip.Source="ອະນຸຍາດໃຫ້ທ່ານຕັ້ງຄ່າທາງເລືອກ FFmpeg. ຮອງຮັບສະເພາະຮູບແບບ ທາງເລືອກ=ຄ່າ (option=value) ເທົ່ານັ້ນ.\nສາມາດຕັ້ງຄ່າຫຼາຍທາງເລືອກໄດ້ໂດຍການຍະຫວ່າງ.\nຕົວຢ່າງ: rtsp_transport=tcp rtsp_flags=prefer_tcp" +Bitrate="ບິດເຣດ" +MaxBitrate="ບິດເຣດສູງສຸດ" +Preset="ພຣີເຊັດ" +Tuning="ການປັບແຕ່ງ (Tuning)" +Profile="ໂປຣໄຟລ໌" +RateControl="ການຄວບຄຸມອັດຕາ" +KeyframeIntervalSec="ໄລຍະຫ່າງຄີເຟຣມ (0=ອັດຕະໂນມັດ)" +Lossless="ບໍ່ມີການສູນເສຍ (Lossless)" +Level="ລະດັບ (Level)" +FilePath="ເສັ້ນທາງໄຟລ໌" +AMFOpts="ທາງເລືອກ AMF/FFmpeg" +AMFOpts.ToolTip="ໃຊ້ເພື່ອລະບຸທາງເລືອກ AMF ຫຼື FFmpeg ແບບກຳນົດເອງ. ຕົວຢ່າງ: \"level=5.2 profile=main\". ກວດເບິ່ງເອກະສານຂອງຕົວເຂົ້າລະຫັດ AMF ສຳລັບລາຍລະອຽດເພີ່ມເຕີມ." +AMF.PreAnalysis="ການວິເຄາະລ່ວງໜ້າ (Pre-Analysis)" +AMF.PreAnalysis.ToolTip="ເປີດໃຊ້ການປັບປຸງຄຸນນະພາບການເຂົ້າລະຫັດ ໂດຍແລກກັບປະສິດທິພາບທີ່ຫຼຸດລົງ ດ້ວຍການຄິດໄລ່ຕົວວັດແທກເພີ່ມເຕີມ ເຊັ່ນ: ກິດຈະກຳ ແລະ ຄວາມສັບຊ້ອນຂອງພື້ນທີ່." +BFrames="B-frames ສູງສຸດ" +VAAPI.Device="ອຸປະກອນ VAAPI" +NVENC.LookAhead.ToolTip="ເປີດໃຊ້ງານ B-frames ແບບໄດນາມິກ.\n\nຫາກປິດການໃຊ້ງານ, ຕົວເຂົ້າລະຫັດຈະໃຊ້ຈຳນວນ B-frames ຕາມທີ່ລະບຸໄວ້ໃນການຕັ້ງຄ່າ 'B-frames ສູງສຸດ' ສະເໝີ.\n\nຫາກເປີດໃຊ້ງານ, ມັນຈະເພີ່ມຄຸນນະພາບຂອງພາບ ໂດຍການໃຊ້ B-frames ເທົ່າທີ່ຈຳເປັນ ຈົນເຖິງຄ່າສູງສຸດ,\nແຕ່ຈະມີການໃຊ້ງານ GPU ເພີ່ມຂຶ້ນ." +NVENC.PsychoVisualTuning.ToolTip="ເປີດໃຊ້ການຕັ້ງຄ່າຕົວເຂົ້າລະຫັດ ທີ່ປັບປຸງການໃຊ້ບິດເຣດ ເພື່ອເພີ່ມຄຸນນະພາບຂອງພາບທີ່ຮັບຮູ້ໄດ້,\nໂດຍສະເພາະໃນສະຖານະການທີ່ມີການເຄື່ອນໄຫວສູງ, ແຕ່ຈະມີການໃຊ້ງານ GPU ເພີ່ມຂຶ້ນ." +NVENC.CQLevel="ລະດັບ CQ" +NVENC.8bitUnsupportedHdr="OBS ບໍ່ຮອງຮັບຜົນໄດ້ຮັບແບບ 8-bit ຂອງ Rec. 2100." +NVENC.I010Unsupported="NVENC ບໍ່ຮອງຮັບ I010. ໃຫ້ໃຊ້ P010 ແທນ." +NVENC.10bitUnsupported="ບໍ່ສາມາດດຳເນີນການເຂົ້າລະຫັດແບບ 10-bit ໃນຕົວເຂົ້າລະຫັດນີ້ໄດ້." +NVENC.16bitUnsupported="ບໍ່ສາມາດດຳເນີນການເຂົ້າລະຫັດແບບ 16-bit ໃນຕົວເຂົ້າລະຫັດນີ້ໄດ້." +NVENC.444Unsupported="ບໍ່ສາມາດດຳເນີນການເຂົ້າລະຫັດແບບ 4:4:4 ໃນຕົວເຂົ້າລະຫັດນີ້ໄດ້." +NVENC.NoAV1FallbackPossible="ການເຂົ້າລະຫັດ AV1 ບໍ່ສາມາດໃຊ້ໄດ້ກັບການຕັ້ງຄ່າປັດຈຸບັນ. ລອງປິດການປັບຂະໜາດ (re-scaling) ຫຼື ທາງເລືອກ GPU ທີ່ອາດຈະຕັ້ງຄ່າໄວ້. ກວດເບິ່ງ log ສຳລັບລາຍລະອຽດເພີ່ມເຕີມ." +NVENC.Preset2.p1="P1: ໄວທີ່ສຸດ (ຄຸນນະພາບຕ່ຳສຸດ)" +NVENC.Preset2.p2="P2: ໄວກວ່າ (ຄຸນນະພາບຕ່ຳ)" +NVENC.Preset2.p3="P3: ໄວ (ຄຸນນະພາບຕ່ຳ)" +NVENC.Preset2.p4="P4: ປານກາງ (ຄຸນນະພາບປານກາງ)" +NVENC.Preset2.p5="P5: ຊ້າ (ຄຸນນະພາບດີ)" +NVENC.Preset2.p6="P6: ຊ້າກວ່າ (ຄຸນນະພາບດີກວ່າ)" +NVENC.Preset2.p7="P7: ຊ້າທີ່ສຸດ (ຄຸນນະພາບດີທີ່ສຸດ)" +NVENC.Tuning.hq="ຄຸນນະພາບສູງ (High Quality)" +NVENC.Tuning.ll="ຄວາມໜ່ວງຕ່ຳ (Low Latency)" +NVENC.Tuning.ull="ຄວາມໜ່ວງຕ່ຳພິເສດ (Ultra Low Latency)" +NVENC.Multipass="ໂໝດ Multipass" +NVENC.Multipass.disabled="ຜ່ານດຽວ (Single Pass)" +NVENC.Multipass.qres="ສອງຜ່ານ (ຄວາມລະອຽດ 1/4)" +NVENC.Multipass.fullres="ສອງຜ່ານ (ຄວາມລະອຽດເຕັມ)" +AMF.Preset.speed="ຄວາມໄວ" +AMF.Preset.balanced="ສົມດູນ" +AMF.Preset.quality="ຄຸນນະພາບ" +AMF.Preset.highQuality="ຄຸນນະພາບສູງ" +LocalFile="ໄຟລ໌ໃນເຄື່ອງ" +Looping="ວົນຊ້ຳ" +Input="ອິນພຸດ (Input)" +InputFormat="ຮູບແບບອິນພຸດ" +BufferingMB="ການບັຟເຟີເຄືອຂ່າຍ" +HardwareDecode="ໃຊ້ການຖອດລະຫັດຮາດແວເມື່ອສາມາດໃຊ້ໄດ້" +ClearOnMediaEnd="ບໍ່ສະແດງຫຍັງເລີຍເມື່ອການຫຼິ້ນສິ້ນສຸດ" +RestartWhenActivated="ເລີ່ມການຫຼິ້ນຄືນໃໝ່ເມື່ອແຫຼ່ງຂໍ້ມູນເລີ່ມເຮັດວຽກ" +CloseFileWhenInactive="ປິດໄຟລ໌ເມື່ອບໍ່ມີການເຄື່ອນໄຫວ" +CloseFileWhenInactive.ToolTip="ປິດໄຟລ໌ເມື່ອແຫຼ່ງຂໍ້ມູນບໍ່ໄດ້ຖືກສະແດງໃນການສະຕຣີມ ຫຼື\nການບັນທຶກ. ສິ່ງນີ້ຊ່ວຍໃຫ້ສາມາດປ່ຽນໄຟລ໌ໄດ້ເມື່ອແຫຼ່ງຂໍ້ມູນບໍ່ໄດ້ເຮັດວຽກ,\nແຕ່ອາດຈະມີຄວາມຊັກຊ້າໃນການເລີ່ມຕົ້ນເລັກນ້ອຍເມື່ອແຫຼ່ງຂໍ້ມູນກັບມາເຮັດວຽກອີກຄັ້ງ." +ColorRange="ຊ່ວງສີ YUV" +ColorRange.Auto="ອັດຕະໂນມັດ" +ColorRange.Partial="ຈຳກັດ (Limited)" +ColorRange.Full="ເຕັມ (Full)" +LinearAlpha="ໃຊ້ Alpha ໃນພື້ນທີ່ Linear" +RestartMedia="ເລີ່ມໃໝ່" +SpeedPercentage="ຄວາມໄວ" +Seekable="ສາມາດເລື່ອນໄດ້ (Seekable)" +Play="ຫຼິ້ນ" +Pause="ຢຸດຊົ່ວຄາວ" +Stop="ຢຸດ" +MediaFileFilter.AllMediaFiles="ໄຟລ໌ສື່ທັງໝົດ" +MediaFileFilter.VideoFiles="ໄຟລ໌ວິດີໂອ" +MediaFileFilter.AudioFiles="ໄຟລ໌ສຽງ" +MediaFileFilter.AllFiles="ໄຟລ໌ທັງໝົດ" +ReplayBuffer.Save="ບັນທຶກ Replay" +HelperProcessFailed="ບໍ່ສາມາດເລີ່ມຂະບວນການຊ່ວຍບັນທຶກໄດ້. ກວດເບິ່ງວ່າໄຟລ໌ OBS ບໍ່ໄດ້ຖືກບລັອກ ຫຼື ລົບອອກໂດຍໂປຣແກຣມປ້ອງກັນໄວຣັດ / ຄວາມປອດໄພຂອງພາກສ່ວນທີສາມ." +UnableToWritePath="ບໍ່ສາມາດຂຽນລົງໃນ %1 ໄດ້. ກວດໃຫ້ແນ່ໃຈວ່າທ່ານກຳລັງໃຊ້ເສັ້ນທາງການບັນທຶກທີ່ບັນຊີຜູ້ໃຊ້ຂອງທ່ານໄດ້ຮັບອະນຸຍາດໃຫ້ຂຽນ ແລະ ມີພື້ນທີ່ດິດພຽງພໍ." +WarnWindowsDefender="ຫາກເປີດໃຊ້ Windows 10 Ransomware Protection ມັນອາດຈະເຮັດໃຫ້ເກີດຂໍ້ຜິດພາດນີ້ໄດ້ເຊັ່ນກັນ. ລອງປິດການເຂົ້າເຖິງໂຟນເດີທີ່ຖືກຄວບຄຸມ (controlled folder access) ໃນການຕັ້ງຄ່າ Windows Security / Virus & threat protection." +Encoder.Error="ບໍ່ສາມາດເປີດ %1: %2" +Encoder.Timeout="ຕົວເຂົ້າລະຫັດ %1 ໃຊ້ເວລາໃນການເຂົ້າລະຫັດດົນເກີນໄປ (ໝົດເວລາ: %2 ວິນາທີ)" +AMF.8bitUnsupportedHdr="OBS ບໍ່ຮອງຮັບຜົນໄດ້ຮັບແບບ 8-bit ຂອງ Rec. 2100." +AMF.10bitUnsupportedAvc="ບໍ່ສາມາດດຳເນີນການເຂົ້າລະຫັດແບບ 10-bit ໃນຕົວເຂົ້າລະຫັດ AMD H.264 ໄດ້." +AMF.16bitUnsupported="ບໍ່ສາມາດດຳເນີນການເຂົ້າລະຫັດແບບ 16-bit ໃນຕົວເຂົ້າລະຫັດນີ້ໄດ້." +NVENC.Error="ບໍ່ສາມາດເປີດ codec NVENC ໄດ້: %1" +NVENC.GenericError="ລອງຕິດຕັ້ງ <a href=\"https://obsproject.com/go/nvidia-drivers\">ໄດຣເວີ NVIDIA</a> ລ່າສຸດ ແລະ ປິດໂປຣແກຣມບັນທຶກອື່ນໆທີ່ອາດຈະໃຊ້ NVENC ຢູ່ ເຊັ່ນ NVIDIA ShadowPlay ຫຼື Windows Game DVR." +NVENC.BadGPUIndex="ທ່ານໄດ້ເລືອກ GPU %1 ໃນການຕັ້ງຄ່າຕົວເຂົ້າລະຫັດຜົນໄດ້ຮັບຂອງທ່ານ. ໃຫ້ຕັ້ງຄ່າກັບເປັນ 0 ແລະ ລອງອີກຄັ້ງ." +NVENC.OutdatedDriver="ໄດຣເວີ NVIDIA ທີ່ຕິດຕັ້ງບໍ່ຮອງຮັບ NVENC ເວີຊັນນີ້, ລອງ <a href=\"https://obsproject.com/go/nvidia-drivers\">ອັບເດດໄດຣເວີ</a>." +NVENC.UnsupportedDevice="ຂໍ້ຜິດພາດ NVENC: ອຸປະກອນບໍ່ຮອງຮັບ. ກວດເບິ່ງວ່າກາດຈໍຂອງທ່ານ <a href=\"https://obsproject.com/go/nvenc-matrix\">ຮອງຮັບ NVENC</a> ຫຼື ບໍ່ ແລະ ລອງ <a href=\"https://obsproject.com/go/nvidia-drivers\">ອັບເດດໄດຣເວີ</a>." +NVENC.TooManySessions="ຂໍ້ຜິດພາດ NVENC: ມີການໃຊ້ງານພ້ອມກັນຫຼາຍເກີນໄປ. ລອງປິດໂປຣແກຣມບັນທຶກອື່ນໆທີ່ອາດຈະໃຊ້ NVENC ຢູ່ ເຊັ່ນ NVIDIA ShadowPlay ຫຼື Windows Game DVR." +NVENC.CheckDrivers="ລອງຕິດຕັ້ງ <a href=\"https://obsproject.com/go/nvidia-drivers\">ໄດຣເວີ NVIDIA</a> ລ່າສຸດ." +AV1.8bitUnsupportedHdr="OBS ບໍ່ຮອງຮັບຜົນໄດ້ຮັບແບບ 8-bit ຂອງ Rec. 2100." +H264.UnsupportedVideoFormat="ຮອງຮັບສະເພາະຮູບແບບວິດີໂອທີ່ໃຊ້ສີແບບ 8-bit ເທົ່ານັ້ນ." +H264.UnsupportedColorSpace="ຮອງຮັບສະເພາະພື້ນທີ່ສີ Rec. 709 ເທົ່ານັ້ນ." +ReconnectDelayTime="ໄລຍະເວລາລໍຖ້າການເຊື່ອມຕໍ່ໃໝ່"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/ms-MY.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/ms-MY.ini
Changed
@@ -48,7 +48,6 @@ AMF.Preset.balanced="Seimbang" AMF.Preset.quality="Kualiti" AMF.Preset.highQuality="Kualiti Tinggi" -FFmpegSource="Sumber Media" LocalFile="Fail Setempat" Looping="Gelung" InputFormat="Format Input"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/nb-NO.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/nb-NO.ini
Changed
@@ -34,7 +34,6 @@ AMF.Preset.balanced="Balansert" AMF.Preset.quality="Kvalitet" AMF.Preset.highQuality="Høy kvalitet" -FFmpegSource="Mediekilde" LocalFile="Lokal fil" Looping="Repeter" Input="Inngang"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/nl-NL.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/nl-NL.ini
Changed
@@ -39,7 +39,6 @@ AMF.Preset.balanced="Gebalanceerd" AMF.Preset.quality="Kwaliteit" AMF.Preset.highQuality="Hoge kwaliteit" -FFmpegSource="Mediabron" LocalFile="Lokaal bestand" Looping="Herhalen" Input="Invoer"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/nn-NO.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/nn-NO.ini
Changed
@@ -9,7 +9,6 @@ AMF.Preset.balanced="Balansert" AMF.Preset.quality="Kvalitet" AMF.Preset.highQuality="Høg kvalitet" -FFmpegSource="Mediakjelde" LocalFile="Lokal fil" ColorRange.Partial="Avgrensa" SpeedPercentage="Fart"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/pl-PL.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/pl-PL.ini
Changed
@@ -49,7 +49,7 @@ AMF.Preset.balanced="Zrównoważone" AMF.Preset.quality="Jakość" AMF.Preset.highQuality="High Quality (wysoka jakość)" -FFmpegSource="Źródło danych" +FFmpegSource="Multimedia" LocalFile="Plik lokalny" Looping="Pętla" Input="Wejście" @@ -72,7 +72,7 @@ Pause="Pauza" Stop="Zatrzymaj" MediaFileFilter.AllMediaFiles="Wszystkie pliki multimedialne" -MediaFileFilter.VideoFiles="Pliki video" +MediaFileFilter.VideoFiles="Pliki wideo" MediaFileFilter.AudioFiles="Pliki audio" MediaFileFilter.AllFiles="Wszystkie pliki" ReplayBuffer="Nagrywanie powtórek"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/pt-BR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/pt-BR.ini
Changed
@@ -49,7 +49,7 @@ AMF.Preset.balanced="Equilibrado" AMF.Preset.quality="Qualidade" AMF.Preset.highQuality="Alta qualidade" -FFmpegSource="Fonte de mídia" +FFmpegSource="Mídia" LocalFile="Arquivo local" Input="Entrada" InputFormat="Formato de entrada" @@ -93,5 +93,5 @@ NVENC.CheckDrivers="Tente instalar o <a href=\"https://obsproject.com/go/nvidia-drivers\">driver da NVIDIA</a> mais recente." AV1.8bitUnsupportedHdr="O OBS não suporta saída de 8 bits do Rec. 2100." H264.UnsupportedVideoFormat="Somente formatos de vídeo que usam cores de 8 bits são suportados." -H264.UnsupportedColorSpace="Somente o espaço de cor Rec. 709 é suportado." +H264.UnsupportedColorSpace="Somente o espaço de cores Rec. 709 é suportado." ReconnectDelayTime="Atraso de reconexão"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/pt-PT.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/pt-PT.ini
Changed
@@ -50,7 +50,7 @@ AMF.Preset.balanced="Equilibrado" AMF.Preset.quality="Qualidade" AMF.Preset.highQuality="Alta qualidade" -FFmpegSource="Fonte de multimédia" +FFmpegSource="Multimédia" LocalFile="Ficheiro local" Looping="Repetir" Input="Entrada"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/ro-RO.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/ro-RO.ini
Changed
@@ -46,7 +46,6 @@ AMF.Preset.balanced="Echilibrat" AMF.Preset.quality="Calitate" AMF.Preset.highQuality="Calitate înaltă" -FFmpegSource="Sursă media" LocalFile="Fișier local" Looping="Redă în buclă" InputFormat="Formatul inputului"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/ru-RU.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/ru-RU.ini
Changed
@@ -55,7 +55,7 @@ AMF.Preset.balanced="Баланс" AMF.Preset.quality="Качество" AMF.Preset.highQuality="Высокое качество" -FFmpegSource="Источник медиа" +FFmpegSource="Мультимедиа" LocalFile="Локальный файл" Looping="Повтор" Input="Ввод"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/si-LK.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/si-LK.ini
Changed
@@ -20,7 +20,6 @@ AMF.Preset.balanced="සංතුලිත" AMF.Preset.quality="ගුණත්වය" AMF.Preset.highQuality="ඉහළ ගුණත්වය" -FFmpegSource="මාධ්ය මූලාශ්රය" LocalFile="ස්ථානීය ගොනුව" Looping="පුඩුලීම" Input="ආදානය"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/sk-SK.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/sk-SK.ini
Changed
@@ -40,7 +40,7 @@ AMF.Preset.balanced="Vyvážené" AMF.Preset.quality="Kvalita" AMF.Preset.highQuality="Vysoká kvalita" -FFmpegSource="Zdroj médií" +FFmpegSource="Médiá" LocalFile="Lokálny súbor" Looping="Slučka" Input="Vstup"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/sl-SI.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/sl-SI.ini
Changed
@@ -52,7 +52,6 @@ AMF.Preset.balanced="Uravnoteženo" AMF.Preset.quality="Kakovost" AMF.Preset.highQuality="Visoka kakovost" -FFmpegSource="Predstavnostni vir" LocalFile="Lokalna datoteka" Looping="Ponavljaj" Input="Vhod"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/sr-CS.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/sr-CS.ini
Changed
@@ -10,7 +10,6 @@ NVENC.PsychoVisualTuning="Psiho vizuelna podešavanja" NVENC.PsychoVisualTuning.ToolTip="Uključuje podešavanja enkodera koja optimizuju korišćenje protoka za povećani vizuelni kvalitet,\nposebno u situacijama sa ubrzanim pokretima, po cenu povećane upotrebe GPU-a." NVENC.CQLevel="CQ Nivo" -FFmpegSource="Medija izvor" LocalFile="Lokalna datoteka" Looping="Ponavljanje" Input="Ulaz" @@ -22,7 +21,11 @@ ColorRange="YUV opseg boja" ColorRange.Auto="Automatski" ColorRange.Full="Potpuni" +RestartMedia="Restartuj" +SpeedPercentage="Brzina" Seekable="Pretraživanje" +Pause="Pauziraj" +Stop="Zaustavi" MediaFileFilter.AllMediaFiles="Sve medija datoteke" MediaFileFilter.VideoFiles="Video datoteke" MediaFileFilter.AudioFiles="Zvučne datoteke"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/sr-SP.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/sr-SP.ini
Changed
@@ -53,7 +53,6 @@ AMF.Preset.balanced="Уравнотежено" AMF.Preset.quality="Квалитет" AMF.Preset.highQuality="Висок квалитет" -FFmpegSource="Медија извор" LocalFile="Локална датотека" Looping="Понављање" Input="Улаз"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/sv-SE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/sv-SE.ini
Changed
@@ -54,7 +54,6 @@ AMF.Preset.balanced="Balanserad" AMF.Preset.quality="Kvalitet" AMF.Preset.highQuality="Hög kvalitet" -FFmpegSource="Mediakälla" LocalFile="Lokal fil" Looping="Upprepa" Input="Inmatning"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/szl-PL.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/szl-PL.ini
Changed
@@ -5,7 +5,6 @@ Lossless="Bezstratny" Level="Poziōm" NVENC.CQLevel="Poziōm CQ" -FFmpegSource="Zdrzōdło danych" LocalFile="Lokalny zbiōr" Looping="Pyntla" Input="Wchōd"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/ta-IN.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/ta-IN.ini
Changed
@@ -2,7 +2,6 @@ Bitrate="பிட்விகிதம்" MaxBitrate="அதிகபட்ச பிட்விகிதம்" Preset="முன்னமைவு" -FFmpegSource="மீடியா மூலம்" LocalFile="லோக்கல் கோப்பு" Looping="சுழற்சி" Input="உள்ளீடு"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/th-TH.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/th-TH.ini
Changed
@@ -49,7 +49,6 @@ AMF.Preset.balanced="ความสมดุล" AMF.Preset.quality="คุณภาพ" AMF.Preset.highQuality="คุณภาพสูง" -FFmpegSource="แหล่งสื่อ" LocalFile="ไฟล์ในเครื่อง" Looping="วนซ้ำ" Input="นำเข้า"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/tl-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/tl-PH.ini
Changed
@@ -3,7 +3,10 @@ Preset="I-preset" RateControl="Kontrolin ang Rate" Lossless="Walang Pagkawala" -FFmpegSource="Pinagmulan ng Media" +FilePath="Landas ng Talaksan" +NVENC.NoAV1FallbackPossible="Hindi magagamit ang AV1 na pag-e-encode sa kasalukuyang mga kagustuhan. Subukang di-paganahin ang anumang pagsasalinlaki o kaayusang GPU na maaring nakatakda. Tingnan ang pagtatala para sa mga karagdagang kaalaman." +NVENC.Multipass.qres="Dalawang Pagpasa (Sangkapat na Hisikot)" +NVENC.Multipass.fullres="Dalawang Pagpasa (Buong Hisikot)" LocalFile="Ang Lokal na File" Looping="Silo" Input="Pampasok" @@ -11,7 +14,7 @@ HardwareDecode="Gamitin ang hardware sa pag-decode kapag itong magagamit na" RestartWhenActivated="I-restart ang playback kapag ang pinagmulan ay naging aktibo na" CloseFileWhenInactive="Isarado ang file kapag hindi ito aktibo" -CloseFileWhenInactive.ToolTip="Tinatanggal ang file kapag ang pinagmulan ay hindi ipinapakita sa stream o\nnatala. Pinapayagan nito na mabago ang file kapag ang pinagmulan ay hindi aktibo,\nngunit maaaring may ilang pagkaantala sa startup kapag muling pinagana ang pinagmulan." +CloseFileWhenInactive.ToolTip="Isasarado ang ligpit kapag hindi ipinapakita sa batis o\nsa recording ang pinagmulan. Pinahihintulotan ang mga pagbabago sa ligpit kapag hindi gumagana ang pinagmulan,\nngunit maaring maaantala ang pagsisimula tuwing pinapagana muli ang pinagmulan." ColorRange="Ang Saklaw ng Kulay na YUV" ColorRange.Auto="Awto" ColorRange.Full="Puno" @@ -21,6 +24,6 @@ MediaFileFilter.AudioFiles="Ang mga Audio File" MediaFileFilter.AllFiles="Lahat ng mga File" ReplayBuffer="I-replay ang Buffer" -ReplayBuffer.Save="I-save ang Replay" +ReplayBuffer.Save="Iimbak ang Baliking Pagpapalabas" HelperProcessFailed="Hindi magawang simulan ang pagtatala ng proseso ng katulong. Suriin na ang mga file ng OBS ay hindi na-block o inalis ng anumang 3rd party antivirus / seguridad ng software." -UnableToWritePath="Hindi makapagsulat sa %1. Tiyaking gumagamit ka ng isang landas sa pagtatala kung saan pinahihintulutan ang iyong user account na magsulat at mayroong sapat na puwang sa disk." +UnableToWritePath="Bigong makapagsulat sa %1. Tiyaking gumagamit ka ng landas na may pahintulot sa iyong akawnt na makapagsulat at sapat ang lawak ng disk."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/tr-TR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/tr-TR.ini
Changed
@@ -51,7 +51,7 @@ AMF.Preset.balanced="Dengeli" AMF.Preset.quality="Kalite" AMF.Preset.highQuality="Yüksek Kalite" -FFmpegSource="Ortam Kaynağı" +FFmpegSource="Medya" LocalFile="Yerel Dosya" Looping="Döngü" Input="Giriş"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/tt-RU.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/tt-RU.ini
Changed
@@ -15,7 +15,6 @@ AMF.Preset.speed="Тизлек" AMF.Preset.quality="Сыйфат" AMF.Preset.highQuality="Югары сыйфат" -FFmpegSource="Медиа чыганагы" LocalFile="Локаль файл" Input="Кертү" InputFormat="Кертү форматы"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/ug-CN.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/ug-CN.ini
Changed
@@ -49,7 +49,7 @@ AMF.Preset.balanced="تەڭپۇڭ" AMF.Preset.quality="سۈپەت" AMF.Preset.highQuality="يۇقىرى سۈپەت" -FFmpegSource="ۋاسىتە مەنبەسى" +FFmpegSource="ۋاسىتە" LocalFile="يەرلىك ھۆججەت" Looping="دەۋرىي" Input="كىرگۈز"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/uk-UA.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/uk-UA.ini
Changed
@@ -19,7 +19,7 @@ AMFOpts="Параметри AMF/FFmpeg" AMFOpts.ToolTip="Скористайтесь, щоб задати параметри AMF або FFmpeg. Наприклад, \"level=5.2 profile=main\". Подробиці шукайте в документації кодувальника AMF." AMF.PreAnalysis="Попередній аналіз" -AMF.PreAnalysis.ToolTip="Забезпечує покращену якість кодування коштом продуктивності, обчислюючи додаткові показники, такі як активність та просторова складність." +AMF.PreAnalysis.ToolTip="Забезпечує покращену якість кодування знижуючи швидкодію, обчислюючи додаткові показники, такі як активність та просторова складність." BFrames="Максимальна кількість B-кадрів" VAAPI.Device="Пристрій VAAPI" NVENC.LookAhead="Передбачення (Look-ahead)" @@ -51,7 +51,7 @@ AMF.Preset.balanced="Збалансований" AMF.Preset.quality="Якість" AMF.Preset.highQuality="Висока якість" -FFmpegSource="Джерело мультимедіа" +FFmpegSource="Медіа" LocalFile="Локальний файл" Looping="Повторювати" Input="Ввід"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/vi-VN.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/vi-VN.ini
Changed
@@ -16,6 +16,8 @@ FilePath="Đường dẫn tệp" AMFOpts="Tuỳ chọn AMF/FFmpeg" AMFOpts.ToolTip="Sử dụng để chỉ định tùy chọn AMF hoặc FFmpeg tùy chỉnh. Ví dụ: \"level=5.2 profile=main\". Kiểm tra tài liệu mã hóa AMF để biết thêm chi tiết." +AMF.PreAnalysis="Tiền phân tích" +AMF.PreAnalysis.ToolTip="Cho phép cải thiện chất lượng mã hóa với chi phí hiệu suất bằng cách tính toán các số liệu bổ sung như hoạt động và độ phức tạp của không gian." BFrames="Khung-B tối đa" VAAPI.Device="Thiết bị VAAPI" NVENC.LookAhead.ToolTip="Bật chế độ khung hình B động.\n\nNếu tắt, trình mã hóa sẽ luôn sử dụng số khung hình B được chỉ định trong cài đặt 'Khung hình B tối đa'.\n\nNếu bật, nó sẽ tăng chất lượng hình ảnh bằng cách sử dụng số lượng khung hình B cần thiết, lên tới tối đa,\nnhưng tăng sử dụng GPU." @@ -26,6 +28,7 @@ NVENC.I010Unsupported="NVENC không hỗ trợ I010. Sử dụng P010 thay thế." NVENC.10bitUnsupported="Không thể thực hiện mã hóa 10-bit trên bộ mã hóa này." NVENC.16bitUnsupported="Không thể thực hiện biên mã 16-bit trên bộ biên mã này." +NVENC.444Unsupported="Không thể thực hiện mã hóa 4:4:4 trên bộ biên mã này." NVENC.NoAV1FallbackPossible="Mã hóa AV1 (Encoding) không khả dụng với cài đặt hiện tại. Hãy thử tắt bất kỳ tùy chọn GPU hoặc thay đổi quy mô nào có thể được đặt. Kiểm tra log để biết thêm chi tiết." NVENC.Preset2.p1="P1: Nhanh nhất (Chất lượng thấp nhất)" NVENC.Preset2.p2="P2: Nhanh hơn (Chất lượng thấp hơn)" @@ -45,7 +48,7 @@ AMF.Preset.balanced="Cân bằng" AMF.Preset.quality="Chất lượng" AMF.Preset.highQuality="Chất lượng cao" -FFmpegSource="Nguồn media" +FFmpegSource="Phương tiện" LocalFile="Tập tin cục bộ" Looping="Lặp lại" Input="Nhập" @@ -88,4 +91,6 @@ NVENC.TooManySessions="Lỗi NVENC: Quá nhiều phiên đồng thời. Hãy thử đóng phần mềm ghi âm khác có thể đang sử dụng NVENC, chẳng hạn như NVIDIA ShadowPlay hoặc Windows Game DVR." NVENC.CheckDrivers="Hãy thử cài đặt <a href=\"https://obsproject.com/go/nvidia-drivers\">trình điều khiển NVIDIA</a> mới nhất." AV1.8bitUnsupportedHdr="OBS không hỗ trợ đầu ra 8-bit của Rec. 2100." +H264.UnsupportedVideoFormat="Chỉ hỗ trợ các định dạng video sử dụng màu 8 bit." +H264.UnsupportedColorSpace="Chỉ có Rec. Không gian màu 709 được hỗ trợ." ReconnectDelayTime="Độ trễ kết hợp lại"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/zh-CN.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/zh-CN.ini
Changed
@@ -54,7 +54,7 @@ AMF.Preset.balanced="平衡" AMF.Preset.quality="质量" AMF.Preset.highQuality="高质量" -FFmpegSource="媒体源" +FFmpegSource="媒体" LocalFile="本地文件" Looping="循环" Input="输入"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/data/locale/zh-TW.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/data/locale/zh-TW.ini
Changed
@@ -51,7 +51,6 @@ AMF.Preset.balanced="折衷" AMF.Preset.quality="畫質" AMF.Preset.highQuality="高畫質" -FFmpegSource="媒體來源" LocalFile="本機檔案" Looping="循環" Input="輸入"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
Changed
@@ -105,6 +105,7 @@ int abitrate; int sample_rate; int frame_size; + int initial_padding; int channels; }; @@ -288,6 +289,8 @@ return false; if (!get_opt_int(argc, argv, &audio->frame_size, "audio frame size")) return false; + if (!get_opt_int(argc, argv, &audio->initial_padding, "audio padding")) + return false; if (!get_opt_int(argc, argv, &audio->channels, "audio channels")) return false; return true; @@ -554,6 +557,9 @@ if (ffm->output->oformat->flags & AVFMT_GLOBALHEADER) context->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; + // Set initial padding so that priming samples are skipped + context->initial_padding = ffm->audioidx.initial_padding; + avcodec_parameters_from_context(stream->codecpar, context); ffm->audio_infosffm->num_audio_streams.stream = stream;
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-audio-encoders.c -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-audio-encoders.c
Changed
@@ -456,6 +456,12 @@ return enc->frame_size; } +static uint32_t enc_initial_padding(void *data) +{ + struct enc_encoder *enc = data; + return enc->context->initial_padding; +} + struct obs_encoder_info aac_encoder_info = { .id = "ffmpeg_aac", .type = OBS_ENCODER_AUDIO, @@ -469,6 +475,7 @@ .get_properties = enc_properties, .get_extra_data = enc_extra_data, .get_audio_info = enc_audio_info, + .get_priming_samples = enc_initial_padding, }; struct obs_encoder_info opus_encoder_info = { @@ -484,6 +491,7 @@ .get_properties = enc_properties, .get_extra_data = enc_extra_data, .get_audio_info = enc_audio_info, + .get_priming_samples = enc_initial_padding, }; struct obs_encoder_info pcm_encoder_info = {
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-mux.c -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-mux.c
Changed
@@ -211,6 +211,7 @@ os_process_args_add_argf(args, "%d", bitrate); os_process_args_add_argf(args, "%d", (int)obs_encoder_get_sample_rate(aencoder)); os_process_args_add_argf(args, "%d", (int)obs_encoder_get_frame_size(aencoder)); + os_process_args_add_argf(args, "%d", (int)obs_encoder_get_priming_samples(aencoder)); os_process_args_add_argf(args, "%d", (int)audio_output_get_channels(audio)); }
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-openh264.c -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-openh264.c
Changed
@@ -193,7 +193,7 @@ void openh264_defaults(obs_data_t *settings) { - obs_data_set_default_int(settings, "bitrate", 2500); + obs_data_set_default_int(settings, "bitrate", 6000); obs_data_set_default_string(settings, "profile", "main"); }
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c
Changed
@@ -861,7 +861,7 @@ else if (codec == CODEC_AV1) obs_data_set_default_int(settings, "profile", AV_PROFILE_AV1_MAIN); obs_data_set_default_int(settings, "level", AV_LEVEL_UNKNOWN); - obs_data_set_default_int(settings, "bitrate", 2500); + obs_data_set_default_int(settings, "bitrate", 6000); obs_data_set_default_int(settings, "keyint_sec", 0); obs_data_set_default_int(settings, "bf", 0); obs_data_set_default_int(settings, "qp", 20);
View file
obs-studio-32.0.4.tar.xz/plugins/obs-ffmpeg/texture-amf.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-ffmpeg/texture-amf.cpp
Changed
@@ -1383,7 +1383,7 @@ int64_t framerate = enc->fps_num / enc->fps_den; if ((enc->cx * enc->cy > 1920 * 1088) || (framerate > 60)) { // Recommended base defaults - obs_data_set_default_int(settings, "bitrate", 2500); + obs_data_set_default_int(settings, "bitrate", 6000); obs_data_set_default_int(settings, "cqp", 20); obs_data_set_default_string(settings, "rate_control", "CBR"); obs_data_set_default_string(settings, "preset", "quality"); @@ -1841,7 +1841,7 @@ const int64_t framerate = enc->fps_num / enc->fps_den; if ((enc->cx * enc->cy > 1920 * 1088) || is10bit || (framerate > 60)) { // Recommended base defaults - obs_data_set_default_int(settings, "bitrate", 2500); + obs_data_set_default_int(settings, "bitrate", 6000); obs_data_set_default_int(settings, "cqp", 20); obs_data_set_default_string(settings, "preset", "quality"); info("Original base default settings were used according to resolution and framerate."); @@ -2092,7 +2092,7 @@ static void amf_hevc_defaults(obs_data_t *settings) { obs_data_set_default_string(settings, "rate_control", "CBR"); - obs_data_set_default_int(settings, "bitrate", 2500); + obs_data_set_default_int(settings, "bitrate", 6000); obs_data_set_default_int(settings, "cqp", 20); obs_data_set_default_string(settings, "preset", "quality"); } @@ -2245,7 +2245,7 @@ const int64_t framerate = enc->fps_num / enc->fps_den; if ((enc->cx * enc->cy > 1920 * 1088) || is10bit || (framerate > 60)) { // Recommended base defaults - obs_data_set_default_int(settings, "bitrate", 2500); + obs_data_set_default_int(settings, "bitrate", 6000); obs_data_set_default_int(settings, "cqp", 20); obs_data_set_default_string(settings, "preset", "balanced"); obs_data_set_default_string(settings, "profile", "main");
View file
obs-studio-32.0.4.tar.xz/plugins/obs-filters/data/locale/az-AZ.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-filters/data/locale/az-AZ.ini
Changed
@@ -72,7 +72,7 @@ Resolution="Rezolyusiya" Base.Canvas="Əsas (Canvas) Rezolyusiya" None="Heç biri" -ScaleFiltering="Miqyas Süzgəci" +ScaleFiltering="Miqyas Filtrləməsi" ScaleFiltering.Point="Nöqtə" ScaleFiltering.Bicubic="Bikubik" ScaleFiltering.Area="Sahə"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-filters/data/locale/de-DE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-filters/data/locale/de-DE.ini
Changed
@@ -74,7 +74,7 @@ NoiseSuppress.Intensity="Unterdrückungsintensität" NoiseSuppress.Method="Methode" NoiseSuppress.Method.Speex="Speex (Niedrige CPU-Nutzung und Qualität)" -NoiseSuppress.Method.RNNoise="RNNoise (Gute Qualität, höhere CPU-Nutzung)" +NoiseSuppress.Method.RNNoise="RNNoise (gute Qualität, höhere CPU-Nutzung)" Saturation="Sättigung" HueShift="Farbtonverschiebung" Amount="Betrag"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-filters/data/locale/el-GR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-filters/data/locale/el-GR.ini
Changed
@@ -50,6 +50,8 @@ HdrTonemap.SdrWhiteLevel="Λευκό Επίπεδο SDR" HdrTonemap.HdrInputMaximum="Μέγιστη Είσοδος HDR" HdrTonemap.HdrOutputMaximum="Μέγιστη Έξοδος HDR" +HdrTonemap.SdrInputMaximum="Μέγιστη Είσοδος SDR" +HdrTonemap.SdrOutputMaximum="Μέγιστη Έξοδος SDR" ScrollFilter.SpeedX="Οριζόντια Ταχύτητα" ScrollFilter.SpeedY="Κατακόρυφη Ταχύτητα" ScrollFilter.LimitWidth="Περιορισμός Πλάτους"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-filters/data/locale/fil-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-filters/data/locale/fil-PH.ini
Changed
@@ -23,7 +23,7 @@ MaskBlendType.BlendMultiply="I-Blend (Paramihin)" MaskBlendType.BlendAddition="I-Blend (Dagdagan)" MaskBlendType.BlendSubtraction="I-Blend (Bawasan)" -Path="Ang Landas" +Path="Landas" Color="Kulay" ColorMultiply="Pagkakadami ng Kulay" ColorAdd="Pagdadag ng Kulay" @@ -31,8 +31,8 @@ Contrast="Kaibahan" Brightness="Kaliwanagan" SdrOnlyInfo="Impormasyon: Ang Setting ay Ma-apply lang sa SDR Video." -BrowsePath.Images="Lahat ng Image Files" -BrowsePath.AllFiles="Lahat ng Files" +BrowsePath.Images="Lahat ng Image File" +BrowsePath.AllFiles="Lahat ng File" KeyColorType="Susi ng Color Type" KeyColor="Susi ng Kulay" Similarity="Ang pagkapareho (1-1000)" @@ -64,7 +64,7 @@ Gain.GainDB="Makakuha" StretchImage="Mag-stretch ng Imahe (itapon ang imahe ng anyong panumbasan)" Resolution="Resolusyon" -Base.Canvas="Pangunahing Resolusyon (Kanbas)" +Base.Canvas="Basehang (Kanbas) Resolusyon" None="Wala" ScaleFiltering="Iskala ng Pagsasala" ScaleFiltering.Point="Punto"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-filters/data/locale/ka-GE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-filters/data/locale/ka-GE.ini
Changed
@@ -93,7 +93,7 @@ Compressor.AttackTime="გამძაფრება" Compressor.ReleaseTime="დაცხრომა" Compressor.OutputGain="გამოტანის გაძლიერება" -Compressor.SidechainSource="დაწევის/გადაფარვის წყარო" +Compressor.SidechainSource="ჩაჩუმება/გადაფარვის წყარო" Limiter="შემზღუდავი" Limiter.Threshold="ზღურბლი" Limiter.ReleaseTime="გაშვება" @@ -109,7 +109,7 @@ Expander.Presets="მზა პარამეტრ." Expander.Presets.Expander="განმვრცობი" Expander.Presets.Gate="ჩამკეტი" -Expander.Knee.Width="გადაღუნვის სიგრძე" +Expander.Knee.Width="გადახრის სიგრძე" LumaKeyFilter="კაშკაშა არეების ჩანაცვლება (Luma Key)" Luma.LumaMax="სიკაშკაშის ზედა ზღვარი" Luma.LumaMin="სიკაშკაშის ქვედა ზღვარი"
View file
obs-studio-32.1.0.tar.xz/plugins/obs-filters/data/locale/lo-LA.ini
Added
@@ -0,0 +1,116 @@ +ColorFilter="ການແກ້ໄຂສີ" +ColorGradeFilter="ນຳໃຊ້ LUT" +MaskFilter="ໜ້າກາກຮູບພາບ/ການປະສົມ" +AsyncDelayFilter="ການໜ່ວງວິດີໂອ (ບໍ່ປະສານເວລາ)" +CropFilter="ຕັດຂອບ/ເສີມຂອບ" +HdrTonemapFilter="ການແປງໂທນສີ HDR (ທັບຄ່າ)" +ScrollFilter="ການເລື່ອນ" +ChromaKeyFilter="ໂຄຣມາຄີ (Chroma Key)" +ColorKeyFilter="ຄີສີ (Color Key)" +SharpnessFilter="ເຮັດໃຫ້ຄົມຊັດ" +Sharpness="ຄວາມຄົມຊັດ" +ScaleFilter="ການປັບຂະໜາດ/ອັດຕາສ່ວນ" +GPUDelayFilter="ການໜ່ວງການປະມວນຜົນ" +UndistortCenter="ແກ້ໄຂຄວາມຜິດພ້ຽນເຄິ່ງກາງຂອງຮູບພາບ ເມື່ອປັບຂະໜາດຈາກ ultrawide" +NoiseGate="ປະຕູສັນຍານລົບກວນ (Noise Gate)" +NoiseSuppress="ການສະກັດກັ້ນສຽງລົບກວນ" +InvertPolarity="ກັບຂົ້ວສັນຍານ" +Gain="ອັດຕາຂະຫຍາຍ" +DelayMs="ການໜ່ວງ" +Type="ປະເພດ" +MaskBlendType.MaskColor="ໜ້າກາກອັນຟາ (ຊ່ອງສີ)" +MaskBlendType.MaskAlpha="ໜ້າກາກອັນຟາ (ຊ່ອງອັນຟາ)" +MaskBlendType.BlendMultiply="ປະສົມ (ຄູນ)" +MaskBlendType.BlendAddition="ປະສົມ (ບວກ)" +MaskBlendType.BlendSubtraction="ປະສົມ (ລົບ)" +Path="ເສັ້ນທາງ" +Color="ສີ" +ColorMultiply="ການຄູນສີ" +ColorAdd="ການບວກສີ" +Opacity="ຄວາມທຶບແສງ" +Contrast="ຄວາມຕັດກັນ" +Brightness="ຄວາມແຈ້ງ" +Gamma="ແກມມາ" +SdrOnlyInfo="ຂໍ້ມູນ: ການຕັ້ງຄ່ານີ້ມີຜົນກັບວິດີໂອ SDR ເທົ່ານັ້ນ." +BrowsePath.Images="ໄຟລ໌ຮູບພາບທັງໝົດ" +BrowsePath.AllFiles="ໄຟລ໌ທັງໝົດ" +KeyColorType="ປະເພດສີຫຼັກ" +KeyColor="ສີຫຼັກ" +Similarity="ຄວາມຄ້າຍຄືກັນ (1-1000)" +Smoothness="ຄວາມລຽບນຽນ (1-1000)" +ColorSpillReduction="ການຫຼຸດສີຫຼັກທີ່ລົ້ນອອກ (1-1000)" +Crop.Left="ຊ້າຍ" +Crop.Right="ຂວາ" +Crop.Top="ເທິງ" +Crop.Bottom="ລຸ່ມ" +Crop.Width="ຄວາມກວ້າງ" +Crop.Height="ຄວາມສູງ" +Crop.Relative="ສຳພັນກັນ" +HdrTonemap.Description="OBS ສາມາດເຮັດການແປງໂທນສີ HDR ເປັນ SDR ໄດ້ໂດຍອັດຕະໂນມັດ. ໃຫ້ໃຊ້ຕົວຕອງນີ້ສະເພາະກໍລະນີທີ່ເຈົ້າຕ້ອງການການຄວບຄຸມເພີ່ມເຕີມສຳລັບແຫຼ່ງທີ່ມາສະເພາະ.\nຕົວຕອງນີ້ບໍ່ມີຜົນກັບແຫຼ່ງທີ່ມາແບບ SDR." +HdrTonemap.ToneTransform="ການແປງໂທນ" +HdrTonemap.SdrWhiteLevel="ລະດັບສີຂາວ SDR" +HdrTonemap.HdrInputMaximum="ຄ່າສູງສຸດຂອງອິນພຸດ HDR" +HdrTonemap.HdrOutputMaximum="ຄ່າສູງສຸດຂອງເອົາພຸດ HDR" +HdrTonemap.SdrInputMaximum="ຄ່າສູງສຸດຂອງອິນພຸດ SDR" +HdrTonemap.SdrOutputMaximum="ຄ່າສູງສຸດຂອງເອົາພຸດ SDR" +ScrollFilter.SpeedX="ຄວາມໄວລວງນອນ" +ScrollFilter.SpeedY="ຄວາມໄວລວງຕັ້ງ" +ScrollFilter.LimitWidth="ຈຳກັດຄວາມກວ້າງ" +ScrollFilter.LimitHeight="ຈຳກັດຄວາມສູງ" +ScrollFilter.Loop="ວົນຮອບ" +CustomColor="ສີທີ່ກຳນົດເອງ" +Red="ສີແດງ" +Green="ສີຂຽວ" +Blue="ສີຟ້າ" +Magenta="ສີມ່ວງແດງ" +NoiseGate.OpenThreshold="ຂີດຈຳກັດເປີດ" +NoiseGate.CloseThreshold="ຂີດຈຳກັດປິດ" +NoiseGate.AttackTime="ເວລາຕອບສະໜອງ (Attack)" +NoiseGate.HoldTime="ເວລາຄົງສະພາບ (Hold)" +NoiseGate.ReleaseTime="ເວລາຄາຍ (Release)" +Gain.GainDB="ອັດຕາຂະຫຍາຍ" +StretchImage="ຢືດຮູບພາບ (ຖິ້ມອັດຕາສ່ວນຮູບພາບ)" +Resolution="ຄວາມລະອຽດ" +Base.Canvas="ຄວາມລະອຽດພື້ນຖານ (ຜ້າໃບ)" +None="ບໍ່ມີ" +ScaleFiltering="ການຕອງຂະໜາດ" +ScaleFiltering.Point="ຈຸດ (Point)" +ScaleFiltering.Area="ພື້ນທີ່ (Area)" +NoiseSuppress.SuppressLevel="ລະດັບການສະກັດກັ້ນ" +NoiseSuppress.Intensity="ຄວາມເຂັ້ມຂຸ້ນການສະກັດກັ້ນ" +NoiseSuppress.Method="ວິທີການ" +NoiseSuppress.Method.Speex="Speex (ໃຊ້ CPU ໜ້ອຍ, ຄຸນນະພາບຕໍ່າ)" +NoiseSuppress.Method.RNNoise="RNNoise (ຄຸນນະພາບດີ, ໃຊ້ CPU ຫຼາຍກວ່າ)" +Saturation="ຄວາມອີ່ມໂຕຂອງສີ" +HueShift="ການປ່ຽນຄ່າສີ" +Amount="ຈຳນວນ" +PassthroughAlpha="ຜ່ານຄ່າອັນຟາ" +Compressor="ຕົວບີບອັດ (Compressor)" +Compressor.Ratio="ອັດຕາສ່ວນ" +Compressor.Threshold="ຂີດຈຳກັດ" +Compressor.AttackTime="ເວລາຕອບສະໜອງ (Attack)" +Compressor.ReleaseTime="ເວລາຄາຍ (Release)" +Compressor.OutputGain="ອັດຕາຂະຫຍາຍຂາອອກ" +Compressor.SidechainSource="ແຫຼ່ງ Sidechain/Ducking" +Limiter="ຕົວຈຳກັດ (Limiter)" +Limiter.Threshold="ຂີດຈຳກັດ" +Limiter.ReleaseTime="ເວລາຄາຍ (Release)" +Expander="ຕົວຂະຫຍາຍ (Expander)" +Expander.Ratio="ອັດຕາສ່ວນ" +Expander.Threshold="ຂີດຈຳກັດ" +Expander.AttackTime="ເວລາຕອບສະໜອງ (Attack)" +Expander.ReleaseTime="ເວລາຄາຍ (Release)" +Expander.OutputGain="ອັດຕາຂະຫຍາຍຂາອອກ" +Expander.Detector="ການກວດຈັບ" +Expander.Presets="ຄ່າທີ່ຕັ້ງໄວ້ລ່ວງໜ້າ" +Expander.Knee.Width="ຄວາມກວ້າງຂອງສ່ວນໂຄ້ງ (Knee)" +LumaKeyFilter="ລູມາຄີ (Luma Key)" +Luma.LumaMax="ລູມາສູງສຸດ" +Luma.LumaMin="ລູມາຕໍ່າສຸດ" +Luma.LumaMaxSmooth="ຄວາມລຽບນຽນລູມາສູງສຸດ" +Luma.LumaMinSmooth="ຄວາມລຽບນຽນລູມາຕໍ່າສຸດ" +Upward.Compressor="ຕົວບີບອັດແບບສວນທາງ (Upward Compressor)" +3BandEq="ອີຄວໍໄລເຊີ 3 ຢ່ານຄວາມຖີ່" +3BandEq.low="ຕໍ່າ" +3BandEq.mid="ກາງ" +3BandEq.high="ສູງ"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-filters/data/locale/pt-BR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-filters/data/locale/pt-BR.ini
Changed
@@ -68,7 +68,7 @@ Gain.GainDB="Ganho" StretchImage="Esticar a imagem (ignorar proporção da imagem)" Resolution="Resolução" -Base.Canvas="Resolução base (tela)" +Base.Canvas="Resolução base (área de edição)" None="Nenhuma" ScaleFiltering="Filtragem de escala" ScaleFiltering.Point="Ponto"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-filters/data/locale/sl-SI.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-filters/data/locale/sl-SI.ini
Changed
@@ -5,7 +5,7 @@ CropFilter="Obreži/Zapolni" HdrTonemapFilter="Tonalna preslikava HDR (preglasi)" ScrollFilter="Pomikanje" -ChromaKeyFilter="Kromatsko prekrivanje" +ChromaKeyFilter="Barvna maska" ColorKeyFilter="Barvno prekrivanje" SharpnessFilter="Izostri" Sharpness="Ostrina" @@ -110,11 +110,11 @@ Expander.Presets.Expander="Razširjevalec" Expander.Presets.Gate="Vrata" Expander.Knee.Width="Širina kolena" -LumaKeyFilter="Svetlobno prekrivanje" -Luma.LumaMax="Največja svetilnost" -Luma.LumaMin="Najmanjša svetilnost" -Luma.LumaMaxSmooth="Najv. zgl. svetilnost" -Luma.LumaMinSmooth="Najm. zgl. svetilnost" +LumaKeyFilter="Svetlobna maska" +Luma.LumaMax="Največja svetlost" +Luma.LumaMin="Najmanjša svetlost" +Luma.LumaMaxSmooth="Najv. zgl.svetlost" +Luma.LumaMinSmooth="Najm. zgl. svetlost" Upward.Compressor="Navzgornji kompresor" 3BandEq="3-pasovni izenačevalnik" 3BandEq.low="Nizko"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-filters/data/locale/tl-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-filters/data/locale/tl-PH.ini
Changed
@@ -7,8 +7,9 @@ ChromaKeyFilter="Ang Chroma Key" ColorKeyFilter="Kulay ng mga Key" SharpnessFilter="Patalasan pa" +ScaleFilter="Pagsasalinlaki/Tagway ng Anyo" GPUDelayFilter="Mad-render ng Delay" -UndistortCenter="Ang sentro ay i-undistort kapag ang scaling ay mula sa ultrawide" +UndistortCenter="Ipatuwid ang gitna ng laragway kapag magsasalinlaki galing sa labis na lapad." NoiseSuppress="Pagtimpiin ang tunog" Gain="Napunan" DelayMs="I-delay" @@ -17,12 +18,12 @@ MaskBlendType.BlendMultiply="I-blend (pagpaparami)" MaskBlendType.BlendAddition="I-blend (pagsamahin)" MaskBlendType.BlendSubtraction="I-blend (paghiwalayin)" -Path="Daanan" +Path="Landas" Color="Kulay" Contrast="Kaibahan" Brightness="Gaano kaliwanag" -BrowsePath.Images="Lahat ng mga Imahen sa File" -BrowsePath.AllFiles="Lahat ng mga Files" +BrowsePath.Images="Lahat ng Talaksang Laragway" +BrowsePath.AllFiles="Lahat ng Talaksan" KeyColorType="Tipo ng Kulay sa Key" KeyColor="Kulay ng Key" Similarity="Kapareho (1-1000)" @@ -35,6 +36,7 @@ Crop.Width="Lapad" Crop.Height="Taas" Crop.Relative="Kaugnayan" +HdrTonemap.ToneTransform="Pagsaanyo ng Tono" ScrollFilter.SpeedX="Pahigang Bilis" ScrollFilter.SpeedY="Patayong Bilis" ScrollFilter.LimitWidth="Limitasyon ng Lapad" @@ -50,7 +52,8 @@ NoiseGate.ReleaseTime="Pakawalan ang Oras" Gain.GainDB="Napunan" StretchImage="I-stretch ang Imahe (baliwalain ang imahe mula sa aspect ratio)" -Resolution="Resulosyon" +Resolution="Hisikot" +Base.Canvas="Batayang (Kanbas) Hisikot" None="Wala" ScaleFiltering="I-filter ang Scale" ScaleFiltering.Point="Tuldok"
View file
obs-studio-32.1.0.tar.xz/plugins/obs-libfdk/data/locale/lo-LA.ini
Added
@@ -0,0 +1,2 @@ +Bitrate="ບິດເຣດ" +Afterburner="ເປີດໃຊ້ງານ AAC Afterburner"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-libfdk/obs-libfdk.c -> obs-studio-32.1.0.tar.xz/plugins/obs-libfdk/obs-libfdk.c
Changed
@@ -290,6 +290,17 @@ return enc->info.frameLength; } +static uint32_t libfdk_encoder_delay(void *data) +{ + libfdk_encoder_t *enc = data; + +#if (AACENCODER_LIB_VL0 >= 4) + return enc->info.nDelay; +#else + return enc->info.encoderDelay; +#endif +} + struct obs_encoder_info obs_libfdk_encoder = { .id = "libfdk_aac", .type = OBS_ENCODER_AUDIO, @@ -303,6 +314,7 @@ .get_properties = libfdk_properties, .get_extra_data = libfdk_extra_data, .get_audio_info = libfdk_audio_info, + .get_priming_samples = libfdk_encoder_delay, }; bool obs_module_load(void)
View file
obs-studio-32.0.4.tar.xz/plugins/obs-nvenc/data/locale/ar-SA.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-nvenc/data/locale/ar-SA.ini
Changed
@@ -40,6 +40,7 @@ SplitEncode.Disabled="معطل" SplitEncode.Enabled="فصل ثنائي" SplitEncode.ThreeWay="فصل ثلاثي" +SplitEncode.FourWay="تقسيم رباعي" Opts="خيارات المُرمِّز المخصّص" Opts.TT="قائمة من خيارات مفصولة بمسافات للتطبيق للتحكم في المعدل وإعدادات برنامَج الترميز,\nحسب أسمائهم في رأس nvEncodeAPI.\nعلى سبيل المثال: \"lookaheadDepth=16 aqStrength=4\"" Opts.Invalid="خيارات المُرمِّز المخصّص غير صحيحة, تحقق من السجل للتفاصيل.<br><br>أنظر إلى <a href=\"https://obsproject.com/kb/advanced-nvenc-options\">مقالتنا لقاعدة المعرفة</a> للحصول على معلومات عن خيارات متوفرة."
View file
obs-studio-32.1.0.tar.xz/plugins/obs-nvenc/data/locale/az-AZ.ini
Added
@@ -0,0 +1,61 @@ +RateControl="Bitreytə Nəzarət" +CBR="Sabit Bit Sürəti" +VBR="Dəyişkən Bit Sürəti" +CQVBR="Hədəf Keyfiyyəti ilə Dəyişən Bit Sürəti" +CQP="Sabit QP" +Lossless="İtkisiz" +Bitrate="Bit sürəti" +MaxBitrate="Maksimum Bit Sürəti (0 = Səviyyə Limiti)" +TargetQuality="Hədəf Keyfiyyət" +KeyframeIntervalSec="Açar Kadr intervalı (saniyə, 0 = avto)" +LookAhead="Qabaqcadan baxış" +LookAhead.ToolTip="Qabaqcadan baxışı aktiv edir.\n\nAktiv olduqda, gələcək kadrların təhlili ilə daha yaxşı bitreyt bölgüsü müəyyən edərək vizual keyfiyyəti artırır,\nbu isə GPU istifadəsi və gecikmənin artması hesabına baş verir." +AdaptiveQuantization="Adaptiv Kvantlama" +AdaptiveQuantization.ToolTip="Qavranılan vizual keyfiyyəti artırmaq üçün bitreyt istifadəsini optimallaşdıran Zamansal/Məkansal Adaptiv Kvantlamanı aktiv edir,\nxüsusilə yüksək hərəkətli səhnələrdə, bu isə GPU istifadəsinin artması hesabına baş verir.\n\nƏvvəllər \"Vizual Qavrayışa görə Optimallaşdırma\" kimi tanınırdı." +Preset="İlkin Sazlama" +Preset.p1="P1: Ən Sürətli (Ən Aşağı Keyfiyyət)" +Preset.p2="P2: Daha Sürətli (Daha Aşağı Keyfiyyət)" +Preset.p3="P3: Sürətli (Aşağı Keyfiyyət)" +Preset.p4="P4: Orta (Orta Keyfiyyət)" +Preset.p5="P5: Yavaş (Yaxşı Keyfiyyət)" +Preset.p6="P6: Daha Yavaş (Daha Yaxşı Keyfiyyət)" +Preset.p7="P7: Ən Yavaş (Ən Yaxşı Keyfiyyət)" +Tuning="Optimallaşdırma" +Tuning.uhq="Ultra Yüksək Keyfiyyət (yavaş, tövsiyə olunmur)" +Tuning.hq="Yüksək Keyfiyyət" +Tuning.ll="Aşağı Gecikmə" +Tuning.ull="Ultra Aşağı Gecikmə" +Multipass="Çoxkeçidli Rejim" +Multipass.disabled="Birkeçid" +Multipass.qres="İki Keçid (Dörddəbir Rezolyusiya)" +Multipass.fullres="İki Keçid (Tam Rezolyusiya)" +Profile="Profil" +BFrames="B Kadrları" +BFrameRefMode="Referans kimi B-Kadr" +BframeRefMode.Disabled="Deaktiv" +BframeRefMode.Each="Hər biri" +BframeRefMode.Middle="Yalnız orta B-kadr" +SplitEncode="Bölünmüş Kodlaşdırma" +SplitEncode.Auto="Avto" +SplitEncode.Disabled="Deaktiv" +SplitEncode.Enabled="İki istiqamətli bölünmə" +SplitEncode.ThreeWay="Üç istiqamətli bölünmə" +SplitEncode.FourWay="Dörd istiqamətli bölünmə" +Opts="Fərdi Kodlayıcı Seçimləri" +Opts.TT="Rate control və kodek ayarlarına tətbiq olunacaq seçimlərin boşluqla ayrılmış siyahısı\n nvEncodeAPI başlığındakı adlarına əsasən.\nMəsələn: \"lookaheadDepth=16 aqStrength=4\"" +Opts.Invalid="Etibarsız Xüsusi Kodlayıcı seçimləri. Ətraflı məlumat üçün jurnalı yoxlayın.<br><br>Mövcud seçimlər haqqında məlumat üçün bizim <a href=\"https://obsproject.com/kb/advanced-nvenc-options\">Bilik Bazası Məqaləmizə</a> baxın." +Error="NVENC kodekini açmaq mümkün olmadı: %1" +GenericError="Ən son <a href=\"https://obsproject.com/go/nvidia-drivers\">NVIDIA drayverini</a> quraşdırın və NVIDIA ShadowPlay və ya Windows Game DVR kimi NVENC istifadə edə biləcək digər yazı proqramlarını bağlayın." +BadGPUIndex="Siz çıxış kodlayıcı sazlamalarında GPU %1 seçmisiniz. Bu dəyəri 0-a qaytarın və yenidən cəhd edin." +OutdatedDriver="Quraşdırılmış NVIDIA drayveri bu NVENC versiyasını dəstəkləmir, <a href=\"https://obsproject.com/go/nvidia-drivers\">drayveri yeniləməyi</a> yoxlayın." +UnsupportedDevice="NVENC Xətası: Dəstəklənməyən cihaz. Video kartınızın <a href=\"https://obsproject.com/go/nvenc-matrix\">NVENC-i dəstəklədiyini</a> yoxlayın və <a href=\"https://obsproject.com/go/nvidia-drivers\">sürücünü yeniləməyi</a> sınayın." +TooManySessions="NVENC Xətası: Çox sayda eyni vaxtlı seans. NVIDIA ShadowPlay və ya Windows Game DVR kimi NVENC istifadə edə biləcək digər yazı proqramlarını bağlamağı yoxlayın." +CheckDrivers="Ən son <a href=\"https://obsproject.com/go/nvidia-drivers\">NVIDIA sürücüsünü</a> quraşdırmağı sınayın." +8bitUnsupportedHdr="OBS, Rec. 2100-ün 8-bit çıxışını dəstəkləmir." +I010Unsupported="NVENC, I010-u dəstəkləmir. Əvəzinə P010 istifadə edin." +10bitUnsupported="Bu kodlayıcıda 10-bit kodlaşdırma aparmaq mümkün deyil." +16bitUnsupported="Bu kodlayıcıda 16-bit kodlaşdırma aparmaq mümkün deyil." +444Unsupported="Bu kodlayıcıda 4:4:4 kodlaşdırma aparmaq mümkün deyil." +CQLevel="CQ Səviyyəsi" +PsychoVisualTuning="Vizual Qavrayışa görə Optimallaşdırma" +PsychoVisualTuning.ToolTip="GPU istifadəsinin artması hesabına, xüsusilə yüksək hərəkətli səhnələrdə qavranılan vizual\nkeyfiyyəti artırmaq üçün bitreyt istifadəsini optimallaşdıran kodlayıcı ayarlarını aktiv edir."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-nvenc/data/locale/ca-ES.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-nvenc/data/locale/ca-ES.ini
Changed
@@ -39,7 +39,7 @@ SplitEncode.Disabled="Inhabilitat" SplitEncode.Enabled="Separador de dues vies" SplitEncode.ThreeWay="Separador de tres vies" -SplitEncode.FourWay="Divisió de quatre vies" +SplitEncode.FourWay="Separador de quatre vies" Opts="Opcions personalitzades del codificador" Opts.TT="Llista d'opcions per aplicar a la ràtio i configuració del codificador,\nbasada als noms de nvEncodeAPI.\nP.ex. \"lookaheadDepth=16 aqStrength=4\"" Opts.Invalid="Les opcions del codificador personalitzat no són vàlides, consulteu el registre per obtenir més informació.<br><br>Consulteu el nostre <a href=\"https://obsproject.com/kb/advanced-nvenc-options\">article de la base de coneixement</a> per obtenir informació sobre les opcions disponibles."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-nvenc/data/locale/de-DE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-nvenc/data/locale/de-DE.ini
Changed
@@ -5,7 +5,7 @@ Lossless="Verlustfrei" MaxBitrate="Maximale Bitrate (0 = Pegelbegrenzung)" TargetQuality="Zielqualität" -KeyframeIntervalSec="Keyframeintervall in Sek. (0 = automatisch)" +KeyframeIntervalSec="Keyframeintervall (Sekunden, 0 = automatisch)" LookAhead="Lookahead" LookAhead.ToolTip="Wenn diese Option aktiviert ist, wird die visuelle Qualität verbessert, indem durch die Analyse zukünftiger Frames\neine bessere Bitratenverteilung ermittelt wird, allerdings auf Kosten einer höheren GPU-Auslastung und -Latenz." AdaptiveQuantization="Adaptive Quantisierung" @@ -18,7 +18,7 @@ Preset.p5="P5: Langsam (Gute Qualität)" Preset.p6="P6: Langsamer (Bessere Qualität)" Preset.p7="P7: Am langsamsten (Beste Qualität)" -Tuning.uhq="Extrem hohe Qualität (Langsam, nicht empfohlen)" +Tuning.uhq="Extrem hohe Qualität (langsam, nicht empfohlen)" Tuning.hq="Hohe Qualität" Tuning.ll="Niedrige Latenz" Tuning.ull="Extrem niedrige Latenz"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-nvenc/data/locale/el-GR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-nvenc/data/locale/el-GR.ini
Changed
@@ -1,5 +1,7 @@ +Lossless="Μη απωλεστική" Profile="Προφίλ" BframeRefMode.Disabled="Απενεργοποιημένο" BframeRefMode.Each="Κάθε" SplitEncode.Auto="Αυτόματο" SplitEncode.Disabled="Απενεργοποιημένο" +CQLevel="Επίπεδο CQ"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-nvenc/data/locale/et-EE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-nvenc/data/locale/et-EE.ini
Changed
@@ -1,9 +1,17 @@ RateControl="Kiiruse kontroll" CBR="Ühtlane bitikiirus" VBR="Muutuv bitikiirus" +CQVBR="Muutuv bitikiirus sihtkvaliteediga" +CQP="Konstantne QP" Lossless="Kadudeta" Bitrate="Bitikiirus" +MaxBitrate="Maksimaalne bitikiirus (0 = tasemepiirang)" +TargetQuality="Sihtkvaliteet" KeyframeIntervalSec="Võtmekaadri intervall (sekundit, 0 = automaatne)" +LookAhead="Ettevaade" +LookAhead.ToolTip="Lubab ettevaatusfunktsiooni.\n\nKui see on lubatud, parandab see visuaalset kvaliteeti, määrates tulevaste kaadrite analüüsi abil parema bitikiiruse jaotuse,\n suurendades GPU kasutust ja latentsust." +AdaptiveQuantization="Adaptiivne kvantiseerimine" +AdaptiveQuantization.ToolTip="Lubab ajalist/ruumilist adaptiivset kvantimist, mis optimeerib bitikiiruse kasutamist tajutava visuaalse kvaliteedi parandamiseks, eriti suure liikumisega olukordades, suurendades GPU kasutust. Varem tuntud kui \"psühho-visuaalne häälestamine\"." Preset="Eelseadistus" Preset.p1="P1: Kiireim (madalaim kvaliteet)" Preset.p2="P2: Kiirem (madal kvaliteet)" @@ -13,6 +21,7 @@ Preset.p6="P6: Aeglasem (parem kvaliteet)" Preset.p7="P7: Aeglaseim (parim kvaliteet)" Tuning="Timmimine" +Tuning.uhq="Ülikõrge kvaliteet (aeglane, pole soovitatav)" Tuning.hq="Kõrge kvaliteet" Tuning.ll="Madal-viivitus" Tuning.ull="Ülimadal viivitusaeg" @@ -21,17 +30,31 @@ Multipass.fullres="Two Passes (täis-eraldusvõime)" Profile="Profiil" BFrames="B-kaadrid" +BFrameRefMode="B-raam võrdlusalusena" BframeRefMode.Disabled="Väljas" BframeRefMode.Each="Iga" +BframeRefMode.Middle="Ainult keskmine b-kaader" +SplitEncode="Jagatud kodeerimine" SplitEncode.Auto="Automaatne" SplitEncode.Disabled="Väljas" +SplitEncode.Enabled="Kahesuunaline jaotus" +SplitEncode.ThreeWay="Kolmesuunaline jaotus" SplitEncode.FourWay="Neljaosaline jagamine" Opts="Kodeerija kohandatud sätted" +Opts.TT="Tühikutega eraldatud loend valikutest, mida rakendada kiiruse juhtimise ja koodeki sätetele,\npõhineb nende nimedel nvEncodeAPI päises.\nnt \"lookaheadDepth=16 aqStrength=4\"" +Opts.Invalid="Kohandatud kodeerija valikud on sobimatud, üksikasjade saamiseks vaadake logi.<br><br>Lisateavet saadaolevate valikute kohta leiate meie <a href=\"https://obsproject.com/kb/advanced-nvenc-options\">teadmusbaasi artiklist</a>." Error="NVENC kodeerija avamine ebaõnnestus: %1" +GenericError="Proovige installida uusim <a href=\"https://obsproject.com/go/nvidia-drivers\">NVIDIA draiver</a> ja sulgege muu salvestustarkvara, mis võib NVENC-i kasutada, näiteks NVIDIA ShadowPlay või Windows Game DVR." BadGPUIndex="Oled valinud GPU %1 oma väljundkodeerija seadetes. Sea see tagasi 0-le ja proovi uuesti." +OutdatedDriver="Installitud NVIDIA draiver ei toeta seda NVENC versiooni, proovige <a href=\"https://obsproject.com/go/nvidia-drivers\">draiverit värskendada</a>." +UnsupportedDevice="NVENC viga: Toetamata seade. Kontrollige, kas teie videokaart <a href=\"https://obsproject.com/go/nvenc-matrix\">toetab NVENC-i</a> ja proovige <a href=\"https://obsproject.com/go/nvidia-drivers\">draiverit värskendada</a>." +TooManySessions="NVENCi viga: Liiga palju samaaegseid seansse. Proovige sulgeda muud salvestustarkvarad, mis võivad NVENCi kasutada, näiteks NVIDIA ShadowPlay või Windows Game DVR." +CheckDrivers="Proovige installida uusim <a href=\"https://obsproject.com/go/nvidia-drivers\">NVIDIA draiver</a>." 8bitUnsupportedHdr="OBS ei toeta Rec. 2100 8-bitist väljundit." I010Unsupported="NVENC ei toeta I010. Kasutsa selle asemel P010." 10bitUnsupported="Selle kodeerijaga ei saa teha 10-bitist kodeerimist." 16bitUnsupported="Selle kodeerijaga ei saa teha 16-bitist kodeerimist." 444Unsupported="Selle kodeerijaga ei saa teha 4:4:4 kodeerimist." CQLevel="CQ tase" +PsychoVisualTuning="Psühho visuaalne häälestamine" +PsychoVisualTuning.ToolTip="Lubab kodeerija seaded, mis optimeerivad bitikiiruse kasutamist tajutava visuaalse kvaliteedi parandamiseks, eriti suure liikumisega olukordades, suurendades seejuures GPU kasutust."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-nvenc/data/locale/fi-FI.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-nvenc/data/locale/fi-FI.ini
Changed
@@ -40,7 +40,9 @@ SplitEncode.Disabled="Pois käytöstä" SplitEncode.Enabled="Kaksiosainen jako" SplitEncode.ThreeWay="Kolmiosainen jako" +SplitEncode.FourWay="Neljään jako" Opts="Mukautetut enkooderin asetukset" +Opts.TT="Välilyönti eroteltu lista valinnoista nopeuden säätöön ja kodekin asetuksiin,\npohjautuu nimiin nvEncodeAPI:n otsakkeessa.\nEsim.\"lookaheadDepth=16 aqStrength=4\"" Opts.Invalid="Virheelliset mukautetut enkooderin asetukset, tarkista loki lisätietoja varten.<br><br>\nKatso <a href=\"https://obsproject.com/kb/advanced-nvenc-options\">tietopankkiartikkelimme</a> saadaksesi lisätietoa käytettävissä olevista valinnoista." Error="NVENC-koodekin avaaminen epäonnistui: %1" GenericError="Kokeile asentaa uusin <a href=\"https://obsproject.com/go/nvidia-drivers\">NVIDIA-ajuri</a> ja sulkea muut mahdollisesti NVENC-koodausta hyödyntävät tallennusohjelmat, kuten NVIDIA ShadowPlay tai Windows Game DVR."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-nvenc/data/locale/hu-HU.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-nvenc/data/locale/hu-HU.ini
Changed
@@ -40,6 +40,7 @@ SplitEncode.Disabled="Kikapcsolva" SplitEncode.Enabled="Kétirányú felosztás" SplitEncode.ThreeWay="Háromirányú felosztás" +SplitEncode.FourWay="Négyirányú felosztás" Opts="Egyéni kódolási beállítások" Opts.TT="Sebességvezérlő és kodekbeállítási kapcsolók szóközzel elválasztott listája,\naz nvEncodeAPI fejlécben szereplő nevük alapján.\nPéldául „lookaheadDepth=16 aqStrength=4”" Opts.Invalid="Érvénytelen egyéni kódolóbeállítások, nézze meg a naplót a részletekért.<br><br>Az elérhető beállítások további információért tekintse meg a <a href=\"https://obsproject.com/kb/advanced-nvenc-options\">tudásbázis-leírásunkat</a>."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-nvenc/data/locale/ka-GE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-nvenc/data/locale/ka-GE.ini
Changed
@@ -8,8 +8,8 @@ MaxBitrate="ბიტსიხშირე არაუმეტეს (0 = შეზღუდული)" TargetQuality="საბოლოო ხარისხი" KeyframeIntervalSec="საკვანძო კადრ. შუალედი (წამი, 0=თვითშერჩევა)" -LookAhead="წინსწრებით" -LookAhead.ToolTip="განსაზღვრავს წინსწრებით.\n\nროცა მოქმედია, ჩვენების ხარისხი გაუმჯობესდება ბიტსიხშირის განაწილების დადგენით მომავალი კადრების წინასწარი გარჩევით,\nდაყოვნებისა და გრაფიკული პროცესორის დატვირთვის ხარჯზე." +LookAhead="წინსწრებითი" +LookAhead.ToolTip="განსაზღვრავს წინსწრებით.\n\nროცა მოქმედია, ჩვენების ხარისხი გაუმჯობესდება ბიტსიხშირის განაწილების დადგენით მომავალი კადრების წინასწარი გარჩევით\nდაყოვნებისა და გრაფიკული პროცესორის დატვირთვის ხარჯზე." AdaptiveQuantization="მოქნილი დაკვანტვა" AdaptiveQuantization.ToolTip="დროებითი/სივრცული მოქნილი დაკვანტვის საშუალებას იძლევა საუკეთესო ბიტსიხშირის შესარჩევად გამოსახულების ხარისხის უკეთ აღქმისთვის,\nგანსაკუთრებით მოძრავ სცენებში, გრაფიკული პროცესორის გაზრდილი დატვირთვის ხარჯზე.\n\nადრე ცნობილი, როგორც „ფსიქო-ვიზუალური გაუმჯობესება“." Preset="პრესეტი" @@ -57,5 +57,5 @@ 16bitUnsupported="16-ბიტიანი დაშიფვრა ვერ ხერხდება ამ მშიფრავით." 444Unsupported="4:4:4 დაშიფვრა ვერ მოხერხდება ამ მშიფრავით." CQLevel="CQ-დონე" -PsychoVisualTuning="ფსიქოვიზუალური გაუმჯობესება" +PsychoVisualTuning="თვალით აღსაქმელი გაუმჯობესება" PsychoVisualTuning.ToolTip="საშუალებას აძლევს დამშიფრავს, საუკეთესოდ შეარჩიოს ბიტსიხშირე გამოსახულების ხარისხის უკეთ აღქმისთვის,\nგანსაკუთრებით მოძრავ სცენებში, გრაფიკული პროცესორის გაზრდილი დატვირთვის ხარჯზე."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-nvenc/data/locale/kmr-TR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-nvenc/data/locale/kmr-TR.ini
Changed
@@ -16,5 +16,7 @@ Multipass="Awayê pir derbasbûn" Multipass.disabled="Yek derbasbûn" Profile="Profîl" +BframeRefMode.Disabled="Neçalakkirî" SplitEncode.Auto="Xweber" SplitEncode.Disabled="Neçalakkirî" +CQLevel="Asta CQ"
View file
obs-studio-32.1.0.tar.xz/plugins/obs-nvenc/data/locale/lo-LA.ini
Added
@@ -0,0 +1,60 @@ +RateControl="ການຄວບຄຸມອັດຕາ" +CBR="ບິດເຣດຄົງທີ່ (CBR)" +VBR="ບິດເຣດແບບປ່ຽນແປງໄດ້ (VBR)" +CQVBR="ບິດເຣດແບບປ່ຽນແປງໄດ້ພ້ອມຄຸນນະພາບເປົ້າໝາຍ (VBR)" +CQP="QP ຄົງທີ່ (CQP)" +Lossless="ບໍ່ມີການສູນເສຍ (Lossless)" +Bitrate="ບິດເຣດ" +MaxBitrate="ບິດເຣດສູງສຸດ (0 = ຈຳກັດລະດັບ)" +TargetQuality="ຄຸນນະພາບເປົ້າໝາຍ" +KeyframeIntervalSec="ໄລຍະຫ່າງຄີເຟຣມ (ວິນາທີ, 0 = ອັດຕະໂນມັດ)" +LookAhead="ເບິ່ງລ່ວງໜ້າ (Look-ahead)" +LookAhead.ToolTip="ເປີດໃຊ້ງານ Lookahead.\n\nຫາກເປີດໃຊ້ງານ, ມັນຈະເພີ່ມຄຸນນະພາບຂອງພາບໂດຍການກຳນົດການກະຈາຍບິດເຣດທີ່ດີຂຶ້ນຜ່ານການວິເຄາະເຟຣມໃນອະນາຄົດ,\nໂດຍແລກກັບການໃຊ້ງານ GPU ແລະ ຄວາມໜ່ວງທີ່ເພີ່ມຂຶ້ນ." +AdaptiveQuantization="Quantization ແບບປັບຕົວ" +AdaptiveQuantization.ToolTip="ເປີດໃຊ້ງານ Temporal/Spatial Adaptive Quantization ເຊິ່ງຊ່ວຍເພີ່ມປະສິດທິພາບການໃຊ້ບິດເຣດ ເພື່ອເພີ່ມຄຸນນະພາບຂອງພາບທີ່ຮັບຮູ້ໄດ້,\nໂດຍສະເພາະໃນສະຖານະການທີ່ມີການເຄື່ອນໄຫວສູງ, ໂດຍແລກກັບການໃຊ້ງານ GPU ທີ່ເພີ່ມຂຶ້ນ.\n\nເມື່ອກ່ອນຮູ້ຈັກກັນໃນຊື່ \"Psycho-Visual Tuning\"." +Preset="ການຕັ້ງຄ່າລ່ວງໜ້າ (Preset)" +Preset.p1="P1: ໄວທີ່ສຸດ (ຄຸນນະພາບຕ່ໍາທີ່ສຸດ)" +Preset.p2="P2: ໄວກວ່າ (ຄຸນນະພາບຕ່ໍາກວ່າ)" +Preset.p3="P3: ໄວ (ຄຸນນະພາບຕ່ໍາ)" +Preset.p4="P4: ປານກາງ (ຄຸນນະພາບປານກາງ)" +Preset.p5="P5: ຊ້າ (ຄຸນນະພາບດີ)" +Preset.p6="P6: ຊ້າກວ່າ (ຄຸນນະພາບດີກວ່າ)" +Preset.p7="P7: ຊ້າທີ່ສຸດ (ຄຸນນະພາບດີທີ່ສຸດ)" +Tuning="ການປັບແຕ່ງ (Tuning)" +Tuning.uhq="ຄຸນນະພາບສູງພິເສດ (ຊ້າ, ບໍ່ແນະນຳ)" +Tuning.hq="ຄຸນນະພາບສູງ" +Tuning.ll="ຄວາມໜ່ວງຕ່ຳ (Low Latency)" +Tuning.ull="ຄວາມໜ່ວງຕ່ຳພິເສດ (Ultra Low Latency)" +Multipass="ໂໝດ Multipass" +Multipass.disabled="ຜ່ານຮອບດຽວ (Single Pass)" +Multipass.qres="ຜ່ານສອງຮອບ (ຄວາມລະອຽດໜຶ່ງສ່ວນສີ່)" +Multipass.fullres="ຜ່ານສອງຮອບ (ຄວາມລະອຽດເຕັມ)" +Profile="ໂປຣໄຟລ໌" +BFrameRefMode="B-Frame ເປັນຕົວອ້າງອີງ" +BframeRefMode.Disabled="ປິດການໃຊ້ງານ" +BframeRefMode.Each="ທຸກເຟຣມ" +BframeRefMode.Middle="ສະເພາະ b-frame ທາງກາງ" +SplitEncode="ການແຍກເຂົ້າລະຫັດ (Split Encode)" +SplitEncode.Auto="ອັດຕະໂນມັດ" +SplitEncode.Disabled="ປິດການໃຊ້ງານ" +SplitEncode.Enabled="ແຍກສອງທາງ" +SplitEncode.ThreeWay="ແຍກສາມທາງ" +SplitEncode.FourWay="ແຍກສີ່ທາງ" +Opts="ຕົວເລືອກຕົວເຂົ້າລະຫັດແບບກຳນົດເອງ" +Opts.TT="ລາຍການຕົວເລືອກທີ່ຂັ້ນດ້ວຍຍະຫວ່າງ ເພື່ອນຳໃຊ້ກັບການຄວບຄຸມອັດຕາ ແລະ ການຕັ້ງຄ່າ Codec,\nໂດຍອີງຕາມຊື່ຂອງພວກມັນໃນ nvEncodeAPI header.\nຕົວຢ່າງ: \"lookaheadDepth=16 aqStrength=4\"" +Opts.Invalid="ຕົວເລືອກຕົວເຂົ້າລະຫັດແບບກຳນົດເອງບໍ່ຖືກຕ້ອງ, ກວດເບິ່ງ log ສຳລັບລາຍລະອຽດ.<br><br>ເບິ່ງ <a href=\"https://obsproject.com/kb/advanced-nvenc-options\">ບົດຄວາມຖານຄວາມຮູ້</a> ຂອງພວກເຮົາສຳລັບຂໍ້ມູນກ່ຽວກັບຕົວເລືອກທີ່ມີຢູ່." +Error="ບໍ່ສາມາດເປີດ NVENC codec: %1" +GenericError="ລອງຕິດຕັ້ງ <a href=\"https://obsproject.com/go/nvidia-drivers\">ໄດຣເວີ NVIDIA</a> ລ່າສຸດ ແລະ ປິດໂປຣແກຣມບັນທຶກອື່ນໆທີ່ອາດຈະກຳລັງໃຊ້ NVENC ຢູ່ ເຊັ່ນ NVIDIA ShadowPlay ຫຼື Windows Game DVR." +BadGPUIndex="ທ່ານໄດ້ເລືອກ GPU %1 ໃນການຕັ້ງຄ່າຕົວເຂົ້າລະຫັດຂາອອກຂອງທ່ານ. ຕັ້ງຄ່ານີ້ກັບຄືນເປັນ 0 ແລ້ວລອງໃໝ່ອີກຄັ້ງ." +OutdatedDriver="ໄດຣເວີ NVIDIA ທີ່ຕິດຕັ້ງຢູ່ບໍ່ຮອງຮັບ NVENC ເວີຊັນນີ້, ລອງ <a href=\"https://obsproject.com/go/nvidia-drivers\">ອັບເດດໄດຣເວີ</a>." +UnsupportedDevice="ຂໍ້ຜິດພາດ NVENC: ອຸປະກອນບໍ່ຮອງຮັບ. ກວດເບິ່ງວ່າກາດຈໍຂອງທ່ານ <a href=\"https://obsproject.com/go/nvenc-matrix\">ຮອງຮັບ NVENC</a> ຫຼື ບໍ່ ແລະ ລອງ <a href=\"https://obsproject.com/go/nvidia-drivers\">ອັບເດດໄດຣເວີ</a>." +TooManySessions="ຂໍ້ຜິດພາດ NVENC: ມີເຊດຊັນເຮັດວຽກພ້ອມກັນຫຼາຍເກີນໄປ. ລອງປິດໂປຣແກຣມບັນທຶກອື່ນໆທີ່ອາດຈະກຳລັງໃຊ້ NVENC ຢູ່ ເຊັ່ນ NVIDIA ShadowPlay ຫຼື Windows Game DVR." +CheckDrivers="ລອງຕິດຕັ້ງ <a href=\"https://obsproject.com/go/nvidia-drivers\">ໄດຣເວີ NVIDIA</a> ລ່າສຸດ." +8bitUnsupportedHdr="OBS ບໍ່ຮອງຮັບຜົນຜະລິດ 8-bit ຂອງ Rec. 2100." +I010Unsupported="NVENC ບໍ່ຮອງຮັບ I010. ໃຫ້ໃຊ້ P010 ແທນ." +10bitUnsupported="ບໍ່ສາມາດດຳເນີນການເຂົ້າລະຫັດ 10-bit ໃນຕົວເຂົ້າລະຫັດນີ້." +16bitUnsupported="ບໍ່ສາມາດດຳເນີນການເຂົ້າລະຫັດ 16-bit ໃນຕົວເຂົ້າລະຫັດນີ້." +444Unsupported="ບໍ່ສາມາດດຳເນີນການເຂົ້າລະຫັດ 4:4:4 ໃນຕົວເຂົ້າລະຫັດນີ້." +CQLevel="ລະດັບ CQ" +PsychoVisualTuning="ການປັບແຕ່ງພາບຕາມການຮັບຮູ້ (Psycho Visual Tuning)" +PsychoVisualTuning.ToolTip="ເປີດໃຊ້ການຕັ້ງຄ່າຕົວເຂົ້າລະຫັດທີ່ເພີ່ມປະສິດທິພາບການໃຊ້ບິດເຣດ ເພື່ອເພີ່ມຄຸນນະພາບຂອງພາບທີ່ຮັບຮູ້ໄດ້,\nໂດຍສະເພາະໃນສະຖານະການທີ່ມີການເຄື່ອນໄຫວສູງ, ໂດຍແລກກັບການໃຊ້ງານ GPU ທີ່ເພີ່ມຂຶ້ນ."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-nvenc/data/locale/sk-SK.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-nvenc/data/locale/sk-SK.ini
Changed
@@ -38,6 +38,7 @@ SplitEncode.Disabled="Vypnuté" SplitEncode.Enabled="Dvojcestné rozdelenie" SplitEncode.ThreeWay="Trojcestné rozdelenie" +SplitEncode.FourWay="Štvorcestné rozdelenie" Opts="Vlastné nastavenie enkodéra" Opts.TT="Medzerou-oddelený zoznam možností pre použitie kontroly toku a nastavení kodeku,\ns názvami z hlavičky nvEncodeAPI.\nnapr. \"lookaheadDepth=16 aqStrength=4\"" Opts.Invalid="Neplatné vlastné možnosti enkodéra, pozrite si log súbor pre podrobnosti.<br><br>Pozrite si <a href=\"https://obsproject.com/kb/advanced-nvenc-options\">článok databázy znalostí</a> pre viac informácií o dostupných možnostiach."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-nvenc/data/locale/sr-SP.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-nvenc/data/locale/sr-SP.ini
Changed
@@ -40,6 +40,7 @@ SplitEncode.Disabled="Онемогућено" SplitEncode.Enabled="Двосмерна подела" SplitEncode.ThreeWay="Трострука подела" +SplitEncode.FourWay="Четворосмерна подела" Opts="Опције прилагођеног енкодера" Opts.TT="Листа опција одвојених размацима које се примењују на подешавања контроле брзине и кодека,\nна основу њихових имена у заглављу nvEncodeAPI.\nнпр. „lookaheadDepth=16 aqStrength=4“" Opts.Invalid="Неважеће опције прилагођеног енкодера, проверите дневник за детаље.<br><br> Погледајте наш <a href=\"https://obsproject.com/kb/advanced-nvenc-options\">чланак у бази знања</a> за информације о доступним опцијама."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-nvenc/nvenc-opts-parser.c -> obs-studio-32.1.0.tar.xz/plugins/obs-nvenc/nvenc-opts-parser.c
Changed
@@ -82,7 +82,7 @@ APPLY_INT_OPT(lookaheadLevel, NV_ENC_LOOKAHEAD_LEVEL, PRIu32) #endif - /* Macros above will return true if succesfully evaluated. + /* Macros above will return true if successfully evaluated. * Otherwise, return false if option unknown/unsupported. */ return false; }
View file
obs-studio-32.0.4.tar.xz/plugins/obs-outputs/data/locale/ar-SA.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-outputs/data/locale/ar-SA.ini
Changed
@@ -9,6 +9,7 @@ MP4Output.FilePath="مسار الملف" MP4Output.StartChapter="ابدأ" MP4Output.UnnamedChapter="بدون اسم" +MOVOutput="إخراج ملف MOV" IPFamily="عائلة عنوان IP" IPFamily.Both="IPv4 و IPv6 (افتراضي)" IPFamily.V4Only="IPv4 فقط"
View file
obs-studio-32.1.0.tar.xz/plugins/obs-outputs/data/locale/az-AZ.ini
Added
@@ -0,0 +1,27 @@ +RTMPStream="RTMP Yayımı" +RTMPStream.DropThreshold="Buraxma Həddi" +RTMPStream.BindIP="IP-yə Bağla" +RTMPStream.NewSocketLoop="Yeni Soket Dövrü" +RTMPStream.LowLatencyMode="Aşağı Gecikmə Rejimi" +FLVOutput="FLV Fayl Çıxışı" +FLVOutput.FilePath="Fayl Yolu" +Default="İlkin təyin olunan" +MP4Output="MP4 Fayl Çıxışı" +MP4Output.FilePath="Fayl Yolu" +MP4Output.StartChapter="Başla" +MP4Output.UnnamedChapter="Adsız" +MOVOutput="MOV Fayl Çıxışı" +IPFamily="IP Ünvan Ailəsi" +IPFamily.Both="IPv4 və IPv6 (İlkin təyin olunan)" +IPFamily.V4Only="Yalnız IPv4" +IPFamily.V6Only="Yalnız IPv6" +ConnectionTimedOut="Qoşulma vaxtı bitdi. Düzgün bir yayım xidməti konfiqurasiya etdiyinizdən və heç bir təhlükəsizlik divarının qoşulmanı bloklamadığından əmin olun." +PermissionDenied="Qoşulma bloklandı. OBS-in tam internetə çıxışına icazə verildiyindən əmin olmaq üçün təhlükəsizlik divarı / antivirus sazlamalarınızı yoxlayın." +ConnectionAborted="Qoşulma dayandırıldı. Bu, adətən sizinlə yayım xidməti arasında internet bağlantısı problemlərinin olduğunu göstərir." +ConnectionReset="Qoşulma qarşı tərəf tərəfindən sıfırlandı. Bu, adətən sizinlə yayım xidməti arasında internet bağlantısı problemlərinin olduğunu göstərir." +HostNotFound="Host adı tapılmadı. Düzgün bir yayım serveri daxil etdiyinizdən və internet bağlantınızın / DNS-inizin düzgün işlədiyindən əmin olun." +NoData="Host adı tapıldı, lakin tələb olunan növdə məlumat yoxdur. Bu, bir IPv6 ünvanına bağlandıqda və yayım xidmətiniz yalnız IPv4 ünvanlarına sahib olduqda baş verə bilər (bax: Parametrlər → Qabaqcıl)." +AddressNotAvailable="Ünvan mövcud deyil. Ola bilsin ki, yanlış bir IP ünvanına bağlanmağa çalışmısınız (bax: Parametrlər → Qabaqcıl)." +SSLCertVerifyFailed="RTMP serveri yanlış SSL sertifikatı göndərdi." +InvalidParameter="Yanlış qoşulma parametrləri. Yayım xidməti ünvanının düzgün olduğunu yoxlayın." +NoRoute="Hosta çatmaq mümkün olmadı. Bağlandığınız interfeysinizin internetə çıxışı olduğundan və yayım xidmətinin seçdiyiniz ünvan ailəsini dəstəklədiyindən əmin olun (bax: Parametrlər → Qabaqcıl)."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-outputs/data/locale/da-DK.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-outputs/data/locale/da-DK.ini
Changed
@@ -8,6 +8,7 @@ MP4Output="MP4-filoutput" MP4Output.FilePath="Filsti" MP4Output.UnnamedChapter="Unavngivet" +MOVOutput="MOV Fil Output" IPFamily="IP-adresse familie" IPFamily.Both="IPv4 og IPv6 (standard)" IPFamily.V4Only="Kun IPv4"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-outputs/data/locale/el-GR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-outputs/data/locale/el-GR.ini
Changed
@@ -9,6 +9,7 @@ MP4Output.FilePath="Διαδρομή Αρχείου" MP4Output.StartChapter="Έναρξη" MP4Output.UnnamedChapter="Χωρίς όνομα" +MOVOutput="MOV Αρχείο Εξόδου" IPFamily="Οικογένεια Διεύθυνσης IP" IPFamily.Both="IPv4 και IPv6 (Προεπιλογή)" IPFamily.V4Only="Μόνο IPv4"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-outputs/data/locale/fi-FI.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-outputs/data/locale/fi-FI.ini
Changed
@@ -10,6 +10,7 @@ MP4Output.FilePath="Tiedostopolku" MP4Output.StartChapter="Aloita" MP4Output.UnnamedChapter="Nimetön" +MOVOutput="MOV-tiedoston ulosanti" IPFamily="IP-osoiteperhe" IPFamily.Both="IPv4 ja IPv6 (oletus)" IPFamily.V4Only="Vain IPv4"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-outputs/data/locale/fil-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-outputs/data/locale/fil-PH.ini
Changed
@@ -1,7 +1,8 @@ RTMPStream.DropThreshold="I-drop ang Threshold" FLVOutput="Ang FLV File Awput" -FLVOutput.FilePath="Ang Landas ng File" +FLVOutput.FilePath="Landas ng File" Default="I-Default" +MP4Output.FilePath="Landas ng File" ConnectionTimedOut="Ang koneskyong ay nag time out. Siguraduhin na nakaayos at balido ang streaming service at walang firewall na nakaharang sa koneksyon." PermissionDenied="Ang koneksyon ay hinarang. Suriin ang firewall / anti-virus settings upang matiyak na tiyak na may buong access sa internet ang OBS." ConnectionAborted="Ang koneksyon ay naudlot. Ito ay karaniwang nagpapahiwatig na may problema sa iyong internet koneksyon at sa streaming service."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-outputs/data/locale/hu-HU.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-outputs/data/locale/hu-HU.ini
Changed
@@ -10,6 +10,7 @@ MP4Output.FilePath="Fájl elérési útja" MP4Output.StartChapter="Kezdés" MP4Output.UnnamedChapter="Névtelen" +MOVOutput="MOV kimeneti fájl" IPFamily="IP-címcsalád" IPFamily.Both="IPv4 és IPv6 (alapértelmezett)" IPFamily.V4Only="Csak IPv4"
View file
obs-studio-32.1.0.tar.xz/plugins/obs-outputs/data/locale/lo-LA.ini
Added
@@ -0,0 +1,27 @@ +RTMPStream="ການສະຕຣີມ RTMP" +RTMPStream.DropThreshold="ເກນການຕົກຫຼົ່ນ" +RTMPStream.BindIP="ຜູກມັດ IP" +RTMPStream.NewSocketLoop="ວົງຮອບຊັອກເກັດໃໝ່" +RTMPStream.LowLatencyMode="ໂໝດຄວາມໜ່ວງຕ່ຳ" +FLVOutput="ຜົນອອກໄຟລ໌ FLV" +FLVOutput.FilePath="ທີ່ຢູ່ໄຟລ໌" +Default="ຄ່າເລີ່ມຕົ້ນ" +MP4Output="ຜົນອອກໄຟລ໌ MP4" +MP4Output.FilePath="ທີ່ຢູ່ໄຟລ໌" +MP4Output.StartChapter="ເລີ່ມຕົ້ນ" +MP4Output.UnnamedChapter="ບໍ່ມີຊື່" +MOVOutput="ຜົນອອກໄຟລ໌ MOV" +IPFamily="ຕະກູນທີ່ຢູ່ IP" +IPFamily.Both="IPv4 ແລະ IPv6 (ຄ່າເລີ່ມຕົ້ນ)" +IPFamily.V4Only="IPv4 ເທົ່ານັ້ນ" +IPFamily.V6Only="IPv6 ເທົ່ານັ້ນ" +ConnectionTimedOut="ການເຊື່ອມຕໍ່ໝົດເວລາ. ກະລຸນາກວດສອບວ່າທ່ານໄດ້ຕັ້ງຄ່າການບໍລິການສະຕຣີມທີ່ຖືກຕ້ອງ ແລະ ບໍ່ມີ firewall ກີດກັ້ນການເຊື່ອມຕໍ່." +PermissionDenied="ການເຊື່ອມຕໍ່ຖືກປິດກັ້ນ. ກະລຸນາກວດສອບການຕັ້ງຄ່າ firewall / ໂປຣແກຣມປ້ອງກັນໄວຣັສ ຂອງທ່ານເພື່ອໃຫ້ແນ່ໃຈວ່າ OBS ໄດ້ຮັບອະນຸຍາດໃຫ້ເຂົ້າເຖິງອິນເຕີເນັດໄດ້ຢ່າງເຕັມທີ່." +ConnectionAborted="ການເຊື່ອມຕໍ່ຖືກຍົກເລີກ. ສິ່ງນີ້ມັກຈະບົ່ງບອກເຖິງບັນຫາການເຊື່ອມຕໍ່ອິນເຕີເນັດລະຫວ່າງທ່ານ ແລະ ການບໍລິການສະຕຣີມ." +ConnectionReset="ການເຊື່ອມຕໍ່ຖືກຣີເຊັດໂດຍອີກຝ່າຍ. ສິ່ງນີ້ມັກຈະບົ່ງບອກເຖິງບັນຫາການເຊື່ອມຕໍ່ອິນເຕີເນັດລະຫວ່າງທ່ານ ແລະ ການບໍລິການສະຕຣີມ." +HostNotFound="ບໍ່ພົບຊື່ໂຮສ (Hostname). ກະລຸນາກວດສອບວ່າທ່ານໄດ້ປ້ອນເຊີບເວີສະຕຣີມທີ່ຖືກຕ້ອງ ແລະ ການເຊື່ອມຕໍ່ອິນເຕີເນັດ / DNS ຂອງທ່ານເຮັດວຽກຢ່າງຖືກຕ້ອງ." +NoData="ພົບຊື່ໂຮສ, ແຕ່ບໍ່ມີຂໍ້ມູນປະເພດທີ່ຮ້ອງຂໍ. ສິ່ງນີ້ສາມາດເກີດຂຶ້ນໄດ້ຖ້າທ່ານຜູກມັດກັບທີ່ຢູ່ IPv6 ແລະ ການບໍລິການສະຕຣີມຂອງທ່ານມີພຽງແຕ່ທີ່ຢູ່ IPv4 (ເບິ່ງ ການຕັ້ງຄ່າ → ຂັ້ນສູງ)." +AddressNotAvailable="ທີ່ຢູ່ບໍ່ພ້ອມໃຊ້ງານ. ທ່ານອາດຈະພະຍາຍາມຜູກມັດກັບທີ່ຢູ່ IP ທີ່ບໍ່ຖືກຕ້ອງ (ເບິ່ງ ການຕັ້ງຄ່າ → ຂັ້ນສູງ)." +SSLCertVerifyFailed="ເຊີບເວີ RTMP ໄດ້ສົ່ງໃບຢັ້ງຢືນ SSL ທີ່ບໍ່ຖືກຕ້ອງມາ." +InvalidParameter="ພາຣາມິເຕີການເຊື່ອມຕໍ່ບໍ່ຖືກຕ້ອງ. ກະລຸນາກວດສອບວ່າທີ່ຢູ່ການບໍລິການສະຕຣີມນັ້ນຖືກຕ້ອງ." +NoRoute="ເກີດຂໍ້ຜິດພາດໃນການເຂົ້າຫາໂຮສ. ກະລຸນາກວດສອບວ່າອິນເຕີເຟດທີ່ທ່ານຜູກມັດໄວ້ນັ້ນສາມາດເຂົ້າເຖິງອິນເຕີເນັດໄດ້ ແລະ ການບໍລິການສະຕຣີມຮອງຮັບຕະກູນທີ່ຢູ່ທີ່ທ່ານເລືອກ (ເບິ່ງ ການຕັ້ງຄ່າ → ຂັ້ນສູງ)."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-outputs/data/locale/sk-SK.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-outputs/data/locale/sk-SK.ini
Changed
@@ -10,6 +10,7 @@ MP4Output.FilePath="Cesta k súboru" MP4Output.StartChapter="Štart" MP4Output.UnnamedChapter="Nepomenovaný" +MOVOutput="Výstup do súboru MOV" IPFamily="Rodina IP adresy" IPFamily.Both="IPv4 a IPv6 (Predvolené)" IPFamily.V4Only="Iba IPv4"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-outputs/data/locale/sv-SE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-outputs/data/locale/sv-SE.ini
Changed
@@ -14,12 +14,12 @@ IPFamily.V4Only="Endast IPv4" IPFamily.V6Only="Endast IPv6" ConnectionTimedOut="Anslutningen förlorades. Se till att du har konfigurerat en giltig strömningstjänst och att inga brandväggar blockerar anslutningen." -PermissionDenied="Anslutningen blockerades. Kontrollera inställningarna för din brandvägg/antivirusprogram för att se till att OBS har fullständig åtkomst till Internet." -ConnectionAborted="Anslutningen avbröts. Detta kan indikera problem med Internetanslutningen mellan dig och strömningstjänsten." -ConnectionReset="Anslutningen återställdes av en peer. Detta kan indikera problem med Internetanslutningen mellan dig och strömningstjänsten." -HostNotFound="Värdnamnet hittades inte. Se till att du har angivit en giltigt strömningstjänst och att din Internetanslutning / DNS fungerar på rätt sätt." +PermissionDenied="Anslutningen blockerades. Kontrollera inställningarna för brandväggen/antivirusprogrammet och säkerställ att OBS har fullständig internetåtkomst." +ConnectionAborted="Anslutningen avbröts. Detta innebär vanligtvis problem med internetanslutningen mellan dig och strömningstjänsten." +ConnectionReset="Anslutningen återställdes av en peer. Detta innebär vanligtvis problem med internetanslutningen mellan dig och strömningstjänsten." +HostNotFound="Värdnamnet hittades inte. Se till att du har angivit en giltig strömningstjänst och att din internetanslutning/DNS fungerar." NoData="Värdnamnet hittades, men ingen data av den begärda typen. Detta kan förekomma om du har bundit till en IPv6-adress och din strömtjänst endast har IPv4-adresser (se Inställningar → Avancerat)." AddressNotAvailable="Adressen är inte tillgänglig. Du kanske har försökt binda till en ogiltig IP-adress (se Inställningar → Avancerat)." SSLCertVerifyFailed="RTMP-servern skickade ett ogiltigt SSL-certifikat." InvalidParameter="Ogiltiga anslutningsparametrar. Kontrollera att adressen till strömtjänsten är korrekt." -NoRoute="Fel när värd skulle nås. Se till att gränssnittet du har kopplat kan komma åt internet och strömtjänsten har stöd för adressfamiljen du valde (se Inställningar → Avancerat)." +NoRoute="Fel när värd skulle nås. Se till att gränssnittet du har kopplat har internetåtkomst och att strömningstjänsten har stöd för adressfamiljen du valde (se Inställningar → Avancerat)."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-outputs/data/locale/tl-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-outputs/data/locale/tl-PH.ini
Changed
@@ -1,6 +1,7 @@ FLVOutput="Ang kinalabasan ng FLV File" -FLVOutput.FilePath="Ang Daanan ng File" +FLVOutput.FilePath="Landas ng Talaksan" Default="Ang Default" +MP4Output.FilePath="Landas ng Talaksan" ConnectionTimedOut="Ang koneksyon ay nawala. Siguraduhing ikaw ay nag-configured ng isang balidong serbisyo ng streaming at walang firewall na nagpipigil sa koneksyon." PermissionDenied="Ang koneksyon ay na-block. I-check ang iyong firewall / anti-virus na settings para masiguradong ang OBS ay pwedeng makapasok sa internet." ConnectionAborted="Ang koneksyon ay nabigo. Ito ay kadalasang indikasyon na ang internet nakoneksyon ay may problema sa'yo o kay sa serbisyo ng streaming."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-outputs/data/locale/vi-VN.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-outputs/data/locale/vi-VN.ini
Changed
@@ -10,6 +10,7 @@ MP4Output.FilePath="Đường dẫn tệp" MP4Output.StartChapter="Bắt đầu" MP4Output.UnnamedChapter="Không tên" +MOVOutput="Đầu ra tệp MOV" IPFamily="Dòng địa chỉ IP" IPFamily.Both="IPv4 và IPv6 (Mặc định)" IPFamily.V4Only="Chỉ IPv4"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-outputs/mp4-mux.c -> obs-studio-32.1.0.tar.xz/plugins/obs-outputs/mp4-mux.c
Changed
@@ -979,7 +979,7 @@ // esds mp4_write_esds(mux, track); - /* Write channel layout for version 1 sample entires */ + /* Write channel layout for version 1 sample entries */ if (version == 1) mp4_write_chnl(mux, track); @@ -2566,7 +2566,7 @@ if (pkt->keyframe) da_push_back(track->sync_samples, &track->samples); - /* Only require ctts box if offet is non-zero */ + /* Only require ctts box if offset is non-zero */ if (offset && !track->needs_ctts) track->needs_ctts = true;
View file
obs-studio-32.0.4.tar.xz/plugins/obs-outputs/mp4-output.c -> obs-studio-32.1.0.tar.xz/plugins/obs-outputs/mp4-output.c
Changed
@@ -151,7 +151,7 @@ /* Video frames can be out of order (b-frames), so instead of using the video packet's dts_usec we need to calculate * the chapter DTS from the frame's PTS (for chapters DTS == PTS). */ - int64_t chap_dts_usec = pkt->pts * 1000000 / pkt->timebase_den; + int64_t chap_dts_usec = (pkt->pts * 1000000 / pkt->timebase_den) - out->start_time; int64_t chap_dts_msec = chap_dts_usec / 1000; int64_t chap_dts_sec = chap_dts_msec / 1000;
View file
obs-studio-32.0.4.tar.xz/plugins/obs-qsv11/data/locale/de-DE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-qsv11/data/locale/de-DE.ini
Changed
@@ -5,7 +5,7 @@ Profile="Profil" ICQQuality="ICQ-Qualität" Latency="Latenz" -Latency.ToolTip="Es gibt einen Kompromiss zwischen Latenz und Qualität.\nWenn Sie Qualität bevorzugen, wählen Sie den Modus „normal“,\ndurch den eine End-zu-End-Latenz von mehr als 2 s auftreten kann.\nFalls Sie eine Latenz von weniger als 500 ms benötigen, wählen Sie „ultra-low“." +Latency.ToolTip="Es gibt einen Kompromiss zwischen Latenz und Qualität.\nWenn Sie Qualität bevorzugen, wählen Sie den Modus „Normal“,\ndurch den eine Ende-zu-Ende-Latenz von mehr als 2 s auftreten kann.\nFalls Sie eine Latenz von weniger als 500 ms benötigen, wählen Sie „Extrem niedrig“." 8bitUnsupportedHdr="Die Ausgabe von 8-Bit von Rec. 2100 wird nicht unterstützt." 10bitUnsupportedAvc="Mit dem Intel-QSV-H.264-Kodierer kann kein 10-Bit kodiert werden." 16bitUnsupported="Mit diesem Kodierer kann kein 16-Bit kodiert werden."
View file
obs-studio-32.1.0.tar.xz/plugins/obs-qsv11/data/locale/lo-LA.ini
Added
@@ -0,0 +1,20 @@ +TargetUsage="ການນຳໃຊ້ເປົ້າໝາຍ" +Bitrate="ບິດເຣດ" +MaxBitrate="ບິດເຣດສູງສຸດ" +RateControl="ການຄວບຄຸມອັດຕາ" +KeyframeIntervalSec="ໄລຍະຫ່າງຄີເຟຣມ (0=ອັດຕະໂນມັດ)" +Profile="ໂປຣໄຟລ໌" +ICQQuality="ຄຸນນະພາບ ICQ" +Latency="ຄວາມໜ່ວງ" +Latency.ToolTip="ມັນມີການແລກປ່ຽນລະຫວ່າງຄວາມໜ່ວງ ແລະ ຄຸນນະພາບ.\nຫາກທ່ານເນັ້ນໃສ່ຄຸນນະພາບ, ກະລຸນາເລືອກໂໝດ 'ປົກກະຕິ', ເຊິ່ງອາດຈະມີຄວາມໜ່ວງແບບຕົ້ນທາງເຖິງປາຍທາງຫຼາຍກວ່າ 2 ວິນາທີ.\nຫາກທ່ານຕ້ອງການຄວາມໜ່ວງແບບຕົ້ນທາງເຖິງປາຍທາງຕ່ຳກວ່າ 500ms, ກະລຸນາເລືອກໂໝດ 'ຕ່ຳທີ່ສຸດ'." +8bitUnsupportedHdr="OBS ບໍ່ຮອງຮັບການສົ່ງອອກແບບ 8-ບິດ ຂອງ Rec. 2100." +10bitUnsupportedAvc="ບໍ່ສາມາດເຂົ້າລະຫັດແບບ 10-ບິດ ເທິງຕົວເຂົ້າລະຫັດ Intel QSV H.264." +16bitUnsupported="ບໍ່ສາມາດເຂົ້າລະຫັດແບບ 16-ບິດ ເທິງຕົວເຂົ້າລະຫັດນີ້." +BFrames="B ເຟຣມ" +TargetUsage.TU1="TU1: ຊ້າທີ່ສຸດ (ຄຸນນະພາບດີທີ່ສຸດ)" +TargetUsage.TU2="TU2: ຊ້າກວ່າ" +TargetUsage.TU3="TU3: ຊ້າ" +TargetUsage.TU4="TU4: ສົມດຸນ (ຄຸນນະພາບປານກາງ)" +TargetUsage.TU5="TU5: ໄວ" +TargetUsage.TU6="TU6: ໄວກວ່າ" +TargetUsage.TU7="TU7: ໄວທີ່ສຸດ (ຄວາມໄວດີທີ່ສຸດ)"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-text/data/locale/fil-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-text/data/locale/fil-PH.ini
Changed
@@ -31,7 +31,7 @@ UseCustomExtents.Wrap="Ibalot" Width="Lapad" Height="Taas" -Transform="Paghuhulma ng Text" +Transform="Transform ng Teksto" Transform.None="Wala" Transform.Startcase="Umpisahan ang Case" Antialiasing="Paganahin ang Antialiasing"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-text/data/locale/ka-GE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-text/data/locale/ka-GE.ini
Changed
@@ -27,7 +27,7 @@ Outline.Opacity="გარემოხაზულობის გაუმჭვირვალობა" ChatlogMode="სასაუბროს (Chatlog) რეჟიმი" ChatlogMode.Lines="სასაუბროს ხაზების შეზღუდვა" -UseCustomExtents="ტექსტის ველის მითითებული ზომის გამოყენება" +UseCustomExtents="ტექსტის ველის მითითებული ზომები" UseCustomExtents.Wrap="ხაზზე გადატანა" Width="სიგანე" Height="სიმაღლე"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-text/data/locale/lo-LA.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-text/data/locale/lo-LA.ini
Changed
@@ -1,31 +1,39 @@ -TextGDIPlus="ເພີ່ມຕົວອັກສອນ" -Font="ຮູບແບບຕົວອັກສອນ (ຟ໊ອນ)" -Text="ບ່ອນຂຽນຕົວໜັງສື" -ReadFromFile="ເອົາຕົວໜັງສືຈາກຟາຍເອກະສານທາງນອກ" -TextFile="ຟາຍປະເພດ Text (UTF-8 ເທົ່ານັ້ນ)" -Filter.TextFiles="ຟາຍປະເພດ text" -Filter.AllFiles="ຟາຍທັງໝົດ" +TextGDIPlus="ເພີ່ມຂໍ້ຄວາມ (GDI+)" +Font="ຮູບແບບຕົວອັກສອນ" +Text="ຂໍ້ຄວາມ" +ReadFromFile="ອ່ານຈາກໄຟລ໌" +TextFile="ໄຟລ໌ຂໍ້ຄວາມ (UTF-8 ເທົ່ານັ້ນ)" +Filter.TextFiles="ໄຟລ໌ຂໍ້ຄວາມ" +Filter.AllFiles="ໄຟລ໌ທັງໝົດ" Color="ສີ" -Opacity="ທຶບແສງ" -BkColor="ສີພື້ນຫຼັງຕົວໜັງສື" -BkOpacity="ຄວາມໃສ ສີພື້ນຫຼັງ" +Opacity="ຄວາມທຶບ" +Gradient="ສີໄລ່ລະດັບ" +Gradient.Color="ສີຂອງການໄລ່ລະດັບ" +Gradient.Opacity="ຄວາມທຶບຂອງການໄລ່ລະດັບ" +Gradient.Direction="ທິດທາງການໄລ່ລະດັບ" +BkColor="ສີພື້ນຫຼັງ" +BkOpacity="ຄວາມທຶບພື້ນຫຼັງ" Alignment="ການຈັດວາງ" Alignment.Left="ຊ້າຍ" Alignment.Center="ກາງ" Alignment.Right="ຂວາ" -Vertical="ລວງຕັ້ງ" -VerticalAlignment="ຈັດລຽງລວງຕັ້ງແບບ" +Vertical="ແນວຕັ້ງ" +VerticalAlignment="ການຈັດວາງແນວຕັ້ງ" VerticalAlignment.Top="ເທິງ" VerticalAlignment.Bottom="ລຸ່ມ" -Outline="ຂອບຕົວອັກສອນ" +Outline="ຂອບ" Outline.Size="ຂະໜາດຂອບ" -Outline.Color="ຂອບສີ" -Outline.Opacity="ຄວາມໃສຂອງຂອບ" -Width="ລວງກວ້າງ" -Height="ລວງສູງ" -Transform="ປັບຕົວອັກສອນ" -Transform.None="ປົກກະຕິ" +Outline.Color="ສີຂອບ" +Outline.Opacity="ຄວາມທຶບຂອບ" +ChatlogMode="ໂໝດບັນທຶກການສົນທະນາ (Chatlog)" +ChatlogMode.Lines="ຈຳກັດຈຳນວນແຖວ" +UseCustomExtents="ກຳນົດຂອບເຂດຂໍ້ຄວາມເອງ" +UseCustomExtents.Wrap="ຕັດແຖວ" +Width="ຄວາມກວ້າງ" +Height="ຄວາມສູງ" +Transform="ການປ່ຽນແປງຮູບຮ່າງ" +Transform.None="ບໍ່ມີ" Transform.Uppercase="ຕົວພິມໃຫຍ່" Transform.Lowercase="ຕົວພິມນ້ອຍ" -Transform.Startcase="ຕົວອັກສອນໃຫຍ່ສະເພາະຕົວທຳອິດ" -Antialiasing="ເປີດໂໝດເຮັດໃຫ້ຂອບງາມ" +Transform.Startcase="ຕົວໃຫຍ່ສະເພາະຕົວທຳອິດ" +Antialiasing="ການລົບຮອຍຢັກ"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-text/data/locale/tl-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-text/data/locale/tl-PH.ini
Changed
@@ -28,3 +28,4 @@ UseCustomExtents="Gumamit ng Custom na Teksto sa Extents" Width="Ang lapad" Height="Ang Taas" +Transform="Pagsaanyo ng Lamandiwa"
View file
obs-studio-32.1.0.tar.xz/plugins/obs-transitions/data/locale/az-AZ.ini
Added
@@ -0,0 +1,75 @@ +FadeTransition="Tədrici Dəyişkənlik" +CutTransition="Kəs" +SwipeTransition="Sürüşdür" +SlideTransition="Slayd" +FadeToColorTransition="Rəngə Tədrici Dəyişkənlik" +Direction="İstiqamət" +Direction.Left="Sol" +Direction.Right="Sağ" +Direction.Up="Yuxarı" +Direction.Down="Aşağı" +SwipeIn="İçəriyə Sürüşmə" +Color="Rəng" +VideoFile="Video Faylı" +FileFilter.VideoFiles="Video Faylları" +FileFilter.AllFiles="Bütün Fayllar" +TransitionPoint="Keçid Nöqtəsi" +TransitionPointFrame="Keçid Nöqtəsi (kadr)" +TransitionPointType="Keçid Nöqtəsi Növü" +AudioTransitionPointType="Səs Keçid Nötəsi Növü" +TransitionPointTypeFrame="Kadr" +TransitionPointTypeTime="Zaman" +TrackMatteEnabled="İzləmə Mənbəyindən İstifadə Et" +InvertTrackMatte="Mat Rənglərini Tərsinə Çevir" +TrackMatteVideoFile="Maska Mənbəyi Video Faylı" +TrackMatteLayout="Maska Tərtibatı" +TrackMatteLayoutHorizontal="Eyni fayl, yan-yana (stinger solda, maska mənbəyi sağda)" +TrackMatteLayoutVertical="Eyni fayl, üst-üstə (stinger yuxarıda, maska mənbəyi aşağıda)" +TrackMatteLayoutSeparateFile="Ayrı fayl (xəbərdarlıq: maska sinxronizasiyadan çıxa bilər)" +TrackMatteLayoutMask="Yalnız Maska" +PreloadVideoToRam="Videonu RAM-a Öncədən Yüklə" +PreloadVideoToRam.Description="Oxutma zamanı real vaxtlı dekodlaşdırmadan yayınmaq üçün bütün Stinger-i RAM-a yükləyir.\nÇox RAM tələb edir (tipik 5 saniyəlik 1080p60 video təxminən 1 GB yer tutur)." +AudioFadeStyle="Səsin Tədrici Dəyişkənlik Stili" +AudioFadeStyle.FadeOutFadeIn="Keçid nöqtəsinə qədər tədricən söndür, sonra tədricən yandır" +AudioFadeStyle.CrossFade="Çarpaz Tədricən Dəyişmə" +SwitchPoint="Zirvə Rəng Nöqtəsi" +LumaWipeTransition="Parlaqlıqla Silmə" +LumaWipe.Image="Şəkil" +LumaWipe.Invert="Tərsinə Çevir" +LumaWipe.Softness="Yumşaqlıq" +LumaWipe.Type.BarndoorBottomLeft="Barndoor: Aşağı Sol" +LumaWipe.Type.BarndoorHorizontal="Barndoor: Üfüqi" +LumaWipe.Type.BarndoorTopLeft="Barndoor: Yuxarı Sol" +LumaWipe.Type.BarndoorVertical="Barndoor: Şaquli" +LumaWipe.Type.BlindsHorizontal="Üfüqi Jalüz" +LumaWipe.Type.BoxBottomLeft="Qutu: Aşağı Sol" +LumaWipe.Type.BoxBottomRight="Qutu: Aşağı Sağ" +LumaWipe.Type.BoxTopLeft="Qutu: Yuxarı Sol" +LumaWipe.Type.BoxTopRight="Qutu: Yuxarı Sağ" +LumaWipe.Type.Burst="Partlayış" +LumaWipe.Type.CheckerboardSmall="Kiçik Dama Taxtası" +LumaWipe.Type.Circles="Dairələr" +LumaWipe.Type.Clock="Saat" +LumaWipe.Type.Cloud="Bulud" +LumaWipe.Type.Curtain="Pərdə" +LumaWipe.Type.Fractal="Fraktal" +LumaWipe.Type.Iris="İris" +LumaWipe.Type.LinearHorizontal="Xətti Üfüqi" +LumaWipe.Type.LinearTopLeft="Xətti Yuxarı Sol" +LumaWipe.Type.LinearTopRight="Xətti Yuxarı Sağ" +LumaWipe.Type.LinearVertical="Xətti Şaquli" +LumaWipe.Type.ParallelZigzagHorizontal="Paralel Ziqzaq Üfüqi" +LumaWipe.Type.ParallelZigzagVertical="Paralel Ziqzaq Şaquli" +LumaWipe.Type.Square="Kvadrat" +LumaWipe.Type.Squares="Kvadratlar" +LumaWipe.Type.Stripes="Zolaqlar" +LumaWipe.Type.StripsHorizontal="Üfüqi Zolaqlar" +LumaWipe.Type.StripsVertical="Şaquli Zolaqlar" +LumaWipe.Type.Watercolor="Akvarel" +LumaWipe.Type.ZigzagHorizontal="Üfüqi Ziqzaq" +LumaWipe.Type.ZigzagVertical="Şaquli Ziqzaq" +AudioMonitoring="Səs İzləmə" +AudioMonitoring.None="İzləmə Deaktivdir" +AudioMonitoring.MonitorOnly="Yalnız İzləmə (çıxışı səssizə al)" +AudioMonitoring.Both="İzləmə və Çıxış" +HardwareDecode="Mövcud olduqda aparat dekodlaşdırmasından istifadə et"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-transitions/data/locale/eo-UY.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-transitions/data/locale/eo-UY.ini
Changed
@@ -1,3 +1,4 @@ +StingerTransition="Pikilo" Direction="Direkto" Direction.Left="Maldekstra" Direction.Right="Dekstra"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-transitions/data/locale/et-EE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-transitions/data/locale/et-EE.ini
Changed
@@ -13,28 +13,63 @@ VideoFile="Videofail" FileFilter.VideoFiles="Videofailid" FileFilter.AllFiles="Kõik failid" +TransitionPoint="Üleminekupunkt" +TransitionPointFrame="Üleminekupunkt (kaader)" +TransitionPointType="Üleminekupunkti tüüp" +AudioTransitionPointType="Heli üleminekupunkti tüüp" TransitionPointTypeFrame="Kaader" TransitionPointTypeTime="Aeg" +TrackMatteEnabled="Kasutage rajamatti" +InvertTrackMatte="Mattvärvide ümberpööramine" +TrackMatteVideoFile="Track Matte videofail" +TrackMatteLayout="Matt paigutus" +TrackMatteLayoutHorizontal="Valitud seadmel on aktiivsed mitu süsteemiefekti" +TrackMatteLayoutVertical="Sama fail, virnastatud (stinger üleval, rajamatt all)" +TrackMatteLayoutSeparateFile="Eraldi fail (hoiatus: matt võib sünkroonist välja minna)" +TrackMatteLayoutMask="Ainult mask" PreloadVideoToRam="Eellaadi video RAM-i" PreloadVideoToRam.Description="Laadige kogu Stinger RAM-i, vältides reaalajas dekodeerimist taasesituse ajal.\nVajab palju RAM-i (tüüpiline 5-sekundiline 1080p60 video võtab ~1 GB)." +AudioFadeStyle="Heli sujumise stiil" +AudioFadeStyle.FadeOutFadeIn="Sujuvalt üleminekupunktini ja seejärel sujuvalt sisse" AudioFadeStyle.CrossFade="Siire" +SwitchPoint="Tippvärvipunkt" +LumaWipeTransition="Luma pühkimine" LumaWipe.Image="Pilt" LumaWipe.Invert="Teistpidi" LumaWipe.Softness="Pehmus" +LumaWipe.Type.BarndoorBottomLeft="Laudauks all vasakul" +LumaWipe.Type.BarndoorHorizontal="Horisontaalne laudauks" +LumaWipe.Type.BarndoorTopLeft="Laudauks üleval vasakul" +LumaWipe.Type.BarndoorVertical="Vertikaalne laudauks" +LumaWipe.Type.BlindsHorizontal="Rulood horisontaalsed" LumaWipe.Type.BoxBottomLeft="Kast all vasakul" LumaWipe.Type.BoxBottomRight="Kast all paremal" LumaWipe.Type.BoxTopLeft="Kast üleval vasakul" LumaWipe.Type.BoxTopRight="Kast üleval paremal" LumaWipe.Type.Burst="Plahvatuse" +LumaWipe.Type.CheckerboardSmall="Malelaud Väike" LumaWipe.Type.Circles="Ringid" LumaWipe.Type.Clock="Kell" LumaWipe.Type.Cloud="Pilv" LumaWipe.Type.Curtain="Kardin" LumaWipe.Type.Fan="Ventilaator" +LumaWipe.Type.Fractal="Fraktaal" +LumaWipe.Type.LinearHorizontal="Lineaarne horisontaalne" +LumaWipe.Type.LinearTopLeft="Lineaarne ülevalt vasakult" +LumaWipe.Type.LinearTopRight="Lineaarne ülevalt paremalt" +LumaWipe.Type.LinearVertical="Lineaarne vertikaalne" +LumaWipe.Type.ParallelZigzagHorizontal="Paralleelselt siksakiliselt horisontaalselt" +LumaWipe.Type.ParallelZigzagVertical="Paralleelne siksakiline vertikaalne" LumaWipe.Type.Square="Ruut" LumaWipe.Type.Squares="Ruudud" LumaWipe.Type.Stripes="Triibud" LumaWipe.Type.StripsHorizontal="Horisontaalsed triibud" LumaWipe.Type.StripsVertical="Vertikaalsed triibud" +LumaWipe.Type.Watercolor="Akvarell" +LumaWipe.Type.ZigzagHorizontal="Horisontaalne siksakiline" +LumaWipe.Type.ZigzagVertical="Vertikaalne siksakiline" +AudioMonitoring="Heli jälgimine" AudioMonitoring.None="Välja lülitatud" +AudioMonitoring.MonitorOnly="Ainult monitor (vaigistatud väljund)" +AudioMonitoring.Both="Monitor ja väljund" HardwareDecode="Kasuta riistvara dekodeerimist, kui see on saadaval"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-transitions/data/locale/fil-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-transitions/data/locale/fil-PH.ini
Changed
@@ -21,7 +21,6 @@ TransitionPointTypeTime="Oras" TrackMatteEnabled="Gumamit ng Track Matte" InvertTrackMatte="Baliktarin ang Matte Colors" -TrackMatteLayout="Kaayusan ng Matte" TrackMatteLayoutHorizontal="Parehong file, side-by-side (stinger sa kaliwa, track matte sa kanan)" TrackMatteLayoutVertical="Parehong file, nakasalansan (stinger sa itaas, track matte sa ibaba)" TrackMatteLayoutSeparateFile="Magkahiwalay na file (babala: maaring mawala sa chempo ang matte)"
View file
obs-studio-32.1.0.tar.xz/plugins/obs-transitions/data/locale/lo-LA.ini
Added
@@ -0,0 +1,76 @@ +FadeTransition="ຈາງຫາຍ" +CutTransition="ຕັດ" +SwipeTransition="ປັດ" +SlideTransition="ເລື່ອນ" +StingerTransition="ສະຕິງເກີ" +FadeToColorTransition="ຈາງຫາຍເປັນສີ" +Direction="ທິດທາງ" +Direction.Left="ຊ້າຍ" +Direction.Right="ຂວາ" +Direction.Up="ຂຶ້ນ" +Direction.Down="ລົງ" +SwipeIn="ປັດເຂົ້າ" +Color="ສີ" +VideoFile="ໄຟລ໌ວິດີໂອ" +FileFilter.VideoFiles="ໄຟລ໌ວິດີໂອ" +FileFilter.AllFiles="ທຸກໄຟລ໌" +TransitionPoint="ຈຸດປ່ຽນຜ່ານ" +TransitionPointFrame="ຈຸດປ່ຽນຜ່ານ (ເຟຣມ)" +TransitionPointType="ປະເພດຈຸດປ່ຽນຜ່ານ" +AudioTransitionPointType="ປະເພດຈຸດປ່ຽນຜ່ານສຽງ" +TransitionPointTypeFrame="ເຟຣມ" +TransitionPointTypeTime="ເວລາ" +TrackMatteEnabled="ໃຊ້ Track Matte" +InvertTrackMatte="ກັບສີ Matte" +TrackMatteVideoFile="ໄຟລ໌ວິດີໂອ Track Matte" +TrackMatteLayout="ໂຄງຮ່າງ Matte" +TrackMatteLayoutHorizontal="ໄຟລ໌ດຽວກັນ, ວາງຂ້າງກັນ (ສະຕິງເກີຢູ່ຊ້າຍ, track matte ຢູ່ຂວາ)" +TrackMatteLayoutVertical="ໄຟລ໌ດຽວກັນ, ວາງຊ້ອນກັນ (ສະຕິງເກີຢູ່ເທິງ, track matte ຢູ່ລຸ່ມ)" +TrackMatteLayoutSeparateFile="ແຍກໄຟລ໌ (ຄຳເຕືອນ: matte ອາດຈະບໍ່ຈັງຫວະກັນ)" +TrackMatteLayoutMask="ໜ້າກາກ (Mask) ເທົ່ານັ້ນ" +PreloadVideoToRam="ໂຫຼດວິດີໂອລ່ວງໜ້າລົງ RAM" +PreloadVideoToRam.Description="ໂຫຼດສະຕິງເກີທັງໝົດລົງ RAM, ເພື່ອຫຼີກເວັ້ນການຖອດລະຫັດແບບ Real-time ໃນຂະນະຫຼິ້ນ.\nຕ້ອງການ RAM ຈຳນວນຫຼາຍ (ວິດີໂອ 1080p60 ຄວາມຍາວ 5 ວິນາທີ ໃຊ້ປະມານ ~1 GB)." +AudioFadeStyle="ຮູບແບບການຈາງຫາຍຂອງສຽງ" +AudioFadeStyle.FadeOutFadeIn="ຈາງອອກໄປຫາຈຸດປ່ຽນຜ່ານ ແລ້ວຈາງເຂົ້າ" +AudioFadeStyle.CrossFade="ຈາງສວນກັນ (Crossfade)" +SwitchPoint="ຈຸດສີສູງສຸດ" +LumaWipe.Image="ຮູບພາບ" +LumaWipe.Invert="ກັບດ້ານ" +LumaWipe.Softness="ຄວາມນຸ້ມນວນ" +LumaWipe.Type.BarndoorBottomLeft="ບານປະຕູ ລຸ່ມຊ້າຍ" +LumaWipe.Type.BarndoorHorizontal="ບານປະຕູ ແນວນອນ" +LumaWipe.Type.BarndoorTopLeft="ບານປະຕູ ເທິງຊ້າຍ" +LumaWipe.Type.BarndoorVertical="ບານປະຕູ ແນວຕັ້ງ" +LumaWipe.Type.BlindsHorizontal="ມ່ານບັງແສງ ແນວນອນ" +LumaWipe.Type.BoxBottomLeft="ກ່ອງ ລຸ່ມຊ້າຍ" +LumaWipe.Type.BoxBottomRight="ກ່ອງ ລຸ່ມຂວາ" +LumaWipe.Type.BoxTopLeft="ກ່ອງ ເທິງຊ້າຍ" +LumaWipe.Type.BoxTopRight="ກ່ອງ ເທິງຂວາ" +LumaWipe.Type.Burst="ລະເບີດອອກ" +LumaWipe.Type.CheckerboardSmall="ຕາຕະລາງໝາກຮຸກ ນ້ອຍ" +LumaWipe.Type.Circles="ວົງມົນ" +LumaWipe.Type.Clock="ໂມງ" +LumaWipe.Type.Cloud="ກ້ອນເມກ" +LumaWipe.Type.Curtain="ຜ້າມ່ານ" +LumaWipe.Type.Fan="ພັດລົມ" +LumaWipe.Type.Iris="ຮູຮັບແສງ (Iris)" +LumaWipe.Type.LinearHorizontal="ເສັ້ນຊື່ ແນວນອນ" +LumaWipe.Type.LinearTopLeft="ເສັ້ນຊື່ ເທິງຊ້າຍ" +LumaWipe.Type.LinearTopRight="ເສັ້ນຊື່ ເທິງຂວາ" +LumaWipe.Type.LinearVertical="ເສັ້ນຊື່ ແນວຕັ້ງ" +LumaWipe.Type.ParallelZigzagHorizontal="ຊິກແຊັກຂະນານ ແນວນອນ" +LumaWipe.Type.ParallelZigzagVertical="ຊິກແຊັກຂະນານ ແນວຕັ້ງ" +LumaWipe.Type.Spiral="ກຽວ" +LumaWipe.Type.Square="ສີ່ຫຼ່ຽມ" +LumaWipe.Type.Squares="ສີ່ຫຼ່ຽມຫຼາຍອັນ" +LumaWipe.Type.Stripes="ລາຍທາງ" +LumaWipe.Type.StripsHorizontal="ແຖບ ແນວນອນ" +LumaWipe.Type.StripsVertical="ແຖບ ແນວຕັ້ງ" +LumaWipe.Type.Watercolor="ສີນ້ຳ" +LumaWipe.Type.ZigzagHorizontal="ຊິກແຊັກ ແນວນອນ" +LumaWipe.Type.ZigzagVertical="ຊິກແຊັກ ແນວຕັ້ງ" +AudioMonitoring="ການຕິດຕາມສຽງ" +AudioMonitoring.None="ປິດການຕິດຕາມ" +AudioMonitoring.MonitorOnly="ຕິດຕາມເທົ່ານັ້ນ (ປິດສຽງອອກ)" +AudioMonitoring.Both="ຕິດຕາມ ແລະ ສົ່ງສຽງອອກ" +HardwareDecode="ໃຊ້ການຖອດລະຫັດດ້ວຍຮາດແວເມື່ອສາມາດໃຊ້ໄດ້"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-transitions/data/locale/pt-BR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-transitions/data/locale/pt-BR.ini
Changed
@@ -70,6 +70,6 @@ LumaWipe.Type.ZigzagVertical="Zigue-zague vertical" AudioMonitoring="Monitoramento de áudio" AudioMonitoring.None="Não monitorar" -AudioMonitoring.MonitorOnly="Apenas monitorar (saída muda)" +AudioMonitoring.MonitorOnly="Só monitorar (saída muda)" AudioMonitoring.Both="Monitorar e enviar áudio" HardwareDecode="Usar decodificação de hardware quando disponível"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-transitions/data/locale/tl-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-transitions/data/locale/tl-PH.ini
Changed
@@ -14,6 +14,7 @@ TransitionPointFrame="Pinagmulan ng Pagbabago (Frame)" TransitionPointType="Pinagmulan ng Pagbabago ng Tipo" TransitionPointTypeFrame="Ang frame" +TrackMatteLayout="Matte na Ayos" AudioFadeStyle="Palabo ang istilo ng Audio" AudioFadeStyle.FadeOutFadeIn="Palabo ang palabas sa pinagmulan ng pagbabago tapos palabo papasok" LumaWipe.Image="Imahe"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-transitions/transition-stinger.c -> obs-studio-32.1.0.tar.xz/plugins/obs-transitions/transition-stinger.c
Changed
@@ -524,6 +524,7 @@ static void stinger_transition_start(void *data) { struct stinger_info *s = data; + enum obs_media_state state; if (s->media_source) { calldata_t cd = {0}; @@ -531,7 +532,8 @@ proc_handler_t *ph = obs_source_get_proc_handler(s->media_source); proc_handler_t *matte_ph = s->matte_source ? obs_source_get_proc_handler(s->matte_source) : NULL; - if (s->transitioning) { + state = obs_source_media_get_state(s->media_source); + if (s->transitioning || state == OBS_MEDIA_STATE_PLAYING) { proc_handler_call(ph, "restart", &cd); if (matte_ph) { proc_handler_call(matte_ph, "restart", &cd);
View file
obs-studio-32.1.0.tar.xz/plugins/obs-vst/data/locale/lo-LA.ini
Added
@@ -0,0 +1,4 @@ +OpenPluginInterface="ເປີດໜ້າຈໍໂຕ້ຕອບປລັກອິນ" +ClosePluginInterface="ປິດໜ້າຈໍໂຕ້ຕອບປລັກອິນ" +VstPlugin="ປລັກອິນ VST 2.x" +OpenInterfaceWhenActive="ເປີດໜ້າຈໍໂຕ້ຕອບເມື່ອເປີດໃຊ້ງານ"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-vst/win/EditorWidget-win.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-vst/win/EditorWidget-win.cpp
Changed
@@ -49,7 +49,7 @@ effect->dispatcher(effect, effEditGetRect, 0, 0, &vstRect, 0); if (vstRect) { // on Windows, the size reported by 'effect' is larger than - // its actuall size by a factor of the monitor's ui scale, + // its actual size by a factor of the monitor's ui scale, // so the window size should be divided by the factor qreal scale_factor = devicePixelRatioF(); int width = vstRect->right - vstRect->left; @@ -77,7 +77,7 @@ if (rec) { // on Windows, the size reported by 'effect' is larger than - // its actuall size by a factor of the monitor's ui scale, + // its actual size by a factor of the monitor's ui scale, // so the window size should be divided by the factor qreal scale_factor = devicePixelRatioF(); int width = rec->right - rec->left;
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/az-AZ.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/az-AZ.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="Daşıyıcı Token" Error.InvalidSDP="WHIP serveri etibarsız SDP ilə cavab verdi: %1" Error.NoRemoteDescription="Uzaq təsviri təyin etmək mümkün olmadı: %1" +Error.SimulcastLayersRejected="WHIP serveri yalnız %1 sinxron yayım qatını qəbul etdi"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/be-BY.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/be-BY.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="Токен карыстальніка" Error.InvalidSDP="Сервер WHIP адказаў памылковым SDP: %1" Error.NoRemoteDescription="Не атрымалася задаць аддаленае апісанне: %1" +Error.SimulcastLayersRejected="Сервер WHIP прыняў толькі %1 сл. адначаснай трансляцыі"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/ca-ES.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/ca-ES.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="Testimoni d'autorització" Error.InvalidSDP="El servidor WHIP ha respost amb un SDP no vàlid: %1" Error.NoRemoteDescription="No s'ha pogut establir la descripció remota: %1" +Error.SimulcastLayersRejected="El servidor WHIP només accepta %1 capes de difusió simultània"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/cs-CZ.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/cs-CZ.ini
Changed
@@ -2,3 +2,4 @@ Service.Name="Služba WHIP" Error.InvalidSDP="WHIP server odpověděl chybným SDP: %1" Error.NoRemoteDescription="Nepodařilo se nastavit popis: %1" +Error.SimulcastLayersRejected="WHIP server přijal pouze %1 simulcast vrstvy"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/de-DE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/de-DE.ini
Changed
@@ -2,3 +2,4 @@ Service.Name="WHIP-Dienst" Error.InvalidSDP="WHIP-Server hat mit ungültigem SDP geantwortet: %1" Error.NoRemoteDescription="Remote-Beschreibung konnte nicht gesetzt werden: %1" +Error.SimulcastLayersRejected="Der WHIP-Server akzeptierte nur %1 Simulcast-Layer."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/el-GR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/el-GR.ini
Changed
@@ -1,2 +1,3 @@ Output.Name="Έξοδος WHIP" Service.Name="Υπηρεσία WHIP" +Error.NoRemoteDescription="Αποτυχία ορισμού απομακρυσμένης περιγραφής: %1"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/en-US.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/en-US.ini
Changed
@@ -4,3 +4,4 @@ Error.InvalidSDP="WHIP server responded with invalid SDP: %1" Error.NoRemoteDescription="Failed to set remote description: %1" +Error.SimulcastLayersRejected="WHIP server only accepted %1 simulcast layers"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/es-ES.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/es-ES.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="Token del portador" Error.InvalidSDP="El servidor WHIP respondió con un SDP no válido: %1" Error.NoRemoteDescription="Kaugkirjelduse määramine ebaõnnestus: %1" +Error.SimulcastLayersRejected="El servidor WHIP solo acepta %1 capas de transmisión simultánea"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/fa-IR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/fa-IR.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="توکن رمز" Error.InvalidSDP="سرور WHIP با SDP نامعتبر پاسخ داد: %1" Error.NoRemoteDescription="توضیحات راه دور تنظیم نشد: %1" +Error.SimulcastLayersRejected="سرور WHIP فقط %1 لایههای پخش همزمان را میپذیرد"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/fr-FR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/fr-FR.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="Jeton du porteur" Error.InvalidSDP="Le serveur WHIP a répondu avec un SDP invalide : %1" Error.NoRemoteDescription="Échec de la définition de la description du pair distant : %1" +Error.SimulcastLayersRejected="Le serveur WHIP n'a accepté que %1 couches de diffusion simultanée."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/he-IL.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/he-IL.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="אסימון נושא" Error.InvalidSDP="שרת ה־WHIP הגיב עם SDP שגוי: %1" Error.NoRemoteDescription="הגדרת התיאור המרוחק נכשלה: %1" +Error.SimulcastLayersRejected="שרת ה־WHIP קיבל רק %1 שכבות מהשידור המקבילי"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/hu-HU.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/hu-HU.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="Bemutatandó token" Error.InvalidSDP="A WHIP-kiszolgáló érvénytelen SDP-vel válaszolt: %1" Error.NoRemoteDescription="A távoli leírás beállítása nem sikerült: %1" +Error.SimulcastLayersRejected="A WHIP-kiszolgáló csak %1 simulcast réteget fogadott el"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/id-ID.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/id-ID.ini
Changed
@@ -2,3 +2,4 @@ Service.Name="Layanan WHIP" Error.InvalidSDP="Server WHIP telah merespons dengan SDP yang tidak sah: %1" Error.NoRemoteDescription="Gagal untuk mengatur deskripsi remote: %1" +Error.SimulcastLayersRejected="Server WHIP hanya menerima lapisan siarsimul %1"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/it-IT.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/it-IT.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="Portatore del token" Error.InvalidSDP="Il server WHIP ha risposto con SDP non valido: %1" Error.NoRemoteDescription="Impossibile impostare la descrizione remota: %1" +Error.SimulcastLayersRejected="Il server WHIP accetta solo %1 livelli simulcast"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/ja-JP.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/ja-JP.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="Bearerトークン" Error.InvalidSDP="WHIPサーバーが無効なSDPで応答しました: %1" Error.NoRemoteDescription="リモート説明の設定に失敗しました: %1" +Error.SimulcastLayersRejected="WHIPサーバーはサイマルキャストのレイヤーを %1 つまでしか受け付けませんでした"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/ka-GE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/ka-GE.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="საშუამავლო საცნობი" Error.InvalidSDP="WHIP-სერვერის პასუხია უმართებულო SDP: %1" Error.NoRemoteDescription="დისტანციური აღწერილობის დაყენება ვერ მოხერხდა: %1" +Error.SimulcastLayersRejected="WHIP-სერვერზე მისაღებია თანაგადაცემის მხოლოდ %1 შრე"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/ko-KR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/ko-KR.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="Bearer 토큰" Error.InvalidSDP="WHIP 서버가 잘못된 SDP로 응답함: %1" Error.NoRemoteDescription="원격 설명을 설정할 수 없음: %1" +Error.SimulcastLayersRejected="WHIP 서버는 %1개의 시뮬캐스트 레이어만 받아들입니다 "
View file
obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/lo-LA.ini
Added
@@ -0,0 +1,5 @@ +Output.Name="ເອົາທ໌ພຸດ WHIP" +Service.Name="ບໍລິການ WHIP" +Error.InvalidSDP="ເຊີບເວີ WHIP ຕອບສະໜອງດ້ວຍ SDP ທີ່ບໍ່ຖືກຕ້ອງ: %1" +Error.NoRemoteDescription="ບໍ່ສາມາດກຳນົດລາຍລະອຽດໄລຍະໄກ: %1" +Error.SimulcastLayersRejected="ເຊີບເວີ WHIP ຍອມຮັບພຽງແຕ່ %1 ຊັ້ນ simulcast"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/ms-MY.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/ms-MY.ini
Changed
@@ -2,3 +2,4 @@ Service.Name="Perkhidmatan WHIP" Error.InvalidSDP="Server WHIP menjawab dengan tidak sah SDP: %1" Error.NoRemoteDescription="Gagal untuk menetapkan deskripsi kawalan: %1" +Error.SimulcastLayersRejected="Pelayan WHIP hanya menerima %1 lapisan siaran-serentak"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/nl-NL.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/nl-NL.ini
Changed
@@ -2,3 +2,4 @@ Service.Name="WHIP service" Error.InvalidSDP="WHIP-server reageerde met een incorrecte SDP: %1" Error.NoRemoteDescription="Instellen van remote omschrijving is mislukt: %1" +Error.SimulcastLayersRejected="De WHIP-server accepteerde slechts %1 simulcastlagen."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/pl-PL.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/pl-PL.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="Token okaziciela" Error.InvalidSDP="Serwer WHIP zwrócił nieprawidłowy SDP: %1" Error.NoRemoteDescription="Nie udało się ustawić zdalnego opisu: %1" +Error.SimulcastLayersRejected="Liczba akceptowanych przez serwer WHIP warstw wynosi %1"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/pt-BR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/pt-BR.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="Token Bearer" Error.InvalidSDP="O servidor WHIP respondeu com um SDP inválido: %1" Error.NoRemoteDescription="Falha ao definir a descrição remota: %1" +Error.SimulcastLayersRejected="Servidor WHIP aceitou apenas %1 camadas de transmissão simultânea"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/pt-PT.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/pt-PT.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="Chave Bearer" Error.InvalidSDP="O servidor WHIP respondeu com um SDP inválido: %1" Error.NoRemoteDescription="Falha ao definir uma descrição remota: %1" +Error.SimulcastLayersRejected="Servidor WHIP apenas aceitou %1 camada de transmissão simultânea"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/ru-RU.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/ru-RU.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="Токен предъявителя" Error.InvalidSDP="Сервер WHIP ответил недействительным SDP: %1" Error.NoRemoteDescription="Не удалось задать удалённое описание: %1" +Error.SimulcastLayersRejected="Сервер WHIP принимал только %1 слоёв одновременной трансляции"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/sk-SK.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/sk-SK.ini
Changed
@@ -2,3 +2,4 @@ Service.Name="WHIP Služba" Error.InvalidSDP="WHIP server odpovedal s nesprávnym SDP: %1" Error.NoRemoteDescription="Zlyhalo nastavenie vzdialeného popisu: %1" +Error.SimulcastLayersRejected="WHIP server prijal iba %1 simulcast vrstiev"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/sv-SE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/sv-SE.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="Ägartoken" Error.InvalidSDP="WHIP-servern svarade med ogiltig SDP: %1" Error.NoRemoteDescription="Misslyckades att konfigurera fjärrbeskrivning: %1" +Error.SimulcastLayersRejected="WHIP-servern godtog endast %1 simulcast-lager"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/tr-TR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/tr-TR.ini
Changed
@@ -2,3 +2,4 @@ Service.Name="WHIP Servisi" Error.InvalidSDP="WHIP sunucusu geçersiz SDP ile yanıt verdi: %1" Error.NoRemoteDescription="Uzak açıklama ayarlanamadı: %1" +Error.SimulcastLayersRejected="WHIP sunucusu yalnızca %1 eş zamanlı yayın katmanını kabul ediyor"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/ug-CN.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/ug-CN.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="ئىگىسىز پەرمان تاختىسى" Error.InvalidSDP="WHIP مۇلازىمېتىر ئىناۋەتسىز SDP قايتۇردى: %1" Error.NoRemoteDescription="يىراقتىكى چۈشەندۈرۈشنى تەڭشىيەلمىدى: %1" +Error.SimulcastLayersRejected="WHIP مۇلازىمېتىر پەقەت %1 قەۋەت تەڭ تارقىتىشنى قوللايدۇ"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/uk-UA.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/uk-UA.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="Токен автентифікації" Error.InvalidSDP="Сервер WHIP відповів недійсним SDP: %1" Error.NoRemoteDescription="Не вдалося задати віддалений опис: %1" +Error.SimulcastLayersRejected="Сервер WHIP прийняв лише %1 шари одночасної трансляції"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/vi-VN.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/vi-VN.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="Mã Bearer" Error.InvalidSDP="Máy chủ WHIP phản hồi với SDP không hợp lệ: %1" Error.NoRemoteDescription="Không thể đặt mô tả từ xa: %1" +Error.SimulcastLayersRejected="Máy chủ WHIP chỉ chấp nhận %1 lớp phát sóng đồng thời"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/data/locale/zh-CN.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/data/locale/zh-CN.ini
Changed
@@ -3,3 +3,4 @@ Service.BearerToken="Bearer 令牌" Error.InvalidSDP="WHIP 服务器响应了无效的 SDP:%1" Error.NoRemoteDescription="无法设置远程描述:%1" +Error.SimulcastLayersRejected="WHIP 服务器仅接受了 %1 层同播"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/whip-output.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/whip-output.cpp
Changed
@@ -26,6 +26,9 @@ // ~3 seconds of 8.5 Megabit video const int video_nack_buffer_size = 4000; +const std::string rtpHeaderExtUriMid = "urn:ietf:params:rtp-hdrext:sdes:mid"; +const std::string rtpHeaderExtUriRid = "urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id"; + WHIPOutput::WHIPOutput(obs_data_t *, obs_output_t *output) : output(output), endpoint_url(), @@ -41,8 +44,7 @@ total_bytes_sent(0), connect_time_ms(0), start_time_ns(0), - last_audio_timestamp(0), - last_video_timestamp(0) + last_audio_timestamp(0) { } @@ -59,6 +61,19 @@ { std::lock_guard<std::mutex> l(start_stop_mutex); + for (uint32_t idx = 0; idx < MAX_OUTPUT_VIDEO_ENCODERS; idx++) { + auto encoder = obs_output_get_video_encoder2(output, idx); + if (encoder == nullptr) { + break; + } + + auto v = std::make_shared<videoLayerState>(); + // base_ssrc is ssrc for audio track. We do `+ 1` for the video, then idx for each Simulcast layer. + v->ssrc = base_ssrc + 1 + idx; + v->rid = std::to_string(idx); + videoLayerStatesencoder = v; + } + if (!obs_output_can_begin_data_capture(output, 0)) return false; if (!obs_output_initialize_encoders(output, 0)) @@ -93,9 +108,25 @@ Send(packet->data, packet->size, duration, audio_track, audio_sr_reporter); last_audio_timestamp = packet->dts_usec; } else if (video_track && packet->type == OBS_ENCODER_VIDEO) { - int64_t duration = packet->dts_usec - last_video_timestamp; + auto rtp_config = video_sr_reporter->rtpConfig; + auto videoLayerState = videoLayerStatespacket->encoder; + if (videoLayerState == nullptr) { + Stop(false); + obs_output_signal_stop(output, OBS_OUTPUT_ENCODE_ERROR); + return; + } + + rtp_config->sequenceNumber = videoLayerState->sequenceNumber; + rtp_config->ssrc = videoLayerState->ssrc; + rtp_config->rid = videoLayerState->rid; + rtp_config->timestamp = videoLayerState->rtpTimestamp; + int64_t duration = packet->dts_usec - videoLayerState->lastVideoTimestamp; + Send(packet->data, packet->size, duration, video_track, video_sr_reporter); - last_video_timestamp = packet->dts_usec; + + videoLayerState->sequenceNumber = rtp_config->sequenceNumber; + videoLayerState->lastVideoTimestamp = packet->dts_usec; + videoLayerState->rtpTimestamp = rtp_config->timestamp; } } @@ -142,6 +173,24 @@ rtc::Description::Video video_description(video_mid, rtc::Description::Direction::SendOnly); video_description.addSSRC(ssrc, cname, media_stream_id, media_stream_track_id); + video_description.addExtMap(rtc::Description::Entry::ExtMap(1, rtpHeaderExtUriMid)); + video_description.addExtMap(rtc::Description::Entry::ExtMap(2, rtpHeaderExtUriRid)); + + if (videoLayerStates.size() >= 2) { + std::vector<std::pair<int, std::string>> sortedRids; + + for (const auto &encoder, state : videoLayerStates) { + sortedRids.push_back({std::stoi(state->rid), state->rid}); + } + + std::sort(sortedRids.begin(), sortedRids.end(), + (const auto &a, const auto &b) { return a.first < b.first; }); + + for (const auto &_, rid : sortedRids) { + video_description.addRid(rid); + } + } + auto rtp_config = std::make_shared<rtc::RtpPacketizationConfig>(ssrc, cname, video_payload_type, #if RTC_VERSION_MAJOR == 0 && RTC_VERSION_MINOR > 22 || RTC_VERSION_MAJOR > 0 rtc::H264RtpPacketizer::ClockRate); @@ -149,6 +198,10 @@ rtc::H264RtpPacketizer::defaultClockRate); #endif + rtp_config->midId = 1; + rtp_config->ridId = 2; + rtp_config->mid = video_mid; + const obs_encoder_t *encoder = obs_output_get_video_encoder2(output, 0); if (!encoder) return; @@ -372,16 +425,26 @@ curl_easy_setopt(c, CURLOPT_UNRESTRICTED_AUTH, 1L); curl_easy_setopt(c, CURLOPT_ERRORBUFFER, error_buffer); - auto cleanup = &() { + auto doCleanup = &(bool connectFailed) { curl_easy_cleanup(c); curl_slist_free_all(headers); + if (connectFailed) { + obs_output_signal_stop(output, OBS_OUTPUT_CONNECT_FAILED); + } + }; + + auto displayError = &(const char *what, const char *errorMessage) { + struct dstr error_message; + dstr_init_copy(&error_message, obs_module_text(errorMessage)); + dstr_replace(&error_message, "%1", what); + obs_output_set_last_error(output, error_message.array); + dstr_free(&error_message); }; CURLcode res = curl_easy_perform(c); if (res != CURLE_OK) { do_log(LOG_ERROR, "Connect failed: %s", error_buffer0 ? error_buffer : curl_easy_strerror(res)); - cleanup(); - obs_output_signal_stop(output, OBS_OUTPUT_CONNECT_FAILED); + doCleanup(true); return false; } @@ -389,15 +452,14 @@ curl_easy_getinfo(c, CURLINFO_RESPONSE_CODE, &response_code); if (response_code != 201) { do_log(LOG_ERROR, "Connect failed: HTTP endpoint returned response code %ld", response_code); - cleanup(); + doCleanup(false); obs_output_signal_stop(output, OBS_OUTPUT_INVALID_STREAM); return false; } if (read_buffer.empty()) { do_log(LOG_ERROR, "Connect failed: No data returned from HTTP endpoint request"); - cleanup(); - obs_output_signal_stop(output, OBS_OUTPUT_CONNECT_FAILED); + doCleanup(true); return false; } @@ -417,8 +479,7 @@ if (location_header_count < static_cast<size_t>(redirect_count) + 1) { do_log(LOG_ERROR, "WHIP server did not provide a resource URL via the Location header"); - cleanup(); - obs_output_signal_stop(output, OBS_OUTPUT_CONNECT_FAILED); + doCleanup(true); return false; } @@ -446,8 +507,7 @@ curl_easy_getinfo(c, CURLINFO_EFFECTIVE_URL, &effective_url); if (effective_url == nullptr) { do_log(LOG_ERROR, "Failed to build Resource URL"); - cleanup(); - obs_output_signal_stop(output, OBS_OUTPUT_CONNECT_FAILED); + doCleanup(true); return false; } @@ -462,8 +522,7 @@ CURLUcode rc = curl_url_get(url_builder, CURLUPART_URL, &url, CURLU_NO_DEFAULT_PORT); if (rc) { do_log(LOG_ERROR, "WHIP server provided a invalid resource URL via the Location header"); - cleanup(); - obs_output_signal_stop(output, OBS_OUTPUT_CONNECT_FAILED); + doCleanup(true); return false; } @@ -479,31 +538,40 @@ auto response = std::string(read_buffer); response.erase(0, response.find("v=0")); + // If we are sending multiple layers assert that the remote accepted them all + if (videoLayerStates.size() != 1) { + auto layersAccepted = simulcast_layers_in_answer(response); + if (videoLayerStates.size() != layersAccepted) { + do_log(LOG_ERROR, "WHIP only accepted %lu layers", layersAccepted); + displayError(std::to_string(layersAccepted).c_str(), "Error.SimulcastLayersRejected"); + doCleanup(true); + return false; + } + } + rtc::Description answer(response, "answer"); try { peer_connection->setRemoteDescription(answer); } catch (const std::invalid_argument &err) { do_log(LOG_ERROR, "WHIP server responded with invalid SDP: %s", err.what()); - cleanup(); + doCleanup(true); struct dstr error_message; dstr_init_copy(&error_message, obs_module_text("Error.InvalidSDP")); dstr_replace(&error_message, "%1", err.what()); obs_output_set_last_error(output, error_message.array); dstr_free(&error_message); - obs_output_signal_stop(output, OBS_OUTPUT_CONNECT_FAILED); return false; } catch (const std::exception &err) { do_log(LOG_ERROR, "Failed to set remote description: %s", err.what()); - cleanup(); + doCleanup(true); struct dstr error_message; dstr_init_copy(&error_message, obs_module_text("Error.NoRemoteDescription")); dstr_replace(&error_message, "%1", err.what()); obs_output_set_last_error(output, error_message.array); dstr_free(&error_message); - obs_output_signal_stop(output, OBS_OUTPUT_CONNECT_FAILED); return false; } - cleanup(); + doCleanup(false); #if RTC_VERSION_MAJOR == 0 && RTC_VERSION_MINOR > 20 || RTC_VERSION_MAJOR > 0 peer_connection->gatherLocalCandidates(iceServers); @@ -557,7 +625,7 @@ curl_easy_setopt(c, CURLOPT_TIMEOUT, 8L); curl_easy_setopt(c, CURLOPT_ERRORBUFFER, error_buffer); - auto cleanup = &() { + auto doCleanup = &() { curl_easy_cleanup(c); curl_slist_free_all(headers); }; @@ -566,7 +634,7 @@ if (res != CURLE_OK) { do_log(LOG_WARNING, "DELETE request for resource URL failed: %s", error_buffer0 ? error_buffer : curl_easy_strerror(res)); - cleanup(); + doCleanup(); return; } @@ -574,13 +642,13 @@ curl_easy_getinfo(c, CURLINFO_RESPONSE_CODE, &response_code); if (response_code != 200) { do_log(LOG_WARNING, "DELETE request for resource URL failed. HTTP Code: %ld", response_code); - cleanup(); + doCleanup(); return; } do_log(LOG_DEBUG, "Successfully performed DELETE request for resource URL"); resource_url.clear(); - cleanup(); + doCleanup(); } void WHIPOutput::StopThread(bool signal) @@ -611,7 +679,7 @@ connect_time_ms = 0; start_time_ns = 0; last_audio_timestamp = 0; - last_video_timestamp = 0; + videoLayerStates.clear(); } void WHIPOutput::Send(void *data, uintptr_t size, uint64_t duration, std::shared_ptr<rtc::Track> track, @@ -652,7 +720,7 @@ void register_whip_output() { - const uint32_t base_flags = OBS_OUTPUT_ENCODED | OBS_OUTPUT_SERVICE; + const uint32_t base_flags = OBS_OUTPUT_ENCODED | OBS_OUTPUT_SERVICE | OBS_OUTPUT_MULTI_TRACK_AV; const char *audio_codecs = "opus"; #ifdef ENABLE_HEVC
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/whip-output.h -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/whip-output.h
Changed
@@ -10,9 +10,18 @@ #include <atomic> #include <mutex> #include <thread> +#include <algorithm> #include <rtc/rtc.hpp> +struct videoLayerState { + uint16_t sequenceNumber; + uint32_t rtpTimestamp; + int64_t lastVideoTimestamp; + uint32_t ssrc; + std::string rid; +}; + class WHIPOutput { public: WHIPOutput(obs_data_t *settings, obs_output_t *output); @@ -36,7 +45,6 @@ void SendDelete(); void StopThread(bool signal); void ParseLinkHeader(std::string linkHeader, std::vector<rtc::IceServer> &iceServers); - void Send(void *data, uintptr_t size, uint64_t duration, std::shared_ptr<rtc::Track> track, std::shared_ptr<rtc::RtcpSrReporter> rtcp_sr_reporter); @@ -58,11 +66,12 @@ std::shared_ptr<rtc::RtcpSrReporter> audio_sr_reporter; std::shared_ptr<rtc::RtcpSrReporter> video_sr_reporter; + std::map<obs_encoder_t *, std::shared_ptr<videoLayerState>> videoLayerStates; + std::atomic<size_t> total_bytes_sent; std::atomic<int> connect_time_ms; int64_t start_time_ns; int64_t last_audio_timestamp; - int64_t last_video_timestamp; }; void register_whip_output();
View file
obs-studio-32.0.4.tar.xz/plugins/obs-webrtc/whip-utils.h -> obs-studio-32.1.0.tar.xz/plugins/obs-webrtc/whip-utils.h
Changed
@@ -83,3 +83,25 @@ return ua.str(); } + +static size_t simulcast_layers_in_answer(std::string answer) +{ + auto layersStart = answer.find("a=simulcast"); + if (layersStart == std::string::npos) { + return 0; + } + + auto layersEnd = answer.find("\r\n", layersStart); + if (layersEnd == std::string::npos) { + return 0; + } + + size_t layersAccepted = 1; + for (auto i = layersStart; i < layersEnd; i++) { + if (answeri == ';') { + layersAccepted++; + } + } + + return layersAccepted; +}
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/CMakeLists.txt -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/CMakeLists.txt
Changed
@@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.28...3.30) -set(obs-websocket_VERSION 5.6.3) +set(obs-websocket_VERSION 5.7.2) set(OBS_WEBSOCKET_RPC_VERSION 1) include(cmake/obs-websocket-api.cmake) @@ -61,6 +61,7 @@ PRIVATE # cmake-format: sortable src/eventhandler/EventHandler.cpp src/eventhandler/EventHandler.h + src/eventhandler/EventHandler_Canvases.cpp src/eventhandler/EventHandler_Config.cpp src/eventhandler/EventHandler_Filters.cpp src/eventhandler/EventHandler_General.cpp @@ -80,6 +81,7 @@ src/requesthandler/RequestBatchHandler.h src/requesthandler/RequestHandler.cpp src/requesthandler/RequestHandler.h + src/requesthandler/RequestHandler_Canvases.cpp src/requesthandler/RequestHandler_Config.cpp src/requesthandler/RequestHandler_Filters.cpp src/requesthandler/RequestHandler_General.cpp
View file
obs-studio-32.1.0.tar.xz/plugins/obs-websocket/data/locale/az-AZ.ini
Added
@@ -0,0 +1,41 @@ +OBSWebSocket.Plugin.Description="WebSocket vasitəsilə OBS Studio-un uzaqdan idarə edilməsi" +OBSWebSocket.Settings.DialogTitle="WebSocket Server Parametrləri" +OBSWebSocket.Settings.PluginSettingsTitle="Plagin Parametrləri" +OBSWebSocket.Settings.ServerEnable="WebSocket serverini aktiv et" +OBSWebSocket.Settings.AlertsEnable="Bildiriş Sahəsində Xəbərdarlıqları Aktiv Et" +OBSWebSocket.Settings.DebugEnable="Sazlama Jurnalını Aktiv Et" +OBSWebSocket.Settings.DebugEnableHoverText="Cari OBS nümunəsi üçün sazlama jurnallaşdırmanı aktiv edir. Yükləndikdə saxlanılmır.\nYüklənmə zamanı aktiv etmək üçün --websocket_debug parametrindən istifadə edin." +OBSWebSocket.Settings.ServerSettingsTitle="Server Parametrləri" +OBSWebSocket.Settings.AuthRequired="Autentifikasiyanı Aktiv Et" +OBSWebSocket.Settings.Password="Server Şifri" +OBSWebSocket.Settings.GeneratePassword="Şifrə Yarat" +OBSWebSocket.Settings.ServerPort="Server Portu" +OBSWebSocket.Settings.ShowConnectInfo="Qoşulma Məlumatını Göstər" +OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Xəbərdarlıq: Hazırda Canlı Yayımdasınız" +OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Görünür, bir çıxış (yayım, yazı və s.) hazırda aktivdir." +OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Qoşulma məlumatınızı göstərmək istədiyinizə əminsiniz?" +OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Xəbərdarlıq: Potensial Təhlükəsizlik Problemi" +OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket server şifrəsini adi mətn kimi saxlayır. obs-websocket tərəfindən yaradılmış bir şifrədən istifadə etməyiniz şiddətlə tövsiyə olunur." +OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Öz şifrənizi istifadə etmək istədiyinizə əminsiniz?" +OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Xəta: Yanlış Konfiqurasiya" +OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="6 və ya daha çox simvoldan ibarət bir şifrə istifadə etməlisiniz." +OBSWebSocket.SessionTable.Title="Qoşulmuş WebSocket Seansları" +OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Uzaq Ünvan" +OBSWebSocket.SessionTable.SessionDurationColumnTitle="Seans Müddəti" +OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Gələn/Gedən Mesajlar" +OBSWebSocket.SessionTable.IdentifiedTitle="İdentifikasiya Edildi" +OBSWebSocket.SessionTable.KickButtonColumnTitle="Kənarlaşdırılsın?" +OBSWebSocket.SessionTable.KickButtonText="Kənarlaşdır" +OBSWebSocket.ConnectInfo.DialogTitle="WebSocket Qoşulma Məlumatı" +OBSWebSocket.ConnectInfo.CopyText="Kopyala" +OBSWebSocket.ConnectInfo.ServerIp="Server IP-si (Ən Yaxşı Təxmin)" +OBSWebSocket.ConnectInfo.ServerPort="Server Portu" +OBSWebSocket.ConnectInfo.ServerPassword="Server Şifri" +OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="Autentifikasiya Deaktivdir" +OBSWebSocket.ConnectInfo.QrTitle="QR Kodu ilə Qoşul" +OBSWebSocket.TrayNotification.Identified.Title="Yeni WebSocket Qoşulması" +OBSWebSocket.TrayNotification.Identified.Body="Klient %1 identifikasiya edildi." +OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket Autentifikasiya Xətası" +OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klient %1 autentifikasiya edə bilmədi." +OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket Klienti Ayrıldı" +OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 ayrıldı."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/data/locale/de-DE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/data/locale/de-DE.ini
Changed
@@ -12,7 +12,7 @@ OBSWebSocket.Settings.ServerPort="Serverport" OBSWebSocket.Settings.ShowConnectInfo="Verbindungsinformationen anzeigen" OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Achtung: Zurzeit live" -OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Derzeit ist eine Ausgabe (Stream, Aufnahme, etc.) aktiv." +OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Derzeit ist eine Ausgabe (Stream, Aufnahme usw.) aktiv." OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Möchten Sie wirklich Ihre Verbindungsinformationen anzeigen?" OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Achtung: Mögliches Sicherheitsproblem" OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket speichert das Serverpasswort unverschlüsselt, daher ist ein von obs-websocket generiertes Passwort sehr zu empfehlen."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/data/locale/fil-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/data/locale/fil-PH.ini
Changed
@@ -13,7 +13,7 @@ OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Babala: Kasalukuyang nakalive" OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Lumalabas na kasalukuyang aktibo ang isang output (stream, recording, atbp.)." OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Sigurado ka bang gusto mong ipakita ang iyong impormasyon sa pagkonekta?" -OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Babala: Potensyal na Isyu sa Seguridad" +OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Babala: Maaaring Mapanganib sa Kaligtasan" OBSWebSocket.Settings.Save.UserPasswordWarningMessage="Iniimbak ng obs-websocket ang password ng server bilang plain text. Ang paggamit ng password na nabuo ng obs-websocket ay lubos na inirerekomenda." OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Sigurado ka bang gusto mong gamitin ang iyong sariling password?" OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Error: Di-wastong Configuration"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/data/locale/ka-GE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/data/locale/ka-GE.ini
Changed
@@ -12,10 +12,10 @@ OBSWebSocket.Settings.ServerPort="სერვერის პორტი" OBSWebSocket.Settings.ShowConnectInfo="კავშირის შესახებ" OBSWebSocket.Settings.ShowConnectInfoWarningTitle="გაფრთხილება: პირდაპირ ეთერშია" -OBSWebSocket.Settings.ShowConnectInfoWarningMessage="როგორც ჩანს, გამოტანა (ნაკადის, ჩანაწერის და სხვ.) ეთერში გადის." +OBSWebSocket.Settings.ShowConnectInfoWarningMessage="როგორც ჩანს, გამოტანა (ნაკადის, ჩანაწერის და სხვ.) ეთერშია გაშვებული." OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="ნამდვილად გსურთ კავშირის მონაცემების გამოჩენა?" OBSWebSocket.Settings.Save.UserPasswordWarningTitle="ყურადღება: სავარაუდო საფრთხე" -OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket სერვერის პაროლს ტექსტის სახით. დაჟინებით გირჩევთ, გამოიყენოთ obs-websocket-ით შედგენილი პაროლი." +OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket ინახავს სერვერის პაროლს ტექსტის სახით. დაჟინებით გირჩევთ, გამოიყენოთ პაროლი, რომელსაც თავად შეადგენს obs-websocket." OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="ნამდვილად გსურთ საკუთარი პაროლის გამოყენება?" OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="შეცდომა: არასწორი გამართვა" OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="პაროლი უნდა შეიცავდეს 6 ან მეტ სიმბოლოს."
View file
obs-studio-32.1.0.tar.xz/plugins/obs-websocket/data/locale/lo-LA.ini
Added
@@ -0,0 +1,41 @@ +OBSWebSocket.Plugin.Description="ຄວບຄຸມ OBS Studio ໄລຍະໄກຜ່ານ WebSocket" +OBSWebSocket.Settings.DialogTitle="ການຕັ້ງຄ່າເຊີບເວີ WebSocket" +OBSWebSocket.Settings.PluginSettingsTitle="ການຕັ້ງຄ່າປັກອິນ" +OBSWebSocket.Settings.ServerEnable="ເປີດໃຊ້ງານເຊີບເວີ WebSocket" +OBSWebSocket.Settings.AlertsEnable="ເປີດໃຊ້ງານການແຈ້ງເຕືອນໃນຖາດລະບົບ" +OBSWebSocket.Settings.DebugEnable="ເປີດໃຊ້ງານການບັນທຶກດີບັກ" +OBSWebSocket.Settings.DebugEnableHoverText="ເປີດໃຊ້ການບັນທຶກດີບັກສຳລັບການເຮັດວຽກຂອງ OBS ໃນຕອນນີ້. ຈະບໍ່ຖືກຈົດຈຳໄວ້ເມື່ອໂຫຼດໃໝ່.\nໃຊ້ --websocket_debug ເພື່ອເປີດໃຊ້ງານຕອນໂຫຼດ." +OBSWebSocket.Settings.ServerSettingsTitle="ການຕັ້ງຄ່າເຊີບເວີ" +OBSWebSocket.Settings.AuthRequired="ເປີດໃຊ້ງານການຢືນຢັນຕົວຕົນ" +OBSWebSocket.Settings.Password="ລະຫັດຜ່ານເຊີບເວີ" +OBSWebSocket.Settings.GeneratePassword="ສ້າງລະຫັດຜ່ານ" +OBSWebSocket.Settings.ServerPort="ພອດເຊີບເວີ" +OBSWebSocket.Settings.ShowConnectInfo="ສະແດງຂໍ້ມູນການເຊື່ອມຕໍ່" +OBSWebSocket.Settings.ShowConnectInfoWarningTitle="ຄຳເຕືອນ: ກຳລັງຖ່າຍທອດສົດຢູ່" +OBSWebSocket.Settings.ShowConnectInfoWarningMessage="ເບິ່ງຄືວ່າຜົນຜະລິດ (ການສະຕຣີມ, ການບັນທຶກ ແລະ ອື່ນໆ) ກຳລັງເຮັດວຽກຢູ່." +OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="ເຈົ້າແນ່ໃຈບໍ່ວ່າຕ້ອງການສະແດງຂໍ້ມູນການເຊື່ອມຕໍ່ຂອງເຈົ້າ?" +OBSWebSocket.Settings.Save.UserPasswordWarningTitle="ຄຳເຕືອນ: ບັນຫາຄວາມປອດໄພທີ່ອາດເກີດຂຶ້ນ" +OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket ຈັດເກັບລະຫັດຜ່ານເຊີບເວີເປັນຂໍ້ຄວາມທຳມະດາ. ແນະນຳຢ່າງຍິ່ງໃຫ້ໃຊ້ລະຫັດຜ່ານທີ່ສ້າງໂດຍ obs-websocket." +OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="ເຈົ້າແນ່ໃຈບໍ່ວ່າຕ້ອງການໃຊ້ລະຫັດຜ່ານຂອງເຈົ້າເອງ?" +OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="ຂໍ້ຜິດພາດ: ການກຳນົດຄ່າບໍ່ຖືກຕ້ອງ" +OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="ເຈົ້າຕ້ອງໃຊ້ລະຫັດຜ່ານທີ່ມີຄວາມຍາວ 6 ຕົວອັກສອນຂຶ້ນໄປ." +OBSWebSocket.SessionTable.Title="ເຊດຊັນ WebSocket ທີ່ເຊື່ອມຕໍ່ຢູ່" +OBSWebSocket.SessionTable.RemoteAddressColumnTitle="ທີ່ຢູ່ປາຍທາງ" +OBSWebSocket.SessionTable.SessionDurationColumnTitle="ໄລຍະເວລາຂອງເຊດຊັນ" +OBSWebSocket.SessionTable.MessagesInOutColumnTitle="ຂໍ້ຄວາມ ເຂົ້າ/ອອກ" +OBSWebSocket.SessionTable.IdentifiedTitle="ລະບຸຕົວຕົນແລ້ວ" +OBSWebSocket.SessionTable.KickButtonColumnTitle="ດີດອອກ?" +OBSWebSocket.SessionTable.KickButtonText="ດີດອອກ" +OBSWebSocket.ConnectInfo.DialogTitle="ຂໍ້ມູນການເຊື່ອມຕໍ່ WebSocket" +OBSWebSocket.ConnectInfo.CopyText="ກັອບປີ້" +OBSWebSocket.ConnectInfo.ServerIp="IP ເຊີບເວີ (ຄາດຄະເນ)" +OBSWebSocket.ConnectInfo.ServerPort="ພອດເຊີບເວີ" +OBSWebSocket.ConnectInfo.ServerPassword="ລະຫັດຜ່ານເຊີບເວີ" +OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="ປິດການຢືນຢັນຕົວຕົນ" +OBSWebSocket.ConnectInfo.QrTitle="QR ການເຊື່ອມຕໍ່" +OBSWebSocket.TrayNotification.Identified.Title="ການເຊື່ອມຕໍ່ WebSocket ໃໝ່" +OBSWebSocket.TrayNotification.Identified.Body="ລູກຂ່າຍ %1 ໄດ້ລະບຸຕົວຕົນແລ້ວ." +OBSWebSocket.TrayNotification.AuthenticationFailed.Title="ການຢືນຢັນຕົວຕົນ WebSocket ລົ້ມເຫຼວ" +OBSWebSocket.TrayNotification.AuthenticationFailed.Body="ລູກຂ່າຍ %1 ຢືນຢັນຕົວຕົນບໍ່ສຳເລັດ." +OBSWebSocket.TrayNotification.Disconnected.Title="ລູກຂ່າຍ WebSocket ຕັດການເຊື່ອມຕໍ່" +OBSWebSocket.TrayNotification.Disconnected.Body="ລູກຂ່າຍ %1 ຖືກຕັດການເຊື່ອມຕໍ່."
View file
obs-studio-32.1.0.tar.xz/plugins/obs-websocket/data/locale/tl-PH.ini
Added
@@ -0,0 +1,5 @@ +OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Babala: Maaaring Mapanganib sa Kaligtasan" +OBSWebSocket.Settings.Save.UserPasswordWarningMessage="Iniimbak ng obs-websocket ang password ng server bilang lamandiwang payak. Lubos na iminumungkahi ang paggamt ng password na binuo ng obs-websocket." +OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Tiyak ka bang gusto mong gamitin ang iyong sariling password?" +OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Kamalian: Di-wasting Kaayosan" +OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Gumamit dapat ng password na may habang 6 na titik o higit pa."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/docs/docs/generate_md.py -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/docs/docs/generate_md.py
Changed
@@ -18,6 +18,7 @@ 'General', 'Config', 'Sources', + 'Canvases', 'Scenes', 'Inputs', 'Transitions',
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/docs/generated/protocol.json -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/docs/generated/protocol.json
Changed
@@ -100,12 +100,20 @@ "enumValue": "(1 << 10)" }, { + "description": "Subscription value to receive events in the `Canvases` category.", + "enumIdentifier": "Canvases", + "rpcVersion": "1", + "deprecated": false, + "initialVersion": "5.7.0", + "enumValue": "(1 << 11)" + }, + { "description": "Helper to receive all non-high-volume events.", "enumIdentifier": "All", "rpcVersion": "1", "deprecated": false, "initialVersion": "5.0.0", - "enumValue": "(General | Config | Scenes | Inputs | Transitions | Filters | Outputs | SceneItems | MediaInputs | Vendors | Ui)" + "enumValue": "(General | Config | Scenes | Inputs | Transitions | Filters | Outputs | SceneItems | MediaInputs | Vendors | Ui | Canvases)" }, { "description": "Subscription value to receive the `InputVolumeMeters` high-volume event.", @@ -782,6 +790,23 @@ , "requests": { + "description": "Gets an array of canvases in OBS.", + "requestType": "GetCanvasList", + "complexity": 3, + "rpcVersion": "1", + "deprecated": false, + "initialVersion": "5.7.0", + "category": "canvases", + "requestFields": , + "responseFields": + { + "valueName": "canvases", + "valueType": "Array<Object>", + "valueDescription": "Array of canvases" + } + + }, + { "description": "Gets the value of a \"slot\" from the selected persistent data realm.", "requestType": "GetPersistentData", "complexity": 2, @@ -1286,6 +1311,14 @@ "category": "filters", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the source is in, if using the sourceName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sourceName", "valueType": "String", "valueDescription": "Name of the source", @@ -1346,6 +1379,14 @@ "category": "filters", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the source is in, if using the sourceName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sourceName", "valueType": "String", "valueDescription": "Name of the source to add the filter to", @@ -1398,6 +1439,14 @@ "category": "filters", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the source is in, if using the sourceName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sourceName", "valueType": "String", "valueDescription": "Name of the source the filter is on", @@ -1434,6 +1483,14 @@ "category": "filters", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the source is in, if using the sourceName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sourceName", "valueType": "String", "valueDescription": "Name of the source the filter is on", @@ -1478,6 +1535,14 @@ "category": "filters", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the source is in, if using the sourceName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sourceName", "valueType": "String", "valueDescription": "Name of the source", @@ -1535,6 +1600,14 @@ "category": "filters", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the source is in, if using the sourceName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sourceName", "valueType": "String", "valueDescription": "Name of the source the filter is on", @@ -1579,6 +1652,14 @@ "category": "filters", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the source is in, if using the sourceName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sourceName", "valueType": "String", "valueDescription": "Name of the source the filter is on", @@ -1631,6 +1712,14 @@ "category": "filters", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the source is in, if using the sourceName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sourceName", "valueType": "String", "valueDescription": "Name of the source the filter is on", @@ -2088,6 +2177,14 @@ "category": "inputs", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene to add the input to as a scene item", @@ -3653,6 +3750,14 @@ "category": "scene items", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene to get the items of", @@ -3687,6 +3792,14 @@ "category": "scene items", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the group is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the group to get the items of", @@ -3721,6 +3834,14 @@ "category": "scene items", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene or group is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene or group to search in", @@ -3771,6 +3892,14 @@ "category": "scene items", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene the item is in", @@ -3818,6 +3947,14 @@ "category": "scene items", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene to create the new item in", @@ -3876,6 +4013,14 @@ "category": "scene items", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene the item is in", @@ -3912,6 +4057,14 @@ "category": "scene items", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene the item is in", @@ -3970,6 +4123,14 @@ "category": "scene items", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene the item is in", @@ -4012,6 +4173,14 @@ "category": "scene items", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene the item is in", @@ -4056,6 +4225,14 @@ "category": "scene items", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene the item is in", @@ -4098,6 +4275,14 @@ "category": "scene items", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene the item is in", @@ -4142,6 +4327,14 @@ "category": "scene items", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene the item is in", @@ -4184,6 +4377,14 @@ "category": "scene items", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene the item is in", @@ -4228,6 +4429,14 @@ "category": "scene items", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene the item is in", @@ -4270,6 +4479,14 @@ "category": "scene items", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene the item is in", @@ -4314,6 +4531,14 @@ "category": "scene items", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene the item is in", @@ -4356,6 +4581,14 @@ "category": "scene items", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene the item is in", @@ -4391,34 +4624,43 @@ "responseFields": }, { - "description": "Gets an array of all scenes in OBS.", + "description": "Gets an array of scenes in OBS.", "requestType": "GetSceneList", "complexity": 2, "rpcVersion": "1", "deprecated": false, "initialVersion": "5.0.0", "category": "scenes", - "requestFields": , + "requestFields": + { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scenes are in", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + } + , "responseFields": { "valueName": "currentProgramSceneName", "valueType": "String", - "valueDescription": "Current program scene name. Can be `null` if internal state desync" + "valueDescription": "Current program scene name. Can be `null` if non-main canvas or internal state desync" }, { "valueName": "currentProgramSceneUuid", "valueType": "String", - "valueDescription": "Current program scene UUID. Can be `null` if internal state desync" + "valueDescription": "Current program scene UUID. Can be `null` if non-main canvas or internal state desync" }, { "valueName": "currentPreviewSceneName", "valueType": "String", - "valueDescription": "Current preview scene name. `null` if not in studio mode" + "valueDescription": "Current preview scene name. `null` if not in studio mode or non-main canvas" }, { "valueName": "currentPreviewSceneUuid", "valueType": "String", - "valueDescription": "Current preview scene UUID. `null` if not in studio mode" + "valueDescription": "Current preview scene UUID. `null` if not in studio mode or non-main canvas" }, { "valueName": "scenes", @@ -4445,7 +4687,7 @@ }, { - "description": "Gets the current program scene.\n\nNote: This request is slated to have the `currentProgram`-prefixed fields removed from in an upcoming RPC version.", + "description": "Gets the current program scene.\n\nNote 1: This request is slated to have the `currentProgram`-prefixed fields removed from in an upcoming RPC version.\n\nNote 2: Canvases do not have any concept of a program or preview scene, so this request does not support canvases.", "requestType": "GetCurrentProgramScene", "complexity": 1, "rpcVersion": "1", @@ -4574,6 +4816,14 @@ "category": "scenes", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas to create the new scene in. Leave default to assume main canvas", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name for the new scene", @@ -4600,6 +4850,14 @@ "category": "scenes", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene to remove", @@ -4628,6 +4886,14 @@ "category": "scenes", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene to be renamed", @@ -4664,6 +4930,14 @@ "category": "scenes", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene", @@ -4703,6 +4977,14 @@ "category": "scenes", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the scene is in, if using the sceneName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sceneName", "valueType": "String", "valueDescription": "Name of the scene", @@ -4747,6 +5029,14 @@ "category": "sources", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the source is in, if using sourceName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sourceName", "valueType": "String", "valueDescription": "Name of the source to get the active state of", @@ -4786,6 +5076,14 @@ "category": "sources", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the source is in, if using sourceName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sourceName", "valueType": "String", "valueDescription": "Name of the source to take a screenshot of", @@ -4852,6 +5150,14 @@ "category": "sources", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the source is in, if using sourceName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sourceName", "valueType": "String", "valueDescription": "Name of the source to take a screenshot of", @@ -5425,6 +5731,14 @@ "category": "ui", "requestFields": { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas the source is in, if using the sourceName field", + "valueRestrictions": null, + "valueOptional": true, + "valueOptionalBehavior": "Unknown" + }, + { "valueName": "sourceName", "valueType": "String", "valueDescription": "Name of the source to open a projector for", @@ -5462,6 +5776,77 @@ , "events": { + "description": "A new canvas has been created.", + "eventType": "CanvasCreated", + "eventSubscription": "Canvases", + "complexity": 2, + "rpcVersion": "1", + "deprecated": false, + "initialVersion": "5.7.0", + "category": "canvases", + "dataFields": + { + "valueName": "canvasName", + "valueType": "String", + "valueDescription": "Name of the new canvas" + }, + { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the new canvas" + } + + }, + { + "description": "A canvas has been removed.", + "eventType": "CanvasRemoved", + "eventSubscription": "Canvases", + "complexity": 2, + "rpcVersion": "1", + "deprecated": false, + "initialVersion": "5.7.0", + "category": "canvases", + "dataFields": + { + "valueName": "canvasName", + "valueType": "String", + "valueDescription": "Name of the removed canvas" + }, + { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the removed canvas" + } + + }, + { + "description": "The name of a canvas has changed.", + "eventType": "CanvasNameChanged", + "eventSubscription": "Canvases", + "complexity": 2, + "rpcVersion": "1", + "deprecated": false, + "initialVersion": "5.7.0", + "category": "canvases", + "dataFields": + { + "valueName": "canvasUuid", + "valueType": "String", + "valueDescription": "UUID of the canvas" + }, + { + "valueName": "oldCanvasName", + "valueType": "String", + "valueDescription": "Old name of the canvas" + }, + { + "valueName": "canvasName", + "valueType": "String", + "valueDescription": "New name of the canvas" + } + + }, + { "description": "The current scene collection has begun changing.\n\nNote: We recommend using this event to trigger a pause of all polling requests, as performing any requests during a\nscene collection change is considered undefined behavior and can cause crashes!", "eventType": "CurrentSceneCollectionChanging", "eventSubscription": "Config",
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/docs/generated/protocol.md -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/docs/generated/protocol.md
Changed
@@ -516,6 +516,7 @@ - EventSubscription::MediaInputs(#eventsubscriptionmediainputs) - EventSubscription::Vendors(#eventsubscriptionvendors) - EventSubscription::Ui(#eventsubscriptionui) + - EventSubscription::Canvases(#eventsubscriptioncanvases) - EventSubscription::All(#eventsubscriptionall) - EventSubscription::InputVolumeMeters(#eventsubscriptioninputvolumemeters) - EventSubscription::InputActiveStateChanged(#eventsubscriptioninputactivestatechanged) @@ -1285,11 +1286,21 @@ --- +### EventSubscription::Canvases + +Subscription value to receive events in the `Canvases` category. + +- Identifier Value: `(1 << 11)` +- Latest Supported RPC Version: `1` +- Added in v5.7.0 + +--- + ### EventSubscription::All Helper to receive all non-high-volume events. -- Identifier Value: `(General | Config | Scenes | Inputs | Transitions | Filters | Outputs | SceneItems | MediaInputs | Vendors | Ui)` +- Identifier Value: `(General | Config | Scenes | Inputs | Transitions | Filters | Outputs | SceneItems | MediaInputs | Vendors | Ui | Canvases)` - Latest Supported RPC Version: `1` - Added in v5.0.0 @@ -1508,6 +1519,10 @@ - CurrentProfileChanging(#currentprofilechanging) - CurrentProfileChanged(#currentprofilechanged) - ProfileListChanged(#profilelistchanged) +- Canvases Events(#canvases-events) + - CanvasCreated(#canvascreated) + - CanvasRemoved(#canvasremoved) + - CanvasNameChanged(#canvasnamechanged) - Scenes Events(#scenes-events) - SceneCreated(#scenecreated) - SceneRemoved(#sceneremoved) @@ -1713,6 +1728,58 @@ | ---- | :---: | ----------- | | profiles | Array<String> | Updated list of profiles | +## Canvases Events + +### CanvasCreated + +A new canvas has been created. + +- Complexity Rating: `2/5` +- Latest Supported RPC Version: `1` +- Added in v5.7.0 + +**Data Fields:** + +| Name | Type | Description | +| ---- | :---: | ----------- | +| canvasName | String | Name of the new canvas | +| canvasUuid | String | UUID of the new canvas | + +--- + +### CanvasRemoved + +A canvas has been removed. + +- Complexity Rating: `2/5` +- Latest Supported RPC Version: `1` +- Added in v5.7.0 + +**Data Fields:** + +| Name | Type | Description | +| ---- | :---: | ----------- | +| canvasName | String | Name of the removed canvas | +| canvasUuid | String | UUID of the removed canvas | + +--- + +### CanvasNameChanged + +The name of a canvas has changed. + +- Complexity Rating: `2/5` +- Latest Supported RPC Version: `1` +- Added in v5.7.0 + +**Data Fields:** + +| Name | Type | Description | +| ---- | :---: | ----------- | +| canvasUuid | String | UUID of the canvas | +| oldCanvasName | String | Old name of the canvas | +| canvasName | String | New name of the canvas | + ## Scenes Events ### SceneCreated @@ -2627,6 +2694,8 @@ - GetSourceActive(#getsourceactive) - GetSourceScreenshot(#getsourcescreenshot) - SaveSourceScreenshot(#savesourcescreenshot) +- Canvases Requests(#canvases-1-requests) + - GetCanvasList(#getcanvaslist) - Scenes Requests(#scenes-1-requests) - GetSceneList(#getscenelist) - GetGroupList(#getgrouplist) @@ -3257,6 +3326,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the source is in, if using sourceName field | None | Unknown | | ?sourceName | String | Name of the source to get the active state of | None | Unknown | | ?sourceUuid | String | UUID of the source to get the active state of | None | Unknown | @@ -3286,6 +3356,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the source is in, if using sourceName field | None | Unknown | | ?sourceName | String | Name of the source to take a screenshot of | None | Unknown | | ?sourceUuid | String | UUID of the source to take a screenshot of | None | Unknown | | imageFormat | String | Image compression format to use. Use `GetVersion` to get compatible image formats | None | N/A | @@ -3318,6 +3389,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the source is in, if using sourceName field | None | Unknown | | ?sourceName | String | Name of the source to take a screenshot of | None | Unknown | | ?sourceUuid | String | UUID of the source to take a screenshot of | None | Unknown | | imageFormat | String | Image compression format to use. Use `GetVersion` to get compatible image formats | None | N/A | @@ -3326,24 +3398,46 @@ | ?imageHeight | Number | Height to scale the screenshot to | >= 8, <= 4096 | Source value is used | | ?imageCompressionQuality | Number | Compression quality to use. 0 for high compression, 100 for uncompressed. -1 to use "default" (whatever that means, idk) | >= -1, <= 100 | -1 | +## Canvases Requests + +### GetCanvasList + +Gets an array of canvases in OBS. + +- Complexity Rating: `3/5` +- Latest Supported RPC Version: `1` +- Added in v5.7.0 + +**Response Fields:** + +| Name | Type | Description | +| ---- | :---: | ----------- | +| canvases | Array<Object> | Array of canvases | + ## Scenes Requests ### GetSceneList -Gets an array of all scenes in OBS. +Gets an array of scenes in OBS. - Complexity Rating: `2/5` - Latest Supported RPC Version: `1` - Added in v5.0.0 +**Request Fields:** + +| Name | Type | Description | Value Restrictions | ?Default Behavior | +| ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scenes are in | None | Unknown | + **Response Fields:** | Name | Type | Description | | ---- | :---: | ----------- | -| currentProgramSceneName | String | Current program scene name. Can be `null` if internal state desync | -| currentProgramSceneUuid | String | Current program scene UUID. Can be `null` if internal state desync | -| currentPreviewSceneName | String | Current preview scene name. `null` if not in studio mode | -| currentPreviewSceneUuid | String | Current preview scene UUID. `null` if not in studio mode | +| currentProgramSceneName | String | Current program scene name. Can be `null` if non-main canvas or internal state desync | +| currentProgramSceneUuid | String | Current program scene UUID. Can be `null` if non-main canvas or internal state desync | +| currentPreviewSceneName | String | Current preview scene name. `null` if not in studio mode or non-main canvas | +| currentPreviewSceneUuid | String | Current preview scene UUID. `null` if not in studio mode or non-main canvas | | scenes | Array<Object> | Array of scenes | --- @@ -3370,7 +3464,9 @@ Gets the current program scene. -Note: This request is slated to have the `currentProgram`-prefixed fields removed from in an upcoming RPC version. +Note 1: This request is slated to have the `currentProgram`-prefixed fields removed from in an upcoming RPC version. + +Note 2: Canvases do not have any concept of a program or preview scene, so this request does not support canvases. - Complexity Rating: `1/5` - Latest Supported RPC Version: `1` @@ -3458,6 +3554,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas to create the new scene in. Leave default to assume main canvas | None | Unknown | | sceneName | String | Name for the new scene | None | N/A | **Response Fields:** @@ -3480,6 +3577,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene to remove | None | Unknown | | ?sceneUuid | String | UUID of the scene to remove | None | Unknown | @@ -3497,6 +3595,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene to be renamed | None | Unknown | | ?sceneUuid | String | UUID of the scene to be renamed | None | Unknown | | newSceneName | String | New name for the scene | None | N/A | @@ -3517,6 +3616,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene | None | Unknown | | ?sceneUuid | String | UUID of the scene | None | Unknown | @@ -3541,6 +3641,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene | None | Unknown | | ?sceneUuid | String | UUID of the scene | None | Unknown | | ?transitionName | String | Name of the scene transition to use as override. Specify `null` to remove | None | Unchanged | @@ -3625,6 +3726,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene to add the input to as a scene item | None | Unknown | | ?sceneUuid | String | UUID of the scene to add the input to as a scene item | None | Unknown | | inputName | String | Name of the new input to created | None | N/A | @@ -4368,6 +4470,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field | None | Unknown | | ?sourceName | String | Name of the source | None | Unknown | | ?sourceUuid | String | UUID of the source | None | Unknown | @@ -4413,6 +4516,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field | None | Unknown | | ?sourceName | String | Name of the source to add the filter to | None | Unknown | | ?sourceUuid | String | UUID of the source to add the filter to | None | Unknown | | filterName | String | Name of the new filter to be created | None | N/A | @@ -4433,6 +4537,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field | None | Unknown | | ?sourceName | String | Name of the source the filter is on | None | Unknown | | ?sourceUuid | String | UUID of the source the filter is on | None | Unknown | | filterName | String | Name of the filter to remove | None | N/A | @@ -4451,6 +4556,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field | None | Unknown | | ?sourceName | String | Name of the source the filter is on | None | Unknown | | ?sourceUuid | String | UUID of the source the filter is on | None | Unknown | | filterName | String | Current name of the filter | None | N/A | @@ -4470,6 +4576,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field | None | Unknown | | ?sourceName | String | Name of the source | None | Unknown | | ?sourceUuid | String | UUID of the source | None | Unknown | | filterName | String | Name of the filter | None | N/A | @@ -4497,6 +4604,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field | None | Unknown | | ?sourceName | String | Name of the source the filter is on | None | Unknown | | ?sourceUuid | String | UUID of the source the filter is on | None | Unknown | | filterName | String | Name of the filter | None | N/A | @@ -4516,6 +4624,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field | None | Unknown | | ?sourceName | String | Name of the source the filter is on | None | Unknown | | ?sourceUuid | String | UUID of the source the filter is on | None | Unknown | | filterName | String | Name of the filter to set the settings of | None | N/A | @@ -4536,6 +4645,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field | None | Unknown | | ?sourceName | String | Name of the source the filter is on | None | Unknown | | ?sourceUuid | String | UUID of the source the filter is on | None | Unknown | | filterName | String | Name of the filter | None | N/A | @@ -4557,6 +4667,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene to get the items of | None | Unknown | | ?sceneUuid | String | UUID of the scene to get the items of | None | Unknown | @@ -4584,6 +4695,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the group is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the group to get the items of | None | Unknown | | ?sceneUuid | String | UUID of the group to get the items of | None | Unknown | @@ -4609,6 +4721,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene or group is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene or group to search in | None | Unknown | | ?sceneUuid | String | UUID of the scene or group to search in | None | Unknown | | sourceName | String | Name of the source to find | None | N/A | @@ -4634,6 +4747,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene the item is in | None | Unknown | | ?sceneUuid | String | UUID of the scene the item is in | None | Unknown | | sceneItemId | Number | Numeric ID of the scene item | >= 0 | N/A | @@ -4661,6 +4775,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene to create the new item in | None | Unknown | | ?sceneUuid | String | UUID of the scene to create the new item in | None | Unknown | | ?sourceName | String | Name of the source to add to the scene | None | Unknown | @@ -4689,6 +4804,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene the item is in | None | Unknown | | ?sceneUuid | String | UUID of the scene the item is in | None | Unknown | | sceneItemId | Number | Numeric ID of the scene item | >= 0 | N/A | @@ -4709,6 +4825,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene the item is in | None | Unknown | | ?sceneUuid | String | UUID of the scene the item is in | None | Unknown | | sceneItemId | Number | Numeric ID of the scene item | >= 0 | N/A | @@ -4737,6 +4854,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene the item is in | None | Unknown | | ?sceneUuid | String | UUID of the scene the item is in | None | Unknown | | sceneItemId | Number | Numeric ID of the scene item | >= 0 | N/A | @@ -4761,6 +4879,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene the item is in | None | Unknown | | ?sceneUuid | String | UUID of the scene the item is in | None | Unknown | | sceneItemId | Number | Numeric ID of the scene item | >= 0 | N/A | @@ -4782,6 +4901,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene the item is in | None | Unknown | | ?sceneUuid | String | UUID of the scene the item is in | None | Unknown | | sceneItemId | Number | Numeric ID of the scene item | >= 0 | N/A | @@ -4808,6 +4928,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene the item is in | None | Unknown | | ?sceneUuid | String | UUID of the scene the item is in | None | Unknown | | sceneItemId | Number | Numeric ID of the scene item | >= 0 | N/A | @@ -4829,6 +4950,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene the item is in | None | Unknown | | ?sceneUuid | String | UUID of the scene the item is in | None | Unknown | | sceneItemId | Number | Numeric ID of the scene item | >= 0 | N/A | @@ -4855,6 +4977,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene the item is in | None | Unknown | | ?sceneUuid | String | UUID of the scene the item is in | None | Unknown | | sceneItemId | Number | Numeric ID of the scene item | >= 0 | N/A | @@ -4878,6 +5001,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene the item is in | None | Unknown | | ?sceneUuid | String | UUID of the scene the item is in | None | Unknown | | sceneItemId | Number | Numeric ID of the scene item | >= 0 | N/A | @@ -4904,6 +5028,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene the item is in | None | Unknown | | ?sceneUuid | String | UUID of the scene the item is in | None | Unknown | | sceneItemId | Number | Numeric ID of the scene item | >= 0 | N/A | @@ -4935,6 +5060,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene the item is in | None | Unknown | | ?sceneUuid | String | UUID of the scene the item is in | None | Unknown | | sceneItemId | Number | Numeric ID of the scene item | >= 0 | N/A | @@ -4961,6 +5087,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field | None | Unknown | | ?sceneName | String | Name of the scene the item is in | None | Unknown | | ?sceneUuid | String | UUID of the scene the item is in | None | Unknown | | sceneItemId | Number | Numeric ID of the scene item | >= 0 | N/A | @@ -5664,6 +5791,7 @@ | Name | Type | Description | Value Restrictions | ?Default Behavior | | ---- | :---: | ----------- | :----------------: | ----------------- | +| ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field | None | Unknown | | ?sourceName | String | Name of the source to open a projector for | None | Unknown | | ?sourceUuid | String | UUID of the source to open a projector for | None | Unknown | | ?monitorIndex | Number | Monitor index, use `GetMonitorList` to obtain index | None | -1: Opens projector in windowed mode |
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/eventhandler/EventHandler.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/eventhandler/EventHandler.cpp
Changed
@@ -28,10 +28,15 @@ signal_handler_t *coreSignalHandler = obs_get_signal_handler(); if (coreSignalHandler) { coreSignals.emplace_back(coreSignalHandler, "source_create", SourceCreatedMultiHandler, this); + coreSignals.emplace_back(coreSignalHandler, "source_create_canvas", SourceCreatedMultiHandler, this); coreSignals.emplace_back(coreSignalHandler, "source_destroy", SourceDestroyedMultiHandler, this); coreSignals.emplace_back(coreSignalHandler, "source_remove", SourceRemovedMultiHandler, this); coreSignals.emplace_back(coreSignalHandler, "source_rename", SourceRenamedMultiHandler, this); coreSignals.emplace_back(coreSignalHandler, "source_update", SourceUpdatedMultiHandler, this); + coreSignals.emplace_back(coreSignalHandler, "canvas_create", CanvasCreatedMultiHandler, this); + coreSignals.emplace_back(coreSignalHandler, "canvas_destroy", CanvasDestroyedMultiHandler, this); + coreSignals.emplace_back(coreSignalHandler, "canvas_remove", CanvasRemovedMultiHandler, this); + coreSignals.emplace_back(coreSignalHandler, "canvas_rename", CanvasRenamedMultiHandler, this); } else { blog(LOG_ERROR, "EventHandler::EventHandler Unable to get libobs signal handler!"); } @@ -599,6 +604,58 @@ } } +void EventHandler::CanvasCreatedMultiHandler(void *param, calldata_t *data) +{ + auto eventHandler = static_cast<EventHandler *>(param); + obs_canvas_t *canvas = GetCalldataPointer<obs_canvas_t>(data, "canvas"); + if (!canvas) + return; + + signal_handler_t *sh = obs_canvas_get_signal_handler(canvas); + signal_handler_connect(sh, "source_rename", SourceRenamedMultiHandler, eventHandler); + + eventHandler->HandleCanvasCreated(canvas); +} + +void EventHandler::CanvasDestroyedMultiHandler(void *param, calldata_t *data) +{ + auto eventHandler = static_cast<EventHandler *>(param); + obs_canvas_t *canvas = GetCalldataPointer<obs_canvas_t>(data, "canvas"); + if (!canvas) + return; + + if (!obs_canvas_removed(canvas)) + eventHandler->HandleCanvasRemoved(canvas); +} + +void EventHandler::CanvasRemovedMultiHandler(void *param, calldata_t *data) +{ + auto eventHandler = static_cast<EventHandler *>(param); + obs_canvas_t *canvas = GetCalldataPointer<obs_canvas_t>(data, "canvas"); + if (!canvas) + return; + + signal_handler_t *sh = obs_canvas_get_signal_handler(canvas); + signal_handler_disconnect(sh, "source_rename", SourceRenamedMultiHandler, eventHandler); + + eventHandler->HandleCanvasRemoved(canvas); +} + +void EventHandler::CanvasRenamedMultiHandler(void *param, calldata_t *data) +{ + auto eventHandler = static_cast<EventHandler *>(param); + obs_canvas_t *canvas = GetCalldataPointer<obs_canvas_t>(data, "canvas"); + if (!canvas) + return; + + std::string oldCanvasName = calldata_string(data, "prev_name"); + std::string canvasName = calldata_string(data, "new_name"); + if (oldCanvasName.empty() || canvasName.empty()) + return; + + eventHandler->HandleCanvasNameChanged(canvas, oldCanvasName, canvasName); +} + void EventHandler::StreamOutputReconnectHandler(void *param, calldata_t *) { auto eventHandler = static_cast<EventHandler *>(param);
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/eventhandler/EventHandler.h -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/eventhandler/EventHandler.h
Changed
@@ -76,6 +76,10 @@ static void SourceRemovedMultiHandler(void *param, calldata_t *data); static void SourceRenamedMultiHandler(void *param, calldata_t *data); static void SourceUpdatedMultiHandler(void *param, calldata_t *data); + static void CanvasCreatedMultiHandler(void *param, calldata_t *data); + static void CanvasDestroyedMultiHandler(void *param, calldata_t *data); + static void CanvasRemovedMultiHandler(void *param, calldata_t *data); + static void CanvasRenamedMultiHandler(void *param, calldata_t *data); // Signal handler: media sources static void SourceMediaPauseMultiHandler(void *param, calldata_t *data); @@ -100,6 +104,11 @@ void HandleCurrentProfileChanged(); void HandleProfileListChanged(); + // Canvases + void HandleCanvasCreated(obs_canvas_t *canvas); + void HandleCanvasRemoved(obs_canvas_t *canvas); + void HandleCanvasNameChanged(obs_canvas_t *canvas, std::string oldCanvasName, std::string canvasName); + // Scenes void HandleSceneCreated(obs_source_t *source); void HandleSceneRemoved(obs_source_t *source);
View file
obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/eventhandler/EventHandler_Canvases.cpp
Added
@@ -0,0 +1,88 @@ +/* +obs-websocket +Copyright (C) 2016-2021 Stephane Lepin <stephane.lepin@gmail.com> +Copyright (C) 2020-2021 Kyle Manning <tt2468@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see <https://www.gnu.org/licenses/> +*/ + +#include "EventHandler.h" + +/** + * A new canvas has been created. + * + * @dataField canvasName | String | Name of the new canvas + * @dataField canvasUuid | String | UUID of the new canvas + * + * @eventType CanvasCreated + * @eventSubscription Canvases + * @complexity 2 + * @rpcVersion -1 + * @initialVersion 5.7.0 + * @api events + * @category canvases + */ +void EventHandler::HandleCanvasCreated(obs_canvas_t *canvas) +{ + json eventData; + eventData"canvasName" = obs_canvas_get_name(canvas); + eventData"canvasUuid" = obs_canvas_get_uuid(canvas); + BroadcastEvent(EventSubscription::Canvases, "CanvasCreated", eventData); +} + +/** + * A canvas has been removed. + * + * @dataField canvasName | String | Name of the removed canvas + * @dataField canvasUuid | String | UUID of the removed canvas + * + * @eventType CanvasRemoved + * @eventSubscription Canvases + * @complexity 2 + * @rpcVersion -1 + * @initialVersion 5.7.0 + * @api events + * @category canvases + */ +void EventHandler::HandleCanvasRemoved(obs_canvas_t *canvas) +{ + json eventData; + eventData"canvasName" = obs_canvas_get_name(canvas); + eventData"canvasUuid" = obs_canvas_get_uuid(canvas); + BroadcastEvent(EventSubscription::Canvases, "CanvasRemoved", eventData); +} + +/** + * The name of a canvas has changed. + * + * @dataField canvasUuid | String | UUID of the canvas + * @dataField oldCanvasName | String | Old name of the canvas + * @dataField canvasName | String | New name of the canvas + * + * @eventType CanvasNameChanged + * @eventSubscription Canvases + * @complexity 2 + * @rpcVersion -1 + * @initialVersion 5.7.0 + * @api events + * @category canvases + */ +void EventHandler::HandleCanvasNameChanged(obs_canvas_t *canvas, std::string oldCanvasName, std::string canvasName) +{ + json eventData; + eventData"canvasUuid" = obs_canvas_get_uuid(canvas); + eventData"oldCanvasName" = oldCanvasName; + eventData"canvasName" = canvasName; + BroadcastEvent(EventSubscription::Canvases, "CanvasNameChanged", eventData); +}
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/eventhandler/EventHandler_SceneItems.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/eventhandler/EventHandler_SceneItems.cpp
Changed
@@ -49,6 +49,10 @@ if (!sceneItem) return; + OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData"sceneName" = obs_source_get_name(obs_scene_get_source(scene)); eventData"sceneUuid" = obs_source_get_uuid(obs_scene_get_source(scene)); @@ -90,6 +94,10 @@ if (!sceneItem) return; + OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData"sceneName" = obs_source_get_name(obs_scene_get_source(scene)); eventData"sceneUuid" = obs_source_get_uuid(obs_scene_get_source(scene)); @@ -122,6 +130,10 @@ if (!scene) return; + OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData"sceneName" = obs_source_get_name(obs_scene_get_source(scene)); eventData"sceneUuid" = obs_source_get_uuid(obs_scene_get_source(scene)); @@ -159,6 +171,10 @@ bool sceneItemEnabled = calldata_bool(data, "visible"); + OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData"sceneName" = obs_source_get_name(obs_scene_get_source(scene)); eventData"sceneUuid" = obs_source_get_uuid(obs_scene_get_source(scene)); @@ -197,6 +213,10 @@ bool sceneItemLocked = calldata_bool(data, "locked"); + OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData"sceneName" = obs_source_get_name(obs_scene_get_source(scene)); eventData"sceneUuid" = obs_source_get_uuid(obs_scene_get_source(scene)); @@ -232,6 +252,10 @@ if (!sceneItem) return; + OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData"sceneName" = obs_source_get_name(obs_scene_get_source(scene)); eventData"sceneUuid" = obs_source_get_uuid(obs_scene_get_source(scene)); @@ -270,6 +294,10 @@ if (!sceneItem) return; + OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData"sceneName" = obs_source_get_name(obs_scene_get_source(scene)); eventData"sceneUuid" = obs_source_get_uuid(obs_scene_get_source(scene));
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/eventhandler/EventHandler_Scenes.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/eventhandler/EventHandler_Scenes.cpp
Changed
@@ -36,6 +36,10 @@ */ void EventHandler::HandleSceneCreated(obs_source_t *source) { + OBSCanvasAutoRelease canvas = obs_source_get_canvas(source); + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData"sceneName" = obs_source_get_name(source); eventData"sceneUuid" = obs_source_get_uuid(source); @@ -60,6 +64,13 @@ */ void EventHandler::HandleSceneRemoved(obs_source_t *source) { + OBSCanvasAutoRelease canvas = obs_source_get_canvas(source); + // NOTE: Groups do not emit source_remove when they are deleted and canvas will already be NULL + // during source_destroy. As a result, this event will never be emitted here for groups. + // This should be fixed in the future when more thorough canvas support is added. + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData"sceneName" = obs_source_get_name(source); eventData"sceneUuid" = obs_source_get_uuid(source); @@ -84,6 +95,10 @@ */ void EventHandler::HandleSceneNameChanged(obs_source_t *source, std::string oldSceneName, std::string sceneName) { + OBSCanvasAutoRelease canvas = obs_source_get_canvas(source); + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData"sceneUuid" = obs_source_get_uuid(source); eventData"oldSceneName" = oldSceneName;
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/eventhandler/types/EventSubscription.h -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/eventhandler/types/EventSubscription.h
Changed
@@ -154,17 +154,28 @@ */ Ui = (1 << 10), /** + * Subscription value to receive events in the `Canvases` category. + * + * @enumIdentifier Canvases + * @enumValue (1 << 11) + * @enumType EventSubscription + * @rpcVersion -1 + * @initialVersion 5.7.0 + * @api enums + */ + Canvases = (1 << 11), + /** * Helper to receive all non-high-volume events. * * @enumIdentifier All - * @enumValue (General | Config | Scenes | Inputs | Transitions | Filters | Outputs | SceneItems | MediaInputs | Vendors | Ui) + * @enumValue (General | Config | Scenes | Inputs | Transitions | Filters | Outputs | SceneItems | MediaInputs | Vendors | Ui | Canvases) * @enumType EventSubscription * @rpcVersion -1 * @initialVersion 5.0.0 * @api enums */ All = (General | Config | Scenes | Inputs | Transitions | Filters | Outputs | SceneItems | MediaInputs | Vendors | - Ui), + Ui | Canvases), /** * Subscription value to receive the `InputVolumeMeters` high-volume event. *
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler.cpp
Changed
@@ -53,6 +53,9 @@ {"GetRecordDirectory", &RequestHandler::GetRecordDirectory}, {"SetRecordDirectory", &RequestHandler::SetRecordDirectory}, + // Canvases + {"GetCanvasList", &RequestHandler::GetCanvasList}, + // Sources {"GetSourceActive", &RequestHandler::GetSourceActive}, {"GetSourceScreenshot", &RequestHandler::GetSourceScreenshot},
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler.h -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler.h
Changed
@@ -72,6 +72,9 @@ RequestResult GetRecordDirectory(const Request &); RequestResult SetRecordDirectory(const Request &); + // Canvases + RequestResult GetCanvasList(const Request &); + // Sources RequestResult GetSourceActive(const Request &); RequestResult GetSourceScreenshot(const Request &);
View file
obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Canvases.cpp
Added
@@ -0,0 +1,64 @@ +/* +obs-websocket +Copyright (C) 2016-2021 Stephane Lepin <stephane.lepin@gmail.com> +Copyright (C) 2020-2021 Kyle Manning <tt2468@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see <https://www.gnu.org/licenses/> +*/ + +#include "RequestHandler.h" + +/** + * Gets an array of canvases in OBS. + * + * @responseField canvases | Array<Object> | Array of canvases + * + * @requestType GetCanvasList + * @complexity 3 + * @rpcVersion -1 + * @initialVersion 5.7.0 + * @api requests + * @category canvases + */ +RequestResult RequestHandler::GetCanvasList(const Request &) +{ + json responseData; + std::vector<json> canvases; + + obs_enum_canvases( + (void *param, obs_canvas_t *canvas) { + auto canvases = static_cast<std::vector<json> *>(param); + + json canvasJson; + canvasJson"canvasName" = obs_canvas_get_name(canvas); + canvasJson"canvasUuid" = obs_canvas_get_uuid(canvas); + + auto flags = obs_canvas_get_flags(canvas); + json canvasFlags; + canvasFlags"MAIN" = !!(flags & MAIN); + canvasFlags"ACTIVATE" = !!(flags & ACTIVATE); + canvasFlags"MIX_AUDIO" = !!(flags & MIX_AUDIO); + canvasFlags"SCENE_REF" = !!(flags & SCENE_REF); + canvasFlags"EPHEMERAL" = !!(flags & EPHEMERAL); + canvasJson"canvasFlags" = canvasFlags; + + canvasJson"canvasVideoSettings" = Utils::Obs::ObjectHelper::GetCanvasVideoSettings(canvas); + canvases->push_back(canvasJson); + return true; + }, + &canvases); + responseData"canvases" = canvases; + + return RequestResult::Success(responseData); +}
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Config.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Config.cpp
Changed
@@ -440,17 +440,11 @@ */ RequestResult RequestHandler::GetVideoSettings(const Request &) { - struct obs_video_info ovi; - if (!obs_get_video_info(&ovi)) - return RequestResult::Error(RequestStatus::RequestProcessingFailed, "Unable to get internal OBS video info."); + OBSCanvasAutoRelease mainCanvas = obs_get_main_canvas(); + if (!mainCanvas) + return RequestResult::Error(RequestStatus::RequestProcessingFailed, "Unable to get internal main OBS canvas."); - json responseData; - responseData"fpsNumerator" = ovi.fps_num; - responseData"fpsDenominator" = ovi.fps_den; - responseData"baseWidth" = ovi.base_width; - responseData"baseHeight" = ovi.base_height; - responseData"outputWidth" = ovi.output_width; - responseData"outputHeight" = ovi.output_height; + json responseData = Utils::Obs::ObjectHelper::GetCanvasVideoSettings(mainCanvas); return RequestResult::Success(responseData); }
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Filters.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Filters.cpp
Changed
@@ -43,6 +43,7 @@ /** * Gets an array of all of a source's filters. * + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field * @requestField ?sourceName | String | Name of the source * @requestField ?sourceUuid | String | UUID of the source * @@ -59,7 +60,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); @@ -107,6 +108,7 @@ /** * Creates a new filter, adding it to the specified source. * + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field * @requestField ?sourceName | String | Name of the source to add the filter to * @requestField ?sourceUuid | String | UUID of the source to add the filter to * @requestField filterName | String | Name of the new filter to be created @@ -125,7 +127,7 @@ RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!(source && request.ValidateString("filterName", statusCode, comment) && request.ValidateString("filterKind", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -161,6 +163,7 @@ /** * Removes a filter from a source. * + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field * @requestField ?sourceName | String | Name of the source the filter is on * @requestField ?sourceUuid | String | UUID of the source the filter is on * @requestField filterName | String | Name of the filter to remove @@ -176,7 +179,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.ValidateFilter(statusCode, comment); + FilterPair pair = request.AcquireFilter(statusCode, comment); if (!pair.filter) return RequestResult::Error(statusCode, comment); @@ -188,6 +191,7 @@ /** * Sets the name of a source filter (rename). * + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field * @requestField ?sourceName | String | Name of the source the filter is on * @requestField ?sourceUuid | String | UUID of the source the filter is on * @requestField filterName | String | Current name of the filter @@ -204,7 +208,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.ValidateFilter(statusCode, comment); + FilterPair pair = request.AcquireFilter(statusCode, comment); if (!pair.filter || !request.ValidateString("newFilterName", statusCode, comment)) return RequestResult::Error(statusCode, comment); @@ -222,6 +226,7 @@ /** * Gets the info for a specific source filter. * + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field * @requestField ?sourceName | String | Name of the source * @requestField ?sourceUuid | String | UUID of the source * @requestField filterName | String | Name of the filter @@ -242,7 +247,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.ValidateFilter(statusCode, comment); + FilterPair pair = request.AcquireFilter(statusCode, comment); if (!pair.filter) return RequestResult::Error(statusCode, comment); @@ -262,6 +267,7 @@ /** * Sets the index position of a filter on a source. * + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field * @requestField ?sourceName | String | Name of the source the filter is on * @requestField ?sourceUuid | String | UUID of the source the filter is on * @requestField filterName | String | Name of the filter @@ -278,7 +284,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.ValidateFilter(statusCode, comment); + FilterPair pair = request.AcquireFilter(statusCode, comment); if (!(pair.filter && request.ValidateNumber("filterIndex", statusCode, comment, 0, 8192))) return RequestResult::Error(statusCode, comment); @@ -292,6 +298,7 @@ /** * Sets the settings of a source filter. * + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field * @requestField ?sourceName | String | Name of the source the filter is on * @requestField ?sourceUuid | String | UUID of the source the filter is on * @requestField filterName | String | Name of the filter to set the settings of @@ -309,7 +316,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.ValidateFilter(statusCode, comment); + FilterPair pair = request.AcquireFilter(statusCode, comment); if (!(pair.filter && request.ValidateObject("filterSettings", statusCode, comment, true))) return RequestResult::Error(statusCode, comment); @@ -341,6 +348,7 @@ /** * Sets the enable state of a source filter. * + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field * @requestField ?sourceName | String | Name of the source the filter is on * @requestField ?sourceUuid | String | UUID of the source the filter is on * @requestField filterName | String | Name of the filter @@ -357,7 +365,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.ValidateFilter(statusCode, comment); + FilterPair pair = request.AcquireFilter(statusCode, comment); if (!(pair.filter && request.ValidateBoolean("filterEnabled", statusCode, comment))) return RequestResult::Error(statusCode, comment);
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Inputs.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Inputs.cpp
Changed
@@ -123,6 +123,7 @@ /** * Creates a new input, adding it as a scene item to the specified scene. * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene to add the input to as a scene item * @requestField ?sceneUuid | String | UUID of the scene to add the input to as a scene item * @requestField inputName | String | Name of the new input to created @@ -144,7 +145,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease sceneSource = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease sceneSource = request.AcquireScene(statusCode, comment); if (!(sceneSource && request.ValidateString("inputName", statusCode, comment) && request.ValidateString("inputKind", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -211,7 +212,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -241,7 +242,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateString("newInputName", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -314,7 +315,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -345,7 +346,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateObject("inputSettings", statusCode, comment, true))) return RequestResult::Error(statusCode, comment); @@ -396,7 +397,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -426,7 +427,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateBoolean("inputMuted", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -457,7 +458,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -492,7 +493,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -529,7 +530,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -580,7 +581,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -611,7 +612,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateNumber("inputAudioBalance", statusCode, comment, 0.0, 1.0))) return RequestResult::Error(statusCode, comment); @@ -645,7 +646,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -677,7 +678,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateNumber("inputAudioSyncOffset", statusCode, comment, -950, 20000))) return RequestResult::Error(statusCode, comment); @@ -715,7 +716,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -746,7 +747,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateString("monitorType", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -793,7 +794,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -831,7 +832,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input || !request.ValidateObject("inputAudioTracks", statusCode, comment)) return RequestResult::Error(statusCode, comment); @@ -899,7 +900,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -932,7 +933,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input || !request.ValidateString("inputDeinterlaceMode", statusCode, comment)) return RequestResult::Error(statusCode, comment); @@ -976,7 +977,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -1009,7 +1010,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input || !request.ValidateString("inputDeinterlaceFieldOrder", statusCode, comment)) return RequestResult::Error(statusCode, comment); @@ -1049,7 +1050,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateString("propertyName", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -1092,7 +1093,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateString("propertyName", statusCode, comment))) return RequestResult::Error(statusCode, comment);
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_MediaInputs.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_MediaInputs.cpp
Changed
@@ -57,7 +57,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -96,7 +96,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateNumber("mediaCursor", statusCode, comment, 0))) return RequestResult::Error(statusCode, comment); @@ -132,7 +132,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateNumber("mediaCursorOffset", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -169,7 +169,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateString("mediaAction", statusCode, comment))) return RequestResult::Error(statusCode, comment);
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Outputs.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Outputs.cpp
Changed
@@ -317,7 +317,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSOutputAutoRelease output = request.ValidateOutput("outputName", statusCode, comment); + OBSOutputAutoRelease output = request.AcquireOutput("outputName", statusCode, comment); if (!output) return RequestResult::Error(statusCode, comment); @@ -354,7 +354,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSOutputAutoRelease output = request.ValidateOutput("outputName", statusCode, comment); + OBSOutputAutoRelease output = request.AcquireOutput("outputName", statusCode, comment); if (!output) return RequestResult::Error(statusCode, comment); @@ -385,7 +385,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSOutputAutoRelease output = request.ValidateOutput("outputName", statusCode, comment); + OBSOutputAutoRelease output = request.AcquireOutput("outputName", statusCode, comment); if (!output) return RequestResult::Error(statusCode, comment); @@ -413,7 +413,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSOutputAutoRelease output = request.ValidateOutput("outputName", statusCode, comment); + OBSOutputAutoRelease output = request.AcquireOutput("outputName", statusCode, comment); if (!output) return RequestResult::Error(statusCode, comment); @@ -443,7 +443,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSOutputAutoRelease output = request.ValidateOutput("outputName", statusCode, comment); + OBSOutputAutoRelease output = request.AcquireOutput("outputName", statusCode, comment); if (!output) return RequestResult::Error(statusCode, comment); @@ -471,7 +471,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSOutputAutoRelease output = request.ValidateOutput("outputName", statusCode, comment); + OBSOutputAutoRelease output = request.AcquireOutput("outputName", statusCode, comment); if (!(output && request.ValidateObject("outputSettings", statusCode, comment, true))) return RequestResult::Error(statusCode, comment);
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_SceneItems.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_SceneItems.cpp
Changed
@@ -24,8 +24,9 @@ * * Scenes only * - * @requestField ?sceneName | String | Name of the scene to get the items of - * @requestField ?sceneUuid | String | UUID of the scene to get the items of + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field + * @requestField ?sceneName | String | Name of the scene to get the items of + * @requestField ?sceneUuid | String | UUID of the scene to get the items of * * @responseField sceneItems | Array<Object> | Array of scene items in the scene * @@ -40,7 +41,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); @@ -57,8 +58,9 @@ * * Groups only * - * @requestField ?sceneName | String | Name of the group to get the items of - * @requestField ?sceneUuid | String | UUID of the group to get the items of + * @requestField ?canvasUuid | String | UUID of the canvas the group is in, if using the sceneName field + * @requestField ?sceneName | String | Name of the group to get the items of + * @requestField ?sceneUuid | String | UUID of the group to get the items of * * @responseField sceneItems | Array<Object> | Array of scene items in the group * @@ -73,7 +75,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_GROUP_ONLY); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_GROUP_ONLY); if (!scene) return RequestResult::Error(statusCode, comment); @@ -88,6 +90,7 @@ * * Scenes and Groups * + * @requestField ?canvasUuid | String | UUID of the canvas the scene or group is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene or group to search in * @requestField ?sceneUuid | String | UUID of the scene or group to search in * @requestField sourceName | String | Name of the source to find @@ -106,7 +109,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneAutoRelease scene = request.ValidateScene2(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneAutoRelease scene = request.AcquireScene2(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(scene && request.ValidateString("sourceName", statusCode, comment))) // TODO: Source UUID support return RequestResult::Error(statusCode, comment); @@ -133,6 +136,7 @@ /** * Gets the source associated with a scene item. * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -151,7 +155,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem(statusCode, comment); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -169,6 +173,7 @@ * * Scenes only * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene to create the new item in * @requestField ?sceneUuid | String | UUID of the scene to create the new item in * @requestField ?sourceName | String | Name of the source to add to the scene @@ -188,13 +193,13 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease sceneSource = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease sceneSource = request.AcquireScene(statusCode, comment); if (!sceneSource) return RequestResult::Error(statusCode, comment); OBSScene scene = obs_scene_from_source(sceneSource); - OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); @@ -223,6 +228,7 @@ * * Scenes only * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -238,7 +244,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem(statusCode, comment); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -253,6 +259,7 @@ * * Scenes only * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -272,19 +279,19 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem(statusCode, comment); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment); if (!sceneItem) return RequestResult::Error(statusCode, comment); // Get destination scene obs_scene_t *destinationScene; if (request.Contains("destinationSceneName")) { - OBSSourceAutoRelease destinationSceneSource = - request.ValidateSource("destinationSceneName", "destinationSceneUuid", statusCode, comment); + OBSSourceAutoRelease destinationSceneSource = request.AcquireSource("destinationCanvasUuid", "destinationSceneName", + "destinationSceneUuid", statusCode, comment); if (!destinationSceneSource) return RequestResult::Error(statusCode, comment); - // Reimplementation of ValidateScene2 + // Reimplementation of GetScene2 if (obs_source_get_type(destinationSceneSource) != OBS_SOURCE_TYPE_SCENE) return RequestResult::Error(RequestStatus::InvalidResourceType, "The specified source is not a scene."); if (obs_source_is_group(destinationSceneSource)) @@ -330,6 +337,7 @@ * * Scenes and Groups * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -347,8 +355,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -361,6 +368,7 @@ /** * Sets the transform and crop info of a scene item. * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -377,8 +385,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateObject("sceneItemTransform", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -526,6 +533,7 @@ * * Scenes and Groups * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -543,8 +551,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -559,6 +566,7 @@ * * Scenes and Groups * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -575,8 +583,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateBoolean("sceneItemEnabled", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -592,6 +599,7 @@ * * Scenes and Groups * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -609,8 +617,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -625,6 +632,7 @@ * * Scenes and Group * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -641,8 +649,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateBoolean("sceneItemLocked", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -660,6 +667,7 @@ * * Scenes and Groups * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -677,8 +685,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -693,6 +700,7 @@ * * Scenes and Groups * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -709,8 +717,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateNumber("sceneItemIndex", statusCode, comment, 0, 8192))) return RequestResult::Error(statusCode, comment); @@ -736,6 +743,7 @@ * * Scenes and Groups * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -753,8 +761,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -771,6 +778,7 @@ * * Scenes and Groups * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -787,8 +795,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateString("sceneItemBlendMode", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -807,8 +814,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -825,8 +831,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem || !request.ValidateObject("sceneItemSettings", statusCode, comment, true)) return RequestResult::Error(statusCode, comment);
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Scenes.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Scenes.cpp
Changed
@@ -20,12 +20,14 @@ #include "RequestHandler.h" /** - * Gets an array of all scenes in OBS. + * Gets an array of scenes in OBS. * - * @responseField currentProgramSceneName | String | Current program scene name. Can be `null` if internal state desync - * @responseField currentProgramSceneUuid | String | Current program scene UUID. Can be `null` if internal state desync - * @responseField currentPreviewSceneName | String | Current preview scene name. `null` if not in studio mode - * @responseField currentPreviewSceneUuid | String | Current preview scene UUID. `null` if not in studio mode + * @requestField ?canvasUuid | String | UUID of the canvas the scenes are in + * + * @responseField currentProgramSceneName | String | Current program scene name. Can be `null` if non-main canvas or internal state desync + * @responseField currentProgramSceneUuid | String | Current program scene UUID. Can be `null` if non-main canvas or internal state desync + * @responseField currentPreviewSceneName | String | Current preview scene name. `null` if not in studio mode or non-main canvas + * @responseField currentPreviewSceneUuid | String | Current preview scene UUID. `null` if not in studio mode or non-main canvas * @responseField scenes | Array<Object> | Array of scenes * * @requestType GetSceneList @@ -35,30 +37,43 @@ * @api requests * @category scenes */ -RequestResult RequestHandler::GetSceneList(const Request &) +RequestResult RequestHandler::GetSceneList(const Request &request) { + RequestStatus::RequestStatus statusCode; + std::string comment; + OBSCanvasAutoRelease canvas = request.AcquireCanvas("canvasUuid", statusCode, comment); + if (!canvas) + return RequestResult::Error(statusCode, comment); + json responseData; - OBSSourceAutoRelease currentProgramScene = obs_frontend_get_current_scene(); - if (currentProgramScene) { - responseData"currentProgramSceneName" = obs_source_get_name(currentProgramScene); - responseData"currentProgramSceneUuid" = obs_source_get_uuid(currentProgramScene); - } else { + if (obs_canvas_get_flags(canvas) & MAIN) { // Main canvas, which has a program scene, preview scene, and scene order + OBSSourceAutoRelease currentProgramScene = obs_frontend_get_current_scene(); + if (currentProgramScene) { + responseData"currentProgramSceneName" = obs_source_get_name(currentProgramScene); + responseData"currentProgramSceneUuid" = obs_source_get_uuid(currentProgramScene); + } else { + responseData"currentProgramSceneName" = nullptr; + responseData"currentProgramSceneUuid" = nullptr; + } + + OBSSourceAutoRelease currentPreviewScene = obs_frontend_get_current_preview_scene(); + if (currentPreviewScene) { + responseData"currentPreviewSceneName" = obs_source_get_name(currentPreviewScene); + responseData"currentPreviewSceneUuid" = obs_source_get_uuid(currentPreviewScene); + } else { + responseData"currentPreviewSceneName" = nullptr; + responseData"currentPreviewSceneUuid" = nullptr; + } + responseData"scenes" = Utils::Obs::ArrayHelper::GetSceneList(); + } else { // Non-main canvas, which only has an unordered array of scenes responseData"currentProgramSceneName" = nullptr; responseData"currentProgramSceneUuid" = nullptr; + responseData"currentProgramSceneName" = nullptr; + responseData"currentProgramSceneUuid" = nullptr; + responseData"scenes" = Utils::Obs::ArrayHelper::GetCanvasSceneList(canvas); } - OBSSourceAutoRelease currentPreviewScene = obs_frontend_get_current_preview_scene(); - if (currentPreviewScene) { - responseData"currentPreviewSceneName" = obs_source_get_name(currentPreviewScene); - responseData"currentPreviewSceneUuid" = obs_source_get_uuid(currentPreviewScene); - } else { - responseData"currentPreviewSceneName" = nullptr; - responseData"currentPreviewSceneUuid" = nullptr; - } - - responseData"scenes" = Utils::Obs::ArrayHelper::GetSceneList(); - return RequestResult::Success(responseData); } @@ -76,11 +91,16 @@ * @api requests * @category scenes */ -RequestResult RequestHandler::GetGroupList(const Request &) +RequestResult RequestHandler::GetGroupList(const Request &request) { - json responseData; + RequestStatus::RequestStatus statusCode; + std::string comment; + OBSCanvasAutoRelease canvas = request.AcquireCanvas("canvasUuid", statusCode, comment); + if (!canvas) + return RequestResult::Error(statusCode, comment); - responseData"groups" = Utils::Obs::ArrayHelper::GetGroupList(); + json responseData; + responseData"groups" = Utils::Obs::ArrayHelper::GetCanvasGroupList(canvas); return RequestResult::Success(responseData); } @@ -88,7 +108,9 @@ /** * Gets the current program scene. * - * Note: This request is slated to have the `currentProgram`-prefixed fields removed from in an upcoming RPC version. + * Note 1: This request is slated to have the `currentProgram`-prefixed fields removed from in an upcoming RPC version. + * + * Note 2: Canvases do not have any concept of a program or preview scene, so this request does not support canvases. * * @responseField sceneName | String | Current program scene name * @responseField sceneUuid | String | Current program scene UUID @@ -115,8 +137,8 @@ /** * Sets the current program scene. * - * @requestField ?sceneName | String | Scene name to set as the current program scene - * @requestField ?sceneUuid | String | Scene UUID to set as the current program scene + * @requestField ?sceneName | String | Scene name to set as the current program scene + * @requestField ?sceneUuid | String | Scene UUID to set as the current program scene * * @requestType SetCurrentProgramScene * @complexity 1 @@ -129,10 +151,16 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); + OBSCanvasAutoRelease canvas = obs_source_get_canvas(scene); + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) + return RequestResult::Error( + RequestStatus::InvalidResourceState, + "The specified scene is not from the main canvas and cannot be set as the program scene."); + obs_frontend_set_current_scene(scene); return RequestResult::Success(); @@ -176,8 +204,8 @@ * * Only available when studio mode is enabled. * - * @requestField ?sceneName | String | Scene name to set as the current preview scene - * @requestField ?sceneUuid | String | Scene UUID to set as the current preview scene + * @requestField ?sceneName | String | Scene name to set as the current preview scene + * @requestField ?sceneUuid | String | Scene UUID to set as the current preview scene * * @requestType SetCurrentPreviewScene * @complexity 1 @@ -193,10 +221,16 @@ RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); + OBSCanvasAutoRelease canvas = obs_source_get_canvas(scene); + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) + return RequestResult::Error( + RequestStatus::InvalidResourceState, + "The specified scene is not from the main canvas and cannot be set as the preview scene."); + obs_frontend_set_current_preview_scene(scene); return RequestResult::Success(); @@ -205,7 +239,8 @@ /** * Creates a new scene in OBS. * - * @requestField sceneName | String | Name for the new scene + * @requestField ?canvasUuid | String | UUID of the canvas to create the new scene in. Leave default to assume main canvas + * @requestField sceneName | String | Name for the new scene * * @responseField sceneUuid | String | UUID of the created scene * @@ -225,11 +260,15 @@ std::string sceneName = request.RequestData"sceneName"; - OBSSourceAutoRelease scene = obs_get_source_by_name(sceneName.c_str()); + OBSCanvasAutoRelease canvas = request.AcquireCanvas("canvasUuid", statusCode, comment); + if (!canvas) + return RequestResult::Error(statusCode, comment); + + OBSSourceAutoRelease scene = obs_canvas_get_source_by_name(canvas, sceneName.c_str()); if (scene) return RequestResult::Error(RequestStatus::ResourceAlreadyExists, "A source already exists by that scene name."); - OBSSceneAutoRelease createdScene = obs_scene_create(sceneName.c_str()); + OBSSceneAutoRelease createdScene = obs_canvas_scene_create(canvas, sceneName.c_str()); if (!createdScene) return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Failed to create the scene."); @@ -242,6 +281,7 @@ /** * Removes a scene from OBS. * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene to remove * @requestField ?sceneUuid | String | UUID of the scene to remove * @@ -256,11 +296,15 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); - if (Utils::Obs::NumberHelper::GetSceneCount() < 2) + OBSCanvasAutoRelease canvas = obs_source_get_canvas(scene); + if (!canvas) + return RequestResult::Error(RequestStatus::ResourceActionFailed, "Error getting canvas for the specified scene."); + + if ((obs_canvas_get_flags(canvas) & MAIN) && Utils::Obs::NumberHelper::GetCanvasSceneCount(canvas) < 2) return RequestResult::Error(RequestStatus::NotEnoughResources, "You cannot remove the last scene in the collection."); @@ -272,6 +316,7 @@ /** * Sets the name of a scene (rename). * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene to be renamed * @requestField ?sceneUuid | String | UUID of the scene to be renamed * @requestField newSceneName | String | New name for the scene @@ -287,13 +332,14 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment); if (!(scene && request.ValidateString("newSceneName", statusCode, comment))) return RequestResult::Error(statusCode, comment); std::string newSceneName = request.RequestData"newSceneName"; - OBSSourceAutoRelease existingSource = obs_get_source_by_name(newSceneName.c_str()); + OBSCanvasAutoRelease canvas = obs_source_get_canvas(scene); + OBSSourceAutoRelease existingSource = obs_canvas_get_source_by_name(canvas, newSceneName.c_str()); if (existingSource) return RequestResult::Error(RequestStatus::ResourceAlreadyExists, "A source already exists by that new scene name."); @@ -308,8 +354,9 @@ * * Note: A transition UUID response field is not currently able to be implemented as of 2024-1-18. * - * @requestField ?sceneName | String | Name of the scene - * @requestField ?sceneUuid | String | UUID of the scene + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field + * @requestField ?sceneName | String | Name of the scene + * @requestField ?sceneUuid | String | UUID of the scene * * @responseField transitionName | String | Name of the overridden scene transition, else `null` * @responseField transitionDuration | Number | Duration of the overridden scene transition, else `null` @@ -325,7 +372,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); @@ -349,6 +396,7 @@ /** * Sets the scene transition overridden for a scene. * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene * @requestField ?sceneUuid | String | UUID of the scene * @requestField ?transitionName | String | Name of the scene transition to use as override. Specify `null` to remove | Unchanged @@ -365,7 +413,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment);
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Sources.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Sources.cpp
Changed
@@ -114,6 +114,7 @@ * * **Compatible with inputs and scenes.** * + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using sourceName field * @requestField ?sourceName | String | Name of the source to get the active state of * @requestField ?sourceUuid | String | UUID of the source to get the active state of * @@ -131,7 +132,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); @@ -152,6 +153,7 @@ * * **Compatible with inputs and scenes.** * + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using sourceName field * @requestField ?sourceName | String | Name of the source to take a screenshot of * @requestField ?sourceUuid | String | UUID of the source to take a screenshot of * @requestField imageFormat | String | Image compression format to use. Use `GetVersion` to get compatible image formats @@ -172,7 +174,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!(source && request.ValidateString("imageFormat", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -240,6 +242,7 @@ * * **Compatible with inputs and scenes.** * + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using sourceName field * @requestField ?sourceName | String | Name of the source to take a screenshot of * @requestField ?sourceUuid | String | UUID of the source to take a screenshot of * @requestField imageFormat | String | Image compression format to use. Use `GetVersion` to get compatible image formats @@ -259,7 +262,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!(source && request.ValidateString("imageFormat", statusCode, comment) && request.ValidateString("imageFilePath", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -322,7 +325,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); @@ -339,7 +342,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source || !request.ValidateObject("sourceSettings", statusCode, comment, true)) return RequestResult::Error(statusCode, comment);
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Transitions.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Transitions.cpp
Changed
@@ -315,6 +315,7 @@ if (request.Contains("release")) { if (!request.ValidateOptionalBoolean("release", statusCode, comment)) return RequestResult::Error(statusCode, comment); + release = request.RequestData"release"; } OBSSourceAutoRelease transition = obs_frontend_get_current_transition();
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Ui.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Ui.cpp
Changed
@@ -96,7 +96,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -122,7 +122,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -148,7 +148,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -265,6 +265,7 @@ * * Note: This request serves to provide feature parity with 4.x. It is very likely to be changed/deprecated in a future release. * + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field * @requestField ?sourceName | String | Name of the source to open a projector for * @requestField ?sourceUuid | String | UUID of the source to open a projector for * @requestField ?monitorIndex | Number | Monitor index, use `GetMonitorList` to obtain index | None | -1: Opens projector in windowed mode @@ -281,7 +282,7 @@ { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment);
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/requesthandler/rpc/Request.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/requesthandler/rpc/Request.cpp
Changed
@@ -211,20 +211,27 @@ return true; } -obs_source_t *Request::ValidateSource(const std::string &nameKeyName, const std::string &uuidKeyName, - RequestStatus::RequestStatus &statusCode, std::string &comment) const +obs_canvas_t *Request::AcquireCanvas(const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, + std::string &comment) const { - if (ValidateString(nameKeyName, statusCode, comment)) { - std::string sourceName = RequestDatanameKeyName; - obs_source_t *ret = obs_get_source_by_name(sourceName.c_str()); + if (ValidateString(uuidKeyName, statusCode, comment)) { + std::string canvasUuid = RequestDatauuidKeyName; + obs_canvas_t *ret = obs_get_canvas_by_uuid(canvasUuid.c_str()); if (!ret) { statusCode = RequestStatus::ResourceNotFound; - comment = std::string("No source was found by the name of `") + sourceName + "`."; + comment = std::string("No canvas was found by the UUID of `") + canvasUuid + "`."; return nullptr; } return ret; } + return obs_get_main_canvas(); +} + +obs_source_t *Request::AcquireSource(const std::string &canvasUuidKeyName, const std::string &nameKeyName, + const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, + std::string &comment) const +{ if (ValidateString(uuidKeyName, statusCode, comment)) { std::string sourceUuid = RequestDatauuidKeyName; obs_source_t *ret = obs_get_source_by_uuid(sourceUuid.c_str()); @@ -236,16 +243,33 @@ return ret; } + if (ValidateString(nameKeyName, statusCode, comment)) { + OBSCanvasAutoRelease canvas = AcquireCanvas(canvasUuidKeyName, statusCode, comment); + if (!canvas) + return nullptr; + std::string sourceName = RequestDatanameKeyName; + obs_source_t *ret = (obs_canvas_get_flags(canvas) & MAIN) + ? obs_get_source_by_name(sourceName.c_str()) + : obs_canvas_get_source_by_name(canvas, sourceName.c_str()); + if (!ret) { + statusCode = RequestStatus::ResourceNotFound; + comment = std::string("No source was found by the name of `") + sourceName + "` within the canvas `" + + obs_canvas_get_name(canvas) + "`."; + return nullptr; + } + return ret; + } + statusCode = RequestStatus::MissingRequestField; - comment = std::string("Your request must contain at least one of the following fields: `") + nameKeyName + "` or `" + - uuidKeyName + "`."; + comment = std::string("Your request must contain at least one of the following fields: `") + nameKeyName + + "` with optional `" + canvasUuidKeyName + "` or `" + uuidKeyName + "`."; return nullptr; } -obs_source_t *Request::ValidateScene(RequestStatus::RequestStatus &statusCode, std::string &comment, - const ObsWebSocketSceneFilter filter) const +obs_source_t *Request::AcquireScene(RequestStatus::RequestStatus &statusCode, std::string &comment, + const ObsWebSocketSceneFilter filter) const { - obs_source_t *ret = ValidateSource("sceneName", "sceneUuid", statusCode, comment); + obs_source_t *ret = AcquireSource("canvasUuid", "sceneName", "sceneUuid", statusCode, comment); if (!ret) return nullptr; @@ -272,10 +296,10 @@ return ret; } -obs_scene_t *Request::ValidateScene2(RequestStatus::RequestStatus &statusCode, std::string &comment, - const ObsWebSocketSceneFilter filter) const +obs_scene_t *Request::AcquireScene2(RequestStatus::RequestStatus &statusCode, std::string &comment, + const ObsWebSocketSceneFilter filter) const { - OBSSourceAutoRelease sceneSource = ValidateSource("sceneName", "sceneUuid", statusCode, comment); + OBSSourceAutoRelease sceneSource = AcquireSource("canvasUuid", "sceneName", "sceneUuid", statusCode, comment); if (!sceneSource) return nullptr; @@ -303,9 +327,9 @@ } } -obs_source_t *Request::ValidateInput(RequestStatus::RequestStatus &statusCode, std::string &comment) const +obs_source_t *Request::AcquireInput(RequestStatus::RequestStatus &statusCode, std::string &comment) const { - obs_source_t *ret = ValidateSource("inputName", "inputUuid", statusCode, comment); + obs_source_t *ret = AcquireSource("canvasUuid", "inputName", "inputUuid", statusCode, comment); if (!ret) return nullptr; @@ -319,9 +343,9 @@ return ret; } -FilterPair Request::ValidateFilter(RequestStatus::RequestStatus &statusCode, std::string &comment) const +FilterPair Request::AcquireFilter(RequestStatus::RequestStatus &statusCode, std::string &comment) const { - obs_source_t *source = ValidateSource("sourceName", "sourceUuid", statusCode, comment); + obs_source_t *source = AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return FilterPair{source, nullptr}; @@ -341,10 +365,10 @@ return FilterPair{source, filter}; } -obs_sceneitem_t *Request::ValidateSceneItem(RequestStatus::RequestStatus &statusCode, std::string &comment, - const ObsWebSocketSceneFilter filter) const +obs_sceneitem_t *Request::AcquireSceneItem(RequestStatus::RequestStatus &statusCode, std::string &comment, + const ObsWebSocketSceneFilter filter) const { - OBSSceneAutoRelease scene = ValidateScene2(statusCode, comment, filter); + OBSSceneAutoRelease scene = AcquireScene2(statusCode, comment, filter); if (!scene) return nullptr; @@ -366,8 +390,7 @@ return sceneItem; } -obs_output_t *Request::ValidateOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode, - std::string &comment) const +obs_output_t *Request::AcquireOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const { if (!ValidateString(keyName, statusCode, comment)) return nullptr;
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/requesthandler/rpc/Request.h -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/requesthandler/rpc/Request.h
Changed
@@ -64,18 +64,20 @@ const bool allowEmpty = false) const; // All return values have incremented refcounts - obs_source_t *ValidateSource(const std::string &nameKeyName, const std::string &uuidKeyName, - RequestStatus::RequestStatus &statusCode, std::string &comment) const; - obs_source_t *ValidateScene(RequestStatus::RequestStatus &statusCode, std::string &comment, - const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; - obs_scene_t *ValidateScene2(RequestStatus::RequestStatus &statusCode, std::string &comment, - const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; - obs_source_t *ValidateInput(RequestStatus::RequestStatus &statusCode, std::string &comment) const; - FilterPair ValidateFilter(RequestStatus::RequestStatus &statusCode, std::string &comment) const; - obs_sceneitem_t *ValidateSceneItem(RequestStatus::RequestStatus &statusCode, std::string &comment, - const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; - obs_output_t *ValidateOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode, - std::string &comment) const; + obs_canvas_t *AcquireCanvas(const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, + std::string &comment) const; + obs_source_t *AcquireSource(const std::string &canvasUuidKeyName, const std::string &nameKeyName, + const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, + std::string &comment) const; + obs_source_t *AcquireScene(RequestStatus::RequestStatus &statusCode, std::string &comment, + const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; + obs_scene_t *AcquireScene2(RequestStatus::RequestStatus &statusCode, std::string &comment, + const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; + obs_source_t *AcquireInput(RequestStatus::RequestStatus &statusCode, std::string &comment) const; + FilterPair AcquireFilter(RequestStatus::RequestStatus &statusCode, std::string &comment) const; + obs_sceneitem_t *AcquireSceneItem(RequestStatus::RequestStatus &statusCode, std::string &comment, + const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; + obs_output_t *AcquireOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const; std::string RequestType; bool HasRequestData;
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/utils/Json.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/utils/Json.cpp
Changed
@@ -75,6 +75,8 @@ obs_data_set_double(d, key.c_str(), value.get<double>()); } else if (value.is_boolean()) { obs_data_set_bool(d, key.c_str(), value.get<bool>()); + } else if (value.is_null()) { + obs_data_set_obj(d, key.c_str(), NULL); } } }
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/utils/Obs.h -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/utils/Obs.h
Changed
@@ -241,6 +241,7 @@ namespace NumberHelper { uint64_t GetOutputDuration(obs_output_t *output); size_t GetSceneCount(); + size_t GetCanvasSceneCount(obs_canvas_t *canvas); size_t GetSourceFilterIndex(obs_source_t *source, obs_source_t *filter); } @@ -250,7 +251,8 @@ std::vector<obs_hotkey_t *> GetHotkeyList(); std::vector<std::string> GetHotkeyNameList(); std::vector<json> GetSceneList(); - std::vector<std::string> GetGroupList(); + std::vector<json> GetCanvasSceneList(obs_canvas_t *canvas); + std::vector<std::string> GetCanvasGroupList(obs_canvas_t *canvas); std::vector<json> GetSceneItemList(obs_scene_t *scene, bool basic = false); std::vector<json> GetInputList(std::string inputKind = ""); std::vector<std::string> GetInputKindList(bool unversioned = false, bool includeDisabled = false); @@ -265,6 +267,7 @@ namespace ObjectHelper { json GetStats(); json GetSceneItemTransform(obs_sceneitem_t *item); + json GetCanvasVideoSettings(obs_canvas_t *canvas); } namespace SearchHelper {
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/utils/Obs_ArrayHelper.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/utils/Obs_ArrayHelper.cpp
Changed
@@ -110,7 +110,29 @@ return ret; } -std::vector<std::string> Utils::Obs::ArrayHelper::GetGroupList() +std::vector<json> Utils::Obs::ArrayHelper::GetCanvasSceneList(obs_canvas_t *canvas) +{ + std::vector<json> ret; + + auto cb = (void *param, obs_source_t *scene) { + auto ret = static_cast<std::vector<json> *>(param); + + json sceneJson; + sceneJson"sceneName" = obs_source_get_name(scene); + sceneJson"sceneUuid" = obs_source_get_uuid(scene); + sceneJson"sceneIndex" = nullptr; + + ret->push_back(sceneJson); + + return true; + }; + + obs_canvas_enum_scenes(canvas, cb, &ret); + + return ret; +} + +std::vector<std::string> Utils::Obs::ArrayHelper::GetCanvasGroupList(obs_canvas_t *canvas) { std::vector<std::string> ret; @@ -125,7 +147,7 @@ return true; }; - obs_enum_scenes(cb, &ret); + obs_canvas_enum_scenes(canvas, cb, &ret); return ret; }
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/utils/Obs_NumberHelper.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/utils/Obs_NumberHelper.cpp
Changed
@@ -37,6 +37,12 @@ size_t Utils::Obs::NumberHelper::GetSceneCount() { + OBSCanvasAutoRelease canvas = obs_get_main_canvas(); + return GetCanvasSceneCount(canvas); +} + +size_t Utils::Obs::NumberHelper::GetCanvasSceneCount(obs_canvas_t *canvas) +{ size_t ret; auto sceneEnumProc = (void *param, obs_source_t *scene) { auto ret = static_cast<size_t *>(param); @@ -48,7 +54,7 @@ return true; }; - obs_enum_scenes(sceneEnumProc, &ret); + obs_canvas_enum_scenes(canvas, sceneEnumProc, &ret); return ret; }
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/utils/Obs_ObjectHelper.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/utils/Obs_ObjectHelper.cpp
Changed
@@ -87,3 +87,27 @@ return ret; } + +json Utils::Obs::ObjectHelper::GetCanvasVideoSettings(obs_canvas_t *canvas) +{ + json ret; + + struct obs_video_info ovi; + if (canvas && obs_canvas_get_video_info(canvas, &ovi)) { + ret"fpsNumerator" = ovi.fps_num; + ret"fpsDenominator" = ovi.fps_den; + ret"baseWidth" = ovi.base_width; + ret"baseHeight" = ovi.base_height; + ret"outputWidth" = ovi.output_width; + ret"outputHeight" = ovi.output_height; + } else { + ret"fpsNumerator" = nullptr; + ret"fpsDenominator" = nullptr; + ret"baseWidth" = nullptr; + ret"baseHeight" = nullptr; + ret"outputWidth" = nullptr; + ret"outputHeight" = nullptr; + } + + return ret; +}
View file
obs-studio-32.0.4.tar.xz/plugins/obs-websocket/src/utils/Obs_StringHelper.cpp -> obs-studio-32.1.0.tar.xz/plugins/obs-websocket/src/utils/Obs_StringHelper.cpp
Changed
@@ -49,19 +49,19 @@ std::string Utils::Obs::StringHelper::GetCurrentSceneCollection() { BPtr<char> sceneCollectionName = obs_frontend_get_current_scene_collection(); - return std::string(sceneCollectionName.Get()); + return std::string(sceneCollectionName ? sceneCollectionName.Get() : ""); } std::string Utils::Obs::StringHelper::GetCurrentProfile() { BPtr<char> profileName = obs_frontend_get_current_profile(); - return std::string(profileName.Get()); + return std::string(profileName ? profileName.Get() : ""); } std::string Utils::Obs::StringHelper::GetCurrentProfilePath() { BPtr<char> profilePath = obs_frontend_get_current_profile_path(); - return std::string(profilePath.Get()); + return std::string(profilePath ? profilePath.Get() : ""); } std::string Utils::Obs::StringHelper::GetCurrentRecordOutputPath()
View file
obs-studio-32.0.4.tar.xz/plugins/obs-x264/data/locale/ka-GE.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-x264/data/locale/ka-GE.ini
Changed
@@ -3,7 +3,7 @@ BufferSize="მომარაგების ზომა" RateControl="სიხშირის მართვა" KeyframeIntervalSec="საკვანძო კადრ. შუალედი (0=თვითშერჩევა)" -CPUPreset="პროცესორის მზა პარამეტრ. (მაღალი = ნაკლები CPU)" +CPUPreset="პროცესორის მზა პარამ. (მაღალი = ნაკლები CPU)" Profile="პროფილი" Tune="გამართვა" None="(არცერთი)"
View file
obs-studio-32.0.4.tar.xz/plugins/obs-x264/data/locale/kmr-TR.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-x264/data/locale/kmr-TR.ini
Changed
@@ -9,4 +9,5 @@ None="(Ne yek)" EncoderOptions="Vebijarkên x264 (bi cîh veqetandî)" VFR="Rêjeya çarçoveya guherbar (VFR)" +HighPrecisionUnsupported="OBS piştgiriya bikaranîna x264 bi formatên rengîn ên rastbûna bilind nake." HdrUnsupported="OBS piştgiriya bikaranîna x264 bi Rec. 2100 re nake."
View file
obs-studio-32.1.0.tar.xz/plugins/obs-x264/data/locale/lo-LA.ini
Added
@@ -0,0 +1,13 @@ +Bitrate="ອັດຕາບິດ" +CustomBufsize="ໃຊ້ຂະໜາດບັບເຟີທີ່ກຳນົດເອງ" +BufferSize="ຂະໜາດບັບເຟີ" +RateControl="ການຄວບຄຸມອັດຕາ" +KeyframeIntervalSec="ໄລຍະຫ່າງຄີເຟຣມ (0=ອັດຕະໂນມັດ)" +CPUPreset="ຄ່າທີ່ຕັ້ງໄວ້ສຳລັບການນຳໃຊ້ CPU (ສູງກວ່າ = ໃຊ້ CPU ໜ້ອຍກວ່າ)" +Profile="ໂປຣໄຟລ໌" +Tune="ປັບແຕ່ງ" +None="(ບໍ່ມີ)" +EncoderOptions="ຕົວເລືອກ x264 (ແຍກດ້ວຍຍະຫວ່າງ)" +VFR="ເຟຣມເຣດແບບປ່ຽນແປງໄດ້ (VFR)" +HighPrecisionUnsupported="OBS ບໍ່ຮອງຮັບການໃຊ້ x264 ກັບຮູບແບບສີທີ່ມີຄວາມລະອຽດສູງ." +HdrUnsupported="OBS ບໍ່ຮອງຮັບການໃຊ້ x264 ກັບ Rec. 2100."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-x264/data/locale/lv-LV.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-x264/data/locale/lv-LV.ini
Changed
@@ -1,4 +1,11 @@ +CustomBufsize="Izmantot Pielāgotu Bufera Izmēru" BufferSize="Bufera izmērs" +RateControl="Bitu pārraides ātruma Kontrole" +KeyframeIntervalSec="Atslēgas kadru Intervāls (0=auto)" +CPUPreset="CPU Noslodzes Iepriekšiestatījums (augstāks = mazāk CPU)" Profile="Profils" None="(Nav)" EncoderOptions="x264 izvēles (ar baltstarpas rakstzīmes)" +VFR="Mainīgs Kadru ātrums (VFR)" +HighPrecisionUnsupported="OBS neatbalsta x264 izmantošanu ar augstas precizitātes krāsu formātiem." +HdrUnsupported="OBS neatbalsta x264 izmantošanu ar Rec. 2100."
View file
obs-studio-32.0.4.tar.xz/plugins/obs-x264/data/locale/ro-RO.ini -> obs-studio-32.1.0.tar.xz/plugins/obs-x264/data/locale/ro-RO.ini
Changed
@@ -10,4 +10,4 @@ EncoderOptions="Opţiuni x264 (separate prin spațiu)" VFR="Frecvență de cadre variabilă (VFR)" HighPrecisionUnsupported="OBS nu acceptă utilizarea x264 cu formate de culoare de mare precizie." -HdrUnsupported="OBS nu suportă utilizarea x264 cu Rec. 2100." +HdrUnsupported="OBS nu suportă folosirea lui x264 cu Rec. 2100."
View file
obs-studio-32.0.4.tar.xz/plugins/oss-audio/data/locale/fil-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/oss-audio/data/locale/fil-PH.ini
Changed
@@ -1,5 +1,5 @@ OSSInput="Daming Input Capture (DSS)" -CustomDSPPath="Pasadyang DSP Path" +CustomDSPPath="Pasadyang Landas ng DSP" SampleRate="Bilis ng pagsasample" Channels="Mga Channel" SampleFormat="Ayos ng Sample"
View file
obs-studio-32.1.0.tar.xz/plugins/oss-audio/data/locale/lo-LA.ini
Added
@@ -0,0 +1,7 @@ +OSSInput="ການຈັບສຽງຂາເຂົ້າ (OSS)" +CustomDSPPath="ເສັ້ນທາງ DSP ທີ່ກຳນົດເອງ" +SampleRate="ອັດຕາການສຸ່ມຕົວຢ່າງ" +Channels="ຊ່ອງສັນຍານ" +SampleFormat="ຮູບແບບການສຸ່ມຕົວຢ່າງ" +Default="ຄ່າເລີ່ມຕົ້ນ" +Custom="ກຳນົດເອງ"
View file
obs-studio-32.1.0.tar.xz/plugins/oss-audio/data/locale/tl-PH.ini
Added
@@ -0,0 +1,1 @@ +CustomDSPPath="Pasadyang Landas ng DSP"
View file
obs-studio-32.1.0.tar.xz/plugins/rtmp-services/data/locale/lo-LA.ini
Added
@@ -0,0 +1,14 @@ +StreamingServices="ບໍລິການສະຕຣີມມິງ" +CustomStreamingServer="ເຊີເວີສະຕຣີມມິງກຳນົດເອງ" +Service="ບໍລິການ" +Server="ເຊີເວີ" +Server.Auto="ອັດຕະໂນມັດ (ແນະນຳ)" +Server.AutoRTMPS="ອັດຕະໂນມັດ (RTMPS, ແນະນຳ)" +Server.AutoRTMP="ອັດຕະໂນມັດ (RTMP)" +StreamKey="ລະຫັດສະຕຣີມ" +UseAuth="ໃຊ້ການຢືນຢັນຕົວຕົນ" +Username="ຊື່ຜູ້ໃຊ້" +Password="ລະຫັດຜ່ານ" +ShowAll="ສະແດງບໍລິການທັງໝົດ" +MultitrackVideo.Disclaimer="%1 ຈະປັບແຕ່ງການຕັ້ງຄ່າຂອງທ່ານໂດຍອັດຕະໂນມັດ ເພື່ອເຂົ້າລະຫັດ ແລະ ສົ່ງວິດີໂອທີ່ມີຫຼາຍລະດັບຄຸນນະພາບໄປຫາ %2. ການເລືອກຕົວເລືອກນີ້ຈະເປັນການສົ່ງຂໍ້ມູນກ່ຽວກັບຄອມພິວເຕີ ແລະ ການຕິດຕັ້ງຊອບແວຂອງທ່ານໄປຫາ %2." +MultitrackVideo.LearnMoreLink=" <a href='%1'>ຮຽນຮູ້ເພີ່ມເຕີມ</a>"
View file
obs-studio-32.0.4.tar.xz/plugins/rtmp-services/data/package.json -> obs-studio-32.1.0.tar.xz/plugins/rtmp-services/data/package.json
Changed
@@ -1,11 +1,11 @@ { "$schema": "schema/package-schema.json", "url": "https://obsproject.com/obs2_update/rtmp-services/v5", - "version": 281, + "version": 285, "files": { "name": "services.json", - "version": 281 + "version": 285 } }
View file
obs-studio-32.0.4.tar.xz/plugins/rtmp-services/data/services.json -> obs-studio-32.1.0.tar.xz/plugins/rtmp-services/data/services.json
Changed
@@ -1510,24 +1510,6 @@ }, { - "name": "STAGE TEN", - "servers": - { - "name": "STAGE TEN", - "url": "rtmps://app-rtmp.stageten.tv:443/stageten" - } - , - "recommended": { - "keyint": 2, - "profile": "baseline", - "max video bitrate": 4000, - "max audio bitrate": 128 - }, - "supported video codecs": - "h264" - - }, - { "name": "DLive", "servers": { @@ -2013,10 +1995,6 @@ "url": "rtmp://bintu-stream-ass.nanocosmos.de/live" }, { - "name": "bintu-stream Australia (AU)", - "url": "rtmp://bintu-stream-au.nanocosmos.de/live" - }, - { "name": "bintu-vtrans Europe (EU)", "url": "rtmp://bintu-vtrans-eu.nanocosmos.de/live" }, @@ -2640,10 +2618,6 @@ "url": "rtmp://live-us-lax-stream.shareplay.tv" }, { - "name": "Miami, Florida, USA", - "url": "rtmp://live-us-mia-stream.shareplay.tv" - }, - { "name": "Seattle, Washington, USA", "url": "rtmp://live-us-sea-stream.shareplay.tv" }, @@ -2664,10 +2638,6 @@ "url": "rtmp://live-uk-lhr-stream.shareplay.tv" }, { - "name": "Milan, Italy", - "url": "rtmp://live-it-mil-stream.shareplay.tv" - }, - { "name": "Sydney, Australia", "url": "rtmp://live-au-syd-stream.shareplay.tv" } @@ -3593,6 +3563,29 @@ "max video bitrate": 8000, "max audio bitrate": 192 } + }, + { + "name": "Sportify", + "more_info_link": "https://www.homegroundapp.com", + "servers": + { + "name": "Default", + "url": "rtmp://stream.homegroundapp.com/live" + } + , + "recommended": { + "keyint": 2, + "max video bitrate": 3500, + "max audio bitrate": 192, + "supported resolutions": + "1920x1080", + "1280x720" + , + "max fps": 30 + }, + "supported video codecs": + "h264" + } }
View file
obs-studio-32.0.4.tar.xz/plugins/rtmp-services/service-specific/nimotv.c -> obs-studio-32.1.0.tar.xz/plugins/rtmp-services/service-specific/nimotv.c
Changed
@@ -84,7 +84,7 @@ curl_free(encoded_key); curl_easy_setopt(curl_handle, CURLOPT_URL, uri.array); - curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, true); + curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 1L); curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 2L); curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 3L); curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, nimotv_write_cb);
View file
obs-studio-32.0.4.tar.xz/plugins/rtmp-services/service-specific/showroom.c -> obs-studio-32.1.0.tar.xz/plugins/rtmp-services/service-specific/showroom.c
Changed
@@ -113,7 +113,7 @@ dstr_copy(&uri, server); dstr_cat(&uri, access_key); curl_easy_setopt(curl_handle, CURLOPT_URL, uri.array); - curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, true); + curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 1L); curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 2L); curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 30L); curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, showroom_write_cb);
View file
obs-studio-32.1.0.tar.xz/plugins/sndio/data/locale/lo-LA.ini
Added
@@ -0,0 +1,5 @@ +Channels="ຈຳນວນຊ່ອງສັນຍານ" +Device="ອຸປະກອນ" +BitsPerSample="ບິດຕໍ່ຕົວຢ່າງ" +Rate="ອັດຕາ" +SndioInput="ຄລາຍແອນອິນພຸດ Sndio"
View file
obs-studio-32.0.4.tar.xz/plugins/text-freetype2/data/locale/ka-GE.ini -> obs-studio-32.1.0.tar.xz/plugins/text-freetype2/data/locale/ka-GE.ini
Changed
@@ -1,4 +1,4 @@ -TextFreetype2="ტექსტი (FreeType 2)" +TextFreetype2="წარწერა (FreeType 2)" Font="შრიფტი" Text="ტექსტი" TextFile="ტექსტური ფაილი"
View file
obs-studio-32.0.4.tar.xz/plugins/text-freetype2/data/locale/kmr-TR.ini -> obs-studio-32.1.0.tar.xz/plugins/text-freetype2/data/locale/kmr-TR.ini
Changed
@@ -1,6 +1,11 @@ TextFreetype2="Nivîs (FreeType 2)" Font="Cûrenivîs" Text="Nivîs" +TextFile="Pelê nivîsê" +TextFile.Encoding="UTF-8 an UTF-16" +TextInputMode="Awaya ketana nivîsê" +TextInputMode.Manual="Bi destan" +TextInputMode.FromFile="Ji pelê" TextFileFilter="Pelên Nivîsê (*.txt);;" ChatLogMode="Moda têketina axaftinê" ChatLogLines="Rêzikên têketina axaftinê"
View file
obs-studio-32.1.0.tar.xz/plugins/text-freetype2/data/locale/lo-LA.ini
Added
@@ -0,0 +1,18 @@ +TextFreetype2="ຂໍ້ຄວາມ (FreeType 2)" +Font="ຟອນ" +Text="ຂໍ້ຄວາມ" +TextFile="ໄຟລ໌ຂໍ້ຄວາມ" +TextFile.Encoding="ການເຂົ້າລະຫັດ (UTF-8 ຫຼື UTF-16)" +TextInputMode="ໂໝດການປ້ອນຂໍ້ຄວາມ" +TextInputMode.Manual="ປ້ອນເອງ" +TextInputMode.FromFile="ຈາກໄຟລ໌" +TextFileFilter="ໄຟລ໌ຂໍ້ຄວາມ (*.txt);;" +ChatLogMode="ໂໝດບັນທຶກການສົນທະນາ" +ChatLogLines="ແຖວບັນທຶກການສົນທະນາ" +Color1="ສີ 1" +Color2="ສີ 2" +Outline="ເສັ້ນຂອບ" +DropShadow="ເງົາ" +CustomWidth="ກຳນົດຄວາມກວ້າງຂໍ້ຄວາມເອງ" +WordWrap="ຕັດຄຳຂຶ້ນແຖວໃໝ່" +Antialiasing="ເປີດໃຊ້ງານການລຶບຮອຍຢັກ"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/af-ZA.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/af-ZA.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC Videobron" Playlist="Afspeellys" LoopPlaylist="Herhaal afspeellys" Shuffle="Skommel afspeellys"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/ar-SA.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/ar-SA.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="مصدر فيديو VLC" Playlist="قائمة تشغيل" LoopPlaylist="تشغيل القائمة بشكل متكرر" Shuffle="تشغيل القائمة بشكل عشوائي"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/az-AZ.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/az-AZ.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC Video Mənbəyi" Playlist="Oxutma Siyahısı" LoopPlaylist="Oxutma Siyahısını Dövrələ" Shuffle="Oxutma Siyahısını Qarışdır"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/be-BY.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/be-BY.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="Крыінца відэа VLC" +VLCSource="Відэафайл VLC" Playlist="Плэй-ліст" LoopPlaylist="Зацыкліць плэй-ліст" Shuffle="Перамяшаць трэкі"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/bg-BG.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/bg-BG.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="Видеоизточник за VLC" Playlist="Списък за изпълнение" LoopPlaylist="Повтаряне на списъка за изпълнение" Shuffle="Разбъркване на списъка за изпълнение"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/bn-BD.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/bn-BD.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC ভিডিও উৎস" Playlist="প্লেলিস্ট" LoopPlaylist="প্লেলিস্ট লুপ করুন" Shuffle="প্লেলিস্ট পরিবর্তন করুন"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/ca-ES.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/ca-ES.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="Font de vídeo VLC" +VLCSource="Vídeo VLC" Playlist="Llista de reproducció" LoopPlaylist="Repetir la llista de reproducció" Shuffle="Barreja la llista de reproducció"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/cs-CZ.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/cs-CZ.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="Video zdroj VLC" Playlist="Seznam skladeb" LoopPlaylist="Opakovat seznam skladeb" Shuffle="Náhodné řazení playlistu"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/da-DK.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/da-DK.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC-videokilde" Playlist="Afspilningsliste" LoopPlaylist="Gentag afspilningsliste" Shuffle="Bland afspilningsliste"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/de-DE.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/de-DE.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC-Videoquelle" LoopPlaylist="Playlist wiederholen" Shuffle="Zufällige Wiedergabe" PlaybackBehavior="Sichtbarkeitsverhalten"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/el-GR.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/el-GR.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="Πηγή βίντεο VLC" Playlist="Λίστα αναπαραγωγής" LoopPlaylist="Επανάληψη λίστας αναπαραγωγής" Shuffle="Τυχαία αναπαραγωγή λίστας αναπαραγωγής"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/en-US.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/en-US.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="VLC Video Source" +VLCSource="VLC Video" Playlist="Playlist" LoopPlaylist="Loop Playlist" Shuffle="Shuffle Playlist"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/es-ES.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/es-ES.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="Fuente de vídeo VLC" +VLCSource="Vídeo VLC" Playlist="Lista de reproducción" LoopPlaylist="Repetir lista de reproducción" Shuffle="Mezclar lista de reproducción"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/et-EE.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/et-EE.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC Video allikas" Playlist="Esitusloend" LoopPlaylist="Korda esitusloendit" Shuffle="Juhuesita esitlusloend"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/eu-ES.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/eu-ES.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC bideo-iturburua" Playlist="Erreprodukzio-zerrenda" LoopPlaylist="Errepikatu erreprodukzio-zerrenda" Shuffle="Nahasi erreprodukzio-zerrenda"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/fa-IR.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/fa-IR.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="منبع ویدئو VLC" +VLCSource="ویالسی ویدیو" Playlist="لیست پخش" LoopPlaylist="فهرست پخش چرخشی" Shuffle="پخش درهم"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/fi-FI.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/fi-FI.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="VLC Video-lähde" +VLCSource="VLC-video" Playlist="Soittolista" LoopPlaylist="Toista soittolistaa jatkuvasti" Shuffle="Sekoita soittolista"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/fil-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/fil-PH.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC Pinagmulan ng Bidyo" LoopPlaylist="Ulitin ang Playlist" Shuffle="I-shuffle ang Playlist" PlaybackBehavior="Pag-uugali sa pagkakita"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/fr-FR.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/fr-FR.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="Source vidéo VLC" +VLCSource="Vidéo VLC" Playlist="Liste de lecture" LoopPlaylist="Répéter la liste de lecture" Shuffle="Lecture aléatoire"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/gd-GB.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/gd-GB.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="Tùs video VLC" Playlist="Liosta-chluiche" LoopPlaylist="Lùb an liosta-chluich" Shuffle="Cuir an liosta-chluich air thuaiream"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/gl-ES.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/gl-ES.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="Fonte de vídeo VLC" Playlist="Lista de reprodución" LoopPlaylist="Lista de reprodución en bucle" Shuffle="Barallar a lista de reprodución"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/he-IL.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/he-IL.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="מקור וידאו VLC" +VLCSource="סרטון VLC" Playlist="רשימת השמעה" LoopPlaylist="נגינה חוזרת של רשימת ההשמעה" Shuffle="ערבוב רשימת השמעה"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/hi-IN.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/hi-IN.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC वीडियो स्रोत" Playlist="प्लेसूची" LoopPlaylist="प्लेसूची दोहराएं" Shuffle="प्लेसूची उलट-पुलट करें"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/hr-HR.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/hr-HR.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC video izvor" Playlist="Plejlista" LoopPlaylist="Ponavljanje plejliste" Shuffle="Nasumična reprodukcija popisa za reprodukciju"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/hu-HU.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/hu-HU.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="VLC Videoforrás" +VLCSource="VLC videó" Playlist="Lejátszási lista" LoopPlaylist="Ismétlődő lejátszási lista" Shuffle="Véletlenszerű lejátszási lista"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/hy-AM.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/hy-AM.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC վիդեո աղբյուր" Playlist="Տեսացանկ" LoopPlaylist="Շրջել տեսացանկը" Shuffle="Խառնել տեսացանկը"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/id-ID.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/id-ID.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="Sumber Video VLC" +VLCSource="Video VLC" Playlist="Daftar Putar" LoopPlaylist="Ulangi Daftar Putar" Shuffle="Acak Daftar Putar"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/it-IT.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/it-IT.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="Fonte video di VLC" +VLCSource="Video VLC" LoopPlaylist="Ripeti la playlist" Shuffle="Mescola la playlist" PlaybackBehavior="Comportamento visibilità"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/ja-JP.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/ja-JP.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="VLC ビデオソース" +VLCSource="VLCビデオ" Playlist="プレイリスト" LoopPlaylist="プレイリストをループ再生" Shuffle="プレイリストをシャッフルする"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/ka-GE.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/ka-GE.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="VLC-ვიდეოს წყარო" +VLCSource="VLC-ვიდეო" Playlist="დასაკრავი სია" LoopPlaylist="დასაკრავის უსასრულოდ გამეორება" Shuffle="დასაკრავი სიის არევა"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/kaa.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/kaa.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC video deregi" PlaybackBehavior="Kórinis qásiyeti" PlaybackBehavior.StopRestart="Kórinbeytuǵın bolsa toqtatıw, kórinetuǵın bolsa bastan baslaw" PlaybackBehavior.AlwaysPlay="Hámiyshe qoyıw, hátteki kórinbeytuǵın bolsa da"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/kab-KAB.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/kab-KAB.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="Aɣbalu n uvidyu VLC" Playlist="Tabdart n tɣuri" LoopPlaylist="Ales tabdart n tɣuri" Shuffle="Taɣuri tagacurant"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/kmr-TR.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/kmr-TR.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="Çavkaniya vîdyoyê ya VLC" Playlist="Rêzoka lêdanan" LoopPlaylist="Rêzoka lêdanan bêdawî" Shuffle="Rêzoka lêdanan tevlihev bike"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/ko-KR.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/ko-KR.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC 비디오 소스" Playlist="재생목록" LoopPlaylist="반복 재생" Shuffle="무작위 재생"
View file
obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/lo-LA.ini
Added
@@ -0,0 +1,17 @@ +VLCSource="ແຫຼ່ງວິດີໂອ VLC" +Playlist="ລາຍການຫຼິ້ນ" +LoopPlaylist="ວົນຮອບລາຍການຫຼິ້ນ" +Shuffle="ສຸ່ມລາຍການຫຼິ້ນ" +PlaybackBehavior="ພຶດຕິກຳການຫຼິ້ນ" +PlaybackBehavior.StopRestart="ຢຸດເມື່ອເບິ່ງບໍ່ເຫັນ, ເລີ່ມໃໝ່ເມື່ອເບິ່ງເຫັນ" +PlaybackBehavior.PauseUnpause="ພັກໄວ້ເມື່ອເບິ່ງບໍ່ເຫັນ, ຫຼິ້ນຕໍ່ເມື່ອເບິ່ງເຫັນ" +PlaybackBehavior.AlwaysPlay="ຫຼິ້ນຕະຫຼອດເວລາເຖິງແມ່ນວ່າຈະເບິ່ງບໍ່ເຫັນ" +NetworkCaching="ການພັກຂໍ້ມູນເຄືອຂ່າຍ" +PlayPause="ຫຼິ້ນ/ພັກ" +Restart="ເລີ່ມໃໝ່" +Stop="ຢຸດ" +PlaylistNext="ຕໍ່ໄປ" +PlaylistPrev="ກ່ອນໜ້າ" +AudioTrack="ແທຣັກສຽງ" +SubtitleTrack="ແທຣັກຄຳບັນຍາຍ" +SubtitleEnable="ເປີດໃຊ້ຄຳບັນຍາຍ"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/ms-MY.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/ms-MY.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="Sumber Video VLC" +VLCSource="Video VLC" Playlist="Senarai Main" LoopPlaylist="Ulang Senarai Main" Shuffle="Kocok Senarai Main"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/nb-NO.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/nb-NO.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC-videokilde" Playlist="Spilleliste" LoopPlaylist="Repeter spilleliste" Shuffle="Shuffle spilleliste"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/nl-NL.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/nl-NL.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC Videobron" LoopPlaylist="Playlist herhalen" Shuffle="Hussel afspeellijst" PlaybackBehavior="Zichtbaarheidsgedrag"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/pl-PL.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/pl-PL.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="Odtwarzacz VLC" +VLCSource="Wideo VLC" Playlist="Lista odtwarzania" LoopPlaylist="Powtarzaj listę odtwarzania" Shuffle="Przetasuj listę odtwarzania"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/pt-BR.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/pt-BR.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="Fonte de vídeo do VLC" +VLCSource="Vídeo do VLC" Playlist="Lista de reprodução" LoopPlaylist="Reproduzir em loop" Shuffle="Reproduzir aleatoriamente"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/pt-PT.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/pt-PT.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="Fonte de vídeo VLC" +VLCSource="Vídeo VLC" Playlist="Lista de reprodução" LoopPlaylist="Repetir a lista de reprodução" Shuffle="Leitura aleatória"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/ro-RO.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/ro-RO.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="Sursă video VLC" LoopPlaylist="Repetă playlistul" Shuffle="Amestecă playlistul" PlaybackBehavior="Comportamentul vizibilității"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/ru-RU.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/ru-RU.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="Источник VLC видео" +VLCSource="Видео VLC" Playlist="Плейлист" LoopPlaylist="Циклическое воспроизведение" Shuffle="Перемешать плейлист"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/si-LK.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/si-LK.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="වීඑල්සී දෘශ්යක මූලාශ්රය" Playlist="වාදන ලේඛනය" Shuffle="ධාවනලේඛනය කලවම" PlaybackBehavior.StopRestart="නොපෙනෙන විට නවතන්න, පෙනෙන විට යළි අරඹන්න"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/sk-SK.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/sk-SK.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC Video zdroj" Playlist="Zoznam skladieb" LoopPlaylist="Opakovať zoznam skladieb" Shuffle="Prehrať zoznam skladieb náhodne"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/sl-SI.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/sl-SI.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="Vir videoposnetkov VLC" Playlist="Seznam predvajanja" LoopPlaylist="Ponavljaj seznam predvajanja" Shuffle="Premešaj seznam predvajanja"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/sr-CS.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/sr-CS.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC video izvor" Playlist="Plejlista" LoopPlaylist="Ponavljanje plejliste" Shuffle="Puštaj nasumično"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/sr-SP.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/sr-SP.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC видео извор" Playlist="Плејлиста" LoopPlaylist="Понављање плејлисте" Shuffle="Пуштај насумично"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/sv-SE.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/sv-SE.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="VLC-videokälla" +VLCSource="VLC-video" Playlist="Spellista" LoopPlaylist="Slinga spellista" Shuffle="Blanda spellista"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/szl-PL.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/szl-PL.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="Zdrzōdło wideo VLC" Playlist="Playlista" LoopPlaylist="Zapyntl playlista" Shuffle="Losuj porzōndek playlisty"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/ta-IN.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/ta-IN.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC காணொளி மூலம்" Playlist="இசைப்பட்டியல்" PlayPause="இயக்கு/இடைநிறுத்து" Stop="நிறுத்து"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/th-TH.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/th-TH.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="แหล่งวิดีโอ VLC" Playlist="ผังเล่น" LoopPlaylist="ผังเล่นวนรอบ" Shuffle="ผังเล่นสุ่ม"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/tl-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/tl-PH.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="Pinagmulan ng VLC Video" Playlist="Mga Playlist" LoopPlaylist="Loop ng mga Playlist" Shuffle="I-shuffle ang mga Playlist"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/tr-TR.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/tr-TR.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC Video Kaynağı" Playlist="Oynatma Listesi" LoopPlaylist="Oynatma Listesini Yinele" Shuffle="Oynatma Listesini Karıştır"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/tt-RU.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/tt-RU.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC видео чыганагы" Playlist="Плейлист" PlayPause="Уйнату/туктатып тору" Restart="Яңадан башлау"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/ug-CN.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/ug-CN.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="VLC سىن مەنبەسى" +VLCSource="VLC سىن" Playlist="قويۇش تىزىملىكى" LoopPlaylist="دەۋرىي قويۇش تىزىمى" Shuffle="ئىختىيارىي قويۇش تىزىمى"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/uk-UA.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/uk-UA.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="Джерело відео VLC" Playlist="Список відтворення" LoopPlaylist="Повторювати список відтворення" Shuffle="Відтворювати у довільному порядку"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/vi-VN.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/vi-VN.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="Nguồn VLC Video" +VLCSource="Video VLC" Playlist="Danh sách phát" LoopPlaylist="Lặp lại danh sách phát" Shuffle="Ngẫu nhiên hóa danh sách phát"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/zh-CN.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/zh-CN.ini
Changed
@@ -1,4 +1,4 @@ -VLCSource="VLC 视频源" +VLCSource="VLC 视频" Playlist="播放列表" LoopPlaylist="循环播放列表" Shuffle="随机播放列表"
View file
obs-studio-32.0.4.tar.xz/plugins/vlc-video/data/locale/zh-TW.ini -> obs-studio-32.1.0.tar.xz/plugins/vlc-video/data/locale/zh-TW.ini
Changed
@@ -1,4 +1,3 @@ -VLCSource="VLC視訊來源" Playlist="播放清單" LoopPlaylist="循環播放清單" Shuffle="隨機播放"
View file
obs-studio-32.0.4.tar.xz/plugins/win-capture/data/locale/az-AZ.ini -> obs-studio-32.1.0.tar.xz/plugins/win-capture/data/locale/az-AZ.ini
Changed
@@ -1,13 +1,53 @@ +MonitorCapture="Ekran Yaxalama" +WindowCapture="Pəncərə Yaxalama" WindowCapture.Window="Pəncərə" +WindowCapture.Method="Yaxalama Metodu" WindowCapture.Method.Auto="Avtomatik" WindowCapture.Method.BitBlt="BitBlt (Windows 7 və yuxarı)" WindowCapture.Method.WindowsGraphicsCapture="Windows 10 (1903 və yuxarı)" -ForceSdr="SDR-i məcbur edin" -AllowTransparency="Şəffaflığa icazə ver" +WindowCapture.Priority="Pəncərə Uyğunluğu Prioriteti" +WindowCapture.Priority.Title="Pəncərə başlığı uyğun gəlməlidir" +WindowCapture.Priority.Class="Başlıq uyğunlaşdır, olmasa eyni növdən olan pəncərəni tap" +WindowCapture.Priority.Exe="Başlıq uyğunlaşdır, olmasa eyni icra faylına məxsus pəncərəni tap" +CaptureCursor="Kursoru Yaxala" +Compatibility="Çoxadapterli Uyğunluq" +ClientArea="Klient Sahəsi" +ForceSdr="SDR-ə məcbur et" +SLIFix="SLI/Crossfire Yaxalama Rejimi (Yavaş)" +AllowTransparency="Şəffaflığa İcazə Ver" Monitor="Ekran" +PrimaryMonitor="Əsas Ekran" +Method="Yaxalama Metodu" +Method.DXGI="DXGI Masaüstü Dublikasiyası" +Method.WindowsGraphicsCapture="Windows 10 (1903 və yuxarı)" +GameCapture="Oyun Yaxalama" +GameCapture.AnyFullscreen="İstənilən tam ekranlı tətbiqi yaxala" +GameCapture.CaptureWindow="Xüsusi pəncərəni yaxala" +GameCapture.UseHotkey="Ön plandakı pəncərəni qısayol düyməsi ilə yaxala" +GameCapture.LimitFramerate="Yaxalama kadr tezliyini məhdudlaşdır" +GameCapture.CaptureOverlays="Üçüncü tərəf örtüklərini yaxala (məsələn, Steam)" +GameCapture.AntiCheatHook="Anti-hiylə uyğunluq tətbiqindən istifadə et" +GameCapture.HotkeyStart="Ön plandakı pəncərəni yaxala" +GameCapture.HotkeyStop="Yaxalaman Deaktiv et" +GameCapture.HookRate="Oyun Yaxalama Sürəti" GameCapture.HookRate.Slow="Yavaş" -GameCapture.HookRate.Normal="Normal (önərilmiş)" -GameCapture.HookRate.Fast="Tez" -GameCapture.HookRate.Fastest="Sürətli" +GameCapture.HookRate.Normal="Normal (tövsiyə olunur)" +GameCapture.HookRate.Fast="Sürətli" +GameCapture.HookRate.Fastest="Ən Sürətli" +GameCapture.Rgb10a2Space="RGB10A2 Rəng Fəzası" Mode="Rejim" +CaptureAudio="Səs Yaxalama (BETA)" +CaptureAudio.TT="Aktiv edildikdə, avtomatik olaraq seçilmiş pəncərənin/tətbiqin səsini yazan bir \"Tətbiq Səsini Qəbuletmə\" mənbəyi yaradır.\nNəzərə alın ki, əgər \"İş Masası Səsi\" də aktivdirsə, bu, səsin təkrarlanmasına səbəb ola bilər." AudioSuffix="Səs" +SelectAWindow="Yaxalamaq üçün pəncərə seçin" +SelectADisplay="Yaxalamaq üçün ekran seçin" +Compatibility.GameCapture.Admin="%name% Oyun Yaxalama funksiyasından istifadə etmək üçün OBS-in administrator hüquqları ilə işə salınmasını tələb edə bilər." +Compatibility.GameCapture.Blocked="%name% Oyun Yaxalama ilə qeydə alına bilmir. Əvəzində Pəncərə Yaxalama və ya Ekran Yaxalama funksiyasından istifadə edin." +Compatibility.GameCapture.Blocked.Applications="%name% tətbiqləri Oyun Yaxalama ilə qeydə alına bilmir. Əvəzində Pəncərə Yaxalama və ya Ekran Yaxalamadan istifadə edin." +Compatibility.GameCapture.Blocked.Applications.Built="%name% üzərində qurulmuş oyunlar Oyun Yaxalama ilə qeydə alına bilmir. Əvəzində Pəncərə Yaxalama və ya Ekran Yaxalamadan istifadə edin." +Compatibility.GameCapture.WrongGPU="Əgər önizləmə boş görünürsə, %name%-in OBS ilə eyni GPU-da işlədiynə əmin olun." +Compatibility.WindowCapture.BitBlt="%name% seçilmiş Yaxalama Metodu (BitBlt) ilə qeydə alına bilməyə bilər." +Compatibility.WindowCapture.BitBlt.Applications="%name% tətbiqləri seçilmiş Yaxalama Metodu (BitBlt) ilə qeydə alına bilməyə bilər." +Compatibility.WindowCapture.BitBlt.Applications.Based="%name% əsasında qurulmuş tətbiqlər seçilmiş Yaxalama Metodu (BitBlt) ilə qeydə alına bilməyə bilər." +Compatibility.Application.CSGO="Oyun Yaxalamadan istifadə etmək üçün %name% tətbiqinin işə salınma parametrlərinə <code>-allow_third_party_software</code> seçimini əlavə etmək lazım gələ bilər." +Compatibility.Application.Minecraft="Əgər Minecraft: Java Edition-u yaxalamaqda problem yaşayırsınızsa, bizim problemlərin həlli bələdçisinə baxın."
View file
obs-studio-32.0.4.tar.xz/plugins/win-capture/data/locale/de-DE.ini -> obs-studio-32.1.0.tar.xz/plugins/win-capture/data/locale/de-DE.ini
Changed
@@ -32,7 +32,7 @@ GameCapture.HotkeyStop="Erfassung deaktivieren" GameCapture.HookRate="Hook-Rate" GameCapture.HookRate.Slow="Langsam" -GameCapture.HookRate.Normal="Normal (Empfohlen)" +GameCapture.HookRate.Normal="Normal (empfohlen)" GameCapture.HookRate.Fast="Schnell" GameCapture.HookRate.Fastest="Am schnellsten" GameCapture.Rgb10a2Space="RGB10A2-Farbraum"
View file
obs-studio-32.0.4.tar.xz/plugins/win-capture/data/locale/et-EE.ini -> obs-studio-32.1.0.tar.xz/plugins/win-capture/data/locale/et-EE.ini
Changed
@@ -42,3 +42,13 @@ AudioSuffix="Heli" SelectAWindow="Valige jäädvustamiseks aken" SelectADisplay="Valige kuvamiseks aken" +Compatibility.GameCapture.Admin="Game Capture'i kasutamiseks võib %name% vajada OBS-i käivitamist administraatorina." +Compatibility.GameCapture.Blocked="%name% ei saa Game Capture'iga jäädvustada. Kasutage selle asemel Window Capture'it või Display Capture'it." +Compatibility.GameCapture.Blocked.Applications="Rakendusi %name% ei saa Game Capture'iga jäädvustada. Kasutage selle asemel Window Capture'it või Display Capture'it." +Compatibility.GameCapture.Blocked.Applications.Built="%name% peal loodud mänge ei saa Game Capture'iga jäädvustada. Kasutage selle asemel Window Capture'it või Display Capture'it." +Compatibility.GameCapture.WrongGPU="Kui eelvaade on tühi, veenduge, et %name% töötab samal GPU-l kui OBS." +Compatibility.WindowCapture.BitBlt="%name% ei pruugi valitud jäädvustamismeetodi (BitBlt) abil jäädvustada." +Compatibility.WindowCapture.BitBlt.Applications="%name% rakendusi ei pruugi valitud jäädvustamismeetodi (BitBlt) abil jäädvustada." +Compatibility.WindowCapture.BitBlt.Applications.Based="%name% baasil loodud rakendusi ei pruugita valitud jäädvustamismeetodi (BitBlt) abil jäädvustada." +Compatibility.Application.CSGO="%name% võib Game Capture'i kasutamiseks vajada käivitusvalikut <code>-allow_third_party_software</code>." +Compatibility.Application.Minecraft="Kui teil on Minecrafti: Java Editioni jäädvustamisega probleeme, vaadake meie tõrkeotsingu juhendit."
View file
obs-studio-32.0.4.tar.xz/plugins/win-capture/data/locale/fil-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/win-capture/data/locale/fil-PH.ini
Changed
@@ -1,4 +1,4 @@ -MonitorCapture="Ipakita ang Kumuha" +MonitorCapture="Dakip ng Displey" WindowCapture="Kumuha ng window" WindowCapture.Window="Bintana" WindowCapture.Method="Paraan ng Pagcapture" @@ -15,7 +15,7 @@ ForceSdr="I-force ang SDR" SLIFix="SLI/Crossfire nasa Mode ng Pagkuha (Mabagal)" AllowTransparency="Pahintulutan ang Pag-aninaw" -Monitor="Magpakita" +Monitor="Displey" PrimaryMonitor="Pangunahing pagsubaybay" Method="Paraan ng Pagcapture" Method.WindowsGraphicsCapture="Windows 10 (1903 at pataas)" @@ -34,3 +34,8 @@ GameCapture.HookRate.Fastest="Pinakamabilis" Mode="Paraan" SelectAWindow="Pumili ng window upang i-kuha" +SelectADisplay="Pumili ng displey o dakip" +Compatibility.GameCapture.Blocked="Hindi madakip ng Dakip ng Laro ang %name%. Gumamit ng Dakip ng Window o Dakip ng Displey." +Compatibility.GameCapture.Blocked.Applications="Hindi madakip ng Dakip ng Laro ang %name% na mga aplikasyon. Gumamit ng Dakip ng Window o Dakip ng Displey." +Compatibility.GameCapture.Blocked.Applications.Built="Hindi madakip ng Dakip ng Laro ang mga larong ginawa sa %name%. Gumamit ng Dakip ng Window o Dakip ng Displey." +Compatibility.GameCapture.WrongGPU="Kung ang pribyu ay blanko, siguraduhin na ang %name% ay tumatakbo sa magkaparehong GPU sa OBS."
View file
obs-studio-32.0.4.tar.xz/plugins/win-capture/data/locale/kmr-TR.ini -> obs-studio-32.1.0.tar.xz/plugins/win-capture/data/locale/kmr-TR.ini
Changed
@@ -36,6 +36,10 @@ GameCapture.HookRate.Fastest="Leztirîn" GameCapture.Rgb10a2Space="Valahiya rengê RGB10A2" Mode="Awa" +CaptureAudio="Dengê bigire (BETA)" +AudioSuffix="Deng" +SelectAWindow="Bo girtinê çarçoveyekê hilbijêre" +SelectADisplay="" Compatibility.GameCapture.Admin="%name% dibe ku pêdivî hebe ku OBS wekî rêveber were xebitandin bo bikaranîna girtina lîskê." Compatibility.GameCapture.WrongGPU="Ku pêşdîtin vala be, pê ewle be ku %name% li ser heman GPU dixebite wekî OBS." Compatibility.WindowCapture.BitBlt="%name% dibe ku nikare be bi riya karanîna rêbaza girtinê ya hilbijartî (BitBlt) girtinê pêk bîne."
View file
obs-studio-32.0.4.tar.xz/plugins/win-capture/data/locale/lo-LA.ini -> obs-studio-32.1.0.tar.xz/plugins/win-capture/data/locale/lo-LA.ini
Changed
@@ -1,6 +1,52 @@ -MonitorCapture="ຕຽມບັນທຶກໜ້າຈໍປະຈຸບັນ" -WindowCapture="ຕຽມບັນທຶກໜ້າຕ່າງໂປຼແກຼມ" -WindowCapture.Window="ເລືອກໜ້າຕ່າງໂປຼແກຼມ" +MonitorCapture="ບັນທຶກຈໍສະແດງຜົນ" +WindowCapture="ບັນທຶກໜ້າຕ່າງ" +WindowCapture.Window="ໜ້າຕ່າງ" +WindowCapture.Method="ວິທີການບັນທຶກ" WindowCapture.Method.Auto="ອັດຕະໂນມັດ" +WindowCapture.Method.BitBlt="BitBlt (Windows 7 ຂຶ້ນໄປ)" +WindowCapture.Method.WindowsGraphicsCapture="Windows 10 (1903 ຂຶ້ນໄປ)" +WindowCapture.Priority="ລຳດັບຄວາມສຳຄັນໃນການທຽບໜ້າຕ່າງ" +WindowCapture.Priority.Title="ຊື່ໜ້າຕ່າງຕ້ອງກົງກັນ" +WindowCapture.Priority.Class="ທຽບຊື່, ຖ້າບໍ່ໄດ້ໃຫ້ຫາໜ້າຕ່າງປະເພດດຽວກັນ" +WindowCapture.Priority.Exe="ທຽບຊື່, ຖ້າບໍ່ໄດ້ໃຫ້ຫາໜ້າຕ່າງຈາກໂປຼແກຼມດຽວກັນ" +CaptureCursor="ບັນທຶກຕົວຊີ້ເມົາສ໌" +Compatibility="ຄວາມເຂົ້າກັນໄດ້ຂອງຫຼາຍອະແດບເຕີ" +ClientArea="ພື້ນທີ່ສ່ວນເນື້ອຫາ (Client Area)" +ForceSdr="ບັງຄັບໃຊ້ SDR" +SLIFix="ໂໝດບັນທຶກ SLI/Crossfire (ຊ້າ)" +AllowTransparency="ອະນຸຍາດໃຫ້ໂປ່ງໃສ" Monitor="ຈໍສະແດງຜົນ" -GameCapture.AnyFullscreen="ອັດບັນທຶກໂປຼແກຼມທຸກຢ່າງທີ່ເຕັມຈໍ" +PrimaryMonitor="ຈໍສະແດງຜົນຫຼັກ" +Method="ວິທີການບັນທຶກ" +Method.WindowsGraphicsCapture="Windows 10 (1903 ຂຶ້ນໄປ)" +GameCapture="ບັນທຶກເກມ" +GameCapture.AnyFullscreen="ບັນທຶກໂປຼແກຼມເຕັມຈໍໃດໜຶ່ງ" +GameCapture.CaptureWindow="ບັນທຶກໜ້າຕ່າງທີ່ລະບຸ" +GameCapture.UseHotkey="ບັນທຶກໜ້າຕ່າງທາງໜ້າດ້ວຍຄີລັດ" +GameCapture.LimitFramerate="ຈຳກັດເຟຣມເຣດການບັນທຶກ" +GameCapture.CaptureOverlays="ບັນທຶກສ່ວນຊ້ອນທັບຂອງບຸກຄົນທີສາມ (ເຊັ່ນ Steam)" +GameCapture.AntiCheatHook="ໃຊ້ hook ຄວາມເຂົ້າກັນໄດ້ກັບລະບົບປ້ອງກັນການໂກງ" +GameCapture.HotkeyStart="ບັນທຶກໜ້າຕ່າງທາງໜ້າ" +GameCapture.HotkeyStop="ຢຸດການບັນທຶກ" +GameCapture.HookRate="ອັດຕາການ Hook" +GameCapture.HookRate.Slow="ຊ້າ" +GameCapture.HookRate.Normal="ປົກກະຕິ (ແນະນຳ)" +GameCapture.HookRate.Fast="ໄວ" +GameCapture.HookRate.Fastest="ໄວທີ່ສຸດ" +GameCapture.Rgb10a2Space="ພື້ນທີ່ສີ RGB10A2" +Mode="ໂໝດ" +CaptureAudio="ບັນທຶກສຽງ (BETA)" +CaptureAudio.TT="ເມື່ອເປີດໃຊ້ງານ, ຈະສ້າງແຫຼ່ງ \"ບັນທຶກສຽງໂປຼແກຼມ\" ທີ່ຈະອັບເດດຕາມໜ້າຕ່າງ/ໂປຼແກຼມທີ່ຖືກບັນທຶກຢູ່ໂດຍອັດຕະໂນມັດ.\nໝາຍເຫດ: ຫາກຕັ້ງຄ່າ Desktop Audio ໄວ້, ອາດເຮັດໃຫ້ສຽງຊ້ອນກັນໄດ້." +AudioSuffix="ສຽງ" +SelectAWindow="ເລືອກໜ້າຕ່າງທີ່ຈະບັນທຶກ" +SelectADisplay="ເລືອກຈໍສະແດງຜົນທີ່ຈະບັນທຶກ" +Compatibility.GameCapture.Admin="%name% ອາດຕ້ອງການໃຫ້ເປີດ OBS ໃນຖານະຜູ້ເບິ່ງແຍງລະບົບ (Admin) ເພື່ອໃຊ້ການບັນທຶກເກມ." +Compatibility.GameCapture.Blocked="%name% ບໍ່ສາມາດບັນທຶກດ້ວຍການບັນທຶກເກມໄດ້. ໃຫ້ໃຊ້ການບັນທຶກໜ້າຕ່າງ ຫຼື ການບັນທຶກຈໍສະແດງຜົນແທນ." +Compatibility.GameCapture.Blocked.Applications="ໂປຼແກຼມ %name% ບໍ່ສາມາດບັນທຶກດ້ວຍການບັນທຶກເກມໄດ້. ໃຫ້ໃຊ້ການບັນທຶກໜ້າຕ່າງ ຫຼື ການບັນທຶກຈໍສະແດງຜົນແທນ." +Compatibility.GameCapture.Blocked.Applications.Built="ເກມທີ່ສ້າງດ້ວຍ %name% ບໍ່ສາມາດບັນທຶກດ້ວຍການບັນທຶກເກມໄດ້. ໃຫ້ໃຊ້ການບັນທຶກໜ້າຕ່າງ ຫຼື ການບັນທຶກຈໍສະແດງຜົນແທນ." +Compatibility.GameCapture.WrongGPU="ຖ້າຕົວຢ່າງເປັນສີດຳ, ໃຫ້ກວດເບິ່ງວ່າ %name% ກຳລັງເຮັດວຽກຢູ່ເທິງ GPU ດຽວກັນກັບ OBS." +Compatibility.WindowCapture.BitBlt="%name% ອາດບໍ່ສາມາດບັນທຶກໄດ້ໂດຍໃຊ້ວິທີການບັນທຶກທີ່ເລືອກໄວ້ (BitBlt)." +Compatibility.WindowCapture.BitBlt.Applications="ໂປຼແກຼມ %name% ອາດບໍ່ສາມາດບັນທຶກໄດ້ໂດຍໃຊ້ວິທີການບັນທຶກທີ່ເລືອກໄວ້ (BitBlt)." +Compatibility.WindowCapture.BitBlt.Applications.Based="ໂປຼແກຼມທີ່ພັດທະນາດ້ວຍ %name% ອາດບໍ່ສາມາດບັນທຶກໄດ້ໂດຍໃຊ້ວິທີການບັນທຶກທີ່ເລືອກໄວ້ (BitBlt)." +Compatibility.Application.CSGO="%name% ອາດຕ້ອງໃຊ້ຄຳສັ່ງ <code>-allow_third_party_software</code> ຕອນເປີດເກມ ເພື່ອໃຊ້ການບັນທຶກເກມ." +Compatibility.Application.Minecraft="ຫາກເຈົ້າມີບັນຫາໃນການບັນທຶກ Minecraft: Java Edition, ໃຫ້ກວດເບິ່ງຄູ່ມືການແກ້ໄຂບັນຫາຂອງພວກເຮົາ."
View file
obs-studio-32.0.4.tar.xz/plugins/win-capture/data/locale/ro-RO.ini -> obs-studio-32.1.0.tar.xz/plugins/win-capture/data/locale/ro-RO.ini
Changed
@@ -17,7 +17,7 @@ AllowTransparency="Permite transparență" PrimaryMonitor="Monitor principal" Method="Metodă de captură" -Method.DXGI="Duplicare desktop DXGI" +Method.DXGI="Duplicare de desktop DXGI" Method.WindowsGraphicsCapture="Windows 10 (1903 și superior)" GameCapture="Captură de joc" GameCapture.AnyFullscreen="Capturează orice aplicație în ecran complet" @@ -35,7 +35,7 @@ GameCapture.HookRate.Fastest="Cea mai rapidă" GameCapture.Rgb10a2Space="Spațiu de culoare RGB10A2" Mode="Mod" -Compatibility.GameCapture.Admin="%name% poate să necesite ca OBS să fie rulat ca administrator pentru a utiliza captura de joc." -Compatibility.GameCapture.WrongGPU="Dacă previzualizarea este goală, asigurați-vă că %name% rulează pe același GPU ca OBS." +Compatibility.GameCapture.Admin="%name% poate necesita ca OBS să fie rulat ca admin pentru a folosi captura de joc." +Compatibility.GameCapture.WrongGPU="Dacă previzualizarea este goală, asigură-te că %name% rulează pe același GPU ca OBS." Compatibility.WindowCapture.BitBlt="%name% este posibil să nu poată fi capturat cu ajutorul metodei de captură selectate (BitBlt)." Compatibility.Application.Minecraft="Dacă aveți probleme cu capturarea Minecraft: Java Edition, consultați ghidul nostru de depanare."
View file
obs-studio-32.0.4.tar.xz/plugins/win-capture/data/locale/tl-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/win-capture/data/locale/tl-PH.ini
Changed
@@ -1,4 +1,4 @@ -MonitorCapture="Mag Capture ng Display" +MonitorCapture="Dakip ng Tanghal" WindowCapture="Mag Capture ng Window" WindowCapture.Window="Ang Window" WindowCapture.Priority="Ang Match Priority ng Window" @@ -9,7 +9,7 @@ Compatibility="Maraming-adapter Compatibility" SLIFix="SLI/Crossfire Capture Mode (Mahina)" AllowTransparency="Hayaan ang Transparency" -Monitor="Ang Display" +Monitor="Tanghal" PrimaryMonitor="Ang Primirong Monitor" GameCapture="Ang GameCapture" GameCapture.AnyFullscreen="Mag-capture ng kahit alin sa fullscreen na aplikasyon" @@ -21,3 +21,8 @@ GameCapture.HotkeyStart="Mag-capture ng foreground window" GameCapture.HotkeyStop="I-deactivate ang capture" Mode="Ang Moda" +SelectADisplay="Pumili ng tanghal o dakip" +Compatibility.GameCapture.Blocked="Hindi madakip ang %name% ng Dakip ng Laro. Gumamit ng Dakip ng Durungawan o Dakip ng Tanghal." +Compatibility.GameCapture.Blocked.Applications="Hindi madakip ng Dakip ng Laro ang %name% na mga aplikasyon. Gumamit ng Dakip ng Durungawan o Dakip ng Tanghal." +Compatibility.GameCapture.Blocked.Applications.Built="Hindi madakip ng Dakip ng Laro ang mga larong ginawa sa %name%. Gumamit ng Dakip ng Durungawan o Dakip ng Tanghal." +Compatibility.GameCapture.WrongGPU="Kapag blanko ang silip, tiyakin na tumatakbo ang %name% sa magkatulad na GPU sa OBS"
View file
obs-studio-32.0.4.tar.xz/plugins/win-dshow/data/locale/de-DE.ini -> obs-studio-32.1.0.tar.xz/plugins/win-dshow/data/locale/de-DE.ini
Changed
@@ -24,7 +24,7 @@ UseCustomAudioDevice="Benutzerdefiniertes Audiogerät verwenden" AudioDevice="Audiogerät" Buffering="Pufferung" -Buffering.ToolTip="Bei Aktivierung werden die Video- und Audiodaten gepuffert, um die möglichst\nflüssigste und genaueste Wiedergabe bei erhöhter Verzögerung zu gewährleisten.\nFalls Sie die Pufferung zusammen mit Ihrer Capture Card verwenden wollen, ist empfohlen, die\nKarte und das Programm auf die selben FPS einzustellen, um die besten Ergebnisse zu erzielen.\n\nBei Deaktivierung wird die niedrigste Verzögerung der Wiedergabe\nauf Kosten der Framewiedergabegenauigkeit gewährleistet.\nDies ist ideal für Webcams oder wenn Sie das Vorschaufenster\nbenutzen wollen, um z. B. an einer Spielekonsole zu spielen.\n\nDie automatische Erkennung (Standard) aktiviert die Pufferung bei\nVerzögerungen und deaktiviert sie, wenn es keine Verzögerung gibt." +Buffering.ToolTip="Bei Aktivierung werden die Video- und Audiodaten gepuffert, um die möglichst\nflüssigste und genaueste Wiedergabe bei erhöhter Verzögerung zu gewährleisten.\nFalls Sie die Pufferung zusammen mit Ihrer Capture Card verwenden wollen, wird empfohlen, die\nKarte und das Programm auf die gleichen FPS einzustellen, um die besten Ergebnisse zu erzielen.\n\nBei Deaktivierung wird die niedrigste Verzögerung der Wiedergabe\nauf Kosten der Framewiedergabegenauigkeit gewährleistet.\nDies ist ideal für Webcams oder wenn Sie das Vorschaufenster\nbenutzen wollen, um z. B. an einer Spielekonsole zu spielen.\n\nDie automatische Erkennung (Standard) aktiviert die Pufferung bei\nVerzögerungen und deaktiviert sie, wenn es keine Verzögerung gibt." Buffering.AutoDetect="Automatisch erkennen" Buffering.Enable="Aktivieren" Buffering.Disable="Deaktivieren"
View file
obs-studio-32.0.4.tar.xz/plugins/win-dshow/data/locale/fil-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/win-dshow/data/locale/fil-PH.ini
Changed
@@ -7,12 +7,12 @@ ColorRange.Full="Puno" ConfigureVideo="Ang Configure Bidyo" ConfigureCrossbar="I-Configure ang Crossbar" -ResFPSType="Ang Resolusyon/Tipo ng FPS" +ResFPSType="Resolusyon/Uri ng FPS" ResFPSType.Custom="I-Custom" ResFPSType.DevPreferred="I-Device Default" FPS.Matching="I-Match Output FPS" FPS.Highest="Pinakamataas na FPS" -Resolution="Ang Resolusyon" +Resolution="Resolusyon" VideoFormat="Ang Bidyo Format" VideoFormat.Any="Kahit Ano" AudioOutputMode="Ang Audio Output Mode"
View file
obs-studio-32.0.4.tar.xz/plugins/win-dshow/data/locale/ka-GE.ini -> obs-studio-32.1.0.tar.xz/plugins/win-dshow/data/locale/ka-GE.ini
Changed
@@ -24,7 +24,7 @@ UseCustomAudioDevice="ხმის მითითებული მოწყობილობის გამოყენება" AudioDevice="ხმის მოწყობილობა" Buffering="მომარაგება" -Buffering.ToolTip="როცა ჩართულია, იმარაგებს ვიდეოს/ხმის მონაცემებს, რომ უზრუნველყოს შეუფერხებლად და უმაღლესი\nხარისხით გადაცემა, ოღონდ გაზრდილი დაყოვნების ხარჯზე. როცა \nმოსამარაგებლად იყენებთ ვიდეოს ჩამწერ დაფას, სასურველია, რომ აპარატურასა და\nპროგრამას მიეთითოს ერთნაირი კადრის სიხშირე საუკეთესო შედეგისთვის.\n\nროცა გამორთულია, დაყოვნება მეტად მცირეა, ოღონდ კადრების\nგადაცემის სისუფთავის ხარჯზე. ეს უფრო გამოსადეგია კამერით გადაღებისას ან\nპროგრამის შესათვალიერებელი ფანჯრისთვის თამაშისას.\n\nთვითშერჩევის მითითებისას (ნაგულისხმევად) ჩაირთვება, თუ მოწყობილობას დაყოვნება აქვს, ხოლო გამორთვება,\nთუ არ აქვს დაყოვნება." +Buffering.ToolTip="როცა ჩართულია, იმარაგებს ვიდეოს/ხმის მონაცემებს შეუფერხებლად და უმაღლესი\nხარისხით გაშვებისთვის, ოღონდ გაზრდილი დაყოვნების ხარჯზე. თუ \nმომარაგება ხდება ვიდეოჩამწერი დაფით, სასურველია, რომ აპარატურასა და\nპროგრამას მიეთითოს ერთნაირი კადრის სიხშირე საუკეთესო შედეგისთვის.\n\nროცა გამორთულია, დაყოვნება მეტად მცირეა, მაგრამ კადრების\nგადაცემის სისუფთავის ხარჯზე. გამოსადეგია სახის კამერისთვის ან\nპროგრამის შესათვალიერებელი ფანჯრისთვის თამაშისას.\n\nთვითშერჩევის მითითებისას (ნაგულისხმევად) ჩაირთვება, თუ მოწყობილობას დაყოვნება აქვს, ხოლო გამორთვება,\nთუ დაყოვნების გარეშეა." Buffering.AutoDetect="თვითშერჩევა" Buffering.Enable="ჩართვა" Buffering.Disable="გამორთვა"
View file
obs-studio-32.1.0.tar.xz/plugins/win-dshow/data/locale/lo-LA.ini
Added
@@ -0,0 +1,39 @@ +VideoCaptureDevice="ອຸປະກອນຈັບພາບວິດີໂອ" +Device="ອຸປະກອນ" +ColorSpace="ຂອບເຂດສີ" +ColorSpace.Default="ຄ່າເລີ່ມຕົ້ນ" +ColorRange="ໄລຍະສີ" +ColorRange.Default="ຄ່າເລີ່ມຕົ້ນ" +ColorRange.Partial="ຈຳກັດ" +ColorRange.Full="ເຕັມ" +ConfigureVideo="ຕັ້ງຄ່າວິດີໂອ" +ConfigureCrossbar="ຕັ້ງຄ່າ Crossbar" +ResFPSType="ປະເພດ ຄວາມລະອຽດ/FPS" +ResFPSType.Custom="ກຳນົດເອງ" +ResFPSType.DevPreferred="ຄ່າເລີ່ມຕົ້ນຂອງອຸປະກອນ" +FPS.Matching="ກົງກັບ FPS ຂາອອກ" +FPS.Highest="FPS ສູງສຸດ" +Resolution="ຄວາມລະອຽດ" +VideoFormat="ຮູບແບບວິດີໂອ" +VideoFormat.Any="ໃດກໍໄດ້" +VideoFormat.Unknown="ບໍ່ຮູ້ຈັກ (%1)" +AudioOutputMode="ໂໝດສຽງຂາອອກ" +AudioOutputMode.Capture="ຈັບສຽງເທົ່ານັ້ນ" +AudioOutputMode.DirectSound="ສົ່ງສຽງເດັສທັອບອອກ (DirectSound)" +AudioOutputMode.WaveOut="ສົ່ງສຽງເດັສທັອບອອກ (WaveOut)" +UseCustomAudioDevice="ໃຊ້ອຸປະກອນສຽງທີ່ກຳນົດເອງ" +AudioDevice="ອຸປະກອນສຽງ" +Buffering="ການບັຟເຟີ" +Buffering.ToolTip="ເມື່ອເປີດໃຊ້ງານ, ລະບົບຈະບັຟເຟີຂໍ້ມູນວິດີໂອ/ສຽງ ເພື່ອໃຫ້ການຫຼິ້ນມີຄວາມລ່ຽນໄຫຼ ແລະ ຖືກຕ້ອງທີ່ສຸດເທົ່າທີ່ຈະເປັນໄປໄດ້, ແຕ່ຈະເຮັດໃຫ້ເກີດຄວາມໜ່ວງເພີ່ມຂຶ້ນ. ເມື່ອໃຊ້ການບັຟເຟີກັບກາດຈັບພາບວິດີໂອ, ແນະນຳໃຫ້ຕັ້ງຄ່າກາດ ແລະ ໂປຣແກຣມໃຫ້ມີເຟຣມເຣດດຽວກັນເພື່ອຜົນລັພທີ່ດີທີ່ສຸດ.\n\nເມື່ອປິດການໃຊ້ງານ, ຈະຊ່ວຍໃຫ້ມີຄວາມໜ່ວງຕ່ຳສຸດ, ແຕ່ຄວາມຖືກຕ້ອງຂອງການຫຼິ້ນເຟຣມອາດຫຼຸດລົງ. ເໝາະສຳລັບກ້ອງຈັບໃບໜ້າ, ຫຼື ເມື່ອຕ້ອງການໃຊ້ໜ້າຈໍຕົວຢ່າງຂອງໂປຣແກຣມເພື່ອຫຼິ້ນເກມຄອນໂຊນ.\n\nກວດຈັບອັດຕະໂນມັດ (ຄ່າເລີ່ມຕົ້ນ) ຈະເປີດໃຊ້ງານຖ້າອຸປະກອນມີຄວາມຊັກຊ້າ, ແລະ ຈະປິດຖ້າບໍ່ມີຄວາມຊັກຊ້າ." +Buffering.AutoDetect="ກວດຈັບອັດຕະໂນມັດ" +Buffering.Enable="ເປີດໃຊ້ງານ" +Buffering.Disable="ປິດການໃຊ້ງານ" +Activate="ເປີດໃຊ້" +Deactivate="ປິດໃຊ້" +FlipVertically="ພິກແນວຕັ້ງ" +Autorotation="ໃຊ້ຂໍ້ມູນການໝຸນຈາກກ້ອງ (ຖ້າມີ)" +HardwareDecode="ໃຊ້ການຖອດລະຫັດດ້ວຍຮາດແວເມື່ອສາມາດເຮັດໄດ້" +DeactivateWhenNotShowing="ປິດການເຮັດວຽກເມື່ອບໍ່ໄດ້ສະແດງຜົນ" +Bitrate="ບິດເຣດ" +Encoder.C985="ຕົວເຂົ້າລະຫັດ AVerMedia H.264 (c985)" +Encoder.C353="ຕົວເຂົ້າລະຫັດ AVerMedia H.264"
View file
obs-studio-32.0.4.tar.xz/plugins/win-dshow/data/locale/tl-PH.ini -> obs-studio-32.1.0.tar.xz/plugins/win-dshow/data/locale/tl-PH.ini
Changed
@@ -4,12 +4,12 @@ ColorRange.Full="Lahat" ConfigureVideo="I-configure ang Video" ConfigureCrossbar="I-configure ang Crossbar" -ResFPSType="Resolusyon/FPS na Tipo" +ResFPSType="Hisikot/Uri ng FPS" ResFPSType.Custom="Ang Custom" ResFPSType.DevPreferred="Ang Default ng Device" FPS.Matching="I-match ang Output ng FPS" FPS.Highest="Pinakamataas na FPS" -Resolution="Resolusyon" +Resolution="Hisikot" VideoFormat="Ang format ng video" VideoFormat.Any="Kahit ano" VideoFormat.Unknown="Hindi matukoy (%1)"
View file
obs-studio-32.0.4.tar.xz/plugins/win-wasapi/data/locale/kmr-TR.ini -> obs-studio-32.1.0.tar.xz/plugins/win-wasapi/data/locale/kmr-TR.ini
Changed
@@ -1,5 +1,6 @@ AudioInput="Girtina têketina dengê" AudioOutput="Girtina derana dengê" +ApplicationAudioCapture="Girtina dengê sepanê (BETA)" Device="Amûr" Default="Berdest" UseDeviceTiming="Demjimêrên amûrê bi kar bîne"
View file
obs-studio-32.1.0.tar.xz/plugins/win-wasapi/data/locale/lo-LA.ini
Added
@@ -0,0 +1,11 @@ +AudioInput="ການຈັບສຽງຂາເຂົ້າ" +AudioOutput="ການຈັບສຽງຂາອອກ" +ApplicationAudioCapture="ການຈັບສຽງແອັບພລິເຄຊັນ (BETA)" +Device="ອຸປະກອນ" +Default="ຄ່າເລີ່ມຕົ້ນ" +UseDeviceTiming="ໃຊ້ເວລາປະທັບຂອງອຸປະກອນ" +Window="ວິນໂດ" +Priority="ລຳດັບຄວາມສຳຄັນການຈັບຄູ່ຂອງວິນໂດ" +Priority.Title="ຊື່ວິນໂດຕ້ອງກົງກັນ" +Priority.Class="ຈັບຄູ່ຕາມຊື່, ຖ້າບໍ່ດັ່ງນັ້ນໃຫ້ຊອກຫາວິນໂດປະເພດດຽວກັນ" +Priority.Exe="ຈັບຄູ່ຕາມຊື່, ຖ້າບໍ່ດັ່ງນັ້ນໃຫ້ຊອກຫາວິນໂດຈາກໄຟລ໌ປະຕິບັດການດຽວກັນ"
View file
obs-studio-32.0.4.tar.xz/shared/bpm/bpm.c -> obs-studio-32.1.0.tar.xz/shared/bpm/bpm.c
Changed
@@ -431,11 +431,11 @@ * nuh_temporal_id_plus1 u(3) * } */ - const uint8_t prefix_sei_nal_type = 39; + const uint8_t suffix_sei_nal_type = 40; /* The first bit is always 0, so we just need to * save the last bit off the original header and * add the SEI NAL type. */ - uint8_t first_byte = (prefix_sei_nal_type << 1) | (0x01 & hevc_nal_header0); + uint8_t first_byte = (suffix_sei_nal_type << 1) | (0x01 & hevc_nal_header0); hevc_nal_header0 = first_byte; /* The HEVC NAL unit header is 2 byte instead of * one, otherwise everything else is the
View file
obs-studio-32.0.4.tar.xz/shared/file-updater/file-updater/file-updater.c -> obs-studio-32.1.0.tar.xz/shared/file-updater/file-updater/file-updater.c
Changed
@@ -67,20 +67,23 @@ bfree(info); } -static size_t http_write(uint8_t *ptr, size_t size, size_t nmemb, struct update_info *info) +static size_t http_write(char *ptr, size_t size, size_t nmemb, void *info_param) { size_t total = size * nmemb; - if (total) + if (total) { + struct update_info *info = info_param; da_push_back_array(info->file_data, ptr, total); + } return total; } -static size_t http_header(char *buffer, size_t size, size_t nitems, struct update_info *info) +static size_t http_header(char *buffer, size_t size, size_t nitems, void *info_param) { if (!strncmp(buffer, "ETag: ", 6)) { char *etag = buffer + 6; if (*etag) { + struct update_info *info = info_param; char *etag_clean, *p; etag_clean = bstrdup(etag); @@ -110,8 +113,8 @@ curl_easy_setopt(info->curl, CURLOPT_ERRORBUFFER, info->error); curl_easy_setopt(info->curl, CURLOPT_WRITEFUNCTION, http_write); curl_easy_setopt(info->curl, CURLOPT_WRITEDATA, info); - curl_easy_setopt(info->curl, CURLOPT_FAILONERROR, true); - curl_easy_setopt(info->curl, CURLOPT_NOSIGNAL, 1); + curl_easy_setopt(info->curl, CURLOPT_FAILONERROR, 1L); + curl_easy_setopt(info->curl, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt(info->curl, CURLOPT_ACCEPT_ENCODING, ""); curl_obs_set_revoke_setting(info->curl);
View file
obs-studio-32.0.4.tar.xz/shared/media-playback/media-playback/decode.c -> obs-studio-32.1.0.tar.xz/shared/media-playback/media-playback/decode.c
Changed
@@ -119,7 +119,7 @@ break; } case AV_PKT_DATA_CONTENT_LIGHT_LEVEL: { - const AVContentLightMetadata *const md = (AVContentLightMetadata *)&sd->data; + const AVContentLightMetadata *const md = (AVContentLightMetadata *)sd->data; max_luminance = md->MaxCLL; break; }
View file
obs-studio-32.0.4.tar.xz/shared/obs-scripting/obs-scripting-lua-source.c -> obs-studio-32.1.0.tar.xz/shared/obs-scripting/obs-scripting-lua-source.c
Changed
@@ -632,6 +632,7 @@ info.get_name = obs_lua_source_get_name; info.get_defaults2 = obs_lua_source_get_defaults; obs_register_source(&info); + obs_module_add_source(obs_current_module(), info.id); pthread_mutex_lock(&lua_source_def_mutex); v = info.type_data;
View file
obs-studio-32.0.4.tar.xz/shared/obs-scripting/obs-scripting.c -> obs-studio-32.1.0.tar.xz/shared/obs-scripting/obs-scripting.c
Changed
@@ -24,6 +24,18 @@ #include "obs-scripting-internal.h" #include "obs-scripting-callback.h" +static obs_module_t *obs_module_pointer; + +void obs_scripting_set_module(obs_module_t *module) +{ + obs_module_pointer = module; +} + +obs_module_t *obs_current_module(void) +{ + return obs_module_pointer; +} + #if defined(LUAJIT_FOUND) extern obs_script_t *obs_lua_script_create(const char *path, obs_data_t *settings); extern bool obs_lua_script_load(obs_script_t *s);
View file
obs-studio-32.0.4.tar.xz/shared/obs-scripting/obs-scripting.h -> obs-studio-32.1.0.tar.xz/shared/obs-scripting/obs-scripting.h
Changed
@@ -20,6 +20,7 @@ #include <stdarg.h> #include <util/c99defs.h> #include <obs-data.h> +#include <obs.h> #include <obs-properties.h> #ifdef __cplusplus @@ -31,6 +32,7 @@ enum obs_script_lang { OBS_SCRIPT_LANG_UNKNOWN, OBS_SCRIPT_LANG_LUA, OBS_SCRIPT_LANG_PYTHON }; +EXPORT void obs_scripting_set_module(obs_module_t *module); EXPORT bool obs_scripting_load(void); EXPORT void obs_scripting_unload(void); EXPORT const char **obs_scripting_supported_formats(void);
View file
obs-studio-32.0.4.tar.xz/shared/obs-scripting/obspython/CMakeLists.txt -> obs-studio-32.1.0.tar.xz/shared/obs-scripting/obspython/CMakeLists.txt
Changed
@@ -31,8 +31,7 @@ add_library(OBS::python ALIAS obspython) file( - GENERATE OUTPUT - $<$<PLATFORM_ID:Windows>:$<CONFIG>/>obspython.h + GENERATE OUTPUT $<$<PLATFORM_ID:Windows>:$<CONFIG>/>obspython.h CONTENT "#pragma once\n\n#define PYTHON_LIB \"$<TARGET_LINKER_FILE_NAME:Python::Python>\"\n" )
View file
obs-studio-32.0.4.tar.xz/shared/properties-view/double-slider.cpp -> obs-studio-32.1.0.tar.xz/shared/properties-view/double-slider.cpp
Changed
@@ -4,7 +4,7 @@ DoubleSlider::DoubleSlider(QWidget *parent) : SliderIgnoreScroll(parent) { - connect(this, &DoubleSlider::valueChanged, + connect(this, &DoubleSlider::valueChanged, this, this(int val) { emit doubleValChanged((minVal / minStep + val) * minStep); }); }
View file
obs-studio-32.0.4.tar.xz/shared/properties-view/properties-view.cpp -> obs-studio-32.1.0.tar.xz/shared/properties-view/properties-view.cpp
Changed
@@ -333,7 +333,7 @@ WidgetInfo *info = new WidgetInfo(this, prop, edit); connect(show, &QAbstractButton::toggled, info, &WidgetInfo::TogglePasswordText); - connect(show, &QAbstractButton::toggled, + connect(show, &QAbstractButton::toggled, show, =(bool hide) { show->setText(hide ? tr("Hide") : tr("Show")); }); children.emplace_back(info); @@ -733,7 +733,7 @@ /* for backwards compatibility */ if (uuid.isEmpty()) { uuid = QUuid::createUuid().toString(QUuid::WithoutBraces); - obs_data_set_string(item, "uuid", uuid.toUtf8()); + obs_data_set_string(item, "uuid", QT_TO_UTF8(uuid)); } list_item->setData(Qt::UserRole, uuid); } @@ -741,7 +741,7 @@ WidgetInfo *info = new WidgetInfo(this, prop, list); list->setDragDropMode(QAbstractItemView::InternalMove); - connect(list->model(), &QAbstractItemModel::rowsMoved, info() { info->EditableListChanged(); }); + connect(list->model(), &QAbstractItemModel::rowsMoved, info, info() { info->EditableListChanged(); }); QVBoxLayout *sideLayout = new QVBoxLayout(); NewButton(sideLayout, info, "icon-plus", &WidgetInfo::EditListAdd); @@ -1408,14 +1408,14 @@ emit info->ControlChanged(); }); - connect(widget->simpleFPS, comboIndexChanged, =(int) { + connect(widget->simpleFPS, comboIndexChanged, info, =(int) { if (widget->updating) return; emit info->ControlChanged(); }); - connect(widget->fpsRange, comboIndexChanged, =(int) { + connect(widget->fpsRange, comboIndexChanged, info, =(int) { if (widget->updating) return; @@ -1423,14 +1423,14 @@ }); auto sbValueChanged = static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged); - connect(widget->numEdit, sbValueChanged, =(int) { + connect(widget->numEdit, sbValueChanged, info, =(int) { if (widget->updating) return; emit info->ControlChanged(); }); - connect(widget->denEdit, sbValueChanged, =(int) { + connect(widget->denEdit, sbValueChanged, info, =(int) { if (widget->updating) return; @@ -2021,7 +2021,7 @@ if (!recently_updated) { recently_updated = true; update_timer = new QTimer; - connect(update_timer, &QTimer::timeout, this, &ru = recently_updated() { + connect(update_timer, &QTimer::timeout, this, this, &ru = recently_updated() { OBSObject strongObj = view->GetObject(); void *obj = strongObj ? strongObj.Get() : view->rawObj; if (obj && view->callback && !view->deferUpdate) { @@ -2030,7 +2030,7 @@ ru = false; }); - connect(update_timer, &QTimer::timeout, &QTimer::deleteLater); + connect(update_timer, &QTimer::timeout, update_timer, &QTimer::deleteLater); update_timer->setSingleShot(true); }
View file
obs-studio-32.0.4.tar.xz/shared/qt/idian/CMakeLists.txt -> obs-studio-32.1.0.tar.xz/shared/qt/idian/CMakeLists.txt
Changed
@@ -21,7 +21,10 @@ include/Idian/PropertiesList.hpp include/Idian/Row.hpp include/Idian/SpinBox.hpp + include/Idian/StateEventFilter.cpp + include/Idian/StateEventFilter.hpp include/Idian/ToggleSwitch.hpp + include/Idian/Utils.cpp include/Idian/Utils.hpp widgets/Group.cpp widgets/PropertiesList.cpp
View file
obs-studio-32.0.4.tar.xz/shared/qt/idian/components/CheckBox.cpp -> obs-studio-32.1.0.tar.xz/shared/qt/idian/components/CheckBox.cpp
Changed
@@ -21,4 +21,7 @@ using idian::CheckBox; -CheckBox::CheckBox(QWidget *parent) : QCheckBox(parent), Utils(this) {} +CheckBox::CheckBox(QWidget *parent) : QCheckBox(parent), Utils(this) +{ + Utils::applyStateStylingEventFilter(this); +}
View file
obs-studio-32.0.4.tar.xz/shared/qt/idian/components/ComboBox.cpp -> obs-studio-32.1.0.tar.xz/shared/qt/idian/components/ComboBox.cpp
Changed
@@ -25,7 +25,10 @@ using idian::ComboBox; -ComboBox::ComboBox(QWidget *parent) : QComboBox(parent), Utils(this) {} +ComboBox::ComboBox(QWidget *parent) : QComboBox(parent), Utils(this) +{ + Utils::applyStateStylingEventFilter(this); +} void ComboBox::showPopup() {
View file
obs-studio-32.0.4.tar.xz/shared/qt/idian/components/ToggleSwitch.cpp -> obs-studio-32.1.0.tar.xz/shared/qt/idian/components/ToggleSwitch.cpp
Changed
@@ -38,6 +38,8 @@ animBgColor(new QPropertyAnimation(this, "blend", this)), Utils(this) { + Utils::applyStateStylingEventFilter(this); + offPos = rect().width() / 2 - 18; onPos = rect().width() / 2 + 18; xPos = offPos;
View file
obs-studio-32.0.4.tar.xz/shared/qt/idian/include/Idian/CheckBox.hpp -> obs-studio-32.1.0.tar.xz/shared/qt/idian/include/Idian/CheckBox.hpp
Changed
@@ -28,19 +28,6 @@ public: CheckBox(QWidget *parent = nullptr); - -protected: - void focusInEvent(QFocusEvent *e) override - { - Utils::showKeyFocused(e); - QAbstractButton::focusInEvent(e); - } - - void focusOutEvent(QFocusEvent *e) override - { - Utils::hideKeyFocused(e); - QAbstractButton::focusOutEvent(e); - } }; } // namespace idian
View file
obs-studio-32.0.4.tar.xz/shared/qt/idian/include/Idian/ComboBox.hpp -> obs-studio-32.1.0.tar.xz/shared/qt/idian/include/Idian/ComboBox.hpp
Changed
@@ -41,18 +41,6 @@ void hidePopup() override; void mousePressEvent(QMouseEvent *event) override; - - void focusInEvent(QFocusEvent *e) override - { - Utils::showKeyFocused(e); - QComboBox::focusInEvent(e); - } - - void focusOutEvent(QFocusEvent *e) override - { - Utils::hideKeyFocused(e); - QComboBox::focusOutEvent(e); - } }; } // namespace idian
View file
obs-studio-32.0.4.tar.xz/shared/qt/idian/include/Idian/Row.hpp -> obs-studio-32.1.0.tar.xz/shared/qt/idian/include/Idian/Row.hpp
Changed
@@ -39,7 +39,13 @@ Q_OBJECT public: - GenericRow(QWidget *parent = nullptr) : QFrame(parent), Utils(this) { setAccessibleName(""); }; + GenericRow(QWidget *parent = nullptr) : QFrame(parent), Utils(this) + { + setAttribute(Qt::WA_Hover, true); + + applyStateStylingEventFilter(this); + setAccessibleName(""); + }; virtual void setTitle(const QString &title) = 0; virtual void setDescription(const QString &description) = 0; @@ -84,18 +90,6 @@ void keyReleaseEvent(QKeyEvent *) override; bool hasDescription() const { return descriptionLabel != nullptr; } - void focusInEvent(QFocusEvent *event) override - { - Utils::showKeyFocused(event); - QFrame::focusInEvent(event); - } - - void focusOutEvent(QFocusEvent *event) override - { - Utils::hideKeyFocused(event); - QFrame::focusOutEvent(event); - } - private: QGridLayout *layout; @@ -127,18 +121,6 @@ explicit ExpandButton(QWidget *parent = nullptr); void paintEvent(QPaintEvent *) override; - - void focusInEvent(QFocusEvent *event) override - { - Utils::showKeyFocused(event); - QAbstractButton::focusInEvent(event); - } - - void focusOutEvent(QFocusEvent *event) override - { - Utils::hideKeyFocused(event); - QAbstractButton::focusOutEvent(event); - } }; class RowFrame : protected QFrame, protected Utils { @@ -153,18 +135,6 @@ void enterEvent(QEnterEvent *) override; void leaveEvent(QEvent *) override; - void focusInEvent(QFocusEvent *event) override - { - Utils::showKeyFocused(event); - QWidget::focusInEvent(event); - } - - void focusOutEvent(QFocusEvent *event) override - { - Utils::hideKeyFocused(event); - QWidget::focusOutEvent(event); - } - private: friend class CollapsibleRow; };
View file
obs-studio-32.1.0.tar.xz/shared/qt/idian/include/Idian/StateEventFilter.cpp
Added
@@ -0,0 +1,116 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#include <Idian/StateEventFilter.hpp> +#include <Idian/Utils.hpp> +#include <QAbstractButton> +#include <QFocusEvent> +#include <QStyleOptionButton> +#include <QTimer> + +namespace idian { +StateEventFilter::StateEventFilter(idian::Utils *utils, QWidget *target) : QObject(target), target(target), utils(utils) +{ + QAbstractButton *button = qobject_cast<QAbstractButton *>(target); + if (button) { + connect(button, &QAbstractButton::toggled, this, &StateEventFilter::updateCheckedState); + } +} + +bool StateEventFilter::eventFilter(QObject *obj, QEvent *event) +{ + if (!obj->isWidgetType()) { + return QObject::eventFilter(obj, event); + } + + QWidget *widget = qobject_cast<QWidget *>(obj); + QFocusEvent *focusEvent = nullptr; + + bool updateIconColors = true; + + switch (event->type()) { + case QEvent::StyleChange: + case QEvent::ThemeChange: + utils->repolish(widget); + + utils->polishChildren(widget); + + break; + case QEvent::FocusIn: + utils->toggleClass(widget, "focus", true); + + focusEvent = static_cast<QFocusEvent *>(event); + if (focusEvent->reason() != Qt::MouseFocusReason && focusEvent->reason() != Qt::PopupFocusReason) { + utils->toggleClass(widget, "keyFocus", true); + } else { + utils->toggleClass(widget, "keyFocus", false); + } + + utils->polishChildren(widget); + + break; + case QEvent::FocusOut: + utils->toggleClass(widget, "focus", false); + + focusEvent = static_cast<QFocusEvent *>(event); + if (focusEvent->reason() != Qt::PopupFocusReason) { + utils->toggleClass(widget, "keyFocus", false); + utils->polishChildren(widget); + } + + utils->polishChildren(widget); + + break; + case QEvent::HoverEnter: + if (widget->isEnabled()) { + utils->toggleClass(widget, "hover", true); + } + + utils->polishChildren(widget); + + break; + case QEvent::HoverLeave: + utils->toggleClass(widget, "hover", false); + + utils->polishChildren(widget); + + break; + case QEvent::EnabledChange: + utils->toggleClass(widget, "disabled", !widget->isEnabled()); + + utils->polishChildren(widget); + + break; + default: + updateIconColors = false; + break; + } + + if (updateIconColors) { + // Delay icon update + QTimer::singleShot(0, this, this, widget() { utils->applyColorToIcon(widget); }); + } + + return QObject::eventFilter(obj, event); +} + +void StateEventFilter::updateCheckedState(bool checked) +{ + utils->toggleClass(target, "checked", checked); +} + +} // namespace idian
View file
obs-studio-32.1.0.tar.xz/shared/qt/idian/include/Idian/StateEventFilter.hpp
Added
@@ -0,0 +1,41 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#pragma once + +#include <Idian/Utils.hpp> +#include <QObject> + +class QWidget; + +namespace idian { +class StateEventFilter : public QObject { + Q_OBJECT + +public: + explicit StateEventFilter(idian::Utils *utils, QWidget *parent); + + bool eventFilter(QObject *obj, QEvent *event); + +public slots: + void updateCheckedState(bool checked); + +private: + Utils *utils; + QWidget *target; +}; +} // namespace idian
View file
obs-studio-32.0.4.tar.xz/shared/qt/idian/include/Idian/ToggleSwitch.hpp -> obs-studio-32.1.0.tar.xz/shared/qt/idian/include/Idian/ToggleSwitch.hpp
Changed
@@ -82,18 +82,6 @@ void keyReleaseEvent(QKeyEvent *) override; void mouseReleaseEvent(QMouseEvent *) override; - void focusInEvent(QFocusEvent *e) override - { - Utils::showKeyFocused(e); - QAbstractButton::focusInEvent(e); - } - - void focusOutEvent(QFocusEvent *e) override - { - Utils::hideKeyFocused(e); - QAbstractButton::focusOutEvent(e); - } - private slots: void onClicked(bool checked);
View file
obs-studio-32.1.0.tar.xz/shared/qt/idian/include/Idian/Utils.cpp
Added
@@ -0,0 +1,59 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#include <Idian/Utils.hpp> + +#include <Idian/StateEventFilter.hpp> + +#include <QAbstractButton> +#include <QPainter> +#include <QStyleOptionButton> + +namespace idian { +void Utils::applyColorToIcon(QWidget *widget) +{ + QAbstractButton *button = qobject_cast<QAbstractButton *>(widget); + if (button && !button->icon().isNull()) { + // Filter is on a widget with an icon set, update its colors + QStyleOptionButton opt; + opt.initFrom(button); + + QColor color = opt.palette.color(QPalette::ButtonText); + QPixmap tinted = recolorPixmap(button->icon().pixmap(button->iconSize(), QIcon::Normal), color); + QIcon tintedIcon; + tintedIcon.addPixmap(tinted, QIcon::Normal); + tintedIcon.addPixmap(tinted, QIcon::Disabled); + + button->setIcon(tintedIcon); + } +} + +QPixmap Utils::recolorPixmap(const QPixmap &src, const QColor &color) +{ + QImage img = src.toImage(); + QPainter p(&img); + p.setCompositionMode(QPainter::CompositionMode_SourceIn); + p.fillRect(img.rect(), color); + p.end(); + return QPixmap::fromImage(img); +} + +void Utils::applyStateStylingEventFilter(QWidget *widget) +{ + widget->installEventFilter(new StateEventFilter(this, widget)); +} +} // namespace idian
View file
obs-studio-32.0.4.tar.xz/shared/qt/idian/include/Idian/Utils.hpp -> obs-studio-32.1.0.tar.xz/shared/qt/idian/include/Idian/Utils.hpp
Changed
@@ -17,7 +17,6 @@ #pragma once -#include <QFocusEvent> #include <QRegularExpression> #include <QStyle> #include <QWidget> @@ -39,26 +38,8 @@ Utils(QWidget *w) { parent = w; } - // Set a custom property whenever the widget has keyboard focus specifically - void showKeyFocused(QFocusEvent *e) - { - if (e->reason() != Qt::MouseFocusReason && e->reason() != Qt::PopupFocusReason) { - addClass("keyFocus"); - } else { - removeClass("keyFocus"); - } - } - - void hideKeyFocused(QFocusEvent *e) - { - if (e->reason() != Qt::PopupFocusReason) { - removeClass("keyFocus"); - } - } - // Force all children widgets to repaint void polishChildren() { polishChildren(parent); } - static void polishChildren(QWidget *widget) { for (QWidget *child : widget->findChildren<QWidget *>()) { @@ -67,7 +48,6 @@ } void repolish() { repolish(parent); } - static void repolish(QWidget *widget) { widget->style()->unpolish(widget); @@ -76,7 +56,6 @@ // Adds a style class to the widget void addClass(const QString &classname) { addClass(parent, classname); } - static void addClass(QWidget *widget, const QString &classname) { if (!classNameIsValid(classname)) { @@ -91,16 +70,17 @@ } classList.removeDuplicates(); + classList.removeAll(""); classList.append(classname); - widget->setProperty("class", classList.join(" ")); + QString newClasses = classList.isEmpty() ? "" : classList.join(" "); + widget->setProperty("class", newClasses); repolish(widget); } // Removes a style class from a widget void removeClass(const QString &classname) { removeClass(parent, classname); } - static void removeClass(QWidget *widget, const QString &classname) { if (!classNameIsValid(classname)) { @@ -118,16 +98,17 @@ } classList.removeDuplicates(); + classList.removeAll(""); classList.removeAll(classname); - widget->setProperty("class", classList.join(" ")); + QString newClasses = classList.isEmpty() ? "" : classList.join(" "); + widget->setProperty("class", newClasses); repolish(widget); } // Forces the addition or removal of a style class from a widget void toggleClass(const QString &classname, bool toggle) { toggleClass(parent, classname, toggle); } - static void toggleClass(QWidget *widget, const QString &classname, bool toggle) { if (toggle) { @@ -136,6 +117,12 @@ removeClass(widget, classname); } } + + static void applyColorToIcon(QWidget *widget); + + static QPixmap recolorPixmap(const QPixmap &src, const QColor &color); + + void applyStateStylingEventFilter(QWidget *widget); }; } // namespace idian
View file
obs-studio-32.0.4.tar.xz/shared/qt/idian/widgets/Row.cpp -> obs-studio-32.1.0.tar.xz/shared/qt/idian/widgets/Row.cpp
Changed
@@ -157,8 +157,6 @@ setCursor(Qt::PointingHandCursor); } - Utils::addClass("hover"); - if (buddyWidget) Utils::repolish(buddyWidget); @@ -171,8 +169,6 @@ void Row::leaveEvent(QEvent *event) { - Utils::removeClass("hover"); - if (buddyWidget) Utils::repolish(buddyWidget); @@ -236,6 +232,7 @@ // Button for expanding a collapsible ActionRow ExpandButton::ExpandButton(QWidget *parent) : QAbstractButton(parent), Utils(this) { + Utils::applyStateStylingEventFilter(this); setCheckable(true); } @@ -358,13 +355,17 @@ propertyList->addRow(actionRow); } -RowFrame::RowFrame(QWidget *parent) : QFrame(parent), Utils(this) {} +RowFrame::RowFrame(QWidget *parent) : QFrame(parent), Utils(this) +{ + setAttribute(Qt::WA_Hover, true); + + Utils::applyStateStylingEventFilter(this); +} void RowFrame::enterEvent(QEnterEvent *event) { setCursor(Qt::PointingHandCursor); - Utils::addClass("hover"); Utils::polishChildren(); QWidget::enterEvent(event); @@ -372,7 +373,6 @@ void RowFrame::leaveEvent(QEvent *event) { - Utils::removeClass("hover"); Utils::polishChildren(); QWidget::leaveEvent(event);
View file
series
Changed
@@ -1,4 +1,3 @@ 0001-Prefix-modinfo-with-sbin-since-not-in-normal-path.patch libx264-optional.patch ffmpeg-x11-linking.patch -12328.patch
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.