У меня есть видео в формате .mp4 (без звука) с частотой 30 Гц. с текстовым файлом timestamps.txt, содержащим точные временные метки для каждого кадра видео. Моя цель — встроить временные метки в метаданные кадров без потери качества видео.
Например. текущие временные метки видео (точно 30 Гц):
Код: Выделить всё
0.0333
0.0666
0.0999
...
Код: Выделить всё
0.0313
0.0656
0.0975
...
Подход 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
Мобильная версия