[英]Merge Two Videos with Python3
如何將兩個視頻與 Python3 合並? 我試過 ffmpeg 但我做不到。 然后我嘗試安裝moviepy,但我也不能。 你能幫助我嗎?
(其中一個視頻只有聲音)
我正在使用 PyQt5。 應用程序在我運行時關閉。 這是退出代碼:
Process finished with exit code -1073740791 (0xC0000409)
但是,如果我刪除 ffmpeg 行,它就可以正常工作。
我嘗試的第一種方法:
video = ffmpeg.input('videoo.mp4')
audio = ffmpeg.input('voicee.mp4')
ffmpeg.output(video, audio, 'out.mp4').run()
我嘗試的第二種方法:
ffmpeg.concat(ffmpeg.input('videoo.mp4'), ffmpeg.input('voicee.mp4'), v=1, a=1).output('vdeo.mp4').run()
我試過的第三種方法:
subprocess.run("ffmpeg -i videoo.mp4 -i voicee.webm -c:v copy -c:a copy output.mp4")
由於 OP 沒有提供 MRE,所以很難知道問題出在哪里,所以我的回答重點是提供只實現功能的代碼。
在這種情況下,轉換非常耗時,因此必須在輔助線程中執行:
import sys
import threading
import ffmpeg
from PyQt5 import QtCore, QtWidgets
class Converter(QtCore.QObject):
started = QtCore.pyqtSignal()
finished = QtCore.pyqtSignal()
def concatenate(self, inputs, output):
threading.Thread(
target=self._concatenate, args=(inputs, output), daemon=True
).start()
def _concatenate(self, inputs, output):
self.started.emit()
ffmpeg.concat(*[ffmpeg.input(i) for i in inputs]).output(output).run()
self.finished.emit()
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.input_1_le = QtWidgets.QLineEdit()
self.input_2_le = QtWidgets.QLineEdit()
self.output_le = QtWidgets.QLineEdit()
self.load_1_btn = QtWidgets.QPushButton("Select 1 input")
self.load_2_btn = QtWidgets.QPushButton("Select 2 input")
self.load_3_btn = QtWidgets.QPushButton("Select output")
self.start_btn = QtWidgets.QPushButton("Start")
lay = QtWidgets.QGridLayout(self)
lay.addWidget(QtWidgets.QLabel("Input 1"), 0, 0)
lay.addWidget(self.input_1_le, 0, 1)
lay.addWidget(self.load_1_btn, 0, 2)
lay.addWidget(QtWidgets.QLabel("Input 2"), 1, 0)
lay.addWidget(self.input_2_le, 1, 1)
lay.addWidget(self.load_2_btn, 1, 2)
lay.addWidget(QtWidgets.QLabel("Output"), 2, 0)
lay.addWidget(self.output_le, 2, 1)
lay.addWidget(self.load_3_btn, 2, 2)
lay.addWidget(self.start_btn, 3, 0, 1, 3)
self.converter = Converter()
self.load_1_btn.clicked.connect(self.load_input_1)
self.load_2_btn.clicked.connect(self.load_input_2)
self.load_3_btn.clicked.connect(self.load_output)
self.start_btn.clicked.connect(self.start)
self.converter.started.connect(lambda: self.start_btn.setEnabled(False))
self.converter.finished.connect(lambda: self.start_btn.setEnabled(True))
@QtCore.pyqtSlot()
def load_input_1(self):
filename, _ = QtWidgets.QFileDialog.getOpenFileName(
self,
self.tr("Select Video"),
QtCore.QDir.homePath(),
self.tr("Video Files (*.mp4)"),
)
if filename:
self.input_1_le.setText(filename)
@QtCore.pyqtSlot()
def load_input_2(self):
filename, _ = QtWidgets.QFileDialog.getOpenFileName(
self,
self.tr("Select Video"),
QtCore.QDir.homePath(),
self.tr("Video Files (*.mp4)"),
)
if filename:
self.input_2_le.setText(filename)
@QtCore.pyqtSlot()
def load_output(self):
filename, _ = QtWidgets.QFileDialog.getSaveFileName(
self,
self.tr("Select Video"),
QtCore.QDir.homePath(),
self.tr("Video Files (*.mp4)"),
)
if filename:
self.output_le.setText(filename)
@QtCore.pyqtSlot()
def start(self):
self.converter.concatenate(
[self.input_1_le.text(), self.input_2_le.text()], self.output_le.text()
)
def main():
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.