e
sv

Node.js'de Gstreamer'ı kullanma

avatar

Yazılım Method

  • e 0

    Mutlu

  • e 0

    Eğlenmiş

  • e 0

    Şaşırmış

  • e 0

    Kızgın

  • e 0

    Üzgün

giriiş

GStreamer, akışlı medya uygulamaları oluşturmak için bir çerçevedir. GStreamer çerçevesiyle, hem ses hem de video özellikleri dahil olmak üzere her türlü veri akışı akışını işleyebilen düşük gecikmeli uygulamalar tasarlamak ve oluşturmak mümkündür.

GStreamer çekirdeği, eklentiler, veri akışı ve medya türü işleme için bir çerçeve sağlar. Ayrıca çeşitli eklentileri kullanarak uygulama yazmak için bir API sağlar.

Eklenti tabanlı çerçeve, veri akışını tanımlayan bir boru hattında bağlanabilen ve düzenlenebilen çeşitli kodlayıcı ve diğer işlevler sağlar. Ancak, yazının yazıldığı tarih itibariyle, GStreamer uygulamaları için resmi bir Node.js bağlantı noktası/bağlayıcısı yoktur.

Bu gönderide, aşağıdaki bölümlerde GStreamer'ın işlevleri ve Node ile kurulumu hakkında konuşacağız:

Özellikler ve kullanım durumları

GStreamer'ın en önemli kullanım örneklerinden biri medya oynatıcılar oluşturmak içindir. Bir geliştirici olarak, tek bir kod satırı yazmadan medya ardışık düzenleri oluşturmak için kapsamlı bir dizi güçlü araç kullanabilirsiniz.

Varsayılan olarak GStreamer, MP3, Ogg/Vorbis, MPEG-1/2, AVI, QuickTime, mod vb. dahil olmak üzere çok çeşitli formatları destekleyen bir medya oynatıcı oluşturmak için bileşenler içerir.

Ancak GStreamer, diğer medya oynatıcılardan çok daha fazlasını sunar. Başlıca avantajları, takılabilir bileşenlerin, bir video veya ses düzenleme uygulaması yazabilmek için isteğe bağlı boru hatlarına karıştırılabilmesidir. GStreamer özellikle şunları sağlar:

  • Multimedya uygulamaları için bir API
  • Bir eklenti mimarisi
  • Bir boru hattı mimarisi
  • Ortam türü işleme/uzlaşma için bir mekanizma

GStreamer eklenti mimarisi

Eklentiler aracılığıyla GStreamer, mevcut bileşenleri (örn. kodekler) ve diğer platform giriş/çıkış mekanizmalarını yeniden kullanmak için diğer multimedya çerçeveleriyle köprü kurabilir.

GStreamer'ın özü temelde medyadan bağımsızdır. Yalnızca baytları ve blokları bilir ve yalnızca temel öğeleri içerir. Tüm medya işleme işlevselliği, çekirdeğin dışındaki eklentiler tarafından sağlanır. Bunlar, çekirdeğe belirli medya türlerinin nasıl ele alınacağını söyler.

GStreamer eklentileri aşağıdaki gruplara ayrılabilir:

  • Protokollerin işlenmesi
  • Kaynaklar: ses ve video için (protokol eklentilerini içerir)
  • Biçimler: ayrıştırıcılar, biçimlendiriciler, çoklayıcılar, ayrıştırıcılar, meta veriler, altyazılar
  • Codec'ler: kodlayıcılar ve kod çözücüler
  • Filtreler: dönüştürücüler, karıştırıcılar, efektler
  • Lavabo: ses ve video için (protokol eklentilerini içerir)

GStreamer Kurulumu

GStreamer'ı yüklemek için belgeler, işletim sistemi seçiminize bağlı olarak aralarından seçim yapabileceğiniz çeşitli yaklaşımlar sunar.

macOS X için OSX Snow Leopard (10.6) veya üzerini ve XCode 3.2.6 veya üzerini kurmamız gerekiyor. Ancak önerilen sistem sürümü XCode 8'li macOS Sierra'dır. Burada bulabileceğimiz GStreamer indirme sayfasından hem runtime hem de geliştirme yükleyicilerini yükleyebiliriz.

Windows, iOS, Android ve Linux dahil olmak üzere diğer işletim sistemleri/ortamları için, desteklenen tüm ekosistemlerin bir listesini ve geliştirme amaçlı GStreamer SDK'ları oluşturmanın yollarını içeren belgelerdeki indirmeler sayfasına bakabiliriz.

GStreamer ile oynamak için mevcut komutlara göz atmak için sistem /Library/Frameworks/GStreamer.framework/Commands gidebiliriz. Popüler komutlardan bazıları gst-launch-1.0 , gst-inspect-1.0 , gst-play-1.0 .

Node.js ile GStreamer'ı kurma

Kurulumdan sonra, bir GStreamer ardışık düzenini kullanmak ve sonucu bir web tarayıcısına göndermek için Node.js çalışma zamanını kullanmaya devam edebiliriz.

Dilediğimiz bir klasör oluşturalım ve npm veya Yarn kullanarak Express.js'yi kuralım ve bir package.json dosyası ile temel bir proje kurmak için talimatları takip edelim:

 npm ekspres yükleyin veya iplik ekspres ekleyin

Ardından, GStreamer ile akış örneğimiz için JavaScript kodunu tutmak için bir index.js dosyası oluşturmaya devam edin. Aşağıdaki index.js dosyasına bakın:

 const ifade = gerektirir('ifade')
const http = gerektirir('http')
const net = require('net');
const çocuk = require('child_process');

const uygulama = ekspres();
app.use(express.static(__dirname + '/'));

const httpServer = http.createServer(app);
sabit bağlantı noktası = 3000;  

// video etiketini tutan html sayfasını gönder
app.get('/', işlev (gerekli, res) {
    res.send('index.html');
});

//bağlantıyı durdur
app.post('/stop', işlev (gereklilik, res) {
    konsol.log('Bağlantı /stop bitiş noktası kullanılarak kapatıldı.');
    if (gstMuxer != tanımsız) {
        gstMuxer.kill(); // GStreamer Pipeline'ı öldür
    }
    gstMuxer = tanımsız;
    Yeniden gönder();
});

// video akışını gönder
app.get('/stream', function (req, res) {
    res.writeHead(200, {
        'İçerik Türü': 'video/webm',
    });

    const tcpServer = net.createServer(işlev (soket) {
        socket.on('veri', işlev (veri) {
            res.write(veri);
        });
        socket.on('kapat', işlev () {
            konsol.log('Soket kapalı.');
            Yeniden gönder();
        });
    });

    tcpServer.maxConnections = 1;

    tcpServer.listen(işlev () {
        konsol.log("Bağlantı başladı.");
        if (gstMuxer == tanımsız) {
            konsol.log("gstMuxer'ın içinde == tanımsız");
            const cmd = 'gst-launch-1.0';
            const args = getGstPipelineArguments(bu);
            const gstMuxer = child.spawn(cmd, args);
            gstMuxer.stderr.on('veri', onSpawnError);
            gstMuxer.on('çıkış', onSpawnExit);
        }
        başka {
            konsol.log("gstMuxer != tanımsız olduğu için yeni GST ardışık düzeni reddedildi.");
        }
    });
});

httpServer.listen(port);
console.log(`Kamera Akışı Uygulaması şu adreste dinleniyor: http://localhost:${port}`)

process.on('uncaughtException', function (hata) {
    konsol.log(hata);
});

//işlevler
function onSpawnError(veri) {
    konsol.log(data.toString());
}

function onSpawnExit(kod) {
    if (kod != boş) {
        konsol.log('GStreamer hatası, çıkış kodu' + kod);
    }
}

function getGstPipelineArguments(tcpServer) {
    const argümanlar =
        ['/Users/alexandernnakwue/Downloads/samplevideo.mp4', 'pattern=top',
            '!', 'video/x-raw,genişlik=320,yükseklik=240,kare hızı=100/1',
            '!', 'vpuenc_h264', 'bit hızı=2000',
            '!', 'mp4mux', 'parça süresi=10',
            '!', 'tcpclientsink', 'ana bilgisayar=yerel ana bilgisayar',
            'port=' + tcpServer.address().port];
    dönüş argümanları;
}

Yukarıdaki dosyada görebileceğimiz gibi, üç bitiş noktamız var:

  1. Video etiketini tutan HTML sayfasını göndermek için bir uç nokta
  2. Video akışını göndermek için bir uç nokta
  3. Bağlantıyı sonlandırmak için bir uç nokta

Ardından, aşağıda gösterildiği gibi video etiketini tutan HTML sayfasını ( index.html ) oluşturun.

 <!DOCTYPE html>
<kafa>
    <title>NodeJS Demolu GStreamer</title>
    <meta name="viewport" content="width=cihaz genişliği, ilk ölçek=0.9">
    <stil>
        html,
        gövde {
            taşma: gizli;
        }
    </style> 
    <script>
        işlev arabelleği() {
            //Başlangıçta gecikmeyi en aza indirmek için mümkün olan en kısa sürede oynatmaya başlayın 
            const dStream = document.getElementById('vidStream');
            denemek {
                dStream.play();
            } yakalama (hata) {
                konsol.log(hata);
            }

        }
    </script>
</head>

<body onload="buffer();">
    <video id="vidStream" width="640" height="480" sessize alındı>
        <source src="/stream" type="video/mp4" />
        <source src="/stream" type="video/webm" />
        <source src="/stream" type="video/ogg" />
        <!-- geri dönüş -->
        Tarayıcınız video öğesini desteklemiyor. </video> </body>

Girişte bahsettiğim gibi, şu anda Node.js için resmi bağlantı noktası veya bağlama yoktur. Yukarıdaki kod, bu Yığın Taşması gönderisinden uyarlanmıştır.

Akış uygulamasını ve akış için video veya ses kaynağını, TCP bağlantı noktasını ve adresini, ayarları vb. içeren bağımsız değişkenleri başlatmak için gst-launch-1.0 komutunu kullanmaya devam edebiliriz. Sayfa yüklenirken play() metodu ile video akışını en kısa sürede oynatıyoruz.

Not: Bu yalnızca Chromium tabanlı tarayıcılarda çalışır. Daha fazlasını aşağıda anlatacağım.l

Bazı Gstreamer sınırlamaları

Node.js için GStreamer'ın bugünkü mevcut uygulaması standartlaştırılmamış ve hala eksik. Örneğin, mevcut uygulama tam olarak tarayıcı uyumlu değildir ve yalnızca Chromium tabanlı olanlarda çalışır, çünkü Chrome'da kaynakları yüklemek için gereken bazı HTTP başlıkları mevcut değildir. Ek olarak, hala çok sayıda hata içerdiğinden GStreamer'ı bazı sistem mimarilerinde oluşturmak hala zor bir iştir.

GStreamer, birden fazla farklı programlama dili için doğrudan bağlantı noktalarını henüz desteklememektedir. Bu, Node.js uygulamalarında GStreamer'ı kullanmayı amaçlayan geliştiricilerin, doğrudan Node'dan C kodunu çağırmak için node-addon-api api'yi kullanması gerektiği anlamına gelir. Ancak bu yöntem çok fazla çalışma gerektirir ve özellikle node-gyp ile oluştururken hataya açık olabilir.

Çözüm

Fark etmiş olabileceğimiz gibi, bugün Node.js için sınırlı GStreamer bağlamaları var.

node-gstreamer-superficial gibi başka bağlamalar da mevcuttur, ancak belgelere göre, GStreamer için tam bir JS bağlaması olmaya çalışmaz ve umarım bir gün node-gir ile değiştirilir (veya ile uygulanır) .

Diğer mevcut bağlamalar veya saldırılar beklendiği gibi çalışmıyor, standartlaştırılmamış veya hataya açık. Bu gerçekten çok büyük bir zorluk ve yakın gelecekte standartlaştırılmış ve endüstri çapında bir Node.js bağlama bağlantı noktasının oluşturulması gerekiyor.

Node.js'de Gstreamer'ı Kullanma yazısı ilk olarak LogRocket Blog'da yayınlandı.

etiketlerETİKETLER
Üzgünüm, bu içerik için hiç etiket bulunmuyor.

Sıradaki içerik:

Node.js'de Gstreamer'ı kullanma