我懂了这里(如何将.ts文件无损转换为主流格式?)建议将 MKV 用于此目的 ( ffmpeg -i input -map 0 -c copy output.mkv
),但是不是 MP4,据说这需要重新编码视频。
(基于此,我sh -c 'ffmpeg -i "$0" -map 0 -c copy "${0%%.*}".mkv' %f
在上下文菜单操作中使用了上述内容这里。
这里(如何将 .mkv 文件无损转换为 .mp4 文件?)我发现将 MKV 转换为 MP4 非常简单(无需重新编码ffmpeg -i input.mkv -codec copy output.mp4
),只需更改容器即可。
如果无需重新编码即可进行 TS->MKV->MP4 转换,那么直接进行 TS->MP4 是否也应该可行?
我已将该命令添加到我的文件管理器上下文菜单中sh -c 'ffmpeg -i "$0" -map 0 -c copy "${0%%.*}".mp4' %f
,并且它对于 .ts 文件来说运行起来没有问题,就像 .mkv 一样。
使用 Mediainfo 检查两个生成的 MP4 文件(TS->MP4
和TS->MKV->MP4
,其中->
是前面提到的命令)我看到有关它们的视频内容的基本相同的信息。
其余部分相同:
编码设置:cabac=1 / ref=1 / deblock=1:0:0 / analyze=0x3:0x3 / me=dia / subme=3 / psy=1 / psy_rd=1.00:0.00 / combined_ref=0 / me_range=16 / chroma_me=1 / trellis=0 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=0 /threads=8 / lookahead_threads=2 /sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=0 / b_adapt=1 / b_bias=0 / direct=1 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=25 / scenecut=40 / intra_refresh=0 / rc_lookahead=0 / rc=crf / mbtree=0 / crf=24.0 / qcomp=0.60 / qpmin=10 / qpmax=51 / qpstep=4 / vbv_maxrate=3000 / vbv_bufsize=3000 / crf_max=0.0 / nal_hrd=none / filler=0 / ip_ratio=0.71 / pb_ratio=1.30 / aq=1:1.00
答案1
TS > MP4?视情况而定™
是的,TS 视频可直接转换(重新混合)为 MP4 视频,无需重新编码视频和音频格式是否兼容。您的视频是H.264,这是目前MP4中最常见和最兼容的视频格式,因此将其从TS复制到MP4没有问题。
任意格式
TS 支持的格式比 MP4 多。如果您尝试将任意格式混合到 MP4 中,可能的结果如下:
成功- FFmpeg MP4 多路复用器和您的播放器/设备支持这些格式。
部分成功- FFmpeg MP4 复用器支持这些格式,但您的播放器/设备不支持。这可能是 MP4 支持的不常见或旧格式的情况。
失败- 不支持该格式,复用器将向您显示错误消息,例如
Could not find tag for codec foo in stream #0, codec not currently supported in container
建议的程序
因此,为了完全兼容,我建议重新编码,如果格式不是常见且被广泛支持的H.264或H.265/HEVC视频+AAC音频。
对于自动化,您可以使用ffprobe
它来确定格式。请参阅有没有办法在转码之前使用 ffmpeg 确定文件的编码?例如。然后在脚本中使用 if/then 语句来执行正确的命令。
字幕
主要例外是字幕。MP4 不支持很好的字幕。如果您的 TS 包含文本字幕(ASS/SSA、SRT),那么您可以将它们转换为定时文本(-c:s mov_text
),但播放器对定时文本字幕的支持并不普遍。必须排除基于图像的字幕,例如负向映射 -map 0 -map -0:s
。
答案2
我有来自 DLINK 安全摄像头的 200 多个 .ts 文件,我需要将它们无损拼接起来以供当局(保险)使用。
首先创建要合并的 ts 文件列表:
for i in `\ls *.ts | sort -V`; do echo "file '$i'"; done >> mylist.txt;
将它们合并为一个 ts:
ffmpeg -f concat -safe "0" -i mylist.txt -c copy merge.ts
然后将 ts 直接无损转换为当局熟知的格式
ffmpeg -i merge.ts -map 0 -c copy output.mp4