音视频入门基础:MPEG2-PS专题(2)——使用FFmpeg命令生成ps文件

发布于:2025-02-11 ⋅ 阅读:(53) ⋅ 点赞:(0)

=================================================================

音视频入门基础:MPEG2-PS专题系列文章:

音视频入门基础:MPEG2-PS专题(1)——MPEG2-PS官方文档下载

音视频入门基础:MPEG2-PS专题(2)——使用FFmpeg命令生成ps文件

音视频入门基础:MPEG2-PS专题(3)——MPEG2-PS格式简介

音视频入门基础:MPEG2-PS专题(4)——FFmpeg源码中,判断某文件是否为PS文件的实现

音视频入门基础:MPEG2-PS专题(5)——FFmpeg源码中,解析PS流中的PES流的实现

音视频入门基础:MPEG2-PS专题(6)——FFmpeg源码中,获取PS流的视频信息的实现

音视频入门基础:MPEG2-PS专题(7)——通过FFprobe显示PS流每个packet的信息

=================================================================

一、错误的命令

通过FFmpeg命令可以将mp4文件转换为ps文件,PS文件中包含PS流数据。

由于PS流/PS文件对应的FFInputFormat结构为:

const FFInputFormat ff_mpegps_demuxer = {
    .p.name         = "mpeg",
    .p.long_name    = NULL_IF_CONFIG_SMALL("MPEG-PS (MPEG-2 Program Stream)"),
    .p.flags        = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
    .priv_data_size = sizeof(MpegDemuxContext),
    .read_probe     = mpegps_probe,
    .read_header    = mpegps_read_header,
    .read_packet    = mpegps_read_packet,
    .read_timestamp = mpegps_read_dts,
};

可以看到上述.p.name = "mpeg",所以理论上通过FFmpeg将mp4文件转换为ps文件的命令为:

./ffmpeg -i input.mp4 -vcodec libx264 -f mpeg video1.ps

通过命令:./ffmpeg -i XXX.ps可以查看生成的媒体文件的信息:

通过vlc也可以直接播放生成的媒体文件,并查看其信息:

通过上述命令似乎生成了一个MPEG2-PS文件,但实际上生成的是一个MPEG-1 系统容器。用Elecard Stream Analyzer工具可以查看到其内部包含的并不是PES流:

二、正确的命令

查阅FFmpeg的在线官方文档:FFmpeg Formats Documentation

可以看到“mpeg”是MPEG1-PS的多路复用器,“vob”才是MPEG2-PS的多路复用器。所以将其它格式的媒体文件转换为MPEG2-PS文件,需要加上“-f vob”选项:

所以将FFmpeg命令修改为:

./ffmpeg -i input.mp4 -vcodec libx264 -acodec pcm_s16be -f vob video2.ps

注意,音频编码器不能指定为AAC,即不能选择参数“-acodec aac”,因为FFmpeg(FFmpeg7.0.1)不支持生成音频压缩编码格式为AAC的MPEG-PS文件。如果指定为AAC,会报错:Unsupported audio codec. Must be one of mp1, mp2, mp3, 16-bit pcm_dvd, pcm_s16be, ac3 or dts:

通过命令:./ffmpeg -i XXX.ps可以查看生成的ps文件的信息:

用Elecard Stream Analyzer工具可以查看到其内部包含MPEG2-PS的Program Pack、System Header、PES Packet,证明这就是MPEG2-PS文件:


网站公告

今日签到

点亮在社区的每一天
去签到