一、参考资料
FFmpeg 官方文档:https://www.ffmpeg.org/documentation.html
FFmpeg 教程:https://wklchris.github.io/blog/FFmpeg/index.html
二、FFmpeg相关介绍
FFmpeg支持硬件加速类型
libavutil/hwcontext.h · ChinaFFmpeg/ffmpeg - Gitee.com
enum AVHWDeviceType {
AV_HWDEVICE_TYPE_NONE,
AV_HWDEVICE_TYPE_VDPAU,
AV_HWDEVICE_TYPE_CUDA,
AV_HWDEVICE_TYPE_VAAPI,
AV_HWDEVICE_TYPE_DXVA2,
AV_HWDEVICE_TYPE_QSV,
AV_HWDEVICE_TYPE_VIDEOTOOLBOX,
AV_HWDEVICE_TYPE_D3D11VA,
AV_HWDEVICE_TYPE_DRM,
AV_HWDEVICE_TYPE_OPENCL,
AV_HWDEVICE_TYPE_MEDIACODEC,
AV_HWDEVICE_TYPE_VULKAN,
AV_HWDEVICE_TYPE_D3D12VA,
AV_HWDEVICE_TYPE_AMF,
};
AV_HWDEVICE_TYPE_NONE
- 含义:表示不使用任何硬件加速。当选择此类型时,FFmpeg将仅依靠软件进行处理。
- 适用场景:在硬件加速不可用、不需要或者软件处理更适合某些特定情况(如精确的调试场景)时使用。
AV_HWDEVICE_TYPE_VDPAU
- 含义:VDPAU(Video Decode and Presentation API for Unix)是NVIDIA为Unix系统开发的视频解码和显示API。它允许将视频解码任务卸载到NVIDIA GPU上。
- 优点:
- 对于支持的NVIDIA GPU,能够高效地进行视频解码,减轻CPU的负担。
- 在Unix系统上可以利用NVIDIA的硬件能力实现流畅的视频播放和处理。
- 局限性:仅适用于NVIDIA GPU且在Unix系统下,并且需要安装相应的驱动和库。
AV_HWDEVICE_TYPE_CUDA
- 含义:CUDA是NVIDIA推出的一种并行计算平台和编程模型。在FFmpeg中使用CUDA可以利用NVIDIA GPU进行更广泛的视频处理任务,不仅仅是解码,还包括编码、滤镜处理等。
- 优点:
- 强大的并行计算能力,可显著提高视频处理速度,尤其是对于高清和超高清视频。
- 有丰富的NVIDIA GPU支持,在深度学习与视频处理结合的场景下非常有用。
- 局限性:需要NVIDIA GPU、CUDA工具包的安装,并且开发难度相对较高,因为涉及到CUDA编程知识。
AV_HWDEVICE_TYPE_VAAPI
- 含义:VA API(Video Acceleration API)是一种开源的视频加速API,主要用于Linux系统。它旨在提供一个通用的接口,使不同的视频处理硬件(如Intel和AMD的GPU)能够在Linux上实现视频加速。
- 优点:
- 跨不同硬件厂商的GPU(主要是Intel和AMD在Linux下),提供统一的视频加速接口。
- 有助于提高视频播放和处理效率,减少CPU使用率。
- 局限性:不同硬件的支持程度可能会有所差异,并且需要系统和驱动的良好支持。
AV_HWDEVICE_TYPE_DXVA2
- 含义:DXVA2(DirectX Video Acceleration 2)是Microsoft的Windows平台下的视频加速技术。它允许将视频解码任务交给GPU,以提高视频播放和处理性能。
- 优点:
- 在Windows系统中广泛支持,对于Windows下的视频播放和处理有很好的优化效果。
- 与Windows操作系统和DirectX生态系统紧密集成。
- 局限性:仅适用于Windows平台,并且依赖于系统中安装的DirectX版本和GPU驱动。
AV_HWDEVICE_TYPE_QSV
- 含义:QSV(Intel Quick Sync Video)是Intel的硬件视频编码/解码技术。FFmpeg通过此类型可以利用Intel GPU进行高效的视频处理。
- 优点:
- 对于Intel集成GPU,提供了快速的视频编码和解码能力。
- 低功耗且性能表现较好,特别适合于笔记本电脑等设备。
- 局限性:仅适用于Intel GPU,并且需要特定的驱动和Intel硬件支持。
AV_HWDEVICE_TYPE_VIDEOTOOLBOX
- 含义:VideoToolbox是Apple在macOS和iOS系统上的视频处理框架。FFmpeg可以通过这个类型利用Apple设备的硬件加速能力。
- 优点:
- 在Apple设备(Mac、iPhone、iPad等)上实现高效的视频处理,与苹果的硬件和系统紧密结合。
- 充分利用苹果设备的硬件优势,如A系列芯片的视频处理能力。
- 局限性:仅适用于Apple的macOS和iOS设备。
AV_HWDEVICE_TYPE_D3D11VA
- 含义:D3D11VA(Direct3D 11 Video Acceleration)是Microsoft基于Direct3D 11的视频加速技术。它为Windows系统下的视频处理提供了GPU加速的能力。
- 优点:
- 基于Windows平台的Direct3D 11,有广泛的应用和硬件支持。
- 可以用于多种视频处理任务的加速,如解码、编码等。
- 局限性:仅适用于Windows平台且需要支持Direct3D 11的硬件。
AV_HWDEVICE_TYPE_DRM
- 含义:DRM(Direct Rendering Manager)是Linux内核中的一个子系统,用于管理GPU的访问权限。在FFmpeg中,AV_HWDEVICE_TYPE_DRM可用于与DRM相关的视频处理硬件加速。
- 优点:
- 在Linux系统下,通过DRM可以更好地管理和利用GPU资源进行视频处理。
- 有助于实现安全和高效的视频播放和处理。
- 局限性:主要适用于Linux系统且与系统的DRM实现和硬件支持密切相关。
AV_HWDEVICE_TYPE_OPENCL
- 含义:OPENCL(Open Computing Language)是一个用于跨平台并行编程的开放标准。FFmpeg中的AVHWDEVICETYPE_OPENCL可以利用支持OPENCL的硬件(如GPU、FPGA等)进行视频处理的加速。
- 优点:
- 跨多种硬件平台,不仅限于特定品牌的GPU,可以包括FPGA等其他可并行计算的设备。
- 提供了一个开放的框架,方便开发人员根据不同硬件编写优化的视频处理代码。
- 局限性:需要硬件和驱动支持OPENCL,并且开发复杂度相对较高,需要对OPENCL编程有一定了解。
AV_HWDEVICE_TYPE_MEDIACODEC
- 含义:MediaCodec是Android系统中的多媒体编解码框架。FFmpeg通过这个类型可以在Android设备上利用系统的硬件加速能力进行视频处理。
- 优点:
- 在Android设备上实现高效的视频处理,与Android系统的多媒体框架紧密结合。
- 可以利用Android设备的硬件编解码能力,节省电量和提高处理速度。
- 局限性:仅适用于Android设备且依赖于Android系统的MediaCodec实现。
AV_HWDEVICE_TYPE_VULKAN
- 含义:Vulkan是一种新一代的图形和计算API。在FFmpeg中,AV_HWDEVICE_TYPE_VULKAN可用于利用支持Vulkan的硬件进行视频处理的加速。
- 优点:
- 提供了更低级别的硬件控制,可能带来更高的性能和效率。
- 作为新一代的API,有望在未来的硬件上得到更好的支持和优化。
- 局限性:需要硬件支持Vulkan,并且目前Vulkan在视频处理中的应用还在发展阶段,相关的开发资源和成熟度相对较低。
AV_HWDEVICE_TYPE_D3D12VA
- 含义:D3D12VA(Direct3D 12 Video Acceleration)是Microsoft基于Direct3D 12的视频加速技术。它是D3D11VA的升级版,为Windows系统下的视频处理提供更高效的GPU加速能力。
- 优点:
- 基于Windows平台的Direct3D 12,具有更好的性能和资源管理能力。
- 对于高性能视频处理需求(如游戏中的视频流处理)有更好的支持。
- 局限性:仅适用于Windows平台且需要支持Direct3D 12的硬件。
AV_HWDEVICE_TYPE_AMF
- 含义:AMF(Advanced Media Framework)是AMD推出的高级媒体框架。FFmpeg中的AVHWDEVICETYPE_AMF可以利用AMD硬件进行视频处理的加速。
- 优点:
- 对于AMD硬件,能够充分利用其GPU的视频处理能力。
- 提供了AMD特定的优化,可能在AMD平台上实现高效的视频处理。
- 局限性:仅适用于AMD硬件,并且需要安装AMD相关的驱动和软件支持。
FFmpeg 常用指令
# ffmpeg支持的编码器
ffmpeg -codecs
# ffmpeg支持的封装格式
ffmpeg -formats
# ffmpeg支持的封装格式
ffmpeg -muxers
# ffmpeg支持的解封装格式
ffmpeg -demuxers
-formats show available formats
-muxers show available muxers
-demuxers show available demuxers
-devices show available devices
-codecs show available codecs
-decoders show available decoders
-encoders show available encoders
-bsfs show available bit stream filters
-protocols show available protocols
-filters show available filters
-pix_fmts show available pixel formats
-layouts show standard channel layouts
-sample_fmts show available audio sample formats
-colors show available color names
-sources device list sources of the input device
-sinks device list sinks of the output device
-hwaccels show available HW acceleration methods
其他指令:
# 查看依赖库
ldd ./ffmpeg
# 查看版本
./ffmpeg -version
FFmpeg 转换指令
ffmpeg -i /data/test.wmv -c:v libx264 -c:a aac -strict -2 /data/output.mp4
-s <width>x<height>
:指定输出视频的分辨率大小;-b:v <bitrate>
:设置视频流的比特率;-r <fps>
:设置视频的帧率;-c:a copy
:复制音频流而不重新编码`;-c:v libx264
:使用libx264编码器对视频进行H.264编码;-preset ultrafast
:设置编码速度与质量之间的平衡,ultrafast表示非常快速但画面质量也较差;-crf <quality>
:控制视频的质量,值越小则质量越好,通常取18到23之间的数字;-threads <num_of_threads>
:并发处理线程数。
FFmpeg 视频转换
使用ffmpeg将h264视频转换为h265,支持qsv,cuda加速
ffplay 常用指令
ffplay
是 FFmpeg 套件中的媒体播放工具,支持大多数视频/音频格式。如果已安装 FFmpeg,通常可以直接使用它。
播放视频文件:
ffplay input.mp4
- 替换
input.mp4
为你的视频文件路径。 - 按
q
退出播放,按空格
暂停/继续。
播放完成后自动退出:
ffplay -autoexit input.mp4
播放rtsp视频流:
ffplay rtsp://192.168.1.100:8554/live
播放时调整速度:
ffplay -vf
ffmpeg 推流
# 接收端先监听(如用 ffplay)
ffplay tcp://0.0.0.0:8554?listen
ffplay -rtsp_transport tcp rtsp://0.0.0.0:8554/live
# 推流端
ffmpeg -i test.mp4 -f mpegts tcp://0.0.0.0:8554
三、FAQ
FFmpeg 常见问题
Q:Invalid data found when processing input
/mnt/test_video # ffmpeg -i person.mp4
ffmpeg version 4.3.8 Copyright (c) 2000-2024 the FFmpeg developers
built with gcc 11.1.0 (GCC)
configuration: --prefix=/home/yoyo/360Downloads/ffmpeg-4.3.8/ffmpeg_build --enable-shared --enable-static --enable-gpl --enable-version3 --enable-avresample --disable-asm --disable-optimizations --cross-prefix=arm-linux-gnueabihf- --target-os=linux --cc=arm-linux-gnueabihf-gcc --arch=arm --cpu=armv7 --enable-cross-compile --enable-small --disable-everything --enable-libx264 --enable-decoder=h264 --enable-parser=h264 --enable-demuxer=rtsp --extra-libs=-ldl --enable-ffmpeg --enable-protocol='file,http,rtmp' --extra-ldflags=-L/home/yoyo/360Downloads/x264/x264build/lib --extra-cflags=-I/home/yoyo/360Downloads/x264/x264build/include
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
libpostproc 55. 7.100 / 55. 7.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x492d0] moov atom not found
person.mp4: Invalid data found when processing input
错误原因:“moov atom” 一般在录制结束时才会写入,所以异常退出会导致 “moov atom” 缺失,进而无法播放。moov atom 包含视频的元数据和索引,视频播放器播放视频所需的信息也存储在 moov atom 中。当录制视频时录制设备突然关闭,使得 moov atom 丢失,从而出现 “moov atom not found” 错误。
方法一:untrunc-gui.exe 工具(暂未测试)
修复录制异常终止导致的 MP4 文件损坏(moov atom not found)
视频修复工具——untrunc使用指南(moov atom not found)
untrunc 代码仓库:https://github.com/Ch1h5ah/untrunc
untrunc-gui 代码仓库:https://github.com/tech-media/untrunc-gui
下载 untrunc-gui:https://github.com/anthwlock/untrunc/releases
方法二:EaseUS Fixo文件修复工具(暂未测试)
方法三:MP4Box 工具(暂未测试)
下载 MP4Box:https://www.videohelp.com/software/MP4Box
mp4box -add input.mp4 output.mp4
输出结果:
E:\MyProjects\test_video>mp4box -add demo.mp4 demo_output.mp4
IsoMedia import demo.mp4 - track ID 1 - Video (size 1920 x 1080)
IsoMedia import demo.mp4 - track ID 2 - Audio (SR 48000 - 2 channels)
Saving demo_output.mp4: 0.500 secs Interleaving
方法四:qt-faststart 工具(暂未测试)
qt-faststart input.mp4 output.mp4
E:\MyProjects\test_video>qt-faststart demo.mp4 demo_output.mp4
ftyp 0 32
moov 32 17369
free 17401 8
mdat 17409 28092128
last atom in file was not a moov atom
方法五:ffmpeg工具(暂未测试)
如果文件是本地生成的,可以使用 -movflags faststart
重新封装文件,并将 moov atom
移动到文件开头:
ffmpeg -i input.mp4 -c:v copy -c:a copy -movflags faststart output.mp4
输出结果:
E:\MyProjects\test_video>ffmpeg -i demo.mp4 -c:v copy -c:a copy -movflags faststart demo_output.mp4
ffmpeg version 7.1-full_build-www.gyan.dev Copyright (c) 2000-2024 the FFmpeg developers
built with gcc 14.2.0 (Rev1, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libaribcaption --enable-libdav1d --enable-libdavs2 --enable-libopenjpeg --enable-libquirc --enable-libuavs3d --enable-libxevd --enable-libzvbi --enable-libqrencode --enable-librav1e --enable-libsvtav1 --enable-libvvenc --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxeve --enable-libxvid --enable-libaom --enable-libjxl --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-dxva2 --enable-d3d11va --enable-d3d12va --enable-ffnvcodec --enable-libvpl --enable-nvdec --enable-nvenc --enable-vaapi --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libcodec2 --enable-libilbc --enable-libgsm --enable-liblc3 --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
libavutil 59. 39.100 / 59. 39.100
libavcodec 61. 19.100 / 61. 19.100
libavformat 61. 7.100 / 61. 7.100
libavdevice 61. 3.100 / 61. 3.100
libavfilter 10. 4.100 / 10. 4.100
libswscale 8. 3.100 / 8. 3.100
libswresample 5. 3.100 / 5. 3.100
libpostproc 58. 3.100 / 58. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'demo.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf61.1.100
Duration: 00:00:18.56, start: 0.000000, bitrate: 12116 kb/s
Stream #0:0[0x1](und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 12056 kb/s, 29.97 fps, 29.91 tbr, 29910 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : AVC Coding
Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 55 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Output #0, mp4, to 'demo_output.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf61.7.100
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 12056 kb/s, 29.97 fps, 29.91 tbr, 29910 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : AVC Coding
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 55 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
Press [q] to stop, [?] for help
[mp4 @ 000002005df74040] Starting second pass: moving the moov atom to the beginning of the file
[out#0/mp4 @ 000002005d3b5f40] video:27309KiB audio:125KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.062000%
frame= 556 fps=0.0 q=-1.0 Lsize= 27451KiB time=00:00:18.55 bitrate=12119.7kbits/s speed= 502x
如果文件损坏,可以尝试使用 -fflags +genpts
生成缺失的 PTS(Presentation Time Stamp):
ffmpeg -fflags +genpts -i input.mp4 -c copy output.mp4
E:\MyProjects\test_video>ffmpeg -fflags +genpts -i demo.mp4 -c copy demo_output.mp4
ffmpeg version 7.1-full_build-www.gyan.dev Copyright (c) 2000-2024 the FFmpeg developers
built with gcc 14.2.0 (Rev1, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libaribcaption --enable-libdav1d --enable-libdavs2 --enable-libopenjpeg --enable-libquirc --enable-libuavs3d --enable-libxevd --enable-libzvbi --enable-libqrencode --enable-librav1e --enable-libsvtav1 --enable-libvvenc --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxeve --enable-libxvid --enable-libaom --enable-libjxl --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-dxva2 --enable-d3d11va --enable-d3d12va --enable-ffnvcodec --enable-libvpl --enable-nvdec --enable-nvenc --enable-vaapi --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libcodec2 --enable-libilbc --enable-libgsm --enable-liblc3 --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
libavutil 59. 39.100 / 59. 39.100
libavcodec 61. 19.100 / 61. 19.100
libavformat 61. 7.100 / 61. 7.100
libavdevice 61. 3.100 / 61. 3.100
libavfilter 10. 4.100 / 10. 4.100
libswscale 8. 3.100 / 8. 3.100
libswresample 5. 3.100 / 5. 3.100
libpostproc 58. 3.100 / 58. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'demo.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf61.1.100
Duration: 00:00:18.56, start: 0.000000, bitrate: 12116 kb/s
Stream #0:0[0x1](und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 12056 kb/s, 29.97 fps, 29.91 tbr, 29910 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : AVC Coding
Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 55 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Output #0, mp4, to 'demo_output.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf61.7.100
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 12056 kb/s, 29.97 fps, 29.91 tbr, 29910 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : AVC Coding
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 55 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
Press [q] to stop, [?] for help
[out#0/mp4 @ 0000013b30467b00] video:27309KiB audio:125KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.062000%
frame= 556 fps=0.0 q=-1.0 Lsize= 27451KiB time=00:00:18.55 bitrate=12119.7kbits/s speed= 809x