使用ffmpeg实现视频裁剪并保持清高晰度

news/2024/7/10 22:14:38 标签: 音视频, ffmpeg

1 原始视频信息

通过ffmpeg -i命令查看视频基本信息

ffmpeg -i source.mp4
ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 12.2.0 (Rev10, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --pkg-config=pkgconf --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-dxva2 --enable-d3d11va --enable-libvpl --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband
  libavutil      58. 29.100 / 58. 29.100
  libavcodec     60. 31.102 / 60. 31.102
  libavformat    60. 16.100 / 60. 16.100
  libavdevice    60.  3.100 / 60.  3.100
  libavfilter     9. 12.100 /  9. 12.100
  libswscale      7.  5.100 /  7.  5.100
  libswresample   4. 12.100 /  4. 12.100
  libpostproc    57.  3.100 / 57.  3.100
[aist#0:1/pcm_s16be @ 000001f6000bbdc0] Guessed Channel Layout: stereo
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'source.mp4':
  Metadata:
    major_brand     : XAVC
    minor_version   : 17506303
    compatible_brands: XAVCmp42iso6
    creation_time   : 2023-10-28T07:08:28.000000Z
  Duration: 00:06:07.20, start: 0.000000, bitrate: 247096 kb/s
  Stream #0:0[0x1](und): Video: h264 (High 4:2:2 Intra) (avc1 / 0x31637661), yuv422p10le(tv, bt709, progressive), 3840x2160 [SAR 1:1 DAR 16:9], 238910 kb/s, 25 fps, 25 tbr, 25k tbn (default)
    Metadata:
      creation_time   : 2023-10-28T07:08:28.000000Z
      handler_name    : Video Media Handler
      vendor_id       : [0][0][0][0]
      encoder         : AVC Coding
  Stream #0:1[0x2](und): Audio: pcm_s16be (twos / 0x736F7774), 48000 Hz, 2 channels, s16, 1536 kb/s (default)
    Metadata:
      creation_time   : 2023-10-28T07:08:28.000000Z
      handler_name    : Sound Media Handler
      vendor_id       : [0][0][0][0]
  Stream #0:2[0x3](und): Data: none (rtmd / 0x646D7472), 5939 kb/s (default)
    Metadata:
      creation_time   : 2023-10-28T07:08:28.000000Z
      handler_name    : Timed Metadata Media Handler
      timecode        : 07:03:16:20

通过命令查看,原始视频信息

Video: h264 (High 4:2:2 Intra) (avc1 / 0x31637661), yuv422p10le(tv, bt709, progressive), 3840x2160 [SAR 1:1 DAR 16:9], 238910 kb/s, 25 fps, 25 tbr, 25k tbn (default)

分辨率为3840x2160,码率238910k, 帧率25

2 ffmpeg视频转换-保持清晰度

ffmpeg -i xy_b2.MP4 -r 25 -qscale 0 -q:v 1 -c:a aac -b:v 20000k -vf crop=1920:2160:960:0 xy_2k25p_b2.mp4

-qscale value:使用固定的视频量化标度(VBR),以value质量为基础的VBR,取值0.01-255,越小质量越好

  • -q:v:表示存储jpeg的图像质量

  • -b:v:设置输出文件的视频比特率(码率),本例中设置为与原视频相同

  • -c:a:指定音频编码器

  • -vf:设置视频滤镜,crop=$w:$h:$x_left:$y_top。w:指定宽度,h:指定高度,x_left:指定左侧的pos,y_top:指定顶部的pos

3 查看转换视频

ffmpeg -i output.mp4
ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 12.2.0 (Rev10, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --pkg-config=pkgconf --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-dxva2 --enable-d3d11va --enable-libvpl --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband
  libavutil      58. 29.100 / 58. 29.100
  libavcodec     60. 31.102 / 60. 31.102
  libavformat    60. 16.100 / 60. 16.100
  libavdevice    60.  3.100 / 60.  3.100
  libavfilter     9. 12.100 /  9. 12.100
  libswscale      7.  5.100 /  7.  5.100
  libswresample   4. 12.100 /  4. 12.100
  libpostproc    57.  3.100 / 57.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.16.100
  Duration: 00:06:07.20, start: 0.000000, bitrate: 20153 kb/s
  Stream #0:0[0x1](und): Video: h264 (High 4:2:2) (avc1 / 0x31637661), yuv422p10le(tv, bt709, progressive), 1920x2160 [SAR 1:1 DAR 8:9], 20014 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
    Metadata:
      handler_name    : Video Media Handler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.31.102 libx264
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 132 kb/s (default)
    Metadata:
      handler_name    : Sound Media Handler
      vendor_id       : [0][0][0][0]

转换后的视频参数如下:

Video: h264 (High 4:2:2) (avc1 / 0x31637661), yuv422p10le(tv, bt709, progressive), 1920x2160 [SAR 1:1 DAR 8:9], 20014 kb/s, 25 fps, 25 tbr, 12800 tbn (default)

分辨率为1920x2160,码率20014k, 帧率25

 4 FFmpeg介绍

FFmpeg项目由 Fabrice Bellard在2000年创立。到目前为止,FFmpeg项目的开发者仍然与VLC、MPV、dav1d、x264等多媒体开源项目有着广泛的重叠。Ffmpeg(FastForward Mpeg)是一款遵循GPL的开源软件,在音视频处理方面表现十分优秀,几乎囊括了现存所有的视音频格式的编码,解码、转码、混合、过滤及播放。作为最受欢迎的视频和图像处理软件,它被来自各行各业的不同公司所广泛使用。同时也是一款跨平台的软件,完美兼容Linux、Windows、Mac OSX等平台。其实它由3大部件组成,号称音视频处理工具三剑客:

  • Ffmpeg:由命令行组成,用于多媒体格式转换
  • Ffplay:基于ffmpeg开源代码库libraries做的多媒体播放器
  • Ffprobe:基于ffmpeg做的多媒体流分析器

       Ffmpeg 应该是 FFmpeg 工具集中最核心的利器,支持多种多样的编码器、解码器、封装格式、滤镜功能。FFmpeg框架的基本组成包含AVFormat、AVCodec、AVFilter、AVDevice、AVUtil等模块库,结构图如下:

  •  AVFormat–FFmpeg的封装模块

AVFormat中实现了目前多媒体领域中的绝大多数媒体封装格式,包括封装和解封装,如MP4、FLV、KV、TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式。FFmpeg是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的扩展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块。

  • AVCodec–FFmpeg的编解码模块

AVCodec中实现了目前多媒体领域绝大多数常用的编解码格式,即支持编码,也支持解码。AVCodec除了支持MPEG4、AAC、MJPEG等自带的媒体编解码格式之外,还支持第三方的编解码器,如H.264(AVC)编码,需要使用x264编码器;H.265(HEVC)编码,需要使用x264编码器;MP3(mp3lame)编码,需要使用libmp3lame编码器。如果希望增加自己的编码格式,或者硬件编解码,则需要在AVCodec中增加相应的编解码模块。

  • AVFilter–FFmpeg的滤镜模块

AVFilter库提供了一个通用的音频、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和多个输出。

  • swresample–FFmpeg的音频转换计算模块

swresample模块提供了高级别的音频重采样API。例如允许操作音频采样、音频通道布局转换与布局调整。

  • swscale–FFmpeg的视频图像转换计算模块

swscale模块提供了高级别的图像转换API,例如它允许进行图像缩放和像素格式转换,常见于将图像从1080p转换成720p或者480p等的缩放,或者将图像数据从YUV420p转换成YUYV,或者YUV转RGB等图像格式转换。

5 FFmpeg常用参数

5.1 能力集列表

  • -formats:列出支持的文件格式。
  • -codecs:列出支持的编解码器。
  • -decoders:列出支持的解码器。
  • -encoders:列出支持的编码器。
  • -protocols:列出支持的协议。
  • -bsfs:列出支持的比特流过滤器。
  • -filters:列出支持的滤镜。
  • -pix_fmts:列出支持的图像采样格式。
  • -sample_fmts:列出支持的声音采样格式。

5.2 常用输入选项

  • -i filename:指定输入文件名。
  • -f fmt:强制设定文件格式,需使用能力集列表中的名称(缺省是根据扩展名选择的)。
  • -ss hh:mm:ss[.xxx]:设定输入文件的起始时间点,启动后将跳转到此时间点然后开始读取数据。

对于输入,以下选项通常是自动识别的,但也可以强制设定。

  • -c codec:指定解码器,需使用能力集列表中的名称。
  • -acodec codec:指定声音的解码器,需使用能力集列表中的名称。
  • -vcodec codec:指定视频的解码器,需使用能力集列表中的名称。
  • -b:v bitrate:设定视频流的比特率,整数,单位bps。
  • -r fps:设定视频流的帧率,整数,单位fps。
  • -s WxH : 设定视频的画面大小。也可以通过挂载画面缩放滤镜实现。
  • -pix_fmt format:设定视频流的图像格式(如RGB还是YUV)。
  • -ar sample rate:设定音频流的采样率,整数,单位Hz。
  • -ab bitrate:设定音频流的比特率,整数,单位bps。
  • -ac channels:设置音频流的声道数目。

5.3 常用输出选项

  • -f fmt:强制设定文件格式,需使用能力集列表中的名称(缺省是根据扩展名选择的)。
  • -c codec:指定编码器,需使用能力集列表中的名称(编码器设定为”copy“表示不进行编解码)。
  • -acodec codec:指定声音的编码器,需使用能力集列表中的名称(编码器设定为”copy“表示不进行编解码)。
  • -vcodec codec:指定视频的编码器,需使用能力集列表中的名称(编解码器设定为”copy“表示不进行编解码)。
  • -r fps:设定视频编码器的帧率,整数,单位fps。
  • -pix_fmt format:设置视频编码器使用的图像格式(如RGB还是YUV)。
  • -ar sample rate:设定音频编码器的采样率,整数,单位Hz。
  • -b bitrate:设定音视频编码器输出的比特率,整数,单位bps。
  • -ab bitrate:设定音频编码器输出的比特率,整数,单位bps。
  • -ac channels:设置音频编码器的声道数目。
  • -an 忽略任何音频流。
  • -vn 忽略任何视频流。
  • -t hh:mm:ss[.xxx]:设定输出文件的时间长度。
  • -to hh:mm:ss[.xxx]:如果没有设定输出文件的时间长度的画可以设定终止时间点。

5.4 ffmpeg流标识

FFMPEG的某些选项可以对一个特定的媒体流起作用,这种情况下需要在选项后面增加一个流标识。流标识允许以下几种格式:

  • 流序号。譬如“:1”表示第二个流。
  • 流类型。譬如“:a“表示音频流,流类型可以和流序号合并使用,譬如“:a:1”表示第二个音频流。
  • 节目。节目和流序号可以合并使用。
  • 流标识。流标识是一个内部标识号。

假如要设定第二个音频流为copy,则需要指定-codec:a:1 copy

5.5 ffmpeg音频选项

  • -aframes:等价于frames:a,输出选项,用于指定输出的音频帧数目。
  • -aq:等价于q:a,老版本为qscale:a,用于设定音频质量。
  • -atag:等价于tag:a,用于设定音频流的标签。
  • -af:等价于filter:a,用于设定一个声音的后处理过滤链,其参数为一个描述声音后处理链的字符串。

5.6 ffmpeg视频选项

  • -vframes:等价于frames:v,输出选项,用于指定输出的视频帧数目。
  • -aspect:设置宽高比,如4:3、16:9、1.3333、1.7777等。
  • -bits_per_raw_sample:设置每个像素点的比特数。
  • -vstats:产生video统计信息。
  • -vf:等价于filter:v,用于设定一个图像的后处理过滤链,其参数为一个描述图像后处理链的字符串。
  • -vtag:等价于tag:v,用于设定视频流的标签。
  • -force_fps:强制设定视频帧率。
  • -force_key_frames:显式控制关键帧的插入,参数为字符串,可以是一个时间戳,也可以是一个 “expr:”前缀的表达式。如“-force_key_frames 0:05:00”、“-force_key_frames expr:gte(t,n_forced*5)”

5.7 ffmpeg滤镜选项

-filter_simple 添加简单滤镜

-filter_complex FILTER 添加复杂滤镜

5.8 ffmpeg高级选项

  • -re:要求按照既定速率处理输入数据,这个速率即是输入文件的帧率。
  • -map:指定输出文件的流映射关系。例如 “-map 1:0 -map 1:1”要求将第二个输入文件的第一个流和第二个流写入到输出文件。如果没有-map选项,ffmpeg采用缺省的映射关系。

5.9 ffprobe参数

简单的说,ffprobe 是一个多媒体流分析工具。它从多媒体流中收集信息,并且以人类和机器可读的形式打印出来。它可以用来检测多媒体流的容器类型,以及每一个多媒体流的格式和类型。它可以作为一个独立的应用来使用,也可以结合文本过滤器执行更复杂的处理。

  • -f format 强制使用某种格式
  • -sexagesimal 时间单元格式化 HOURS:MM:SS.MICROSECONDS
  • -pretty 格式美化
  • -print_format format 格式化(可选值: default, compact, csv, flat, ini, json, xml)
  • -of format -print_format别名
  • -select_streams stream_specifier 选择指定流
  • -sections 打印节的结构和信息
  • -show_data 显示包数据
  • -show_data_hash 显示包数据哈希值
  • -show_error 显示文件探测/检测错误
  • -show_format 显示格式或者容器信息
  • -show_frames 显示帧信息
  • -show_format_entry entry 根据格式/容器信息显示指定entry
  • -show_packets 显示包信息
  • -show_programs 显示程序信息
  • -show_streams 显示流信息
  • -show_chapters 显示章节信息
  • -count_frames 统计每个流的帧数
  • -count_packets 统计每个流的包数
  • -show_program_version 显示ffprobe版本
  • -show_library_versions show library versions
  • -show_versions show program and library versions
  • -show_pixel_formats 显示像素格式
  • -show_private_data show private data
  • -private same as show_private_data
  • -bitexact force bitexact output
  • -read_intervals read_intervals set read intervals
  • -default generic catch all option

5.10 ffplayer参数

  • -x 强制设置视频显示窗口的宽度
  • -y 强制设置视频显示窗口的高度
  • -S 设置视频显示的宽高
  • -fs 强制全屏显示
  • -an 屏蔽音频
  • -vn 屏蔽视频
  • -Sn 屏蔽字幕
  • -ss 根据设置的秒进行定位拖动
  • -t 设置播放视频/音频长度
  • -Bytes 设置定位拖动的策略,0为不可拖动,1为可拖动,-1为自动
  • -Nodisp 关闭图形化显示窗口
  • -f 强制使用设置的格式进行解析
  • -window_title 设置显示窗口的标题
  • -af 设置音频的滤镜
  • -Codec 强制使用设置的codec进行解码
  • -autorotate 自动旋转视频
  • -ast 设置将要播放的音频流
  • -vst 设置将要播放的视频流
  • -sst 设置将要播放的字幕流
  • -Stats 输出多媒体播放状态
  • -Fast 非标准化规范的多媒体兼容优化
  • -sync 音视频同步设置可设置根据音频视频进行参考,视频时间参考,或者外部扩展时间进行参考
  • -autoexit 多媒体播放完毕自动退出ffplay,ffplay默认播放完毕不退出播放器
  • -exitonkeydown 当有按键按下事件产生时退出ffplay
  • -exitonmousedown 当有鼠标按键事件产生时退出ffplay
  • -loop 设置多媒体文件循环播放次数
  • -framedrop 当CPU资 源占用过高时,自动丢帧
  • -infbuf 设置无极限的播放器buffer,这个选项常见于实时流媒体播放场景
  • -vf 视频滤镜设置
  • -acodec 强制使用设置的音频解码器
  • -vcodec 强制使用设置的视频解码器
  • -scodec 强制使用设置的字幕解码器

http://www.niftyadmin.cn/n/5299424.html

相关文章

3、事务与持久化

目录 1、事务 2、持久化 1. RDB 2.AOF 3.Redis的主从架构 4、哨兵 5、Redis的集群 1、事务 Redis事务:一次失误操作,该成功的成功,该失败的失败。 先开启事务,执行一些列的命令,但是命令不会立即执行&#xf…

如何编写一个javaAgent jar工具包超详细教程

介绍 Java Agent技术 Java Agent技术是JDK提供的用来编写Java工具的技术,使用这种技术生成一种特殊的jar包,这种jar包可以让Java程序 运行其中的代码。 Java Agent技术的两种模式 Java Agent技术实现了让Java程序执行独立的Java Agent程序中的代码…

【大数据面试知识点】Spark的DAGScheduler

Spark数据本地化是在哪个阶段计算首选位置的? 先看一下DAGScheduler的注释,可以看到DAGScheduler除了Stage和Task的划分外,还做了缓存的跟踪和首选运行位置的计算。 DAGScheduler注释: The high-level scheduling layer that i…

【MySQL】数据库之高级SQL查询语句补充

目录 一、补充正则表达式的查询regexp 二、补充case的用法 三、补充空值和null值的区别 一、补充正则表达式的查询regexp 要知道 在MySQL中使用正则表达式,一定要在前面加上regexp 正则表达式 ^ 匹配文本的开始字符 ‘^bd’ 匹配以 bd 开头的字符串 …

记事本在手机桌面上怎么找?手机里的记事本怎么找?

在日常生活、工作和学习中,我们时常需要随手记录一些重要的事项、灵感闪现的瞬间或者是待办的任务。比如,在超市购物前,列出购物清单;在开会时,记下重要的讨论点;在学习时,捕捉那一刹那的灵感。…

『OPEN3D』1.12 RGBD三维重建

目录 一、流程准备 1、数据集准备 2、重建参数配置 3、代码运行 二、代码解析</

基于Flutter构建小型新闻App

目录 1. 概述 1.1 功能概述 1.2 技术准备 1.3 源码地址 2. App首页 2.1 pubspec依赖 2.2 热门首页组件 2.2.1 DefaultTabController 2.2.2 Swiper 2.3 新闻API数据访问 2.4 热门首页效果图 3. 新闻分类 3.1 GestureDetector 3.2 新闻分类效果图 4. 收藏功能 4…

BOSS直聘上算法岗位的薪资分析

目录 一、数据介绍及预处理 1、数据介绍 2、数据预处理 二、数据分析 1、缺失值统计 2、岗位数量、薪资水平统计 3、企业维度岗位数量 4、top薪资岗位 三、划重点 少走10年弯路 元旦抽空爬取了一下BOSS直聘上base北京的算法岗位的相关数据&#xff0c;本文简单分析拿…