我该如何解决这个问题;PES数据包大小不匹配“;FFmpeg中的错误?
如何修复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视频中的帧类型:我该如何解决这个问题;PES数据包大小不匹配“;FFmpeg中的错误?,ffmpeg,Ffmpeg,如何修复FFmpeg中的错误PES数据包大小不匹配- 我将回答我自己的问题,因为短语PES数据包大小不匹配经常出现在与ffmpeg相关的帖子中,但我还没有找到一个令人满意的解决方案 它通常涉及到一个涉及.TS传输流文件的问题:要么与连接此类文件有关,要么与重新多路复用(从.TS到.mp4)有关。在ffmpeg输出的某个地方,致命的短语数据包大小不匹配将突然开始重复 解决方案是将它们连接为.ts文件(即原始格式),然后获取输出的.ts文件,将其拆分为视频文件(.ts)和音频文件(.ts),然后使用
- 帧类型001:帧内编码(I)-“I帧”
- 帧类型010:预测编码(p)-“p帧”
- 帧类型011:双向预测编码(B)-“B帧”
不理想,但它通常有效。回答自己的问题很好,但请将问题放在问题框中,答案放在答案框中。当然,在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