源资源来自教程,来自慕课网 李超,本人仅仅是添加注释

#include <stdlib.h>
#include <libavutil/timestamp.h>
#include <libavformat/avformat.h>static void log_packet(const AVFormatContext *fmt_ctx, const AVPacket *pkt, const char *tag)
{AVRational *time_base = &fmt_ctx->streams[pkt->stream_index]->time_base;printf("%s: pts:%s pts_time:%s dts:%s dts_time:%s duration:%s duration_time:%s stream_index:%d\n",tag,av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, time_base),av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, time_base),av_ts2str(pkt->duration), av_ts2timestr(pkt->duration, time_base),pkt->stream_index);
}int cut_video(double from_seconds, double end_seconds, const char* in_filename, const char* out_filename) {AVOutputFormat *ofmt = NULL;AVFormatContext *ifmt_ctx = NULL, *ofmt_ctx = NULL;AVPacket pkt;int ret, i;av_register_all();if ((ret = avformat_open_input(&ifmt_ctx, in_filename, 0, 0)) < 0) {fprintf(stderr, "Could not open input file '%s'", in_filename);goto end;}if ((ret = avformat_find_stream_info(ifmt_ctx, 0)) < 0) {fprintf(stderr, "Failed to retrieve input stream information");goto end;}av_dump_format(ifmt_ctx, 0, in_filename, 0);//输出上下文avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, out_filename);if (!ofmt_ctx) {fprintf(stderr, "Could not create output context\n");ret = AVERROR_UNKNOWN;goto end;}ofmt = ofmt_ctx->oformat;for (i = 0; i < ifmt_ctx->nb_streams; i++) {AVStream *in_stream = ifmt_ctx->streams[i];AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);if (!out_stream) {fprintf(stderr, "Failed allocating output stream\n");ret = AVERROR_UNKNOWN;goto end;}//拷贝流信息ret = avcodec_copy_context(out_stream->codec, in_stream->codec);if (ret < 0) {fprintf(stderr, "Failed to copy context from input to output stream codec context\n");goto end;}out_stream->codec->codec_tag = 0;if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;}av_dump_format(ofmt_ctx, 0, out_filename, 1);if (!(ofmt->flags & AVFMT_NOFILE)) {ret = avio_open(&ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE);if (ret < 0) {fprintf(stderr, "Could not open output file '%s'", out_filename);goto end;}}//写多媒体信息头ret = avformat_write_header(ofmt_ctx, NULL);if (ret < 0) {fprintf(stderr, "Error occurred when opening output file\n");goto end;}//定位跳去到指定流位置 秒数*时间基=开始剪切的位置ret = av_seek_frame(ifmt_ctx, -1, from_seconds*AV_TIME_BASE, AVSEEK_FLAG_ANY);if (ret < 0) {fprintf(stderr, "Error seek\n");goto end;}int64_t *dts_start_from = malloc(sizeof(int64_t) * ifmt_ctx->nb_streams);memset(dts_start_from, 0, sizeof(int64_t) * ifmt_ctx->nb_streams);int64_t *pts_start_from = malloc(sizeof(int64_t) * ifmt_ctx->nb_streams);memset(pts_start_from, 0, sizeof(int64_t) * ifmt_ctx->nb_streams);while (1) {AVStream *in_stream, *out_stream;ret = av_read_frame(ifmt_ctx, &pkt);if (ret < 0)break;in_stream  = ifmt_ctx->streams[pkt.stream_index];out_stream = ofmt_ctx->streams[pkt.stream_index];log_packet(ifmt_ctx, &pkt, "in");//和结束位置比较if (av_q2d(in_stream->time_base) * pkt.pts > end_seconds) {av_free_packet(&pkt);break;}if (dts_start_from[pkt.stream_index] == 0) {dts_start_from[pkt.stream_index] = pkt.dts;printf("dts_start_from: %s\n", av_ts2str(dts_start_from[pkt.stream_index]));}if (pts_start_from[pkt.stream_index] == 0) {pts_start_from[pkt.stream_index] = pkt.pts;printf("pts_start_from: %s\n", av_ts2str(pts_start_from[pkt.stream_index]));}/* copy packet *///时间基转换  pts 就是每一帧数据的播放时间 pkt.pts = av_rescale_q_rnd(pkt.pts - pts_start_from[pkt.stream_index], in_stream->time_base, out_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);pkt.dts = av_rescale_q_rnd(pkt.dts - dts_start_from[pkt.stream_index], in_stream->time_base, out_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);if (pkt.pts < 0) {pkt.pts = 0;}if (pkt.dts < 0) {pkt.dts = 0;}pkt.duration = (int)av_rescale_q((int64_t)pkt.duration, in_stream->time_base, out_stream->time_base);pkt.pos = -1;log_packet(ofmt_ctx, &pkt, "out");printf("\n");ret = av_interleaved_write_frame(ofmt_ctx, &pkt);if (ret < 0) {fprintf(stderr, "Error muxing packet\n");break;}av_free_packet(&pkt);}free(dts_start_from);free(pts_start_from);av_write_trailer(ofmt_ctx);
end:avformat_close_input(&ifmt_ctx);/* close output */if (ofmt_ctx && !(ofmt->flags & AVFMT_NOFILE))avio_closep(&ofmt_ctx->pb);avformat_free_context(ofmt_ctx);if (ret < 0 && ret != AVERROR_EOF) {fprintf(stderr, "Error occurred: %s\n", av_err2str(ret));return 1;}return 0;
}int main(int argc, char *argv[]){if(argc < 5){fprintf(stderr, "Usage: \command startime, endtime, srcfile, outfile");return -1;}double startime = atoi(argv[1]);double endtime = atoi(argv[2]);cut_video(startime, endtime, argv[3], argv[4]);return 0;
}

ffmpeg 视频的剪切相关推荐

  1. 用 ffmpeg 实现批量剪切视频

    title: 用 ffmpeg 实现批量剪切视频 date: 2018-01-21 17:03:27 tags: categories: 不要在意思这些细节 一直对编辑视频很有兴趣,上大学的时候学了一 ...

  2. Android 音视频深入 二十一 FFmpeg视频剪切

    视频剪切我意外的发现上一次的视频压缩的代码能够运行FFmpeg视频剪切的命令,但是不能做视频合并的命令,因为不能读取记录了几个视频的路径的txt文件. 这里我就说直说视频剪切的过程,不说代码,只说lo ...

  3. ffmpeg 视频剪辑常用命令

    1. 从视频中抽取帧 ffmpeg -i input.mp4 -r 1 -q:v 2 D:\images\img_%02d.jpeg -i 输入视频 -r 提取频率,每秒多少帧,可以为小数 -q:v ...

  4. python自动剪视频_python剪切视频与合并视频的实现

    windows10/python3.6环境需安装imageio,ffmpeg(视频中有教下载)文字中不体现太麻烦,看起来也不方便! 剪切代码python代码: import imageio image ...

  5. 使用FFmpeg4android 实现视频 水印 剪切 压缩 旋转

    翻看了一下自己的上一篇博客,7月5号写的......,瞬间不高兴了,写博客贵在坚持,而自己在这段时间确松懈下来了,实在不应该呀!罪过罪过! 最近这一段时间内,公司的项目迭代更新需要添加新的功能包括:视 ...

  6. ffmpeg视频处理教程

    1.ffmpeg简介 2.ffmpeg常用功能 3.ffmpeg的GPU加速 1.ffmpeg简介 FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或 ...

  7. 视频编解码的理论和实践2:Ffmpeg视频编解码

    近几年,视频编解码技术在理论及应用方面都取得了重大的进展,越来越多的人想要了解编解码技术.因此,网易云信研发工程师为大家进行了归纳梳理,从理论及实践两个方面简单介绍视频编解码技术. 相关阅读推荐 &l ...

  8. 在线短视频缩略图剪切工具

    在线短视频缩略图剪切工具 在线短视频缩略图剪切工具 本工具支持将图像切割成多个小图像块,分别用于不同的短视频封面,多个短视频在列表页形成一个整体图像. 可以点击右侧按钮查看实际使用效果图. https ...

  9. nginx RTMP FFmpeg 视频直播

    /***************************************************************************** nginx RTMP FFmpeg 视频直 ...

最新文章

  1. C语言不用strcmp函数比较字符串大小
  2. 人类血液中首次发现微塑料颗粒,饮料瓶塑料袋化妆品都是来源
  3. NSDictionary
  4. 1014 Waiting in Line (30 分) 【未完成】【难度: 难 / 知识点: 大模拟】
  5. ReenTrantLock可重入锁(和synchronized的区别)总结
  6. 如何更好的掌握一个知识点_如何成为一个更好的讲故事的人3个关键点
  7. 3dmax模型转换为*.FLT格式的建模要点
  8. php点链接直接现在文件吗,PHP实现点击a标签的href做链接时,直接保存文件(任何类型),而...
  9. 摄像头训练的吃豆人,我还是没活几集 | TensorFlow.js
  10. bitmap存入mysql,[MySQL] mysql中bitmap的简单运用
  11. Axure rp8元件库载入失败怎么解决
  12. iOS蓝牙开发(一)蓝牙相关基础知识
  13. 程序员工资一般多少_一般程序员真实工资 程序员工资薪酬大起底
  14. Redis学习笔记(四)—— redis的常用命令和五大数据类型的简单使用
  15. 可扩展标记语言XML(淅淅沥沥的小雨)
  16. php面向过程求圆 三角形 长方形计算,求,圆,三角形,长方形,梯形的面积,周长公式...
  17. MAVEN下载历史版本
  18. 基于Leaflet的leaflet-sidebar侧边栏组件集成
  19. ModelNet40点云数据集预处理
  20. Python对带光晕的任意纯色背景图像进行去背景色操作(保留透明效果、附源码)

热门文章

  1. asp实训报告摘要_个人网站实训报告---asp.NET 动态网站设计
  2. word横向网格线设置在哪里_word排版技巧:如何防止行距随字号而改变?
  3. 解决ray报错AttributeError: module ‘aioredis‘ has no attribute ‘create_redis_pool‘
  4. windows使用WSL安装linux子系统
  5. 解决python读取pickle报错ValueError: unsupported pickle protocol: 5
  6. python如何调用参数配置文件_【Python学习笔记七】从配置文件中读取参数
  7. 钉钉机器人自动推送股票信息
  8. 【APIO2009-3】抢掠计划
  9. oracle删除死锁进程
  10. 【shell编程基础0】bash shell编程的基本配置