Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我该如何解决这个问题;PES数据包大小不匹配“;FFmpeg中的错误?_Ffmpeg - Fatal编程技术网

我该如何解决这个问题;PES数据包大小不匹配“;FFmpeg中的错误?

我该如何解决这个问题;PES数据包大小不匹配“;FFmpeg中的错误?,ffmpeg,Ffmpeg,如何修复FFmpeg中的错误PES数据包大小不匹配- 我将回答我自己的问题,因为短语PES数据包大小不匹配经常出现在与ffmpeg相关的帖子中,但我还没有找到一个令人满意的解决方案 它通常涉及到一个涉及.TS传输流文件的问题:要么与连接此类文件有关,要么与重新多路复用(从.TS到.mp4)有关。在ffmpeg输出的某个地方,致命的短语数据包大小不匹配将突然开始重复 解决方案是将它们连接为.ts文件(即原始格式),然后获取输出的.ts文件,将其拆分为视频文件(.ts)和音频文件(.ts),然后使用

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

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

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

解决方案是将它们连接为.ts文件(即原始格式),然后获取输出的.ts文件,将其拆分为视频文件(.ts)和音频文件(.ts),然后使用“itsoffset”选项将它们重新复制(到.ts或.mp4)。即使使用了流复制,输出到.mp4通常会比保留.ts格式产生更差的图片质量

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

附录

对于我建议的解决方案,似乎存在一些争议,详情见下面的评论。似乎有人说我的解决方案忽略了源文件中缺少数据这一事实

我想我至少可以承认,由于ffmpeg在源文件中报告了一个错误,并带有“数据包大小不匹配”警告,因此在评论中提出的反对意见可能是有效的

然而,即使数据丢失,我建议的例程至少会为您提供一个文件,该文件将在大多数媒体播放器中播放。在许多情况下,在报告的错误中指定的连接点上甚至不会出现声音或视觉故障

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

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

PES数据包大小不匹配 错误消息(视频文件):

PES数据包大小不匹配

错误分析

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

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

有时,根据编码器和muxer,当帧非常大(例如 作为高清视频中的I帧),它被打包到多个PES数据包中,所有这些数据包 具有相同的DTS/PTS时间戳

其中h264流的SP和PPS与I型架一起打包, 如果单个PES数据包(包含SP和PPS)丢失, 解码器必须等待下一个SP和PPS传输-- 因为没有它们,它无法解码流

MPEG-2视频中的帧类型:

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

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

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

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

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

如果我下载一个raw.ts文件并通过ts_Doctor运行它,分析仪会抱怨:

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

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

PES数据包长度的零值只能在PES数据包 有效负载是一个视频流

解决方法

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

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


不理想,但它通常有效。

回答自己的问题很好,但请将问题放在问题框中,答案放在答案框中。当然,在ffmpeg的TS muxer编写新文件后,不会出现数据包大小不匹配的情况。仍然无法回答原始数据包是否已正确解译。@szatmary不幸的是,我不否认您的评论。如果您认为该问题不适合给出的答案,请提出更合适的问题。在我忘记之前,我已经简单地记录了几个星期的实验结果——最终找到了一个完美的解决方案@吉安:哦,是的。如果原始文件没有错误,我的解决方案将产生一个完美的输出文件。如果您遵循我的解决方案,但发现连接点处的输出文件中仍然有一个小故障,那么您可以确定故障在于t
:: 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