草庐IT

FFmpeg命令行实践二

响箭零零一 2023-07-10 原文

1 FFmpeg命令参数

1.1 主要参数

  • -i 设定输入流
  • -f 设定输出格式(format)
  • -ss 开始时间
  • -t 时间长度
#修改音视频容器格式为flv,拷贝编码格式,复制0-20s数据
ffmpeg -i test.mp4 -ss 0 -t 20 -codec copy -f flv out.flv
#-f参数可以省略,自动识别输出格式
ffmpeg -i test.mp4 -ss 0 -t 20 -codec copy out.flv

1.2 视频参数

  • -vframes 设置要输出的视频帧数
  • -b 设定视频码率
  • -b:v 视频码率
  • -r 设定帧速率
  • -s 设定画面的宽与高
  • -vn 不处理视频
  • -aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777
  • -vcodec 设定视频编解码器,如果用copy表示原始编解码数据必须被拷贝。
  • -vf 视频过滤器
#查看h265编码格式
ffmpeg -encoders | grep h265
--enable-libx265
#修改视频码率为64k,帧率30帧,分辨率:640x480,纵横比4:3,编码格式为h265
ffmpeg -i test.mp4 -vframes 5 -b 64k -r 30 -s 640x480 -aspect 4:3 -vcodec libx265 test-video-265.mp4
#提取视频数据
ffmpeg -i test.mp4 -vcodec copy -an test-no-audio.mp4

修改前:

修改后:
注意:修改后可以看到视频的码率并没有生效,所以参数之间是相互影响的。

1.3 音频参数

  • -aframes 设置要输出的音频帧数
  • -b:a 音频码率
  • -ar 设定采样率
  • -ac 设定声音的Channel数
  • -acodec 设定声音编解码器,如果用copy表示原始编解码数据必须被拷贝。
  • -an 不处理音频
  • -af 音频过滤器
#查看mp3编码格式
ffmpeg -encoders | grep mp3
A..... libmp3lame           libmp3lame MP3 (MPEG audio layer 3) (codec mp3)
#修改音频音频码率为64k,采样率为16000,双通道,编码格式为mp3,输出100帧大小
ffmpeg -i test.mp4 -aframes 100 -b:a 64k -ar 16000 -ac 2 -acodec libmp3lame test-audio.mp4 
#提取音频数据
ffmpeg -i test.mp4 -acodec copy -vn test-no-video.mp4

修改前:
修改后:

2 提取音视频数据

2.1 保留原数据格式

首先用mediainfo查看音视频格式,然后直接提取到对应文件

#提取文件中aac音频数据
ffmpeg -i test.mp4 -acodec copy -vn test-no-video.aac
#提取文件中h264视频码流
ffmpeg -i test.mp4 -vcodec copy -an test-no-audio.h264

2.2 指定编码格式提取数据

有时候需要将音视频格式转换为需要的格式,可以指定具体的编码格式进行编码,提取相关的数据。

#将视频编码格式转换为h265
ffmpeg -i test.mp4 -vcodec libx265 -an -vframes 5 test.h265 
#将音频转换为mp3
ffmpeg -i test.mp4 -acodec libmp3lame -vn test.mp3

2.3 提取视频像素格式

可以提取视频文件中的视频像素格式,比较常见的两种是yuv和rgb。这里需要注意像素格式是没有视频分辨率信息的需要在转换完成后将视频的分辨率附在名字上保证视频可以正常的播放。

#查看yuv格式
ffmpeg -pix_fmts | grep yuv

#提取视频像素格式为yuv420p,提取5s
ffmpeg -i test.mp4 -t 5 -pix_fmt yuv420p -s 320x240 test-yuv420p-320x240.yuv
#提取视频像素格式为rgb24
ffmpeg -i test.mp4 -t 5 -pix_fmt rgb24 -s 320x240 test-rgb24-320x240.rgb
#yuv420p转rgb24,需要指定输入的分辨率320x240
ffmpeg -s 320x240 -i test-yuv420p.yuv -pix_fmt rgb24 test-rgb24_320x240_1.rgb

2.4 播放视频像素格式文件

播放视频像素格式需要指定基本的像素格式和分辨率

#播放yuv420p格式文件,需要指定像素格式为yuv420p,视频分辨率320x240
ffplay -pixel_format yuv420p -video_size 320x240 -i test-yuv420p-320x240.yuv

2.5 提取音频pcm格式

提取pcm数据指定采样率,通道数和封装格式即可

#查询采样格式
ffmpeg -formats | grep PCM
DE s32le           PCM signed 32-bit little-endian
#提取pcm数据
ffmpeg -i test.mp3 -ar 16000 -ac 2 -f s16le 16000_2_s16le.pcm
#利用sample_fmt获取pcm数据
ffmpeg -sample_fmts | grep PCM
ffmpeg -i test.mp3 -ar 16000 -ac 2 -sample_fmt s16 16000_2_s16.wav
//利用encodec获取
ffmpeg -encoders | grep PCM
ffmpeg -i test.mp3 -ar 16000 -ac 2 -codec:a pcm_s16le 16000_2_s16le.wav

2.6 播放音频像素格式

播放pcm数据需要指定采样率,通道数和封装格式。

ffplay -ar 16000 -ac 2 -f s16le 16000_2_s16le.pcm

3 ffmpeg转封装格式

3.2 保留编码格式

保留封装格式的拷贝,这里需要注意的是保留封装格式-codec copy等价于-vcodec copy 加-acodec copy 加 -s copy即包含音频编码、视频编码和字幕。

#保留编码格式,转换封装格式为ts,
ffmpeg -i test.mp4 -codec copy -t 5 test.flv

3.2 指定编码格式

指定编码格式主要修改两个参数,一个是vcodec,一个是acodec。需要注意的是如何查找自己想要的格式名称,一般采用-encoders

#将MP4中原格式h264转为h265;音频aac转成mp3
ffmpeg -i test.mp4 -vcodec libx265 -acodec libmp3lame -t 5 test-h265-mp3.ts

3.2 修改视频参数

修改视频帧率、码率和分辨率

#修改视频码率为500k
ffmpeg -i test.mp4 -b:v 500k -t 5 test-bv500.ts
#修改视频帧率为10帧
ffmpeg -i test.mp4 -r:v 10 -t 5 test-rv10.ts
#修改视频分辨率为
ffmpeg -i test.mp4 -s:v 800x480 -t 5 test-sv10.ts
#修改音视频帧率
ffmpeg -i test.mp4 -r:v 10 -r:a 100 -t 5 test-rv10av10.ts

修改帧率为10
修改码率为500k

3.3 修改音频参数

修改音频码率、采样率和采样精度

#修改音频码率为500k
ffmpeg -i test.mp4 -b:a 500k -vcodec copy -t 5 test-av500.ts
#修改音频采样率16000
ffmpeg -i test.mp4 -r:a 16000 -vcodec copy -t 5 test-ar10.ts
#修改音频采样精度位16bit
ffmpeg -i test.mp4 -q:a 16 -vcodec copy -t 5 test-aq16.ts
#修改音视频帧率
ffmpeg -i test.mp4 -r:v 10 -r:a 100 -vcodec copy -t 5 test-rv10av10.ts

4 音视频裁剪

4.1 音视频文件裁剪

视频裁剪需要根据起始位置和裁剪时长两部分组成,这里裁剪起始位置可以用秒数来表示也可以用格式化00:00:00来裁剪。另外在视频转换格式时需要注意转换为了视频兼容性增加bsf过滤器来保证视频转换后能正常播放。

#裁剪视频从第5秒开始裁剪10s长度视频
ffmpeg -i test.mp4 -ss 00:00:05 -t 10 -codec copy test-ss10.mp4
#裁剪视频从第5秒开始裁剪10s长度视频,加vbsf为了提高转换的兼容性
ffmpeg -bsfs | grep h264
h264_mp4toannexb
ffmpeg -i test.mp4 -ss 00:00:05 -t 10  -codec copy -vbsf h264_mp4toannexb test-ss10vbsf.ts

4.2 音视频文件拼接

#视频拼接方式,concat命令进行拼接

ffmpeg -f concat -i mp4list.txt -codec copy test-concat2.mp4
vi mp4list.txt
file 'test.mp4'
file 'test-ss10.mp4'

5 视频与图片转换

视频转图片
图片转换时当转换多张图片时,需要利用格式化方式转换为多张图片。

#将视频转图片,%02d转换多张图片,转换一张图片可以用-vframes
ffmpeg -i test.mp4 -t 5 -s 640x360 -r 15 frame%03d.jpg

图片转视频

#将图片转为25帧率的mp4视频
ffmpeg -f image2 -i frame%02d.jpg -r 25 jpgtomp4.mp4

有关FFmpeg命令行实践二的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  3. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  4. ruby-on-rails - rbenv:从 RVM 移动到 rbenv 后,在 Jenkins 执行 shell 中找不到命令 - 2

    我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions

  5. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  6. ruby - 无法在 Ruby 中将 ffmpeg 作为子进程运行 - 2

    我正在尝试使用以下代码通过将ffmpeg实用程序作为子进程运行并获取其输出并解析它来确定视频分辨率:IO.popen'ffmpeg-i'+path_to_filedo|ffmpegIO|#myparsegoeshereend...但是ffmpeg输出仍然连接到标准输出并且ffmepgIO.readlines是空的。ffmpeg实用程序是否需要一些特殊处理?或者还有其他方法可以获得ffmpeg输出吗?我在WinXP和FedoraLinux下测试了这段代码-结果是一样的。 最佳答案 要跟进mouviciel的评论,您需要使用类似pope

  7. ruby-on-rails - Rails 中同一个类的多个关联的最佳实践? - 2

    我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来

  8. ruby - 从 Ruby : capturing the output while displaying the output? 运行 shell 命令 - 2

    我有一个问题。我想从另一个ruby​​脚本运行一个ruby​​脚本并捕获它的输出信息,同时让它也输出到屏幕。亚军#!/usr/bin/envrubyprint"Enteryourpassword:"password=gets.chompputs"Hereisyourpassword:#{password}"我运行的脚本文件:开始.rboutput=`runner`putsoutput.match(/Hereisyour(password:.*)/).captures[0].to_s正如您在此处看到的那样,存在问题。在start.rb的第一行,屏幕是空的。我在运行程序中看不到“输入您的密

  9. ruby-on-rails - 向 Rails 3 添加 Ruby 扩展方法的最佳实践? - 2

    我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion

  10. ruby - 是否有将图像文件转换为 ASCII 艺术的命令行程序或库? - 2

    有这样的事吗?我想在Ruby程序中使用它。 最佳答案 试试这个http://csl.sublevel3.org/jp2a/此外,Imagemagick可能还有一些东西 关于ruby-是否有将图像文件转换为ASCII艺术的命令行程序或库?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6510445/

随机推荐