{"id":43020230,"url":"https://github.com/norihiro/obs-async-audio-filter","last_synced_at":"2026-01-31T06:19:45.121Z","repository":{"id":141979566,"uuid":"467751126","full_name":"norihiro/obs-async-audio-filter","owner":"norihiro","description":"This filter aims to fix audio glitches caused by asynchronous audio of the source","archived":false,"fork":false,"pushed_at":"2026-01-09T23:44:14.000Z","size":176,"stargazers_count":51,"open_issues_count":3,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-01-10T21:34:41.714Z","etag":null,"topics":["audio","obs-studio","sample-rate-converter"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/norihiro.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"custom":"https://paypal.me/nkamae","github":"norihiro","ko_fi":"nkamae"}},"created_at":"2022-03-09T02:35:41.000Z","updated_at":"2026-01-09T23:44:18.000Z","dependencies_parsed_at":null,"dependency_job_id":"309e84d2-9938-4133-b672-ec4dcbf0d5de","html_url":"https://github.com/norihiro/obs-async-audio-filter","commit_stats":{"total_commits":40,"total_committers":1,"mean_commits":40.0,"dds":0.0,"last_synced_commit":"b26ae604d2372047703e7b3a534ae4ce9687fa77"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/norihiro/obs-async-audio-filter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norihiro%2Fobs-async-audio-filter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norihiro%2Fobs-async-audio-filter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norihiro%2Fobs-async-audio-filter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norihiro%2Fobs-async-audio-filter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/norihiro","download_url":"https://codeload.github.com/norihiro/obs-async-audio-filter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norihiro%2Fobs-async-audio-filter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28931096,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-31T04:05:25.756Z","status":"ssl_error","status_checked_at":"2026-01-31T04:02:35.005Z","response_time":128,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audio","obs-studio","sample-rate-converter"],"created_at":"2026-01-31T06:19:44.424Z","updated_at":"2026-01-31T06:19:45.102Z","avatar_url":"https://github.com/norihiro.png","language":"C","funding_links":["https://paypal.me/nkamae","https://github.com/sponsors/norihiro","https://ko-fi.com/nkamae"],"categories":[],"sub_categories":[],"readme":"# Asynchronous Audio Filter Plugin for OBS Studio\n\n## Introduction\n\nThis plugin attempts to fix asynchronous audio by synchronizing to the master clock of OBS Studio.\n\nOBS Studio is running with a clock provided by the OS.\nOn Linux, the clock is synchronized to the NTP server.\nIn contrast, audio interfaces often use their own internal clocks to sample audio,\nwhich are asynchronous relative to OBS's clock.\nThe difference between these clocks causes the audio buffer to eventually overflow or underflow after several minutes or more,\nresulting in OBS dropping a number of audio frames or introducing silent frames.\n\nThis filter detects the clock difference and slowly adjust the compensation amount.\nSince the compensation will take several minutes, distortion should not be noticable.\n\n\u003e [!Note]\n\u003e This filter won't resolve asynchronous issues when monitoring audio.\n\u003e In some cases, the monitoring device has yet another sampling clock other than OBS Studio or source audio.\n\n## Background\n\n### In short: Why Do Audio Glitches Occur in OBS Studio?\n\nOBS Studio is designed to capture and mix audio from multiple sources simultaniously\nsuch as microphones, capture cards, desktop audio.\nEach of these sources is typically driven by its own independent hardware clock.\nEven if set to the same sample rate, they drift over time, leading to glitches.\n\n### Independent Clocks\nEvery audio device (USB microphones, HDMI capture cards, sound cards, etc.)\nuses its own hardware clock to time audio sampling.\nEven if all devices are configured to the same nominal sample rate (e.g., 48000 Hz),\ntheir actual hardware clocks will run at slightly different speeds due to manufacturing tolerances, temperature, and environmental factors.\n\n### Clock Drift\nOver time, these tiny differences in clock speed (even a few parts per million) accumulate.\nEach source provides audio data at a steady rate, according to its own clock,\nbut that rate does not exactly match the internal clock in OBS Studio, which is the clock of your OS.\n\n### Buffer Overruns/Underruns\nThis drift causes the number of audio samples produced by each device to slowly diverge from what OBS Studio expects.\nAs a result, overruns or underruns will occur.\n- **Overruns:** If a source's clock is slightly faster than OBS's, its buffer fills up and excess samples must be dropped, causing pops or audio artifacts.\n- **Underruns:** If a source's clock is slightly slower, the buffer empties and OBS runs out of samples, resulting in gaps or dropouts.\n\n\u003e [!Tip]\n\u003e The underlying problem is not the mismatched sample rate settings (e.g., 44100 Hz vs. 48000 Hz),\n\u003e but unsynchronized hardware clocks even when all devices are set to the same sample rate.\n\n### Prior Solutions\n\n- **Word Clock**:\n  The best solution is to synchronize every hawrdware to the one common clock.\n  However, this requires every hardware and software to support the synchronization.\n  Some enterprise hardware has the input named \"word clock\", however, OBS Studio does not support this for now.\n- **Synchronizing to the audio device**:\n  Some consumer products synchronize to the audio device clock to avoid the issue.\n  However, OBS Studio supports multiple inputs, even if you have one audio input, usually there are also video inputs.\n  If you synchronize to one audio device, you will suffer the asynchronous issue on other devices.\n- **Asynchronous sample rate conversion**:\n  Instead of expecting the sample rates to match exactly,\n  the difference of the sample rates will be estimated and\n  the sample rate of the audio source can be converted.\n  This plugin implements this solution.\n\n## Properties\n\n### Use OBS time\n\nThis plugin assumes the timestamp set by the audio source is calculated from the function `os_gettime_ns`.\nIf not, it is suggested to enable this option.\n\n### Verbosity\n\nIncrease or decrease verbosity in the log file.\n\n## Recommended settings\n\nRecommended setting for each source type is listed below.\n| Type | Source settings | This filter settings |\n| --- | --- | --- |\n| Audio Output Capture, Audio Input Capture | Uncheck `Use Device Timestamps` | Leave it as it is. |\n| Application Audio Capture | n/a | Enable `Use OBS time instead of source time`. |\n| V4L2 | Uncheck `Use Buffering` | Leave it as it is. |\n| Decklink | Uncheck `Use Buffering` | Leave it as it is. |\n| Video Capture Device on macOS | Uncheck `Use Buffering` | Leave it as it is. |\n| Video Capture Device on Windows | Uncheck `Buffering` | Leave it as it is. |\n| NDI Source | Set `Latency Mode` to `Low (experimental)` | Enable `Use OBS time instead of source time`. |\n\n\u003e [!NOTE]\n\u003e Do not apply this plugin to a local file player such as Media Source and VLC Video Source.\n\n## Build and install\n### Linux\nInstall `libsamplerate`. Use `apt` as below on Ubuntu-22.04.\n```shell\nsudo apt install libsamplerate0 libsamplerate0-dev\n```\n\nUse cmake to build on Linux. After checkout, run these commands.\nThe flags `-D USE_ERIKD_LIBSAMPLERATE_DEPS=OFF -D USE_ERIKD_LIBSAMPLERATE_SYSTEM=ON` are optional\nbut recommended to ensure `libsamplerate` from the system will be linked.\n```shell\nmkdir build \u0026\u0026 cd build\ncmake \\\n  -D CMAKE_INSTALL_PREFIX=/usr \\\n  -D USE_ERIKD_LIBSAMPLERATE_DEPS=OFF \\\n  -D USE_ERIKD_LIBSAMPLERATE_SYSTEM=ON \\\n  ..\nmake\nsudo make install\n```\n\nIf you prefer `libswresample` instead of `libsamplerate`, configure with these flags.\n```shell\nmkdir build \u0026\u0026 cd build\ncmake \\\n  -D CMAKE_INSTALL_PREFIX=/usr \\\n  -D USE_ERIKD_LIBSAMPLERATE_DEPS=OFF \\\n  -D USE_ERIKD_LIBSAMPLERATE_SYSTEM=OFF \\\n  -D USE_FFMPEG_SWRESAMPLE=ON \\\n  ..\nmake\nsudo make install\n```\n\n### macOS\nUse cmake to build on macOS. After checkout with a submodule, run these commands.\n```shell\nmkdir build \u0026\u0026 cd build\ncmake ..\nmake\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnorihiro%2Fobs-async-audio-filter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnorihiro%2Fobs-async-audio-filter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnorihiro%2Fobs-async-audio-filter/lists"}