ffmpeg 命令行

ffmpeg -i k.mp4 -ss 00:00:00 -t 10 out.pm4

-ss 指定裁剪的开始时间,精确到秒
-t 被裁剪后的时长。

c代码实现

说一些主要
avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, out_filename);
创建输出的上下文
avcodec_parameters_copy(out_stream->codecpar, in_stream->codecpar);
out_stream->codecpar->codec_tag = 0;
拷贝参数
说明参数没有附加信息
 //打开输出文件(Open output file)
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;}}
if (dts_start_from[pkt.stream_index] == 0) {//dts默认设置为当前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 *///设置dts ptspkt.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");
avformat_write_header():写文件头(对于某些没有文件头的封装格式,不需要此函数。比如说MPEG2TS)。av_interleaved_write_frame():将AVPacket(存储视频压缩码流数据)写入文件。av_write_trailer():写文件尾(对于某些没有文件头的封装格式,不需要此函数。比如说MPEG2TS)。
ret = av_seek_frame(ifmt_ctx, -1, from_seconds*AV_TIME_BASE, AVSEEK_FLAG_ANY);
参数一: fmt_ctx为容器内容;
参数二: 流索引, stream_index
参数三: 将要定位处的时间戳
参数四: seek功能flag
那么如果需要seek到对应的时间戳处需要考虑几个问题:
1. 得到AVFormatContext信息
2. 需要得到stream_index信息
3. 需要设定将要定位的时间戳信息
4. seek功能需要根据需求设置

代码实现

#include <stdio.h>
#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, NULL);if (!out_stream) {fprintf(stderr, "Failed allocating output stream\n");ret = AVERROR_UNKNOWN;goto end;}ret = avcodec_parameters_copy(out_stream->codecpar, in_stream->codecpar);if (ret < 0) {fprintf(stderr, "Failed to copy context from input to output stream codec context\n");goto end;}out_stream->codecpar->codec_tag = 0;}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_packet_unref(&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 */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_packet_unref(&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;
}

ffmpeg 视频裁剪 命令行+C实现(无B帧视频)相关推荐

  1. 音视频处理 ffmpeg初级开发 命令行工具-实用命令

    参考链接 ffmpeg Documentation 作者:smallest_one  链接:FFmpeg命令行工具-实用命令 - 简书 目录 1,help命令使用 1.1 ffmpeg命令的语法结构 ...

  2. FFmpeg+Python打造命令行工具箱

    目录 总操作模式的设计 一次可以处理多个文件. 一个例子 多文件处理的技巧 参数设计 输出路径 工具一.Gif 转换器 方法来源 效果参考 实际指令 代码以及使用 工具二.画面裁切(crop) 参数 ...

  3. guvcview命令行 ubuntu_在Ubuntu上录制视频和编辑(很全)

    Linux多媒体三剑客: GIMP,Inkscape,Blender3D Blender基金会制作的开源微电影Sintel: http://www.sintel.org/about 电影采用Creat ...

  4. android可以剪辑代码的控件,Android 仿抖音视频裁剪范围选择控件,支持本地视频和网络视频...

    实现后效果:由于是在模拟器上跑的背面的封面列表加载不出来,实际效果请真机运行 image.png 具体代码如下: 绘制上层滑动控件部分 package com.cj.customwidget.widg ...

  5. ffmpeg 转码 iPhone 录制的 HDR 视频,命令行示例

    型号较新的 iPhone 默认录制高动态范围(High Dynamic Range,HDR)的视频,特点是亮度范围非常宽,能反映真实世界的亮度.但是在普通显示器上观看,其视觉效果取决于播放器,有时会发 ...

  6. FFmpeg下载及命令行使用

    下载地址 访问FFmpeg官网 选择Dlownload 选择 Windows Package 选择相应版本 点击进行下载,并进行解压,可得到如下几个文件 版本说明 Static: 只包含了3个体积很大 ...

  7. flv.js php,B站视频开源代码flv.js+HTML5无flash播放视频

    源码地址 https://github.com/bilibili/flv.js git clone https://github.com/bilibili/flv.js cd  flv.js-mast ...

  8. ffmpeg / avconv是通用的视频/音频编解码命令行工具【转】

    来自:http://blog.csdn.net/smilefyx/article/details/46793685 通用是既指他们可以处理各种各样的编码的视频和音频,转换成各种需要的格式,又指他们是跨 ...

  9. ffmpeg / avconv是通用的视频/音频编解码命令行工具

    转载自:http://blog.openlg.net/index.php/archives/767 ffmpeg / avconv是通用的视频/音频编解码命令行工具. 通用是既指他们可以处理各种各样的 ...

最新文章

  1. 目标检测coco数据集点滴介绍
  2. org.springframework.beans.factory.BeanCreationException:
  3. struts2 跳转类型 result type=chain、dispatcher、redirect
  4. OpenGL Cube Map立方体贴图的实例
  5. 中石油训练赛 - Gone Fishing(固定大小的圆可以覆盖最多的点)
  6. 加速财务自由的7种理财方法
  7. bp神经网络和softmax原理_BP人工神经网络常用传递函数
  8. python格式化输入_python-格式化(%,format,f-string)输出+输入
  9. 视频压缩编码基础知识(上)
  10. vscode 分析c代码_vs code(C语言)配置教程
  11. BZOJ1022 [SHOI2008]小约翰的游戏John (博弈论)
  12. 数据库原理及应用教程 第4版|微课版答案 陈志泊主编 课后习题答案
  13. 经典 55道 MySQL面试题及答案
  14. balenaEtcher-1.5.70可能是最好用的镜像写U盘工具 img to usb dmg to usb支持多种格式内附截图介绍多平台均有
  15. php工具箱怎么换php版本,最新php程序员工具箱 v1.0版本介绍
  16. 哪些平台需要申请EDI证?有流程介绍吗?
  17. 从零学IOS开发(一)
  18. 2021-05-10
  19. 【AI测试】人工智能测试整体介绍——第六部分
  20. 分享一个餐饮点餐小程序--蜜蜂点餐

热门文章

  1. 【微信多开】windows系统同时登陆多个微信
  2. #你不知道的javascript上卷# 总结
  3. oracle表启用online,Oracle数据库启动与关闭
  4. php 提取视频中的声音,如何提取视频中的声音,并把画面改成文字内容
  5. 有cad版本在线转换的方法吗,怎么转换
  6. C++自创打怪小游戏.
  7. Tsai库---分享一个好用的时间序列库
  8. 【UR #2】跳蚤公路
  9. C语言 结构体的定义和用法
  10. 【谷粒学院】阿里云视频点播VOD功能笔记