ffmpeg添加mpeg ps流的pcm的解码支持

本文介绍如何改进FFmpeg以支持MPEG PS流,包括解决读取媒体类型问题及增加PCM编码支持的方法。
ffmpeg原本不支持mpeg ps流,原因有两个。首先在编码时,ffmpeg没有在流中写入psm头;其次,在解码时,只在读文件头的时候判断了流的类型,而ps流中,流类型是在psm头中的,这样ffmpeg会读不到流类型。
    要解决读不到媒体类型的问题,需要在mpeg.c函数中mpegps_read_packet函数中做修改,该函数是读取数据包的,如果没有文件头,那么执行到此函数中时,psm头不一定被读出了,换句话说音视频流不一定已经被分析出流类型关键字了,因此在 
        es_type = m->psm_es_type[startcode & 0xff];
这行代码之后要做出一个判断,这行代码是从已读出的psm头中获取本包的流类型,如果没有找到本包对应的流类型,es_type会等于0。所以在本段代码后应加上
        if (es_type == 0) goto skip;
即当没有获得本包的媒体类型时,应当跳过后续处理。
    pcm_mulaw在mpeg.c中虽然有支持,但判断了流媒体的类型,如果要所有的mpeg流都支持pcm_mulaw,就需要修改
         else if (m->imkh_cctv && es_type == 0x91) {
这个判断,改为
        else if (es_type == 0x91) {
即当es_type等于0x91时,判断本包为pcm_mulaw数据包。
    如果要增加对pcm_alaw的支持,需要在es_type的这片判断媒体类型的代码中添加
        else if(es_type == 0x90){
            codec_id = AV_CODEC_ID_PCM_ALAW;
            type = AVMEDIA_TYPE_AUDIO;
        }
此外,还需要es_type的判断代码之后,found:标记之前加上如下代码:
            if (codec_id == AV_CODEC_ID_PCM_ALAW)
            {
                st->codec->channels = 1;
                st->codec->sample_rate = 8000;
                st->codec->channel_layout = AV_CH_LAYOUT_MONO;
            }
该段代码是判断如果流是pam_alaw时,设置声道数、采样率、音频数据格式等声音参数,mpeg.c中已经有了codec_id等于AV_CODEC_ID_PCM_MULAW时的处理,可以在该段代码之后添加pam_alaw的声音参数设置。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值