文件切割是一项很常见的基本功能,通过Ffmpeg可以很容易实现这项功能。

  首先介绍下基本原理,文件切割说白了就过滤掉文件的部分音视频包,按照什么规则过滤呢?

答案是时间戳。文件中每个视频及音频包都有时间戳用来标识在哪个时间点该包被播放。当我们有过滤需求,

比如需要过滤掉视频文件的第3分钟到5分钟的视频,首先我们需要计算第三分钟及第五分钟的音视频包时间

戳区间,然后遍历视频文件中所有音视频包时间戳,不再查找区间的音视频包直接丢弃,最后将后半段音视频包

时间戳一致前移即可。

    基于Ffmpeg的开发流程如下图所示:

Ffmpeg 实现文件切割合并

二. 计算过滤区间

//第20S开始,去掉8S

int startPacketNum = 500;

int  discardtPacketNum = 200;

三 遍历过滤

while(true)

{

    auto packet = ReadPacketFromSource();

    if(packet)

    {

        packetCount++;

        if(packetCount <= 500 || packetCount >= 700)

        {

            if(packetCount >= 700)

            {

                if(packet->pts - lastPacketPts > 120)

                {

                    lastPts = lastPacketPts ;

                }

                else

                {

                    auto diff = packet->pts - lastPacketPts;

                    lastPts += diff;

                }

            }

            lastPacketPts = packet->pts;

            if(lastPts != AV_NOPTS_VALUE)

            {

              packet->pts = packet->dts = lastPts;

            }

            ret = WritePacket(packet);

        }

    }

    else

    {

      break;

    }

}

四:文件合并和文件切割一个道理,按照第一个视频的pts依次递增即可。

 

相关文章: