Electron Desktop App Development · Ders

Ekran Yakalama ve Medya

Ekran yakalama özelliklerine ve medya cihazlarına erişmeyi, bunları Electron masaüstü uygulamalarınıza entegre etmeyi keşfedin.

3. ders / 411 adım

Ekran Yakalama ve Medya, CoddyKit'te ücretsiz bir Electron Desktop App Development dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Electron Desktop App Development öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Electron Desktop App Development kursu toplamda 4 dersten oluşur.

Bu dersin bazı bölümleri henüz çevrilmemiş olup İngilizce olarak gösterilmektedir.

Accessing Camera & Screen

Electron lets your desktop app use native features like cameras, microphones, and even capture the screen. This opens up possibilities for video calls, screen recording, and more!

We'll explore how to list available devices, display live camera feeds, and capture your desktop or specific windows.

Discovering Your Devices

Before using a camera or microphone, you can discover what's available on the user's system. The navigator.mediaDevices.enumerateDevices() method provides a list of all connected media input and output devices.

Run this code to see your devices. You might need to grant permission to access devices.

const { app, BrowserWindow } = require('electron');

function createWindow() {
  const win = new BrowserWindow({
    width: 600,
    height: 450,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false // Simplifies example for A1. Use preload scripts for security in real apps.
    }
  });

  const htmlContent = `
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Media Devices</title>
    </head>
    <body>
        <h1>Available Media Devices</h1>
        <ul id="device-list"></ul>

        <script>
            async function getMediaDevices() {
                try {
                    const devices = await navigator.mediaDevices.enumerateDevices();
                    const list = document.getElementById('device-list');
                    if (devices.length === 0) {
                        list.innerHTML = '<li>No media devices found or permission denied.</li>';
                        return;
                    }
                    devices.forEach(device => {
                        const li = document.createElement('li');
                        li.textContent = `Kind: ${device.kind}, Label: ${device.label || 'Unknown'}`; 
                        list.appendChild(li);
                    });
                } catch (err) {
                    console.error('Error listing devices:', err);
                    document.getElementById('device-list').innerHTML = `<li>Error: ${err.message}</li>`;
                }
            }
            getMediaDevices();
        </script>
    </body>
    </html>
  `;
  win.loadURL(`data:text/html;charset=utf-8,${encodeURIComponent(htmlContent)}`);
}

app.whenReady().then(createWindow);
app.on('window-all-closed', () => app.quit());
app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) createWindow();
});

Displaying Camera Stream

To display a live camera feed, we use navigator.mediaDevices.getUserMedia(). This method requests access to a media input device (like a camera) and, if granted, provides a MediaStream.

This stream can then be displayed in a <video> element. Try running this example:

const { app, BrowserWindow } = require('electron');

function createWindow() {
  const win = new BrowserWindow({
    width: 600,
    height: 450,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false // Simplifies example for A1. Use preload scripts for security in real apps.
    }
  });

  const htmlContent = `
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Camera Stream</title>
    </head>
    <body>
        <h1>My Camera Feed</h1>
        <video id="camera-feed" autoplay style="width:100%; height:auto;"></video>
        <p id="status"></p>

        <script>
            async function startCamera() {
                const video = document.getElementById('camera-feed');
                const status = document.getElementById('status');
                try {
                    const stream = await navigator.mediaDevices.getUserMedia({
                        video: true // Request video access
                    });
                    video.srcObject = stream;
                    status.textContent = 'Camera feed active.';
                } catch (err) {
                    console.error('Error accessing camera:', err);
                    status.textContent = `Error: ${err.message}. Please grant camera permission.`;
                }
            }
            startCamera();
        </script>
    </body>
    </html>
  `;
  win.loadURL(`data:text/html;charset=utf-8,${encodeURIComponent(htmlContent)}`);
}

app.whenReady().then(createWindow);
app.on('window-all-closed', () => app.quit());
app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) createWindow();
});

User Permissions & Errors

Accessing media devices like cameras and microphones requires explicit user permission. When getUserMedia() is called, the operating system will typically prompt the user for consent.

  • Your application should always be ready to handle cases where the user grants or denies permission.
  • Catching errors from getUserMedia() (e.g., NotAllowedError) helps you inform the user about permission issues.

Understanding DesktopCapturer

Electron provides the desktopCapturer module, a powerful tool that allows your app to capture video and audio from the entire screen, specific windows, or individual displays.

This is essential for building features like screen sharing, screen recording, or even taking screenshots of other applications running on the user's desktop.

Getting Screen Sources

To capture a screen or window, you first need to get a list of available sources. desktopCapturer.getSources() provides these, including their IDs, names, and even thumbnails.

This method is available in the renderer process (but usually exposed via a preload script for security). For simplicity in this lesson, we'll access it directly.

const { app, BrowserWindow } = require('electron');

function createWindow() {
  const win = new BrowserWindow({
    width: 600,
    height: 450,
    webPreferences: {
      nodeIntegration: true, // Required for desktopCapturer
      contextIsolation: false // Simplifies example for A1. Use preload scripts for security in real apps.
    }
  });

  const htmlContent = `
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Screen Sources</title>
    </head>
    <body>
        <h1>Available Screen Sources</h1>
        <ul id="source-list"></ul>

        <script>
            const { desktopCapturer } = require('electron'); // Access desktopCapturer

            async function getScreenSources() {
                const list = document.getElementById('source-list');
                try {
                    const sources = await desktopCapturer.getSources({
                        types: ['window', 'screen']
                    });

                    if (sources.length === 0) {
                        list.innerHTML = '<li>No screen or window sources found.</li>';
                        return;
                    }

                    sources.forEach(source => {
                        const li = document.createElement('li');
                        li.textContent = `ID: ${source.id}, Name: ${source.name}`; 
                        if (source.thumbnail) {
                            const img = document.createElement('img');
                            img.src = source.thumbnail.toDataURL();
                            img.style.maxWidth = '100px';
                            img.style.marginLeft = '10px';
                            li.appendChild(img);
                        }
                        list.appendChild(li);
                    });
                } catch (err) {
                    console.error('Error getting sources:', err);
                    list.innerHTML = `<li>Error: ${err.message}</li>`;
                }
            }
            getScreenSources();
        </script>
    </body>
    </html>
  `;
  win.loadURL(`data:text/html;charset=utf-8,${encodeURIComponent(htmlContent)}`);
}

app.whenReady().then(createWindow);
app.on('window-all-closed', () => app.quit());
app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) createWindow();
});

Displaying a Screen Stream

Once you have a source ID (e.g., from a specific display or window), you can use navigator.mediaDevices.getUserMedia() again. This time, you pass a chromeMediaSource constraint with the desktopCapturer source ID.

This will capture the chosen screen/window and display it in a <video> element, similar to a camera feed.

const { app, BrowserWindow } = require('electron');

function createWindow() {
  const win = new BrowserWindow({
    width: 600,
    height: 450,
    webPreferences: {
      nodeIntegration: true, // Required for desktopCapturer
      contextIsolation: false // Simplifies example for A1. Use preload scripts for security in real apps.
    }
  });

  const htmlContent = `
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Screen Capture</title>
    </head>
    <body>
        <h1>Screen Capture Demo</h1>
        <button id="start-capture">Start Screen Capture</button>
        <video id="screen-feed" autoplay style="width:100%; height:auto;"></video>
        <p id="status"></p>

        <script>
            const { desktopCapturer } = require('electron');

            document.getElementById('start-capture').addEventListener('click', async () => {
                const video = document.getElementById('screen-feed');
                const status = document.getElementById('status');
                status.textContent = 'Searching for sources...';

                try {
                    const sources = await desktopCapturer.getSources({
                        types: ['screen'], // Only screens for simplicity
                        thumbnailSize: { width: 1, height: 1 } // No large thumbnails needed
                    });

                    if (sources.length === 0) {
                        status.textContent = 'No screen sources found.';
                        return;
                    }

                    // Take the first screen found
                    const screenSource = sources[0]; 
                    status.textContent = `Capturing: ${screenSource.name}`;

                    const stream = await navigator.mediaDevices.getUserMedia({
                        audio: false, // Can be true for audio
                        video: {
                            mandatory: {
                                chromeMediaSource: 'desktop',
                                chromeMediaSourceId: screenSource.id,
                                minWidth: 1280, minHeight: 720,
                                maxWidth: 1920, maxHeight: 1080
                            }
                        }
                    });
                    video.srcObject = stream;
                    status.textContent = 'Screen capture active.';

                } catch (err) {
                    console.error('Error capturing screen:', err);
                    status.textContent = `Error: ${err.message}.`;
                }
            });
        </script>
    </body>
    </html>
  `;
  win.loadURL(`data:text/html;charset=utf-8,${encodeURIComponent(htmlContent)}`);
}

app.whenReady().then(createWindow);
app.on('window-all-closed', () => app.quit());
app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) createWindow();
});

Basic Media Recording

After getting a MediaStream (from a camera or screen), you can record it using the browser's MediaRecorder API. This lets you save the stream as a video or audio file.

The MediaRecorder takes the stream and collects data chunks, which can then be combined into a Blob (e.g., a video file).

const { app, BrowserWindow } = require('electron');

function createWindow() {
  const win = new BrowserWindow({
    width: 600,
    height: 450,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false // Simplifies example for A1. Use preload scripts for security in real apps.
    }
  });

  const htmlContent = `
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Media Recorder</title>
    </head>
    <body>
        <h1>Simple Recorder</h1>
        <button id="start-cam">Start Camera</button>
        <button id="start-rec" disabled>Record</button>
        <button id="stop-rec" disabled>Stop</button>
        <video id="live-feed" autoplay muted style="width:100%; height:auto;"></video>
        <a id="download-link" style="display:none;">Download Recording</a>
        <p id="status"></p>

        <script>
            const startCamBtn = document.getElementById('start-cam');
            const startRecBtn = document.getElementById('start-rec');
            const stopRecBtn = document.getElementById('stop-rec');
            const downloadLink = document.getElementById('download-link');
            const liveFeed = document.getElementById('live-feed');
            const status = document.getElementById('status');

            let mediaRecorder;
            let recordedChunks = [];
            let currentStream;

            startCamBtn.addEventListener('click', async () => {
                try {
                    currentStream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
                    liveFeed.srcObject = currentStream;
                    startRecBtn.disabled = false;
                    startCamBtn.disabled = true;
                    status.textContent = 'Camera ready. Click Record.';
                } catch (err) {
                    status.textContent = `Error: ${err.message}`;
                    console.error('Error starting camera:', err);
                }
            });

            startRecBtn.addEventListener('click', () => {
                recordedChunks = [];
                mediaRecorder = new MediaRecorder(currentStream);
                mediaRecorder.ondataavailable = event => {
                    if (event.data.size > 0) {
                        recordedChunks.push(event.data);
                    }
                };
                mediaRecorder.onstop = () => {
                    const blob = new Blob(recordedChunks, { type: 'video/webm' });
                    const url = URL.createObjectURL(blob);
                    downloadLink.href = url;
                    downloadLink.download = 'electron-recording.webm';
                    downloadLink.style.display = 'block';
                    status.textContent = 'Recording stopped. Download available.';
                };
                mediaRecorder.start();
                startRecBtn.disabled = true;
                stopRecBtn.disabled = false;
                status.textContent = 'Recording...';
            });

            stopRecBtn.addEventListener('click', () => {
                mediaRecorder.stop();
                startRecBtn.disabled = false;
                stopRecBtn.disabled = true;
            });
        </script>
    </body>
    </html>
  `;
  win.loadURL(`data:text/html;charset=utf-8,${encodeURIComponent(htmlContent)}`);
}

app.whenReady().then(createWindow);
app.on('window-all-closed', () => app.quit());
app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) createWindow();
});

Security Best Practices

When working with native media, always prioritize security. Granting access to cameras, microphones, or screen capture can be sensitive.

  • Request Permissions Wisely: Only ask for permissions when absolutely necessary for your app's functionality.
  • Inform Users: Clearly explain why your app needs access to these native features.
  • Context Isolation & Preload Scripts: For real-world applications, use contextIsolation: true and expose desktopCapturer securely via a preload script. This prevents malicious scripts in the renderer from accessing Node.js APIs directly.

Quick Check: Native Media

Which of the following statements are true regarding accessing native media and screen capture in Electron?

Recap: Native Media

Great job! In this lesson, we explored how Electron applications can interact with native media features:

  • We learned to use navigator.mediaDevices.enumerateDevices() to list available cameras and microphones.
  • We accessed live camera feeds with navigator.mediaDevices.getUserMedia().
  • We discovered the desktopCapturer module for listing and capturing screen or window content.
  • We briefly touched upon using MediaRecorder to save captured media streams.
  • Finally, we highlighted the importance of user permissions and security best practices when handling sensitive native features.

These tools empower you to build rich, interactive desktop applications with powerful media capabilities!

Başlamak ücretsiz

Yapay zeka eğitmeniyle JavaScript öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
12
Dersler
47

Sıkça Sorulan Sorular

“Ekran Yakalama ve Medya” dersi ücretsiz mi?

Evet — “Ekran Yakalama ve Medya” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Electron Desktop App Development kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Electron Desktop App Development kursu toplamda 4 dersten oluşur.

“Ekran Yakalama ve Medya” dersinde ne öğreneceğim?

Ekran yakalama özelliklerine ve medya cihazlarına erişmeyi, bunları Electron masaüstü uygulamalarınıza entegre etmeyi keşfedin. Electron Desktop App Development ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Electron Desktop App Development öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Electron Desktop App Development, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Ekran Yakalama ve Medya” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Electron Desktop App Development dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Electron Desktop App Development dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Yerel Modüllerle Çalışma
  2. Sistem Tepsisi Uygulamaları ve Rozetler
  3. Ekran Yakalama ve Medya
  4. Güç ve Donanım İzleme
← Electron Desktop App Development Sayfasına Dön