目录
一 32位编译
1 ffmpeg源码下载
2.1 下载minGW+msys
MinGW - Minimalist GNU for Windows-是Windows下模拟linux运行的库、头文件等的集合。
msys-Minimal SYStem-是Windows下模拟linux运行的最新系统,可以通过类似于linux bash的命令行窗口进行代码编译。
3配置minGW
MinGW下载完成后进入安装目录,如果是D:\MinGW 则目录为D:\MinGW\msys\1.0
用记事本打开msys.bat文件,在第一行加入:
call "D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\vcvars32.bat"
若是vs2019则如下:(注意安装目录结构不同)
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat"
call对应的目录为你的VC安装程序所在目录。
x64位编译与x86相同
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
4 下载yasm并配置
http://www.tortall.net/projects/yasm/releases/yasm-1.3.0-win64.exe
将下载好的yasm-1.3.0-win64.exe 或者 yasm-1.3.0-win32.exe 修改为 yasm.exe并拷贝到
E:\minGW\bin(minGW安装路径)。有网友拷贝到c:\windows\system32目录,亲测无效。
5 编译x264编码库
ffmpeg -encoders 可以发现,编码器没有h264,只有解码器有264.
自行下载x264源码 x264, the best H.264/AVC encoder - VideoLAN
./configure --enable-shared (--enable-static也行)
./configure --arch=x86_64 --enable-static
make
make install
你会发现x264库安装在路径 /usr/local/lib
ffmpeg编译时要带上以下参数
./configure --enable-shared --enable-libx264 --enable-sdl --enable-gpl --extra-cflags="-I/usr/local/include" --extra-ldflags="-L/usr/local/lib"
--extra-cflags 后面跟引入头文件目录,--extra-ldflags后面跟引入库目录
6 编译ffmpeg
cd D:\code\ffmpeg
./configure --enable-shared --disable-static --enable-libx264 --enable-gpl
若只./configure则没有dll文件,统一静态编译到ffmpeg.exe中。默认不支持h264编码,支持h264解码
二 64位编译
1 安装依赖库
源码下载见32位编译部分,安装msys2 64位 MSYS2
安装如下依赖:
x265需要安装cmake,自行安装
pacman -Syu
pacman -Su
pacman -S mingw-w64-x86_64-gcc
//(pacman -S mingw-w64-i686-gcc 32位编译链,可不用)
pacman -S base-devel
pacman -S nasm
pacman -S mingw-w64-x86_64-qt6
pacman -S mingw-w64-x86_64-cmake //cmake-gui.exe会找qt相关的库
pacman -S mingw-w64-x86_64-SDL2
2 x265编译
//设置10bit支持,source/CMakeLists.txt
option(HIGH_BIT_DEPTH "Store pixel samples as 16bit values (Main10/Main12)" ON)
//设置生成路径 /home/build,其他各库都生成在同一个目录,方便ffmpeg集成编译
cmake -G "MSYS Makefiles" -DCMAKE_INSTALL_PREFIX=/home/build ../../source && cmake-gui ../../source
sh make-Makefiles.sh
3 编译x264,sdl
./configure --prefix=/home/build --host=x86_64-w64-mingw32 --enable-shared --enabe-static --disable-asm
./configure --prefix=/home/build --host=x86_64-w64-mingw32 --enable-shared --enable-static
4 编译ffmpeg
./configure --prefix=./ffmpeg4.4_build --arch=x86_64 --enable-shared --enable-static --enable-libx265 --enable-libx264 --enable-gpl --extra-cflags="-I/home/build/include" --extra-ldflags="-L/home/build/lib"
5ubuntu编译ffmpeg
sudo apt install yasm nasm
sudo apt install pkg-config
./configure --prefix=./ffmpeg4.4_build --enable-shared --enable-libx265 --enable-libx264 --enable-gpl
not found pkg-config解决办法:
1) home\build\lib\pkgconfig\x265.pc 增加-lpthread
Libs.private: -lstdc++ -lgcc_s -lgcc -lgcc_s -lgcc -lpthread
2)配置环境变量
export PKG_CONFIG_PATH=/home/build/lib/pkgconfig
根据dll生成lib文件:
cp ./libx264.def ../build/lib/
cd ../build/lib
#若要生成64位lib文件则输入如下命令:
lib /machine:X64 /def:libx264.def
若lib command not found,可以使用vs lib工具解决
Visual Studio Tools command promopt
#若要生成32位lib文件则输入如下命令:
#lib /machine:i386 /def:libx264.def
也可以通过pexports.exe工具将dll转成lib
https://sourceforge.net/projects/mingw/files/MinGW/Extension/pexports/pexports-0.47/
三 参数详解
基本选项: | |
---|---|
-formats | 输出所有可用格式 |
-f fmt | 指定格式(音频或视频格式) |
-i filename | 指定输入文件名,在linux下当然也能指定:0.0(屏幕录制)或摄像头 |
-y | 覆盖已有文件 |
-t duration | 记录时长为t |
-fs limit_size | 设置文件大小上限 |
-ss time_off | 从指定的时间(s)开始, [-]hh:mm:ss[.xxx]的格式也支持 |
-itsoffset time_off | 设置时间偏移(s),该选项影响所有后面的输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持 |
-title string | 标题 |
-timestamp time | 时间戳 |
-author string | 作者 |
-copyright string | 版权信息 |
-comment string | 评论 |
-album string | album名 |
-v verbose | 与log相关的 |
-target type | 设置目标文件类型("vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", ...) |
-dframes number | 设置要记录的帧数 |
视频选项: | |
-b | 指定比特率(bits/s),似乎ffmpeg是自动VBR的,指定了就大概是平均比特率 |
-bitexact | 使用标准比特率 |
-vb | 指定视频比特率(bits/s) |
-vframes number | 设置转换多少桢(frame)的视频 |
-r rate | 帧速率(fps) (可以改,确认非标准桢率会导致音画不同步,所以只能设定为15或者29.97) |
-s size | 指定分辨率 (320x240) |
-aspect aspect | 设置视频长宽比(4:3, 16:9 or 1.3333, 1.7777) |
-croptop size | 设置顶部切除尺寸(in pixels) |
-cropbottom size | 设置底部切除尺寸(in pixels) |
-cropleft size | 设置左切除尺寸 (in pixels) |
-cropright size | 设置右切除尺寸 (in pixels) |
-padtop size | 设置顶部补齐尺寸(in pixels) |
-padbottom size | 底补齐(in pixels) |
-padleft size | 左补齐(in pixels) |
-padright size | 右补齐(in pixels) |
-padcolor color | 补齐带颜色(000000-FFFFFF) |
-vn | 取消视频 |
-vcodec codec | 强制使用codec编解码方式('copy' to copy stream) |
-sameq | 使用同样视频质量作为源(VBR) |
-pass n | 选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率 |
-passlogfile file | 选择两遍的纪录文件名为file |
-newvideo | 在现在的视频流后面加入新的视频流 |
高级视频选项 | |
-pix_fmt format | set pixel format, 'list' as argument shows all the pixel formats supported |
-intra | 仅适用帧内编码 |
-qscale q | 以<数值>质量为基础的VBR,取值0.01-255,约小质量越好 |
-loop_input | 设置输入流的循环数(目前只对图像有效) |
-loop_output | 设置输出视频的循环数,比如输出gif时设为0表示无限循环 |
-g int | 设置图像组大小 |
-cutoff int | 设置截止频率 |
-qmin int | 设定最小质量,与-qmax(设定最大质量)共用,比如-qmin 10 -qmax 31 |
-qmax int | 设定最大质量 |
-qdiff int | 量化标度间最大偏差 (VBR) |
-bf int | 使用frames B 帧,支持mpeg1,mpeg2,mpeg4 |
音频选项: | |
-ab | 设置比特率(单位:bit/s,也许老版是kb/s)前面-ac设为立体声时要以一半比特率来设置,比如192kbps的就设成96,转换 默认比特率都较小,要听到较高品质声音的话建议设到160kbps(80)以上。 |
-aframes number | 设置转换多少桢(frame)的音频 |
-aq quality | 设置音频质量 (指定编码) |
-ar rate | 设置音频采样率 (单位:Hz),PSP只认24000 |
-ac channels | 设置声道数,1就是单声道,2就是立体声,转换单声道的TVrip可以用1(节省一半容量),高品质的DVDrip就可以用2 |
-an | 取消音频 |
-acodec codec | 指定音频编码('copy' to copy stream) |
-vol volume | 设置录制音量大小(默认为256) <百分比> ,某些DVDrip的AC3轨音量极小,转换时可以用这个提高音量,比如200就是原来的2倍 |
-newaudio | 在现在的音频流后面加入新的音频流 |
字幕选项: | |
-sn | 取消字幕 |
-scodec codec | 设置字幕编码('copy' to copy stream) |
-newsubtitle | 在当前字幕后新增 |
-slang code | 设置字幕所用的ISO 639编码(3个字母) |
Audio/Video 抓取选项: | |
-vc channel | 设置视频捕获通道(只对DV1394) |
-tvstd standard | 设置电视标准 NTSC PAL(SECAM) |
要得到一个高画质音质低容量的MP4,首先画面最好不要用固定比特率,而用VBR参数。
示例:
设置输出视频文件的码率是64kbps,-b:v主要是控制平均码率。ffmpeg官方wiki比较建议,设置b:v时,同时加上 -bufsize,-bufsize 用于设置码率控制缓冲器的大小,设置的好处是,让整体的码率更趋近于希望的值,减少波动。
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
强制设置输出文件的帧率为24fps
ffmpeg -i input.avi -r 24 output.avi
强制输入文件的帧率为1fps(仅仅对原生格式有效)并且输出文件的帧率为24fps:
ffmpeg -r 1 -i input.m2v -r 24 output.avi
从时间为00:00:15开始,截取5秒钟的视频。
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
视频转码
ffmpeg -i input.mp4 -vcodec h264 output.mp4