Pembangunan Aplikasi Desktop Electron · Pelajaran

Tangkapan Skrin dan Media

Terokai cara mengakses keupayaan tangkapan skrin dan peranti media serta mengintegrasikannya ke dalam aplikasi desktop Electron anda.

Pelajaran 3 daripada 411 langkah

Tangkapan Skrin dan Media ialah pelajaran Pembangunan Aplikasi Desktop Electron percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Pembangunan Aplikasi Desktop Electron, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Pembangunan Aplikasi Desktop Electron merangkumi sejumlah 4 pelajaran.

Mengakses Kamera & Skrin

Electron membolehkan aplikasi desktop anda menggunakan ciri asli seperti kamera, mikrofon dan juga rakaman skrin. Ini membuka pelbagai kemungkinan untuk panggilan video, rakaman skrin dan banyak lagi!

Kita akan meneroka cara menyenaraikan devices yang tersedia, memaparkan suapan kamera langsung serta menangkap desktop atau tetingkap tertentu.

Menemui Devices Anda

Sebelum menggunakan kamera atau mikrofon, anda boleh mengetahui perkara yang tersedia pada sistem pengguna. Kaedah navigator.mediaDevices.enumerateDevices() menyediakan senarai semua devices input dan output media yang disambungkan.

Jalankan kod ini untuk melihat devices anda. Anda mungkin perlu memberikan kebenaran untuk mengakses 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();
});

Memaparkan Strim Kamera

Untuk memaparkan suapan kamera langsung, kami menggunakan navigator.mediaDevices.getUserMedia(). Kaedah ini meminta capaian kepada device input media (seperti kamera) dan, jika dibenarkan, menyediakan MediaStream.

Strim ini kemudiannya boleh dipaparkan dalam elemen <video>. Cuba jalankan contoh ini:

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();
});

Kebenaran Pengguna & Ralat

Mengakses devices media seperti kamera dan mikrofon memerlukan kebenaran pengguna secara jelas. Apabila getUserMedia() dipanggil, sistem pengendalian biasanya akan meminta persetujuan pengguna.

  • Aplikasi anda hendaklah sentiasa bersedia untuk mengendalikan keadaan apabila pengguna memberikan atau menolak kebenaran.
  • Menangkap ralat daripada getUserMedia() (contohnya, NotAllowedError) membantu anda memaklumkan pengguna tentang isu kebenaran.

Memahami DesktopCapturer

Electron menyediakan modul desktopCapturer, iaitu alat berkuasa yang membolehkan aplikasi anda menangkap video dan audio daripada seluruh skrin, tetingkap tertentu atau paparan individu.

Ini penting untuk membina ciri seperti perkongsian skrin, rakaman skrin atau mengambil tangkapan skrin aplikasi lain yang sedang berjalan pada desktop pengguna.

Mendapatkan Sumber Skrin

Untuk menangkap skrin atau tetingkap, anda perlu mendapatkan senarai sumber yang tersedia terlebih dahulu. desktopCapturer.getSources() menyediakan sumber ini, termasuk ID, nama dan lakaran kecilnya.

Kaedah ini tersedia dalam proses pemapar (tetapi biasanya didedahkan melalui skrip pramuat demi keselamatan). Untuk memudahkan pelajaran ini, kita akan mengaksesnya secara langsung.

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();
});

Memaparkan Strim Skrin

Setelah anda mempunyai ID sumber (contohnya, daripada paparan atau tetingkap tertentu), anda boleh menggunakan navigator.mediaDevices.getUserMedia() sekali lagi. Kali ini, anda menghantar kekangan chromeMediaSource bersama ID sumber desktopCapturer.

Ini akan menangkap skrin/tetingkap yang dipilih dan memaparkannya dalam elemen <video>, sama seperti suapan kamera.

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();
});

Rakaman Media Asas

Selepas mendapatkan MediaStream (daripada kamera atau skrin), anda boleh merakamnya menggunakan API MediaRecorder pelayar. Ini membolehkan anda menyimpan strim sebagai fail video atau audio.

MediaRecorder mengambil strim dan mengumpulkan cebisan data, yang kemudiannya boleh digabungkan menjadi Blob (contohnya, fail video).

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();
});

Amalan Terbaik Keselamatan

Apabila bekerja dengan media asli, sentiasa utamakan keselamatan. Pemberian capaian kepada kamera, mikrofon atau rakaman skrin boleh melibatkan data sensitif.

  • Minta Kebenaran dengan Bijak: Hanya minta kebenaran apabila benar-benar diperlukan untuk kefungsian aplikasi anda.
  • Maklumkan Pengguna: Terangkan dengan jelas sebab aplikasi anda memerlukan capaian kepada ciri asli ini.
  • Pengasingan Konteks & Skrip Pramuat: Untuk aplikasi dunia sebenar, gunakan contextIsolation: true dan dedahkan desktopCapturer dengan selamat melalui skrip pramuat. Ini menghalang skrip berniat jahat dalam pemapar daripada mengakses API Node.js secara langsung.

Semakan Pantas: Media Asli

Antara pernyataan berikut, yang manakah benar tentang mengakses media asli dan menangkap skrin dalam Electron?

Imbas Kembali: Media Asli

Syabas! Dalam pelajaran ini, kita meneroka cara aplikasi Electron berinteraksi dengan ciri media asli:

  • Kita belajar menggunakan navigator.mediaDevices.enumerateDevices() untuk menyenaraikan kamera dan mikrofon yang tersedia.
  • Kita mengakses suapan kamera langsung dengan navigator.mediaDevices.getUserMedia().
  • Kita menemui modul desktopCapturer untuk menyenaraikan dan menangkap kandungan skrin atau tetingkap.
  • Kita menyentuh secara ringkas tentang penggunaan MediaRecorder untuk menyimpan strim media yang ditangkap.
  • Akhir sekali, kita menekankan kepentingan kebenaran pengguna dan amalan terbaik keselamatan apabila mengendalikan ciri asli yang sensitif.

Alat-alat ini membolehkan anda membina aplikasi desktop yang kaya dan interaktif dengan keupayaan media yang berkuasa!

Percuma untuk bermula

Pelajari JavaScript dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
12
Pelajaran
47

Soalan Lazim

Adakah pelajaran “Tangkapan Skrin dan Media” percuma?

Ya — teks penuh “Tangkapan Skrin dan Media” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Pembangunan Aplikasi Desktop Electron, tingkat taraf kepada CoddyKit PRO. Kursus Pembangunan Aplikasi Desktop Electron merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Tangkapan Skrin dan Media”?

Terokai cara mengakses keupayaan tangkapan skrin dan peranti media serta mengintegrasikannya ke dalam aplikasi desktop Electron anda. Anda berlatih Pembangunan Aplikasi Desktop Electron menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Pembangunan Aplikasi Desktop Electron?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Pembangunan Aplikasi Desktop Electron di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Tangkapan Skrin dan Media” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Pembangunan Aplikasi Desktop Electron ini?

Ya. Setiap pelajaran Pembangunan Aplikasi Desktop Electron menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Bekerja dengan Modul Natif
  2. Aplikasi Dulang & Lencana
  3. Tangkapan Skrin dan Media
  4. Pemantauan Kuasa dan Perkakasan
← Kembali ke Pembangunan Aplikasi Desktop Electron