Вопрос или проблема
У меня есть видеофайл ProRes размером около 148 ГБ. Файл не может воспроизвестись дальше первых нескольких секунд.
Я думаю, что может быть проблема с заголовком/контейнером. Я хотел бы извлечь аудиопотоки и видеопотоки и поместить их в новый контейнер, но в своих первых попытках FFmpeg не копировал данные дальше первых нескольких секунд, создавая файл размером всего около 60 Мб.
Есть ли способ сказать FFmpeg, что я хочу продолжить извлечение дальше первых нескольких секунд, даже если он считает, что находит недействительные данные? Я хочу весь поток, до конца файла.
Мои последующие попытки были похожи на эту:
ffmpeg -hide_banner -err_detect ignore_err -s 3600 -i $input -c:v copy -c:a copy -t
2:00:00 -map 0:0 -map 0:1 -map 0:2 -y $output
Это привело к ошибке:
[mov,mp4,m4a,3gp,3g2,mj2 @ 0000026bd67cbf40] неправильное количество сэмплов
Опция video_size не найдена.
ИЗМЕНЕНИЕ –
Вот вывод файла журнала, полученный с помощью -report
:
ffmpeg начат 24 октября 2024 года в 10:35:49
Отчет записан в "ffmpeg-20241024-103549.log"
Уровень журнала: 48
Командная строка:
"C:\\BIN\\ffmpeg.exe" -report -err_detect ignore_err -hide_banner -y -s 3600 -i input.mov -c:v copy -c:a copy -t 2:00:00 -map 0:0 -map 0:1 -map 0:2 output.mkv
Разделение командной строки.
Чтение опции '-report' ... соответствует опции 'report' (создание отчета) с аргументом '1'.
Чтение опции '-err_detect' ... Направление опции err_detect как на уровень кодека, так и на уровень мультиплексирования соответствует AVOption 'err_detect' с аргументом 'ignore_err'.
Чтение опции '-hide_banner' ... соответствует опции 'hide_banner' (не показывать баннер программы) с аргументом '1'.
Чтение опции '-y' ... соответствует опции 'y' (перезаписывать выходные файлы) с аргументом '1'.
Чтение опции '-s' ... соответствует опции 's' (установить размер кадра (WxH или сокращение)) с аргументом '3600'.
Чтение опции '-i' ... соответствует входному URL с аргументом 'input.mov'.
Чтение опции '-c:v' ... соответствует опции 'c' (имя кодека) с аргументом 'copy'.
Чтение опции '-c:a' ... соответствует опции 'c' (имя кодека) с аргументом 'copy'.
Чтение опции '-t' ... соответствует опции 't' (записать или перекодировать "длину" секунд аудио/видео) с аргументом '2:00:00'.
Чтение опции '-map' ... соответствует опции 'map' (установить отображение входного потока) с аргументом '0:0'.
Чтение опции '-map' ... соответствует опции 'map' (установить отображение входного потока) с аргументом '0:1'.
Чтение опции '-map' ... соответствует опции 'map' (установить отображение входного потока) с аргументом '0:2'.
Чтение опции 'output.mkv' ... соответствует выходному URL.
Завершение разделения командной строки.
Анализ группы опций: глобально.
Применение опции report (создание отчета) с аргументом 1.
Применение опции hide_banner (не показывать баннер программы) с аргументом 1.
Применение опции y (перезаписывать выходные файлы) с аргументом 1.
Успешно разобрал группу опций.
Анализ группы опций: входной URL input.mov.
Применение опции s (установить размер кадра (WxH или сокращение)) с аргументом 3600.
Успешно разобрал группу опций.
Открытие входного файла: input.mov.
[NULL @ 000001335109cf00] Открытие 'input.mov' для чтения
[file @ 000001335109d5c0] Установка белого списка по умолчанию 'file,crypto,data'
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001335109cf00] Формат mov,mp4,m4a,3gp,3g2,mj2 проверен с размером=2048 и оценкой=100
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001335109cf00] ISO: Основная марка типа файла: qt
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001335109cf00] Неизвестный тип dref 0x73696c61 размер 12
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001335109cf00] Обработка st: 0, список правок 0 - медиавремя: 0, продолжительность: 192000
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001335109cf00] Неизвестный тип dref 0x73696c61 размер 12
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001335109cf00] Обработка st: 1, список правок 0 - медиавремя: 0, продолжительность: 192000
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001335109cf00] Неизвестный тип dref 0x73696c61 размер 12
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001335109cf00] неправильное количество сэмплов
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001335109cf00] Неизвестный тип dref 0x73696c61 размер 12
Опция video_size не найдена.
Ответ или решение
Как избежать повреждения файлов ProRes в FFmpeg
При работе с видеофайлами формата ProRes, особенно при размере около 148 ГБ, может возникнуть множество проблем, включая повреждение заголовков и контейнеров. Если вы сталкиваетесь с ситуацией, когда файл не воспроизводится после первых нескольких секунд и предположительно повреждён, вы можете использовать FFmpeg для извлечения аудио и видео потоков, даже если это связано с ошибками в данных.
Шаги для извлечения потоков:
-
Проверка формата и структуры файла: Для начала выполните команду, чтобы посмотреть информацию о вашем файле:
ffmpeg -i input.mov
Это поможет вам определить, какие потоки доступны в файле, а также их характеристики.
-
Игнорирование ошибок с помощью параметров: Ваши первоначальные попытки содержали параметры, которые не позволили FFmpeg обрабатывать данные за пределами первых секунд. Используйте следующие параметры, чтобы игнорировать ошибки:
ffmpeg -i input.mov -c:v copy -c:a copy -err_detect ignore_err -f mpegts output.ts
Здесь параметр
-f mpegts
указывает FFmpeg создать выходной файл в формате MPEG Transport Stream, что может помочь обойти некоторые проблемы с контейнером. -
Увеличение продолжительности извлечения: Убедитесь, что вы не ограничиваете продолжительность извлечения видео. Вместо
-t 2:00:00
попробуйте:ffmpeg -i input.mov -c:v copy -c:a copy -err_detect ignore_err -f mpegts output.ts
-
Управление кодированием и декодированием: Если вы сталкиваетесь с проблемами переноса кодеков, вместо использования
copy
может быть полезно перекодировать потоки. Это, конечно, увеличит время обработки и потенциально ухудшит качество, но может решить проблемы с совместимостью:ffmpeg -i input.mov -c:v prores -c:a aac -err_detect ignore_err output.mov
-
Использование дополнительных параметров: В некоторых случаях FFmpeg может помочь с параметрами как
-fix_sub_duration
или-analyzeduration
, которые могут улучшить обработку. -
Работа с большим количеством данных: Если файл слишком большой, стоит рассмотреть возможность обрезки его до меньших частей с помощью:
ffmpeg -i input.mov -ss 0 -t 3600 -c copy -err_detect ignore_err segment_%03d.mov
Это позволит вам работать с сегментами файла, а не с целым, минимизируя вероятные ошибки.
Обработка ошибок
Если FFmpeg все еще выдает ошибку «wrong sample count», это может свидетельствовать о серьезном повреждении файловой структуры. В таком случае, используйте следующие дополнительные методы:
- Проверка других инструментов: Иногда специализированные инструменты, такие как
HandBrake
илиDaVinci Resolve
, могут обрабатывать поврежденные файлы более эффективно. - Работа с резервными копиями: Если у вас есть резервные копии или предыдущие версии файла, попробуйте их использовать.
Заключение
Работа с поврежденными файлами ProRes может оказаться сложной задачей, однако при правильном использовании FFmpeg и других инструментов, вы можете обойти большинство ошибок. Следуя представленным шагам, можно минимизировать потерю данных и извлечь как можно больше информации из поврежденных видеофайлов. Если у вас остаются вопросы или сложности, рекомендуется обратиться к сообществу пользователей FFmpeg или специализированным форумам для получения дополнительной поддержки.