Hi, Jaka,
About the "av_writer.py" in my env: C:...\myenv\Lib\site-packages\depthai_sdk\recorders\video_writers\av_writer.py, I am not having 158 lines, I upload here. Maybe is the version problem? (I follow everything on the webpage: https://github.com/luxonis/depthai) (I couldn't make a proper insert code here):
from datetime import timedelta
from fractions import Fraction
from pathlib import Path
import depthai as dai
from depthai_sdk.recorders.video_writers import AbstractWriter
from depthai_sdk.recorders.video_writers.utils import create_writer_dir
class AvWriter(AbstractWriter):
start_ts: timedelta = None
file = None
def __init__(self, folder: Path, name: str, fourcc: str, fps: float):
global av
import av as av
name = create_writer_dir(folder, name, 'mp4')
self.start_ts = None
self.folder = folder
self.file = av.open(name, 'w')
self._fps = fps
self._fourcc = fourcc
self._create_stream(self.file, fourcc, fps)
def _create_stream(self, file, fourcc, fps) -> None:
"""Create stream in file with given fourcc and fps, works in-place."""
stream = file.add_stream(fourcc, rate=int(fps))
stream.time_base = Fraction(1, 1000 * 1000) # Microseconds
# We need to set pixel format for MJEPG, for H264/H265 it's yuv420p by default
if fourcc == 'mjpeg':
stream.pix_fmt = 'yuvj420p'
def write(self, frame: dai.ImgFrame) -> None:
packet = av.Packet(frame.getData()) # Create new packet with byte array
# Set frame timestamp
if self.start_ts is None:
self.start_ts = frame.getTimestampDevice()
ts = int((frame.getTimestampDevice() - self.start_ts).total_seconds() * 1e6) # To microsec
packet.dts = ts
packet.pts = ts
self.file.mux_one(packet) # Mux the Packet into container
def close(self):
self.file.close()
Here are the two ways of recording I used to produce the error (Both are able to produce the error):
from depthai_sdk import OakCamera, RecordType
import time
with OakCamera() as oak:
color = oak.create_camera('color', resolution='1080P', fps=60, encode='MJPEG')
oak.visualize([color.out.encoded],fps=True) #optional
oak.record([color.out.encoded], './record')
oak.start()
start_time = time.monotonic()
while oak.running():
if time.monotonic() - start_time > 5:
break
oak.poll()
from depthai_sdk import OakCamera
from depthai_sdk.record import RecordType
with OakCamera() as oak:
color = oak.create_camera('color', resolution='1080p', fps=60, encode='mjpeg')
oak.record([color], path='./records', record_type=RecordType.VIDEO)
oak.visualize([color.out.encoded])
oak.start(blocking=True)
Also I noticed that in Test 1, I can't reach 60 fps in the recorded video, but the Test 2 is able to. Could you also help to explain why? I would prefer the recording result from Test 2, but prefer a way of controlling the record like Test 1. Could you advice how to make a controllable record function with 60 fps MJPG vide? (record from SDK doesn't have a callback feature, correct?)
Thanks and Regards
Wu Bi