Как записать поток в течение 30 секунд, используя python-vlc? - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь записать поток 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 Ответ

0 голосов
/ 08 ноября 2019

Я использовал 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()

evid

...