Repository navigation
Bu sürümde ne oldu
Wayland (portal) backend'inde ses iki ayrı yönden bozuktu. İkisi de aynı
boru hattında, ses dalının nasıl kurulduğuyla ilgiliydi.
1. Kayıtlar AAC yerine sıkıştırmasız PCM saklıyordu
Issue #10'da bildirildi: Wayland'de ses açıkken alınan kayıtların ses
track'i pcm_s16le olarak yazılıyor, aac değil. Ses düzgün
çaldığı için kimse fark etmiyordu; sadece dosya aynı süre için yaklaşık
üç kat büyük oluyordu. 32 saniyelik bir çekim yaklaşık 10 MB'a
çıkıyordu.
Nedeni şuydu: AAC encoder (avenc_aac ! aacparse) ses dalının sonundaki
hedefe bakılarak ekleniyordu — sadece doğrudan kayıt muxer'ına
giden dallarda. Replay buffer açıldığında ses hedefi bir tee oluyor
(kayıt + replay ring'i aynı akıştan ayırmak için), encoder o durumda
hiç pipeline'a girmiyordu. Yani encoder "bypass" olmuyordu, tamamen
eksikti; pulsesrc'ten gelen ham PCM doğrudan tee üzerinden
matroskamux'a ve splitmuxsink'e akıyordu. Ham PCM Matroska'da
geçerli bir format olduğu için GStreamer bunu bir hata saymıyor,
sessizce yazıyordu.
Değişiklik: encoder'ın ait olduğu yer dallardır, hedef değil. Tek
kaynak modunda ses artık avenc_aac ! aacparse sonrası AAC olarak hem
kayıt dosyasına hem de replay ring'ine gider. both modunda değişiklik
yok — orada zaten tek encoder mixer'ın altında.
Bunu canlı portal diyaloğu açmadan, aynı pipeline şeklini
kullanan gerçek gst-launch çalıştırmalarıyla doğruladım
(pipewiresrc/pulsesrc yerine test kaynakları): replay açık/kapalı ×
mic/desktop/both, yani 6 kombinasyonun hepsinde kayıt ve replay
ring'i h264 + aac içeriyor. Düzeltme öncesi aynı tabloda replay
kapalı senaryolar hiç başlamıyor, replay açık senaryolar ise
pcm_s16le veriyordu. MP4 remux (ffmpeg -c copy) AAC'i olduğu gibi
taşıyor.
2. Replay buffer kapalıyken sesli kayıt hiç başlamıyordu
Bunu issue'daki cümleden yola çıkarakpipeline'ı çalıştırırken
gördüm: ses açık, replay kapalı olduğunda boru hattı kurulmuyor.
Video dalı filesink ile bitiyor, ses dalı ise "!" ile ona
zincirleniyordu. filesink'in output pad'i yok, bu yüzden GStreamer
tüm pipeline'ı reddediyor:
UYARI: hatalı boru hattı: filesink0, pulsesrc0'a bağlanamadı
CastMane bunu kayıt başlatma sırasındaki erken ölüm kontrolünde
yakalayıp "GStreamer pipeline failed to start" hatası veriyordu. Yani
Wayland'da ses açık, replay kapalıyken kayda hiç başlanamıyordu. Aynı
sebeple both modundaki mixer de filesink'in arkasına zincirleniyordu.
Bu, ses özelliği eklendiğinden beri böyleydi; sorun ses "bozuk"
olduğu için değil, hiç var olmadığı için görünmemiş.
Düzeltme: ses kaynakları her zaman kendi pipeline dalını açıyor. Replay
buffer'ın splitmuxsink'i de bir sink olduğu için zaten gerekliydi,
şimdi bu kural dosink için de geçerli.
Bu iki hata neden aynı yerdeydi?
Sesin nereye bağlandığı, pipeline'ın hangi dalda bittiğine bağlıydı.
Replay buffer eklenirken (PR #9) bu dallar yeniden düzenlendi ve
"!" zincirlemesi yalnızca replay senaryosu için düzeltildi; replay'siz
yol kendi halinde kaldı. İkisini de aynı kuralla birleştirdim: ses
dalı daima bağımsız bir dal, encoder daima dalın parçası.
Bilinen sorunlar
bothmodunda mixer çıkışının örnekleme hızıaudioresample
caps'ine sabitlenmiyor. 48 kHz dışı bir kaynak gelirseavenc_aac
başarısız olur — ama bu durumda pipeline sessizce bozulmaz, açık bir
hata verir. Ayrı bir iş olarak ele alınabilir.- Portal diyaloğu gerçek bir ekran ve kullanıcı seçimi gerektirdiği
için bu sürümde canlı kayıtla uçtan uca test yapılamadı; doğrulama
aynı pipeline yapısını kullanan GStreamer çalıştırmalarıyla yapıldı.