• 31-07-2025, 08:49:11
    #1
    Merhabalar,
    Qt ile geliştirilen bir kamera görüntüleme ve kayıt sistemi üzerinde çalışıyorum. Sistemim x86_64 (i5-1135G7, 16GB RAM, NVIDIA MX330) üzerinde çalışıyor. Aynı zamanda hedef cihaz olarak i.MX8 işlemcili Yocto tabanlı bir gömülü sistem kullanıyorum. Bu cihaz otomasyon sistemlerinde kullanılmak üzere geliştiriliyor.



    Yapmak istediğim şey:


    RTSP üzerinden gelen kameraların canlı görüntüsünü appsink aracılığıyla QImage nesneleri olarak alıyorum. Bu görüntüleri yaklaşık 10 saniyelik bir ring buffer (QQueue<QImage>) yapısıyla bellekte tutuyorum. Tetikleme (örneğin hareket algılama) durumunda bu son N kareyi .mkv - .mp4 - .mov formatında diske kaydetmek istiyorum.
    Kaydedilen video:
    • 10 saniye süreye sahip olmalı
    • Renkler doğru görünmeli (yeşil veya bozuk olmamalı)



    Sistem bileşenleri:

    • Qt 6.6 (Linux – Ubuntu 22.04)
    • GStreamer 1.20+
    • RTSP kameralar (H264 stream)
    • Alınan görüntü: QImage::Format_RGBA8888
    • Çıktı pipeline:
      appsrc ! videoconvert ! x264enc ! matroskamux ! filesink



    Karşılaştığım sorunlar:

    • Oluşan .mkv video dosyası sadece 3–4 saniye uzunluğunda, normalde ~300 kareye denk gelmesi gerekiyordu.
    • Video tamamen yeşil veya bozuk renkli geliyor.



    Denediklerim:

    • Tüm görüntüleri QImage::Format_RGBA8888’e dönüştürüp appsrc'e gönderdim.
    • appsrc caps: video/x-raw, format=RGBA, width=640, height=360, framerate=30/1
    • QImage::Format_RGB888 ile de denedim ama sorun yine aynı.
    • Görüntülerin kendisi düzgün çünkü GUI üzerinde canlı olarak gösteriliyor.



    Sorularım:

    1. Video neden yeşil veya bozuk başlıyor?
    2. Neden sadece 3–4 saniyelik kayıt alıyor, oysa buffer’da daha fazla kare var?
    Format dönüşümünde eksik bir yapı mı var?
    Çalışan bir örnek pipeline, benzer deneyim yaşayanlar veya çözüm önerileri çok faydalı olur.
    Şimdiden teşekkür ederim 🙏
  • 31-07-2025, 09:32:43
    #2
    Merhaba hocam.

    Video neden yeşil ve bozuk başlıyor?
    Bunun nedeni çıktı formatın ile girdi formatının uyumsuzluğundan kaynaklanıyor. Aşağıdaki kod ile yayın yapmayı dener misiniz? Aşağıdaki kodda formatı I420 yaptım. x264enc ile uyumlu ve muhtemelen istediğiniz görüntüyü alacaksınız. tune="zerolatency" speed-preset="ultrafast" bu iki komutu da ben ne olursa olsun ekliyorum. Video aktarımını gözle görülür şekilde hızlandırıyor. Gerçi siz canlı yayın yapmyacaksınız galiba ama olsun zararı olmaz.

    appsrc caps="video/x-raw, format=RGBA, width=640, height=360, framerate=30/1" ! videoconvert ! video/x-raw, format=I420
    ! x264enc tune="zerolatency" speed-preset="ultrafast" ! matroskamux ! filesink
    Ben de direkt QT den video almakta zorlanıyordum. Önce OpenCV den alıp sonra QT ye atmıştım. OpenCV için de BGR formatı kullanılıyor. Bilginiz olsun. Belki denemek istersiniz.
    appsrc caps="video/x-raw, format=RGBA, width=640, height=360, framerate=30/1" ! videoconvert ! video/x-raw, format=BGR
    ! x264enc tune="zerolatency" speed-preset="ultrafast" ! matroskamux ! filesink
    Zaten "Tüm görüntüleri QImage::Format_RGBA8888’e dönüştürüp appsrc'e gönderdim." demişsiniz. Bundan dolayı birde Format_RGB8888 'yi deneyebilir misiniz? Sizin yaptığınız yanlış değil hatta doğru ancak çalışmadıysa birde benim yazdığımı denemenizde fayda var.



    Neden sadece 3–4 saniyelik kayıt alıyor, oysa buffer’da daha fazla kare var?
    Bunun sebebi zaman damgası vermemiş olmanız. Gstreamde is-live=true do-timestamp=true şeklinde komut vardır. Bunlar zamanın düzgün işlenmesini sağlar. Yani kod şu tarz bir şey olacak. (Virgül hatam olabilir siz yine kontrol edersiniz.)

    appsrc caps="video/x-raw is-live=true do-timestamp=true format=RGBA, width=640, height=360, framerate=30/1" ! videoconvert ! video/x-raw, format=I420
    ! x264enc tune="zerolatency" speed-preset="ultrafast" ! matroskamux ! filesink
    Çıktıyı QT üzerinden yapıyorsunu aşağıdaki komut ile EOS sinyali gönderebilirsiniz. Böylece videonun bittiği anlaşılır. Direkt gstreamden yapıyorsanız bu eos sinyal olayını araştırmak lazım.

    gst_app_src_end_of_stream(GST_APP_SRC(appsrc));
  • 31-07-2025, 11:44:50
    #3
    Çok teşekkürler verdiğiniz bilglier için.
  • 02-09-2025, 10:01:48
    #4
    ASametYildirim adlı üyeden alıntı: mesajı görüntüle
    Merhaba hocam.

    Video neden yeşil ve bozuk başlıyor?
    Bunun nedeni çıktı formatın ile girdi formatının uyumsuzluğundan kaynaklanıyor. Aşağıdaki kod ile yayın yapmayı dener misiniz? Aşağıdaki kodda formatı I420 yaptım. x264enc ile uyumlu ve muhtemelen istediğiniz görüntüyü alacaksınız. tune="zerolatency" speed-preset="ultrafast" bu iki komutu da ben ne olursa olsun ekliyorum. Video aktarımını gözle görülür şekilde hızlandırıyor. Gerçi siz canlı yayın yapmyacaksınız galiba ama olsun zararı olmaz.

    appsrc caps="video/x-raw, format=RGBA, width=640, height=360, framerate=30/1" ! videoconvert ! video/x-raw, format=I420
    ! x264enc tune="zerolatency" speed-preset="ultrafast" ! matroskamux ! filesink
    Ben de direkt QT den video almakta zorlanıyordum. Önce OpenCV den alıp sonra QT ye atmıştım. OpenCV için de BGR formatı kullanılıyor. Bilginiz olsun. Belki denemek istersiniz.
    appsrc caps="video/x-raw, format=RGBA, width=640, height=360, framerate=30/1" ! videoconvert ! video/x-raw, format=BGR
    ! x264enc tune="zerolatency" speed-preset="ultrafast" ! matroskamux ! filesink
    Zaten "Tüm görüntüleri QImage::Format_RGBA8888’e dönüştürüp appsrc'e gönderdim." demişsiniz. Bundan dolayı birde Format_RGB8888 'yi deneyebilir misiniz? Sizin yaptığınız yanlış değil hatta doğru ancak çalışmadıysa birde benim yazdığımı denemenizde fayda var.



    Neden sadece 3–4 saniyelik kayıt alıyor, oysa buffer’da daha fazla kare var?
    Bunun sebebi zaman damgası vermemiş olmanız. Gstreamde is-live=true do-timestamp=true şeklinde komut vardır. Bunlar zamanın düzgün işlenmesini sağlar. Yani kod şu tarz bir şey olacak. (Virgül hatam olabilir siz yine kontrol edersiniz.)

    appsrc caps="video/x-raw is-live=true do-timestamp=true format=RGBA, width=640, height=360, framerate=30/1" ! videoconvert ! video/x-raw, format=I420
    ! x264enc tune="zerolatency" speed-preset="ultrafast" ! matroskamux ! filesink
    Çıktıyı QT üzerinden yapıyorsunu aşağıdaki komut ile EOS sinyali gönderebilirsiniz. Böylece videonun bittiği anlaşılır. Direkt gstreamden yapıyorsanız bu eos sinyal olayını araştırmak lazım.

    gst_app_src_end_of_stream(GST_APP_SRC(appsrc));
    hocam merhaba yeni bir sorunum var mesajlarınız dolu olduğu için size ulaşamadım o yüzden buradan yazıyorum müsaitliğiniz varsa yeni açtığım konuya da bakabilirseniz çok müteşekkir olurum şimdiden teşekküler. Konu linkini aşağıya bırakıyorum.
    https://www.r10.net/sorum-var/454822...runum-var.html