视频播放在编程领域往往听着是高大上的技术,因为厂商和视频格式太多太杂了。但牛人的世界我们是从来不懂的,ffmpeg就是个牛人打造的框架,基本市面上八成的播放器都是基于ffmpeg的封装。那我们也来做一个吧。
随便搜搜就找到了FFPlayer这个库,使用也很简单,给定文件后就可以取出每帧的字节。
from ffpyplayer.player import MediaPlayer
import time
player = MediaPlayer(filename)
val = ''
while val != 'eof':
frame, val = player.get_frame()
if val != 'eof' and frame is not None:
img, t = frame
还记着物理课怎么讲电影的原理吗?就是利用了人眼的视觉残留原理,每秒给出24个连续画面,人就认为是活动影像了。所以我们只要用一个窗口定时播放上面代码取出的帧图像就可以了。
Python支持很多的图形库,而QT5最出名,而且已经官方支持Python了。代码很简单
from ffpyplayer.player import MediaPlayer
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPixmap, QImage, QImageReader
from PyQt5.QtCore import QTimer
class MyApp(QWidget):
def __init__(self, name, parent=None):
super(MyApp, self).__init__(parent)
self.label = QLabel()
self.qimg = QImage()
self.val = ''
self.player = MediaPlayer(name)
self.timer = QTimer()
self.timer.setInterval(50)
self.timer.start()
self.timer.timeout.connect(self.showFrame)
layout = QVBoxLayout()
layout.addWidget(self.label)
self.setLayout(layout)
self.setWindowTitle(name)
# self.showFullScreen()
def showFrame(self):
frame, self.val = self.player.get_frame()
if frame is not None:
img, t = frame
self.qimg = QImage(bytes(img.to_bytearray()[0]), img.get_size()[0], img.get_size()[1],
QImage.Format_RGB888)
self.label.setPixmap(QPixmap.fromImage(self.qimg))
if __name__ == '__main__':
app = QApplication(sys.argv)
t = MyApp(sys.argv[1])
t.show()
sys.exit(app.exec_())
MyApp是QT需要的窗口对象,在Main方法调用显示就好。 而窗口布局我们用了QVBoxLayout(), 里面放一个QLabel. 因为一秒等于1000毫秒,每秒24帧就是每50毫秒更新下图片,那就设QTimer的interval为50就好了,然后在QTimer的timeout connect里取出图片数据更新QLabel就可以了。
在showFrame, QLabel是用QImage来显示图片的。QImage的构造函数参数分别是图片的字体数据,宽,高,以及图片格式。
这样一个简单的播放器就实现了,至于菜单和字幕则需要了解QT的相关知识了。