Как установить значение PTS для видеокадров .mp4 без потери качества видеоPython

Программы на Python
Ответить
Anonymous
 Как установить значение PTS для видеокадров .mp4 без потери качества видео

Сообщение Anonymous »

Я уже некоторое время искал решение этой проблемы и пробовал много разных подходов, но безуспешно.
У меня есть видео в формате .mp4 (без звука) с частотой 30 Гц. с текстовым файлом timestamps.txt, содержащим точные временные метки для каждого кадра видео. Моя цель — встроить временные метки в метаданные кадров без потери качества видео.
Например. текущие временные метки видео (точно 30 Гц):

Код: Выделить всё

0.0333
0.0666
0.0999
...
Я стремлюсь вставлять точные временные метки, например (что может дать, например, 29,94 Гц):

Код: Выделить всё

0.0313
0.0656
0.0975
...
Сначала я попробовал ffmpeg -filter_complex и -vf, но безуспешно. Затем я попробовал использовать PyAv (pyav==13.1.0) для покадровой установки временной метки двумя разными подходами:
Подход 1: Использование .add_stream(template=...)< /p>
...
TIMEBASE = Fraction(1, 10000)
pts_stamps = load_timestamps() # First five pts_stamps are [0,316,635,970,1290...]

# Open the input container and stream
input_container = av.open()
input_stream = input_container.streams.video[0]

# Create an output container and configure the output stream using template
output_container = av.open(, mode="w")
output_stream = output_container.add_stream(template=input_stream)

# Iterate through the frames and set the PTS
for i, frame in tqdm(enumerate(input_container.decode(video=0))):
frame.pts = pts_stamps
frame.time_base = TIMEBASE

for packet in output_stream.encode(frame):
output_container.mux(packet)

# Finalize encoding and close the containers
for packet in output_stream.encode():
output_container.mux(packet)

output_container.close()
input_container.close()
< /code>
Тем не менее, это привело к ошибке «ValueError: не может быть перезазначать до нуля». которая, кажется, является относительно распространенной проблемой, которую я не могу решить. Не уверен, почему. < /P>
Подход 2: Настройка настройки выходного контейнера вручную < /p>
...
TIMEBASE = Fraction(1, 10000)
pts_stamps = load_timestamps() # First five pts_stamps are [0,316,635,970,1290...]

# Open the input container and stream
input_container = av.open()
input_stream = input_container.streams.video[0]

# Create an output container and configure the output stream using template
output_container = av.open(, mode="w")
output_stream = output_container.add_stream(input_stream.codec.name, rate=input_stream.average_rate)
output_stream.width = input_stream.width
output_stream.height = input_stream.height
output_stream.pix_fmt = input_stream.pix_fmt
output_stream.bit_rate = input_stream.bit_rate
output_stream.time_base = input_stream.time_base
output_stream.options = {"crf": "0"}

# Iterate through the frames and set the PTS
for i, frame in tqdm(enumerate(input_container.decode(video=0))):
frame.pts = pts_stamps
frame.time_base = TIMEBASE

for packet in output_stream.encode(frame):
output_container.mux(packet)

# Finalize encoding and close the containers
for packet in output_stream.encode():
output_container.mux(packet)

output_container.close()
input_container.close()
< /code>
Это результат в видео с правильными временными метками. Однако качество не то же самое. Выходной файл в 4 раза меньше, и, кажется, существует среднее значение пикселя, отличное от ~ 2,7 пикселя для каждого кадра. Т.е. Кажется, кодирование - это потеря.
Любые советы о том, как это решить?>

Подробнее здесь: https://stackoverflow.com/questions/793 ... eo-quality
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»