zoukankan      html  css  js  c++  java
  • Ffmpeg 实现文件切割

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

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

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

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

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

    时间戳一致前移即可。

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

    图1 视频文件切割流程图

    下面介绍代码:

    一. 打开视频文件获取音视频流信息

    int OpenInput(string inputUrl)
    {
    	inputContext = avformat_alloc_context();	
    	lastReadPacktTime = av_gettime();
    	inputContext->interrupt_callback.callback = interrupt_cb;
    	int ret = avformat_open_input(&inputContext, inputUrl.c_str(), nullptr,nullptr);
    	if(ret < 0)
    	{
    		av_log(NULL, AV_LOG_ERROR, "Input file open input failed
    ");
    		return  ret;
    	}
    	ret = avformat_find_stream_info(inputContext,nullptr);
    	if(ret < 0)
    	{
    		av_log(NULL, AV_LOG_ERROR, "Find input file stream inform failed
    ");
    	}
    	else
    	{
    		av_log(NULL, AV_LOG_FATAL, "Open input file  %s success
    ",inputUrl.c_str());
    	}
    	return ret;
    }
    

     二. 计算过滤区间

    //第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;
    	}
    }
    

      完整代码下载地址:http://pan.baidu.com/s/1o8Lkozw

    如需交流,可以加QQ群1038388075,766718184,或者QQ:350197870

    视频下载地址:http://www.chungen90.com/?news_3/

     Demo下载地址: http://www.chungen90.com/?news_2

  • 相关阅读:
    (转)AJAX开发中常用的Firefox Plugins
    几种流行的AJAX框架jQuery,Mootools,Dojo,Ext JS的对比
    Excel Oledb设置
    统计数据库中所有表的基本信息
    sql 分页加排序等写法
    sql 创建索引
    SQL Server复制需要有实际的服务器名称才能连接到服务器 错误解决方案
    转转:解决Error"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系。"
    Reflector7.5.2.1的Bug
    查询数据库所有依赖
  • 原文地址:https://www.cnblogs.com/wanggang123/p/6923441.html
Copyright © 2011-2022 走看看