【发布时间】:2021-02-08 23:37:14
【问题描述】:
如何修复FFmpeg中PES数据包大小不匹配的错误-
我将回答我自己的问题,因为短语 PES 数据包大小不匹配 经常出现在与 ffmpeg 相关的帖子中,但我还没有看到令人满意的解决方案。
它通常涉及涉及 .TS 传输流文件的问题:要么与连接此类文件有关,要么与重新混合它们有关(从 .ts 到 .mp4)。在 ffmpeg 的输出中,致命的短语 packet size mismatch 会突然开始重复。
一种解决方案是将它们连接为 .ts 文件(即以它们的 原始 格式),然后获取输出 .ts 文件,将其拆分为视频文件 (.ts) 和音频文件(.ts),然后使用“itsoffset”选项将它们重新混合(到 .ts 或 .mp4)。即使使用流复制,输出到 .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 在源文件中报告错误,并带有“数据包大小不匹配”警告,因此评论中提出的反对意见可能是有效的。
但是,即使数据丢失,我建议的例程至少会为您提供一个可以在大多数媒体播放器中播放的文件。在许多情况下,在报告的错误中指定的连接点甚至不会出现听觉或视觉故障。
很难看出如何恢复丢失的数据,但请提供建议。我的脚本必须有改进的余地,因为以前很少有人注意这种类型的错误。
幸运的是,这种类型的错误似乎不会导致声音与图片失去同步。所以连接点之后的音频不会不同步,即使连接时丢失了一些数据。
【问题讨论】:
-
您自己回答问题很好,但请把问题放在问题框中,答案放在答案框中。
-
当然,在 ffmpeg 的 TS muxer 写入新文件后,您不会出现数据包大小不匹配的情况。仍然没有回答原始数据包是否正确解复用。
-
@szatmary 不幸的是,我不理解您的评论。如果您认为该问题不适合给出的答案,请提出更合适的问题。在我忘记之前,我只是简单地记录了几周试验的结果 - 终于找到了一个完美的解决方案!
-
@Gyan 哦,是的。如果原始文件没有错误,我的解决方案将产生一个完美的输出文件。如果您按照我的解决方案,但发现输出文件在连接点处仍然存在故障,那么您可以确定故障在于原始文件,不在串联例程中。
-
*输出看起来很好*,我的意思是数据包字段将同步。如果实际的媒体数据已损坏,它也会出现在输出文件中。如果只有数据包元数据损坏,则不会延续到输出。但这与串联无关。
标签: ffmpeg