Python - получение продолжительности видео с помощью ffprobe и разбиение видео на части - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь разделить видео с помощью ffmpeg, реализуя скрипт на python.

Я получаю эту ошибку:

Command '['ffprobe', '-i', 'path_to_my_video/MVI_0731.MP4', '-hide_banner']' returned non-zero exit status 1.

Вот код, который я использую для разделения видео:

for video_file in video_files:
        try:
            # Call "ffprobe" to get duration of input video.
            ffprobe_process = subprocess.run(args=["ffprobe", "-i", video_file, "-hide_banner"],
                                           check=True,
                                           stdout=subprocess.PIPE,
                                           stderr=subprocess.PIPE,
                                           encoding="utf-8",
                                           shell=True)

            # "ffprobe" writes to stderr instead of stdout!
            duration_string = extract_duration_from_ffprobe_output(ffprobe_process.stderr)            
            duration_in_seconds = duration_string_to_seconds(duration_string)

            # Make start_stop_list
            start_stop_list = read_start_stop_list(start_stop_lists[nbr_video])
            nbr_video += 1
            total_pieces = int(len(start_stop_list))

Эта строка вызывает проблему:

ffprobe_process = subprocess.run(args=["ffprobe", "-i", video_file, "-hide_banner"],
                                           check=True,
                                           stdout=subprocess.PIPE,
                                           stderr=subprocess.PIPE,
                                           encoding="utf-8",
                                           shell=True)

Когда я изменяю это на следующую строку кода:

ffprobe_process = subprocess.run(args=['ffprobe', '-i', video_file, '-show_entries', 'format=duration', '-v', 'quiet', '-of', 'csv=%s' % ("p=0")])

, это работает, я имею в виду, что скрипт идет после этой строки, но затем выдает следующую ошибку на следующейстрока:

470.240000
expected string or bytes-like object

470.240000 - правильная продолжительность моего видео.Таким образом, новая строка, с которой я ее изменил, работает лучше, но все равно не работает с моим кодом.

У кого-нибудь есть идеи, как мне это решить?

1 Ответ

0 голосов
/ 22 октября 2018

Я нашел решение.

Вот код, который работает:

for video_file in video_files:
        try:
            # Call "ffprobe" to get duration of input video.
            ffprobe_process = subprocess.run(args=["ffprobe", "-i", video_file, '-show_entries', 'format=duration', '-v', 'quiet', '-of', 'csv=%s' % ("p=0")])

            # "ffprobe" writes to stderr instead of stdout!
            #duration_string = extract_duration_from_ffprobe_output(ffprobe_process.stderr)     
            duration_string = str(ffprobe_process)   
            #duration_in_seconds = duration_string_to_seconds(duration_string)
            duration_in_seconds = duration_string

            # Make start_stop_list
            start_stop_list = read_start_stop_list(start_stop_lists[nbr_video])
            nbr_video += 1
            total_pieces = int(len(start_stop_list))
            #pdb.set_trace()
...