Фильтр avconv "select" не удаляет первые кадры

Я пытаюсь сегментировать видео с помощью фильтра "select", который используется в a vconv для извлечения только определенного диапазона кадров из входного файла. Например, представьте, что у меня есть видеофайл 60fps с именем input.mp4, с 3000 кадрами (то есть 50 секунд), и я запускаю

avconv -i input.mp4 -vf "select='lt(n,2000)'" output1.mp4
avconv -i input.mp4 -vf "select='gte(n,2000)'" output2.mp4

Я ожидаю, что output1.mp4 имеет первые 2000 кадров input.mp4 (и длится ~33 секунды), а output2.mp4 имеет последние 1000 (и длится ~17 секунд).

Я считаю кадры, запустив

avconv -i video.mp4 -vcodec copy -an -f null /dev/null 2>&1 | grep 'frame='

и проверка значения, присвоенного "кадру".

Что я на самом деле получаю, так это то, что output1.mp4 имеет 2000 кадров и длится ~33 секунды, но output2.mp4 имеет 2999 кадров и все еще длится полные ~50 секунд. Когда я открываю output2.mp4, я замечаю, что первые 2000 кадров видео фактически являются повторением 2000-го кадра ввода, то есть первые 2000 кадров кажутся правильно отфильтрованными, но заменяются первым из принятых кадров,

Это не проблема оч. Я проверяю количество пакетов и их относительные значения с помощью a vprobe:

avprobe -show_packets output2.mp4
echo $(avprobe -show_packets output2.mp4 2>/dev/null | grep PACKET | wc -l)/2 | bc

Я вижу, что на самом деле есть 2999 пакетов.

Что я делаю неправильно?

Дополнительные вопросы:

  • Предполагая, что я делаю что-то не так, почему output2.mp4 содержит 2999, а не полные 3000?
  • Поведение не меняется, использую ли я функцию "gte" или "gt" в фильтре. Почему это может быть?

1 ответ

Скорее всего, вы видите это из-за того, что в файле есть другие потоки. Мне удалось избавиться от проблемы, которую вы описали, удалив другие потоки во второй команде:

avconv -i input.mp4 -vf "select='gte(n,2000)'" -an -sn output2.mp4

Насколько я понимаю, происходит то, что у вас есть, например, аудиопоток, который вы не отбрасываете, поэтому, когда вы отбрасываете видеокадры, видеопоток просто получает первый кадр, который он может получить в свои руки. и заявил, что это будет продолжаться до следующего кадра.

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

Другие вопросы по тегам