# concatTS **Repository Path**: xiaobo0903/concatTS ## Basic Information - **Project Name**: concatTS - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-01-04 - **Last Updated**: 2022-04-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 关于 concatTS 的安装与使用 在直播过程中因为编碼器的问题或者网络不好等情况下,都会引起起视音频的时间戳 出现问题,而在输出直播流时播放器会对于错误的内容进行校正和处理,所以在观看 直播时可能影晌并不明显, 但收录程序会把这些内容都记录下来,在进行合成或者转 码时,都会对于视音频文件产生影响,会出现时间不符(或多或者少),内容缺失以 及音画不同步等情况;这种情况下使用ffmpeg进行合成后的文件基本就不可用,因为 ffmpeg只是简单的进行处理,如果出错则直接丢弃,所以合成的效果不能满足实际的 需求,为了解决这个问题,特编写concatTS来进行处理合成的工作; concatTS主要解决的问题: 1. 重推流造成的时间戳变化,有些编码器重推流后,会从新计算pts和dts,所以会造 成时间戳的又重新开始,这种情况下该程序尽量的通过补差运算,来修正pts和dts, 使其与以前的流的pts和dts时间戳连续,以保证其合成时不会出现错误; 2. 断流补帧操作,因为网络或者编码器的问题,出现视音频流丢帧的现像,这种现像 往往会造成合成后,音画不同步,concatTS通过分析其是否有中断的情况,如果发 现有中断,则进行补帧操作,使其分片的内容尽量的能够保证完整; 3. 重复和过期帧丢弃,因为网络或者编码器的问题,会出现过期帧的问题,ffmpeg处 理过期帧的方式是尽量的保证其能够正常合成,所以通过微调PTS和DTS的值来解决 过期帧或重复帧的问题,但也会造成内容重复和时长不准的情况,concatTS会丢弃 掉这些重复帧和过期帧,使其尽量的与播放器的效果相同; concatTS可能遇到的问题: 1. 关于B帧的处理:因为有些直播流可能会使用B帧,该程序目前还不能够完全支持 带B帧的视频流,所以对于有B帧的直播流,只是进行了简单的写入,**并不会进行 补帧操作;** 2. 关于重推流的计算范围:在重推流时,有些编码器是重新从0开始生成时间戳,因为 各个编码的规则不统一,所以只是简单的做了一下分析,处理中可能会有一些计算 的误差,对于结果产生的影响应该不大,但还需要进一步的观查; 安装方法: 1. 下载程序: - git clone https://gitee.com/xiaobo0903/concatTS.git 2. 可以直接使用concatTS文件,也可以重新编译concatTS.c(该部分略) - mv concatTS /usr/bin 3. 安装依赖库: - yum install libva.x86_64 libvdpau.x86_64 - 如果已经安装了ffmpeg程序,依赖库可以不用单独安装; 运行时可能还会缺少一些动态链接库,可以通过"ldd concatTS"命令来查看缺少的 库名;在目录lib64下有一些常用的库,如果缺少这些库,可以直接拷到相应的 目录下(centos: /lib64); 程序运行: 1. 下载ts切片到本地,并生成有本地路径文件的m3u8文件,如:a.m3u8, 调用方式: - concatTS a.m3u8 - 则会根据a.m3u8文件中的切片内容,生成a.ts的合成文件; 2. 因为该程序只设置生成了分片合成ts文件,所以如果使用mp4格式的文件,**需 要单独安装ffmpeg**,使用ffmpeg的转封装的功能来生成mp4文件,在转封装生 成mp4文件时,**记得需要加入-movflags +faststart,使其能够流化**; 2022-01-19 修改内容: 1、修正计算补帧时,少插一帧造成播放中断的问题; 2、修正在出现视频duration不设置时,出现的该流丢失的问题; 3、增加了m3u8的访问路径支持,生成的ts文件会与m3u8文件在同一目录下; 4、对于中间断流重推后,生成的视频长度与实际有差异,这个暂时没有处量,应 该是属于基本合理的现象; 2022-01-28 修改内容: 1、修正在音频补帧时在某些边界条件下会多补一帧,音频的处理尽量按时间填充 满,但不要多补,如果有不到一帧的时间间隙,可以保留,不需要补帧; 2、尽量按统一的duration来处理帧,因为视频与音频的处理方式有不同,视频的 duration与pts配合着使用,但以pts为主,但音频基本是按duration为主,pts 只是在有间断时候才会起作用(有些播放器),所以调整duration平滑性对于 音画同步非常重要; 3、前一版本对于异常的pts(dts)数据,直接丢弃,而偶尔会出现播放器异常停止 的现像,现在保留该帧数据,尝试修正pts来进行处理; 4、音频补帧的音量优化工作,尽量采用数据量小的帧,因为数据量小的帧,应该 接近于静音帧,所以会随着播放,补帧造成的电平声会越来越小; 2022-01-29 1.修正了因为dts小于或者等于最大的dts值时,不能插入帧的问题; 2.遗留问题:在取补帧数据时,可能会出现补充帧损坏的情况,这样造成整个补帧 的数据也无法进行解码,这种情况可能会造成播放器停止(有些播放器),补充 帧非I帧的情况也会有可能造成播放器停止,因为该程序没有做编解码,所以在编 码层面的问题,暂时无法在此程序中解决; 2022-02-10 1.修正了在视频没有设置duration时自动计算duration时出现的,因两帧之间 的pts差不正常,按错误值调整duration后,会造成整个视频异常;(默认 duration:3600,如果出现两帧之间差值不对,则差值大于1600的才能够更新视频 的默认值) 2022-02-17 1.针对于重复发包的情况,增加去除重复包的策略;在非B帧编码的情况下,如果当 前的pts小于max_pts则直接丢掉,但可能会影响到有些延时到达的包也会被丢弃, 这个改动有一定的风险,需要深度的测试; 2022-02-18 1.以前的音频补帧策略是:取头一个音频帧作为补充帧,然后不断的获取数据量小 的帧做为补充帧,但其实还是会在补帧处出现明显的电平声,该次修改是:如果 是AAC编码的音频,通过FFMPEG库中自带的编码器,按文件的编码参数直接生成 了一个静音帧,然后插帧的内容补充的是静音帧,以消除以前的电平声; 2022-02-23 1.程序运行时提示缺少一些动态链接库,把一些常用的库存放到lib64目录下,通 过"ldd concatTS"命令查看缺少的库,如果lib64下有相应的库,可以直接拷贝 到相应的目录(centos下应该是: /lib64) 即可正常的启动; 2022-03-30 1.修改调整策略,对于有些过期帧,可能是由于编码器的时间抖动造成的,尤其是 音频帧,直接去掉,可能会造成更严重的音画不同步,所以采用了一个折衷的方 案就是,保留所有的帧,对于小于当前PTS值的帧,则计算pts=max_pts+1进行处 理,对于所有的video帧的duration一致设为0,由播放器自动来处理; (在处理过和中视频的pts和duration是有作用的,其按设定的值进行处理,但音 频的pts和duration则是参考的,其更多的是根据连续帧的播放,所以如果中间 有中断或者异常都会造成音频的错位,切记!) 2.目前能够修复的内容: 1.断流重传, pts重新计算而造成的视频异常; 2.网络问题的视频丢包,出现的视音频不同步,或者视频播放停止; 3.编码器或者网络问题造成的包时间戳跳跃,而造成的音画不同步; 3.不能修复的: 1.缗码器重复帧而造成的音画不同步; 2.关键帧损坏或者丢失,而造成的音画不同步(会出现视频停止); 3.超过5分钟以上的断流; 2022-04-25 1.因为出现因为补帧的问题造成视频画面的花屏,所以调整了补帧的策略为: 视频不补帧,通过增加duration的方式来处理画面缺失问题,但因为可能会出现 重复帧和延后帧的情况,又需要保留,所以会出现画面闪动的情况,查不会花屏。 该方式验证了以前的问题视频,能够正常的进行处理; 2.音频帧保持以前补帧的策略不变 2022-1-4 北京 办公室 [xiaobo@yunshicloud.com](url)