Как исправить ошибку Несоответствие размера пакета PES в FFmpeg -
Я собираюсь ответить на свой вопрос, потому что фраза Несоответствие размера пакета PES регулярно появляется в сообщениях, касающихся ffmpeg, но я нигде не видел удовлетворительного решения.
Обычно возникает проблема, связанная с файлами транспортных потоков .TS: либо в связи с конкатенацией таких файлов, либо с их повторным мультиплексированием (от .ts до .mp4).Где-то в выводе из ffmpeg смертельная фраза несоответствие размера пакета внезапно начнет повторяться.
Решение состоит в том, чтобы объединить их в виде файлов .ts (то есть в их original format), затем возьмите выходной файл .ts, разделите его на видеофайл (.ts) и аудиофайл (.ts), затем смените их (на .ts или .mp4), используя опцию itsoffset.Даже если используется потоковая копия , вывод в формат .mp4 часто будет давать худшее качество изображения, чем сохранение формата .ts.
Это делает следующий код, выводя видео .mp4 или .tsвидео (скопируйте код в простой .bat пакетный файл , затем запустите этот файл) -
.
:: Program Location
SET ffmpeg="C:\Program Files\FFmpeg\ffmpeg.exe" -hide_banner
:: STEP 1 -
:: Create File List
IF EXIST mylist.txt DEL mylist.txt
FOR %%i IN (*.ts) DO ECHO file '%%i'>> mylist.txt
:: Concatenate Files : TS
%ffmpeg% -f concat -safe 0 -i mylist.txt -c copy -threads 1 out.ts
:: STEP 2 -
:: Extract Video stream
%ffmpeg% -i out.ts -vcodec copy -an -sn -threads 1 video.ts
:: Extract Audio stream
%ffmpeg% -i out.ts -acodec copy -vn -sn -threads 1 audio.ts
:: STEP 3 -
:: Combine Video and Audio streams (with .MP4 options)
SET mapping=-i video.ts -itsoffset -0 -i audio.ts -map 0:v -map 1:a
SET options=-flags global_header -movflags faststart -threads 1
%ffmpeg% %mapping% -c:v copy -c:a copy %options% output.mp4
:: Combine Video and Audio streams (with .TS options)
SET mapping=-i video.ts -itsoffset -0 -i audio.ts -map 0:v -map 1:a
SET options=-threads 1
%ffmpeg% %mapping% -c:v copy -c:a copy %options% output.ts
.
Приложение :
Похоже, есть некоторые разногласия по поводу предложенного мной решения, как подробно описано в комментариях ниже.Кажется, говорят, что мое решение игнорирует тот факт, что в исходных файлах отсутствуют данные.
Я думаю, что самое малое, что я могу сделать, это признать, что, поскольку ffmpeg сообщает об ошибке в исходных файлах,это предупреждение о несоответствии размера пакета; возражение, выдвинутое в Комментариях, может быть действительным.
Однако, даже если данные отсутствуют, моя предложенная процедура по крайней мере даст вам файл, который будет воспроизводиться в большинстве медиаплееров.Во многих случаях даже не будет слышимой или визуальной неисправности в точке соединения, указанной в сообщенной ошибке.
Трудно увидеть, как могут быть восстановлены недостающие данные, но, пожалуйста, внесите предложения.Должны быть возможности для улучшения моего сценария, потому что раньше этому типу ошибки уделялось так мало внимания.
К счастью, похоже, что этот тип ошибки НЕ приведет к потере синхронизации звука с изображением.Таким образом, звук после точки соединения не будет несинхронизирован, даже если при соединении отсутствуют некоторые данные.