FFmpeg: разделение видео на сегменты очень маленького размера (например, 5 КБ) - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь разделить видеофайл на сегменты размером менее 10 КБ (в идеале 5 КБ) с помощью FFmpeg.

Вот видео, которое я использую: https://download.blender.org/peach/bigbuckbunny_movies/BigBuckBunny_320x180.mp4. Оно уже имеет низкое разрешение.

Я попытался указать очень маленькое -segment_time 00: 00: 0,04:

ffmpeg -i BigBuckBunny_320x180.mp4 -c copy -map 0 -f segment -segment_time 00:00:0.04 BigBuckBunny_320x180_%03d.mp4

Я попытался указать последовательный -segment_frames, например, 1,2,3,4,5,6, 7 ... etc.:

ffmpeg -i BigBuckBunny_320x180.mp4 -c copy -map 0 -f segment -segment_frames 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 -segment_list out.csv BigBuckBunny_320x180_%03d.mp4

Я также пытался форсировать ключевые кадры:

ffmpeg -i BigBuckBunny_320x180.mp4 -force_key_frames "expr:gte(t,n_forced*0.04)" -c copy -map 0 -f segment -segment_frames 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 BigBuckBunny_320x180_%03d.mp4

Все это приводит к сегментам длиной 0,5 с с различными размерами файлов, в среднем составляющими около50KB.

username@My-Air:~/dev/video$ less out.csv 
BigBuckBunny_320x180_000.mp4,0.000000,0.500000
BigBuckBunny_320x180_001.mp4,0.500000,1.000000
BigBuckBunny_320x180_002.mp4,1.000000,1.500000
BigBuckBunny_320x180_003.mp4,1.500000,2.000000
BigBuckBunny_320x180_004.mp4,2.000000,2.500000
BigBuckBunny_320x180_005.mp4,2.500000,3.000000
...

username@My-Air:~/dev/video/bunny_0.5s_splits$ ls -l
total 134552
-rw-r--r--  1 username  staff    16K 25 Mar 23:40 BigBuckBunny_320x180_000.mp4
-rw-r--r--  1 username  staff    26K 25 Mar 23:40 BigBuckBunny_320x180_001.mp4
-rw-r--r--  1 username  staff    36K 25 Mar 23:40 BigBuckBunny_320x180_002.mp4
-rw-r--r--  1 username  staff    44K 25 Mar 23:40 BigBuckBunny_320x180_003.mp4
-rw-r--r--  1 username  staff    40K 25 Mar 23:40 BigBuckBunny_320x180_004.mp4
-rw-r--r--  1 username  staff    38K 25 Mar 23:40 BigBuckBunny_320x180_005.mp4
-rw-r--r--  1 username  staff    43K 25 Mar 23:40 BigBuckBunny_320x180_006.mp4
-rw-r--r--  1 username  staff    44K 25 Mar 23:40 BigBuckBunny_320x180_007.mp4
-rw-r--r--  1 username  staff    50K 25 Mar 23:40 BigBuckBunny_320x180_008.mp4
-rw-r--r--  1 username  staff    49K 25 Mar 23:40 BigBuckBunny_320x180_009.mp4
-rw-r--r--  1 username  staff    50K 25 Mar 23:40 BigBuckBunny_320x180_010.mp4
-rw-r--r--  1 username  staff    51K 25 Mar 23:40 BigBuckBunny_320x180_011.mp4
-rw-r--r--  1 username  staff    51K 25 Mar 23:40 BigBuckBunny_320x180_012.mp4
-rw-r--r--  1 username  staff    57K 25 Mar 23:40 BigBuckBunny_320x180_013.mp4
-rw-r--r--  1 username  staff    53K 25 Mar 23:40 BigBuckBunny_320x180_014.mp4
-rw-r--r--  1 username  staff    57K 25 Mar 23:40 BigBuckBunny_320x180_015.mp4
-rw-r--r--  1 username  staff    57K 25 Mar 23:40 BigBuckBunny_320x180_016.mp4
-rw-r--r--  1 username  staff    61K 25 Mar 23:40 BigBuckBunny_320x180_017.mp4
...

Странно, что временные метки равны 0 и 0,5 с.Это ограничение FFmpeg?Я не смог найти никакой документации, чтобы проверить это.

Есть ли способ уменьшить размер файла до 5 КБ?Возможно ли это с FFmpeg?Если нет, есть ли другой инструмент, который я мог бы использовать?Я посмотрел на GStreamer, но не смог понять, возможно ли это, и это кажется очень сложным.

Любая помощь приветствуется.Спасибо.

1 Ответ

0 голосов
/ 03 апреля 2019

ОК, я наконец-то получил то, что хотел. Теперь у меня есть видео сегменты все под 10KB в среднем около 5KB. Я использовал следующие команды:

  1. Сжатие исходного видеофайла с использованием стандартного сжатия ffmpeg:
ffmpeg BigBuckBunny_320x180.mp4 BigBuckBunny_320x180_compressed.mp4
  1. Установите для интервала ключевых кадров значение 1, чтобы каждый кадр стал ключевым кадром:
ffmpeg -i BigBuckBunny_320x180_compressed.mp4 -vcodec libx264 -x264-params keyint=1:scenecut=0 -acodec copy BigBuckBunny_320x180_compressed_frames.mp4
  1. Разделить полученный файл на сегменты длиной 0,04, равной длине одного кадра:
ffmpeg -i BigBuckBunny_320x180_compressed_frames.mp4 -c copy -map 0 -segment_time 00:00:0.04 -f segment -reset_timestamps 1 BigBuckBunny_320x180_compre
ssed_frames%03d.mp4

Я решил предыдущую проблему, в которой правильно воспроизводился только первый сегмент, используя: -reset_timestamps 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...