Как записывать поток ровно 30 секунд с помощью python-vlc?
Я пытаюсь записать поток RTP через python-vlc ровно на 30 секунд, но выходной файл иногда меньше или больше желаемой длины видео.
Примечание. Я пробовал использовать ffmpeg, но он не может правильно декодировать поток, поэтому было принято решение использовать python-vlc.
Это мой код:
import vlc
import time
vlcInstance = vlc.Instance("--demux=ts")
player1 = vlcInstance.media_player_new()
media1 = vlcInstance.media_new("rtp://239.194.115.71:5000")
media1.add_option("sout=file/ts:sample.mpg")
limiter = 0
player1.set_media(media1)
player1.play()
time.sleep(1)
while player1.is_playing():
if limiter > 30:
player1.stop()
media1.release()
break
limiter = limiter + 1
time.sleep(1)
Какой из возможных методов я могу использовать, чтобы всегда записывать поток ровно 30 секунд?
1 ответ
Решение
Я использовал opencv-python для получения текущего количества кадров и кадров в секунду выходного файла и использовал его для вычисления длины видео.
import vlc
import time
import cv2
import os.path
vid_len = 0
vlcInstance = vlc.Instance("--demux=ts")
player1 = vlcInstance.media_player_new()
media1 = vlcInstance.media_new("rtp://239.194.115.71:5000")
media1.add_option("sout=file/ts:sample.mpg")
player1.set_media(media1)
player1.play()
#checks if the length of the output exceeds 30 seconds
while vid_len < 30:
time.sleep(1)
#checks if the file exists and not empty
if os.path.isfile('sample.mpg') and (os.path.getsize('sample.mpg') > 0):
video_file = cv2.VideoCapture('sample.mpg')
frames = int(video_file.get(cv2.CAP_PROP_FRAME_COUNT))
fps = (video_file.get(cv2.CAP_PROP_FPS))
vid_len = frames/fps
player1.stop()
media1.release()