ps流是一种很老的视频格式,最早来自于MPEG-1 Program Stream,也就是VCD光碟。由于mpeg1压缩算法早已被淘汰,但封装的协议ps格式被沿用至今。
ffmpeg源码中的ps格式解封装的部分位于源码\libavformat\mpeg.c
AVInputFormat ff_mpegps_demuxer = {
.name = "mpeg",
.long_name = NULL_IF_CONFIG_SMALL("MPEG-PS (MPEG-2 Program Stream)"),
.priv_data_size = sizeof(MpegDemuxContext),
.read_probe = mpegps_probe,
.read_header = mpegps_read_header,
.read_packet = mpegps_read_packet,
.read_timestamp = mpegps_read_dts,
.flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
};
我们如果用命令行解封装时通常是不需要指定格式的,会自动探测出封装的格式。当然如果我们知道要处理的文件格式为PS,可以使用iformat = av_find_input_format("mpeg")获取这种格式。
接下来谈谈如何通过命令行将视频文件格式转换为PS格式。
比如有一个h264 ES流文件,要转成PS文件,命令行可以是这样的:
ffmpeg -i test.h264 -codec copy -f mpeg test.ps
注意这里的封装格式写的是mpeg,写成其他的如vcd,vob,svcd,dvd也能够转换。具体可以查看ffmpeg相应的源码\libavformat\mpegenc.c