Фильтр 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
Насколько я понимаю, происходит то, что у вас есть, например, аудиопоток, который вы не отбрасываете, поэтому, когда вы отбрасываете видеокадры, видеопоток просто получает первый кадр, который он может получить в свои руки. и заявил, что это будет продолжаться до следующего кадра.
Таким образом, вам, конечно, придется редактировать аудио, а затем вставлять его обратно в видео.