FFmpeg命令行实践二
Posted 响箭零零一
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FFmpeg命令行实践二相关的知识,希望对你有一定的参考价值。
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
FFmpegWindows 搭建 FFmpeg 命令行运行环境
前言
Android 中需要使用到 FFMPEG , 先在 Windows 中搭建一个 FFMPEG 命令行环境 , 用于进行验证 , 测试 , 学习 ;
一、下载 FFMPEG
进入 FFMPEG 官网下载界面 http://www.ffmpeg.org/download.html ;
选择 Windows 平台的 " Windows builds by BtbN " 下载选项 , 然后会跳转到 GitHub 的 Release 发布版本界面 https://github.com/BtbN/FFmpeg-Builds/releases ;
上传到 CSDN 一份 , 放置 GitHub 可能无法访问 https://download.csdn.net/download/han1202012/19523705
在 GitHub 界面下载 最近的一个稳定版本 4.4 4.4 4.4 的文件 , ffmpeg-n4.4-19-g8d172d9409-win64-gpl-shared-4.4.zip , 如下图所示 ;
下载 ffmpeg-n4.4-19-g8d172d9409-win64-gpl-shared-4.4.zip 文件后 , 解压该文件 ;
上传到 CSDN 一份 , 放置 GitHub 可能无法访问 https://download.csdn.net/download/han1202012/19523705
二、拷贝可执行文件
bin 目录下是 dll 动态库 , 以及 可执行文件 ;
将 3 3 3 个可执行文件拷贝到 " C:\\Windows " 目录下 ,
三、拷贝动态库文件
将所有的 " .dll " 动态库拷贝到 " C:\\Windows\\System32 " 目录下 ;
吐槽下 , Windows 真会玩 , 64 64 64 位的动态库拷贝到 " C:\\Windows\\System32 " 目录下 , 32 32 32 位的动态库拷贝到 " C:\\Windows\\SysWOW64 " 目录下 ;
四、运行 ffmpeg 命令
查看 ffmpeg 版本号 :
ffmpeg -version
执行结果 :
C:\\Users\\octop>ffmpeg -version
ffmpeg version n4.4-19-g8d172d9409 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10-win32 (GCC) 20210408
configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --enable-shared --disable-static --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl --enable-libvmaf --enable-vulkan --enable-amf --enable-libaom --enable-avisynth --enable-libdav1d --enable-libdavs2 --enable-ffnvcodec --enable-cuda-llvm --enable-libglslang --enable-libgme --enable-libass --enable-libbluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2 --enable-libmfx --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --enable-libvidstab --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-ldexeflags= --extra-libs=-lgomp
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
总结
ffmpeg 命令运行环境搭建完毕 , 开始学习 ffmpeg 指令 ;
以上是关于FFmpeg命令行实践二的主要内容,如果未能解决你的问题,请参考以下文章
想要使用ffmpeg来完成如下两个功能: 1.视频截图 2.视频分割功能
FFmpegffmpeg 命令查询二 ( 比特流过滤器 | 可用协议 | 过滤器 | 像素格式 | 标准声道布局 | 音频采样格式 | 颜色名称 )
FFmpegffmpeg 命令查询一 ( 版本 | 编译配置 | 复用格式 | 编解码器 )