音视频入门底子:MPEG2-PS专题(2)——利用FFmpeg命令天生ps文件 ...

打印 上一主题 下一主题

主题 1888|帖子 1888|积分 5664

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、错误的命令

通过FFmpeg命令可以将mp4文件转换为ps文件,PS文件中包罗PS流数据。
由于PS流/PS文件对应的FFInputFormat布局为:
  1. const FFInputFormat ff_mpegps_demuxer = {
  2.     .p.name         = "mpeg",
  3.     .p.long_name    = NULL_IF_CONFIG_SMALL("MPEG-PS (MPEG-2 Program Stream)"),
  4.     .p.flags        = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
  5.     .priv_data_size = sizeof(MpegDemuxContext),
  6.     .read_probe     = mpegps_probe,
  7.     .read_header    = mpegps_read_header,
  8.     .read_packet    = mpegps_read_packet,
  9.     .read_timestamp = mpegps_read_dts,
  10. };
复制代码


可以看到上述.p.name = "mpeg",所以理论上通过FFmpeg将mp4文件转换为ps文件的命令为:
  1. ./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命令修改为:
  1. ./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文件:



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表