首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复FFmpeg中的"PES数据包大小不匹配“错误?

如何修复FFmpeg中的"PES数据包大小不匹配“错误?
EN

Stack Overflow用户
提问于 2019-02-14 23:43:47
回答 1查看 12.7K关注 0票数 5

如何修复错误的包大小不匹配中的FFmpeg -

我将回答我自己的问题,因为PES数据包大小不匹配这个短语经常出现在与ffmpeg相关的帖子中,但我没有看到一个令人满意的解决方案。

它通常涉及到一个涉及.TS传输流文件的问题:要么与连接这些文件有关,要么涉及重新修改它们(从.ts到.mp4)。在ffmpeg输出的某个地方,致命的短语数据包大小不匹配会突然开始重复。

一种解决方案是将它们连接为.ts文件(即它们的原始格式),然后将输出.ts文件分割成一个视频文件( .ts )和一个音频文件(.ts),然后使用"itsoffset“选项重新修改它们(.ts或.mp4)。即使使用流复制,输出到.mp4通常也会比保留.ts格式提供更糟糕的图片质量。

下面的代码这样做,输出.mp4视频或.ts视频(将代码复制到简单的.bat 批处理文件中,然后运行该文件)-

代码语言:javascript
复制
:: 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在源文件中报告了一个错误,它的“数据包大小不匹配”警告,在评论中提出的反对意见可能是有效的。

然而,即使数据丢失,我建议的例程至少会给你一个文件,它将在大多数媒体播放器中播放。在许多情况下,在报告的错误中指定的连接点甚至不会出现可听到的或可视的错误。

很难看出如何恢复丢失的数据,但请提供建议。必须有改进我的脚本的余地,因为以前很少注意这种类型的错误。

令人高兴的是,这种错误似乎不会导致声音与图片失去同步。因此,连接点后的音频不会失去同步,即使连接中缺少一些数据。

EN

回答 1

Stack Overflow用户

发布于 2021-02-08 15:37:14

PES数据包大小失配

错误信息(视频文件):

PES数据包大小失配

误差分析

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

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

有时,取决于编码器和muxer,当一个帧非常大时(例如HD视频中的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 Bytes ( MPEG2视频的旧标准)。对于大多数H264 PES数据包来说,这太小了,因此应该将其设置为零(即“任意长度”)。

如果视频流的PES长度为非零,则会出现问题.FFMPEG似乎无法解决这一问题。FFMPEG似乎要求将流显式标记为“任意长度”(即设置为零)。

如果我下载了一个原始.ts文件并通过TS_Doctor运行它,分析器就会抱怨:

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

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

只有当PES分组有效载荷是视频流时,才能添加PES分组长度的零值。

解决方案

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

然后,应该可以将生成的.ts文件转换为.mp4或.mkv,而不会出现任何错误。

不太理想,但它经常起作用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54700786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档