【问题标题】:How do I fix the "PES packet size mismatch" error in FFmpeg?如何修复 FFmpeg 中的“PES 数据包大小不匹配”错误?
【发布时间】: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


【解决方案1】:

PES 数据包大小不匹配

错误信息(视频文件):

PES 数据包大小不匹配

.

错误分析

单个 PES 数据包只能包含三种可能的帧类型之一, 即 I、B 或 P。单个 PES 数据包存储一个 DTS/PTS 对。

复用器所做的是将帧(无论是 I、B 还是 P)打包成一个 PES 数据包,然后为该数据包添加 DTS 和 PTS 时间戳,仅此而已。 下一帧会被打包成一个单独的PES包。

有时,取决于编码器和复用器,当帧非常大(例如 作为高清视频中的 I 帧)它被打包到多个 PES 数据包中 具有相同的 DTS/PTS 时间戳。

h264流的SPS和PPS打包的地方,连同一个I帧, 到单个 PES 数据包中,如果该数据包(包含 SPS 和 PPS)丢失, 解码器必须等到下一个 SPS 和 PPS 被传输—— 因为没有它们,它无法解码流。

MPEG-2 视频中的帧类型:

  • 帧类型 001:帧内编码 (I) - “i 帧”

  • 帧类型 010:预测编码 (P) - “p 帧”

  • 帧类型 011:双向预测编码 (B) - “b 帧”

在直播中,所有电视台都将 H264 视频流的 PES 长度设置为零, 由于 PES 长度是 16 位值,因此最大大小为 65,535 字节 (MPEG2 视频的旧标准)。这对于大多数 H264 PES 数据包来说太小了, 所以它应该设置为零(即“任意长度”)。

如果视频流的 PES 长度不为零,则可能会出现问题。 FFMPEG 确实 似乎无法应付。看来 FFMPEG 要求流是 明确标记为“任意长度”(即设置为零)。

如果我下载原始 .ts 文件并通过 TS_Doctor 运行它,分析器会报错:

"检测到视频流的 PES 长度。这可能有问题! 将视频流上的 PES 长度修补为安全值 - 是/否。”

如果我点击“否”,然后通过 FFMPEG 运行输出,则会报告一个问题 声音不同步。如果我点击“是”,然后通过 FFMPEG 运行输出, 没有问题报告。这表明输出文件之间的唯一区别 是 PES 长度修正。

PES 数据包长度的值为零只能在 PES 数据包时添加 有效载荷是视频流。

.

解决方法

一种可能的解决方案是连接 .ts 文件,然后获取输出 .ts 文件, 将其拆分为视频文件 (.m4v) 和音频文件 (.m4a),然后重新混合它们 (仍为 .ts 格式)使用“itsoffset”选项。

然后应该可以将生成的 .ts 文件转换为 .mp4 或 .mkv 而无需 任何错误。

不理想,但它经常有效。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 2017-09-09
  • 2017-02-23
相关资源
最近更新 更多