Почему мой IP C обмен данными не работает должным образом? - PullRequest
1 голос
/ 16 марта 2020

Это простая программа проверки продолжительности видео, созданная с помощью Electron. Тем не менее, это не работает, как ожидалось; Я также пытался использовать Electron IP C в других проектах, но всегда терпел неудачу. Я могу успешно загрузить видео и отправить его, после чего ничего не происходит, любые ошибки или советы. Отладчик тоже ничего не показывает. Я построил новый проект с нуля, и у меня такая же проблема. Значение пути также не отображается на консоли

main. js:

const electron = require('electron'),
app = electron.app,
BrowserWindow = electron.BrowserWindow
const ffmpeg = require('fluent-ffmpeg')
const ipc = require('electron').ipcMain

let mainWindow

app.on('ready', () => {
    mainWindow = new BrowserWindow({})
    mainWindow.loadFile('./index.html')
})

ipc.on('video:submit', (event, path) => {
    ffmpeg.ffprobe(path, (metadata) => {
        event.returnValue = metadata.format.duration
    })
})

index. html:

<html>
    <head>
    </head>
    <body>
        <form id="form">
            <h1>Video Info</h1>
            <div>
                <label>Select a video</label>
                <input type="file" accept="video/*" id="input">
            </div>
            <button type="submit" id="sb">Get info</button>
            <div id="result"></div>
        </form>
    </body>
    <script>
        require('./renderer.js')
    </script>
</html>

renderer. js:

const ipc = require('electron').ipcRenderer,

form = document.querySelector('#form')

let result = document.querySelector('#result')

console.log(path)

form.addEventListener('submit', () => {
    const path = document.querySelector('#input').files[0].path
    let reply = ipc.sendSync('video:submit', path)
    result.innerHTML = 'Video is' + reply + 'seconds!'
})

РЕДАКТИРОВАТЬ

Я внес некоторые изменения в main и renderer, чтобы использовать асинхронную передачу и ответ. Я не получаю то, что хочу, но после отправки некоторого контента его имя заменяется на «Файл не выбран». Значение пути по-прежнему не печатается.

изменяется на основном. js:

ipc.on('video:submit', (event, path) => {
    ffmpeg.ffprobe(path, (metadata) => {
        let duration = metadata.format.duration
        event.reply('duration', duration)
    })
})

изменяется на устройстве визуализации. js:

form.addEventListener('submit', () => {
    const path = document.querySelector('#input').files[0].path
    ipc.on('duration', (event, duration) => {
        console.log(duration)
    })
    ipc.send('video:submit', path)
    result.innerHTML = 'Video is' + duration + 'seconds!'
})

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Решено! Было три основных ошибки, поэтому я не знаю, что именно произошло. Но вот они:

1 - ip c функции были сделаны неправильно. Это правильный ответ (асинхронный ответ):

рендер. js:

ipc.on('duration', (event, duration) => {
    result.innerHTML = `Video is ${duration} seconds!`    
})
ipc.send('video:submit', path)

main. js:

ipc.on('video:submit', (event, path) => {
    ffmpeg.ffprobe(path, (err, metadata) => {
        let duration = metadata.format.duration
        console.log(duration)
        event.reply('duration', duration)
    })
 })

2 - DOM wasn Не получена кнопка отправки или событие, поэтому «addEventListiner» получило значение NULL ... Я изменил кнопку отправки на кнопку ввода с тем же идентификатором, а затем изменил событие отправки на событие простого щелчка. Я запросил выбранную кнопку ввода, а не форму вообще. Вот что я наконец получаю:

рендер. js:

const ipc = require('electron').ipcRenderer,

suBtn = document.querySelector('input#sb')

let result = document.querySelector('div#result')

suBtn.addEventListener('click', (event) => {
    event.preventDefault()
    const path = document.querySelector('input#file').files[0].path
    ipc.on('duration', (event, duration) => {
        result.innerHTML = `Video is ${duration} seconds!`    
    })
    ipc.send('video:submit', path)

})

3 - В процессе ffprobe на main. js я вызывал метод с неверными параметрами. Сначала необходимо передать параметр err, затем параметр data, так:

main. js:

ffmpeg.ffprobe(path, (err, metadata) => {
    let duration = metadata.format.duration
    console.log(duration)
    event.reply('duration', duration)
})
0 голосов
/ 16 марта 2020

Код выглядит хорошо, но я думаю, проблема заключается в отправке вашей формы. Страница должна быть перезагружена при отправке, и она не достигает IP C отправки вызова. Попробуйте запретить действие по умолчанию для формы.

form.addEventListener('submit', (e) => {
  e.preventDefault()
  const path = document.querySelector('#input').files[0].path
    ipc.on('duration', (event, duration) => {
        console.log(duration)
    })
   ipc.send('video:submit', path)
    result.innerHTML = 'Video is' + duration + 'seconds!'
  })
...