如何修复错误的包大小不匹配中的FFmpeg -
我将回答我自己的问题,因为PES数据包大小不匹配这个短语经常出现在与ffmpeg相关的帖子中,但我没有看到一个令人满意的解决方案。
它通常涉及到一个涉及.TS传输流文件的问题:要么与连接这些文件有关,要么涉及重新修改它们(从.ts到.mp4)。在ffmpeg输出的某个地方,致命的短语数据包大小不匹配会突然开始重复。
一种解决方案是将它们连接为.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在源文件中报告了一个错误,它的“数据包大小不匹配”警告,在评论中提出的反对意见可能是有效的。
然而,即使数据丢失,我建议的例程至少会给你一个文件,它将在大多数媒体播放器中播放。在许多情况下,在报告的错误中指定的连接点甚至不会出现可听到的或可视的错误。
很难看出如何恢复丢失的数据,但请提供建议。必须有改进我的脚本的余地,因为以前很少注意这种类型的错误。
令人高兴的是,这种错误似乎不会导致声音与图片失去同步。因此,连接点后的音频不会失去同步,即使连接中缺少一些数据。
发布于 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视频中的帧类型:
在直播流中,所有电视台都将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,而不会出现任何错误。
不太理想,但它经常起作用。
https://stackoverflow.com/questions/54700786
复制相似问题