2

Я хочу кодировать после поиска в определенной позиции, и я хочу сделать первый кадр ключевым кадром, вот команда, которую я использовал:

ffmpeg -ss 300  -i howimet.mp4 -acodec libfaac -ar 48000 -ab 128k -ac 2  -vcodec libx264 -vf "scale=480:270" -f mpegts -force_key_frames 300 -t 120 howimet2.ts

-force_key_frames устанавливается для поиска позиции для создания ключевого кадра там. Я использую следующий скрипт (отсюда), чтобы проверить, является ли первый кадр ключевым кадром

ffprobe -show_frames -v quiet howimet2.ts | awk -F= '   /pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } } 
  /pkt_pts_time/ { if (i && ($2 >= 0)) print $2; }  
' | head -n 1

Результат показывает, что первый ключевой кадр не находится во втором 0.

Я думаю, что моя команда не верна. что мне не хватает?

3 ответа3

4

При кодировании видео первый кадр должен быть ключевым. Он будет первым полностью закодированным, и последующие кадры могут использовать его для межкадрового прогнозирования. Кроме того, в начале кодированной видеопоследовательности у вас будет модуль доступа H.264, который сообщает декодеру обновить.

Итак, независимо от того, что вы делаете: если вы просто не копируете поток битов, вы перекодируете видео, и ваш первый кадр должен быть ключевым кадром.

Теперь, по какой-либо причине, ваш поток имеет смещение во время начала. Это означает, что все метки времени представления также сдвигаются в соответствии с этим смещением. Если вы проверите заголовок вывода ffprobe -show_frames , вы увидите, что кадр 0 действительно будет ключевым, но с другим PTS.

Чтобы компенсировать это, вы можете вычесть время начала из всех PTS.

0

Как уже упоминалось, первый кадр вашего видео должен быть I-Frame. Ваша проблема связана не с кодировкой (или копией, если вам нравится), а с декодированием. Наличие -ss до того, как ввод будет неточным, поэтому ffmpeg делает все возможное, чтобы вы смогли найти то, что вам нужно. Ffmpeg прошел это местоположение и, таким образом, сообщает вам ненулевую первую временную метку.

Я бы порекомендовал попробовать второй -ss после вашего -i. Вдоль строк -ss 299 -i введите -ss 1.

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

Следует отметить, что я не думаю, что команда force_key_frames делает то, что вы думаете. Если он что-то делает, он, скорее всего, просто говорит ему добавлять ключевой кадр в выходные данные каждые 300 секунд, но это всего лишь предположение. Это означает, что ключевым кадром будет только первый кадр вашего вывода (t = 120).

https://ffmpeg.org/ffmpeg.html

0

Установите размер GOP с помощью "-g"

Просто чтобы продемонстрировать точность, вот 1 секунда сегментов

ffmpeg -i  in.mkv -g 30  -hls_time 1 -hls_list_size 0 index.m3u8

Вот как выглядит m3u8:

    #EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:1.001000,
index0.ts
#EXTINF:1.001000,
index1.ts
#EXTINF:1.001000,
index2.ts
#EXTINF:1.001000,
index3.ts
#EXTINF:1.001000,
index4.ts
#EXTINF:1.001000,
index5.ts
#EXTINF:1.001000,
index6.ts
#EXTINF:1.001000,
index7.ts
#EXTINF:1.001000,
index8.ts
#EXTINF:1.001000,
index9.ts
#EXTINF:1.001000,
index10.ts
#EXTINF:1.001000,
index11.ts
#EXTINF:1.001000,
index12.ts
#EXTINF:1.001000,
index13.ts
#EXTINF:1.001000,
....

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .