FFMPEG удаляет предположительно поврежденные кадры из исходного видео при перекодировании с использованием кодировщика h264

Я использую h264 для оптимизации MP4 в Интернете. У меня есть видео, в котором есть предположительно поврежденные кадры в первые 1-2 секунды. (Рамка приведена ниже)  Поврежденный кадр в проигрывателе VLC Media Player.

О перекодировании с использованием:

ffmpeg -i orig.mp4 -c:v libx264 -crf 25 -vf scale="-2:min(ih\,720)" -b:v 600K -g 90 -c:a libfdk_aac output.mp4

В выходном MP4 эти кадры выпадают, и у меня есть выход, который начинается примерно на 1-2 секунды с задержкой по сравнению с исходным видео, что приводит к общей меньшей продолжительности времени в выходном видео.

Более того, большинство медиаплееров также пропускают эти кадры при воспроизведении (например, Quicktime Player и т. Д.). Но медиаплеер VLC смог воспроизвести это видео, не пропуская эти кадры.

Есть ли способ не пропускать кадры с помощью ffmpeg? И если возможно, можно ли эти кадры идентифицировать и исправить на видео?

Примечание. Я пробовал кодировать то же видео с помощью транскодера AWS Elastic, который фактически исправил эти кадры (кадр указан ниже): Кадр из видео, перекодированного с помощью эластичного транскодера

Примечание. Исходное видео можно найти здесь - https://drive.google.com/file/d/0B9VkhR9Zu60ybXFDeno3RGpQTUE/view?usp=sharing Видео, транскодированное с помощью транскодера AWS Elsatic, можно найти здесь - https://drive.google.com/file/d/0B9VkhR9Zu60yWUVHQk5Vk5.просмотреть?usp=sharing

РЕДАКТИРОВАТЬ1: Как было предложено @Mulvya в комментариях, видео с TS-транскодированием можно найти здесь - (https://drive.google.com/file/d/0B9VkhR9Zu60yU0t6T0dMME9ZMmc/view?usp=sharing)


person t6nand    schedule 13.07.2017    source источник
comment
Я не могу воспроизвести это поведение с вашим исходным видео.   -  person Gyan    schedule 13.07.2017
comment
Привет. Попробуйте открыть исходное видео с помощью медиаплеера VLC. Вы сможете увидеть поврежденный кадр в течение 1-2 секунд. Также посмотрите это видео, перекодированное с помощью эластичного транскодера AWS - (drive. google.com/file/d/0B9VkhR9Zu60yWUVHQk5MTk05QVk/). Вы четко увидите разницу в начальных кадрах и продолжительности видео. Это перекодирование было выполнено с использованием исходного видео, о котором идет речь.   -  person t6nand    schedule 13.07.2017
comment
И просто чтобы добавить, помогает ли это воспроизвести проблему, я попытался извлечь каждый кадр из исходного видео с помощью ffmpeg и vlc media player. Ffmpeg начал извлечение после этих поврежденных кадров. Однако, используя фильтр видеосцены на VLC для извлечения кадров, я смог получить эти поврежденные кадры, как показано на рисунке.   -  person t6nand    schedule 13.07.2017
comment
Запустите ffmpeg -i orig.mp4 -c copy orig.ts и перекодируйте это.   -  person Gyan    schedule 13.07.2017
comment
Привет спасибо. Это сработало, и перекодированные видео были правильными. Но возможно ли обнаружить такие проблемы в видео из первых рук и запускать эту команду только при наличии какой-либо проблемы.   -  person t6nand    schedule 13.07.2017
comment
Проверьте время начала. Оно должно быть только слегка отрицательным, например. -0.05 самое большее. 0 или положительный тоже хорошо.   -  person Gyan    schedule 13.07.2017
comment
Похоже, что этот метод копирует первый кадр видео в первые 1-2 секунды. Это не совсем то, что я хочу. Проверено извлечением кадров, и первые 18 кадров были скопированы 1-м кадром. Вы можете это подтвердить?   -  person t6nand    schedule 13.07.2017
comment
Нет. Не полагайтесь на извлечение кадра для проверки. FFmpeg по умолчанию использует эмуляцию CFR, если не установлено в противном случае, поэтому кадры будут дублироваться. Проверьте первые несколько кадров aws и TS-транскодирования в плеере.   -  person Gyan    schedule 13.07.2017
comment
При сравнении видео, транскодированных с помощью AWS и TS, для первых нескольких кадров в плеере есть видимые различия. Похоже, что перекодированное видео AWS исправило все поврежденные кадры, но в видео, перекодированном с помощью TS, было дублирование кадра, как вы объяснили ранее. Вот видео, транскодированное TS для справки (drive.google.com/file / d / 0B9VkhR9Zu60yU0t6T0dMME9ZMmc /)   -  person t6nand    schedule 13.07.2017


Ответы (2)


В вашем исходном видео есть кадры без временных меток.

В этом конкретном случае работает извлечение в необработанный битовый поток и затем перекодирование:

ffmpeg -i orig.mp4 -c copy orig.264

ffmpeg -i orig.264 -i orig.mp4 -map 0 -map 1:a -c:v libx264 -crf 25 -vf scale="-2:min(ih\,720)" -b:v 600K -g 90 -c:a libfdk_aac output.mp4
person Gyan    schedule 13.07.2017
comment
Хотя это работает. Но в финальном видео звук кажется рассинхронизированным. - person t6nand; 14.07.2017
comment
Проблема решена синхронизацией аудиопотока с видеопотоком. Спасибо. - person t6nand; 14.07.2017
comment
не могли бы вы объяснить, как вы синхронизировали аудио / видеопоток? - person d.lime; 18.01.2021

Преобразованное видео в файл только сырого видео

ffmpeg -i VID_1550287359485.mp4 -vcodec copy -an -bsf:v h264_mp4toannexb raw2.h264
ffmpeg -framerate 24 -i raw2.h264  -c copy output-a.mp4

Извлечение аудио из видео в формате mp3

ffmpeg -i VID_1550287359485.mp4 -b:a 192K -vn music2.mp3

Устранение проблемы с длиной аудио и видео

ffprobe -i  music2.mp3  -show_entries  format=duration  -v quiet  -print_format json
ffprobe -i  output-a.mp4  -show_entries  format=duration  -v quiet  -print_format json
ffmpeg  -i music2.mp3 -filter:a atempo="0.827415438" new-latest2.mp3

Повернуть видео на 90 градусов против часовой стрелки

ffmpeg -i output-a.mp4 -vf "transpose=2" output-new.mp4

Объединение видео и аудио в выходной файл

ffmpeg -i output-new.mp4 -i new-latest2.mp3 -c:v libx264 -c:a aac -strict experimental -shortest output-second.mp4
person Akhilraj N S    schedule 19.02.2019