You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修改FFmpeg命令解决转码后TS视频时长短于原MOV视频问题

我来帮你排查这个问题——你的TS视频时长变短,核心原因是处理YUV裸数据时未指定输入帧率,加上中间步骤丢失音频、封装时不必要的编码转换,咱们一步步解决:

问题根源拆解

先看你给出的ffprobe对比:

  • 原MOV是24fps,总时长12分14秒(约734秒),总帧数≈734×24=17620帧
  • 最终TS是25fps,时长11分44秒(约704秒),正好是17620÷25的结果

这说明:你处理YUV文件时,FFmpeg默认用25fps读取裸数据(YUV没有元数据,FFmpeg会用默认帧率),虽然你加了-x264-params fps=24,但输入帧率没指定,导致输出的H264实际按25fps编码,总帧数不变的情况下,自然时长缩短。另外原流程还完全丢失了音频,且封装TS时FFmpeg默认把H264转成了mpeg2video,完全没必要。


解决方案:两种可选方式

方式一:一步完成转换(最可靠,避免中间文件错误)

直接跳过YUV中间步骤,用FFmpeg直接转MOV到TS,自动继承原视频的帧率、分辨率和音频参数:

ffmpeg -i 00.mov -c:v libx264 -preset medium -crf 23 -c:a aac -b:a 192k 03.ts

参数说明:

  • -c:v libx264:沿用原视频的H264编码,保证兼容性
  • -preset medium:平衡编码速度和质量(可换成fast加快速度,或slower提升质量)
  • -crf 23:视频质量控制(数值越小质量越高,23是行业默认值)
  • -c:a aac -b:a 192k:将原MP3音频转成TS容器更兼容的AAC格式,比特率和原音频接近

方式二:必须分三步处理YUV(比如需要手动编辑YUV)

如果一定要保留YUV中间文件,每一步都要明确指定参数:

  1. 转YUV时强制匹配原视频参数
ffmpeg -i 00.mov -r 24 -s 1920x800 -pix_fmt yuv420p 01.yuv

-r 24强制输出帧率和原视频一致,确保YUV包含所有原视频帧。

  1. 编码YUV到H264时指定输入帧率
ffmpeg -r 24 -s 1920x800 -pix_fmt yuv420p -i 01.yuv -c:v libx264 -preset medium -crf 23 02.h264

-r 24放在-i前面,告诉FFmpeg输入YUV的帧率是24fps,避免用默认的25fps。

  1. 封装TS并添加原音频
    原流程丢失了音频,这里要把原MOV的音频提取并加入TS,同时直接复制视频流不重新编码:
ffmpeg -i 02.h264 -i 00.mov -c:v copy -c:a aac -b:a 192k 03.ts

-c:v copy避免视频重新编码,保证帧率和时长完全匹配。


验证结果

转换完成后用ffprobe检查TS文件,确认:

  • Duration和原MOV一致(00:12:14.17左右)
  • Video流的帧率为24fps
  • 包含正常的Audio流

内容的提问来源于stack exchange,提问作者Psycho

火山引擎 最新活动