FFmpeg-Encoder-Decoder-for-Python icon indicating copy to clipboard operation
FFmpeg-Encoder-Decoder-for-Python copied to clipboard

Can't extract last 2 frame

Open timothyhalim opened this issue 1 year ago • 2 comments

Get started

  • [X] I have read Contributing guidelines.
  • [X] I have confirmed that my problem could not be solved by the troubleshooting section in the documentation.
  • [X] I agree to follow the Code of Conduct.
  • [X] I have confirmed that my issue is not duplicated with an existing issue.

Description

Hi @cainmagi

When I try to extract last 2 frames of a video it return None

Here is the code used :

from PySide2.QtWidgets import QWidget, QLabel, QVBoxLayout, QApplication, QSlider
from PySide2.QtGui import QImage, QPixmap
from PySide2.QtCore import Qt

import mpegCoder
mpegCoder.setGlobal(dumpLevel=0)

class Player(QWidget):
    def __init__(self, parent=None):
        super(Player, self).__init__(parent)
        self._layout = QVBoxLayout(self)
        self.image = QLabel()
        self.slider = QSlider(Qt.Horizontal)
        self.slider.valueChanged.connect(self.extract_frame)
        self._layout.addWidget(self.image)
        self._layout.addWidget(self.slider)
        self.frames = []
        self.open_file()
        
    def close(self):
        self.decoder.clear()
        return super(Player, self).close()
        
    def open_file(self):
        self.decoder = mpegCoder.MpegDecoder()
        self.decoder.setParameter(nthread=4)
        opened = self.decoder.FFmpegSetup(r"30.mp4")
        
        if opened:
            duration = self.decoder.getParameter("duration")
            fps = self.decoder.getParameter("avgFrameRate")
            frameCount = duration*fps
            print("Video frame count is", frameCount)
            self.slider.setRange(0, frameCount-1) # -1 since start from 0
        
        self.extract_frame(0)
    
    def extract_frame(self, frame):
        print(frame)
        p = self.decoder.ExtractFrame(frame, 1)
        
        data = p[0].data
        height = p[0].shape[0]
        width = p[0].shape[1]
        channel = p[0].shape[2]
        pixmap = QPixmap.fromImage(QImage(data, width, height, channel*width, QImage.Format_RGB888))
        self.image.setPixmap(pixmap)
        
        
if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    p = Player()
    p.show()
    app.exec_()

You can change the frame by changing the slider

Here is the video used, 10sec/300frame video @30fps the time code should be from 00:00 to 09:29 beeping every 1 sec/ 30 frame

https://user-images.githubusercontent.com/38390638/182555161-f07e3e48-b9d8-45e4-8208-d4475c834302.mp4

Not really sure if this is a bug or if I'm doing something wrong

To Reproduce

  1. Run the code
  2. Change the slider
  3. Error occur when extracting last 2 frame

Traceback

No response

Behaviors

  1. The expected behaviors: able to extract every frame of the video
  2. The actual behaviors: unable to extract last 2 frame of the video

Screenshots

No response

OS

Windows 10

Python version

3.9

numpy version

1.23.1

mpegCoder version

3.2.4

Additional context

No response

timothyhalim avatar Aug 03 '22 08:08 timothyhalim