zoukankan      html  css  js  c++  java
  • A script for splitting videos using ffmpeg v2

     //author:hnrayer@gmail.com
    #if _MSC_VER
    #define inline __inline
    #endif
    #include <libavformat/avformat.h>
    #include <libavcodec/avcodec.h>
    #include <libavutil/log.h>
    #include <stdio.h>
    #include <stdlib.h>
    #pragma warning(disable : 4996)
    int main(int argc, char **argv)
    {
    AVFormatContext *piFormatCtx = NULL;
    //the number of segments
    char *pszSegments = NULL;
    int   i_segments;       
    //the duration of each segment
    int sum_secs = 0;
    int step = 0;
    char szcmd[128];//command
    char *pszFullname;
    char drive[_MAX_DRIVE];
    char dir[_MAX_DIR];
    char fname[_MAX_FNAME];
    char ext[_MAX_EXT];
    if (argc < 3)
    {
    printf("usage: ffsplit infile num [num:the number of segments]\n");
    return -1;
    }
    pszSegments = argv[2];
    i_segments = atoi(pszSegments);
    //Register all formats and codecs
    av_register_all();
    //Open video file
    if(avformat_open_input(&piFormatCtx, argv[1], NULL, NULL) != 0)
    {
    return -1; 
    }
    //Retrieve stream information
    if(avformat_find_stream_info(piFormatCtx, NULL) < 0)
    {
    return -1; 
    }
    //print the info of duration
    av_log(NULL, AV_LOG_INFO, "  Duration: ");
    if (piFormatCtx->duration != AV_NOPTS_VALUE)
    {
    int hours, mins, secs, us;
    int64_t duration = piFormatCtx->duration + 5000;  
    secs = duration / AV_TIME_BASE;
    us = duration % AV_TIME_BASE; 
    mins = secs / 60;
    secs %= 60;
    hours = mins / 60;
    mins %= 60;
    av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d\n", hours, mins, secs, (100 * us) / AV_TIME_BASE); 
    sum_secs = hours*60*60 + mins*60 +secs;
    else 
    {
    av_log(NULL, AV_LOG_INFO, "N/A");
    }
    step = sum_secs / i_segments;
    pszFullname = piFormatCtx->filename;
    _splitpath(pszFullname, drive, dir, fname, ext);
    /////////////////////////////////////////
    sprintf(szcmd, "ffmpeg -i %s -codec copy -map 0 -f segment -segment_time %d %s_%%03d%s", argv[1], step, fname, ext);
    puts(szcmd);
    system(szcmd);
    ////////////////////////////////////////
    //Close the video file
    avformat_close_input(&piFormatCtx);
    return 0;
    }
  • 相关阅读:
    .NET控件ZedGraph使用帮助
    .NET多线程编程(转)
    DataTable 添加列、设置主键、添加行、查询、更新
    一个有用的Windows服务小程序——用来完成Server端的Socket通信[转载]
    (周星驰版)学习委托的最好实例 (转载+自己补充了注释)
    这样写
    DataTable添加列和行的方法
    简单工厂之简单模型(uml)
    学了delegate委托还有event事件的联系,基本学明白了。先总结一下吧。[转载]
    HDU_1240——三维空间DFS
  • 原文地址:https://www.cnblogs.com/elesos/p/3008523.html
Copyright © 2011-2022 走看看