From 4917c0406cd4b38167a52dbd8247bba706fa49a7 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Tue, 6 Sep 2022 14:40:34 +0200 Subject: [PATCH] Fix crackling audio with pipewire and only add empty audio packets until the first packet arrives --- TODO | 3 ++- src/main.cpp | 10 ++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/TODO b/TODO index 555ac79..030605d 100644 --- a/TODO +++ b/TODO @@ -10,4 +10,5 @@ Nvidia 515.57 supports nvfbc direct capture with mouse capture. Check if driver See https://trac.ffmpeg.org/wiki/EncodingForStreamingSites for optimizing streaming. Add -ma option to merge all audio tracks into one (muxing?). Look at VK_EXT_external_memory_dma_buf. -Allow setting a different output resolution than the input resolution. \ No newline at end of file +Allow setting a different output resolution than the input resolution. +Use mov+faststart. diff --git a/src/main.cpp b/src/main.cpp index 99e626f..d170dc5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1322,6 +1322,7 @@ int main(int argc, char **argv) { std::deque buffered_audio; std::mutex buffered_audio_mutex; std::condition_variable buffered_audio_cv; + bool got_first_batch = false; // TODO: Make the sound device read async instead of using a thread std::thread sound_read_thread([&](){ @@ -1344,9 +1345,13 @@ int main(int argc, char **argv) { uint8_t *audio_buffer; bool free_audio; { - // TODO: Not a good solution to lack of audio as it causes dropped frames, but it's better then complete audio desync + // TODO: Not a good solution to lack of audio as it causes dropped frames, but it's better then complete audio desync. + // The first packet is delayed for some reason... std::unique_lock lock(buffered_audio_mutex); - buffered_audio_cv.wait_for(lock, std::chrono::milliseconds(30), [&]{ return !running || !buffered_audio.empty(); }); + if(got_first_batch) + buffered_audio_cv.wait(lock, [&]{ return !running || !buffered_audio.empty(); }); + else + buffered_audio_cv.wait_for(lock, std::chrono::milliseconds(21), [&]{ return !running || !buffered_audio.empty(); }); if(!running) break; @@ -1357,6 +1362,7 @@ int main(int argc, char **argv) { audio_buffer = buffered_audio.front(); buffered_audio.pop_front(); free_audio = true; + got_first_batch = true; } }