国标28181的PS流是打包在rtp中,传输给接收端播放的,如果要获取PS流的数据,就要把RTP包头去掉,拼在一起就是一个PS文件,这个文件是可以播放的。不过实际遇到的一个问题就是只有视频能播放,但声音出不来,用的是ffplay和vlc都一样。在用ffprobe查看流的信息,发现音频没有认出来。这是因为其中的音频流是G.711A,缺少声道和采样率的信息,这不像mp3音频格式每一帧都含有。ffmpeg中关于PS流解析的源码位于libavformat\mpeg.c,通过研究发现需要在保存PS流到文件的时候,先写入6个字节的文件头,其内容要求前4个字节为“IMKH”,表明这是海康的PS流,国标28181的音频G.711A的格式默认成单声道,8000,16位。这样一来,用ffprobe就能识别出音频流了,ffplay也能播放了。补充说明的是PS流中要包含PSM头(没有这个就不知道媒体类型,当然不能播放了),而系统头没有用到。
最近有人看了我上面写的还是不明白怎么做,我这里补充一下:由于ps流的规范里面的音频是mp2,是不支持G.711A格式的,所以才需要在文件最前面插入上面提到的6个字节。具体的做法就是产生一个新的ps文件,先写入那6个字节,再追加原来的PS文件。使用shell命令行操作可以参考下面的这篇文章:
拼接字符串和文件得到新的文件的命令_qiuchangyong的博客-CSDN博客_windows 命令行 字符串拼接
PS文件处理好了,就可以转换为mp4格式的,便于用各种播放器播放了。转换命令如下:
ffmpeg -i input.ps -vcodec copy -acodec aac output.mp4