public:it:ffmpeg

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
public:it:ffmpeg [2021/10/27 16:01] – [硬解] oakfirepublic:it:ffmpeg [2023/08/15 14:48] (当前版本) – [FFmpeg] oakfire
行 2: 行 2:
   * Official site:[[https://ffmpeg.org/|ffmpeg.org]]   * Official site:[[https://ffmpeg.org/|ffmpeg.org]]
   * 静态编译下载:[[https://johnvansickle.com/ffmpeg/]]   * 静态编译下载:[[https://johnvansickle.com/ffmpeg/]]
 +  * ffmpeg 原理:[[https://ffmpeg.xianwaizhiyin.net/]]
  
 ===== FFmpeg使用===== ===== FFmpeg使用=====
   * 命令行使用:https://www.ostechnix.com/20-ffmpeg-commands-beginners/   * 命令行使用:https://www.ostechnix.com/20-ffmpeg-commands-beginners/
   * 使用入门:https://www.ruanyifeng.com/blog/2020/01/ffmpeg.html   * 使用入门:https://www.ruanyifeng.com/blog/2020/01/ffmpeg.html
 +  * [[https://ffmpeg.guide/| 辅助工具,根据节点线框,生成对应的 FFmpeg 命令]]
   * FFmpeg 的命令可以分成五个部分:<code bash>ffmpeg [$1] {[$2] -i $3} ... {[$4] $5} ...</code>   * FFmpeg 的命令可以分成五个部分:<code bash>ffmpeg [$1] {[$2] -i $3} ... {[$4] $5} ...</code>
     * $1: 全局参数     * $1: 全局参数
行 26: 行 28:
 ==== 常用指令 ==== ==== 常用指令 ====
   * 列出支持的容器类型:''ffmpeg -formats''   * 列出支持的容器类型:''ffmpeg -formats''
-  * 列出支持的编码格式:''ffmpeg --codecs''+  * 列出支持的编码格式:''ffmpeg -codecs''
   * 列出安装的编码器:''ffmpeg -encoders''   * 列出安装的编码器:''ffmpeg -encoders''
   * 列出视频信息:''ffmpeg -i video.mp4''   * 列出视频信息:''ffmpeg -i video.mp4''
行 36: 行 38:
   * 生成画面带时间戳的测试视频:<code bash>ffmpeg -f lavfi -i testsrc=duration=100:size=1280x720:rate=30:decimals=2 -pix_fmt yuv420p -vcodec libx264 output.mp4   * 生成画面带时间戳的测试视频:<code bash>ffmpeg -f lavfi -i testsrc=duration=100:size=1280x720:rate=30:decimals=2 -pix_fmt yuv420p -vcodec libx264 output.mp4
 </code> 生成空画面测试视频:<code bash>ffmpeg -f lavfi -i color=c=blue:s=1280x720:r=30 -pix_fmt yuv420p ...</code>详细看 ffmpeg 滤镜文档[[https://ffmpeg.org/ffmpeg-filters.html#toc-allrgb_002c-allyuv_002c-color_002c-haldclutsrc_002c-nullsrc_002c-pal75bars_002c-pal100bars_002c-rgbtestsrc_002c-smptebars_002c-smptehdbars_002c-testsrc_002c-testsrc2_002c-yuvtestsrc|ffmpeg-filters]]。如果是实时视频流,比如往v4l2推流,加 ''-re'' 参数来以视频原始速度来生成:<code bash>ffmpeg -re -f lavfi -i color=c=blue:s=1280x720:r=30 -pix_fmt yuv420p -f v4l2 /dev/video0</code> </code> 生成空画面测试视频:<code bash>ffmpeg -f lavfi -i color=c=blue:s=1280x720:r=30 -pix_fmt yuv420p ...</code>详细看 ffmpeg 滤镜文档[[https://ffmpeg.org/ffmpeg-filters.html#toc-allrgb_002c-allyuv_002c-color_002c-haldclutsrc_002c-nullsrc_002c-pal75bars_002c-pal100bars_002c-rgbtestsrc_002c-smptebars_002c-smptehdbars_002c-testsrc_002c-testsrc2_002c-yuvtestsrc|ffmpeg-filters]]。如果是实时视频流,比如往v4l2推流,加 ''-re'' 参数来以视频原始速度来生成:<code bash>ffmpeg -re -f lavfi -i color=c=blue:s=1280x720:r=30 -pix_fmt yuv420p -f v4l2 /dev/video0</code>
 +  * mp4 转 m3u8 <code bash>ffmpeg -i input.mp4 -profile:v baseline -level 3.0 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls .\outputDir\index.m3u8</code>
 +  * 只测试解码不保存<code bash>ffmpeg -i input.mp4 -f null /dev/null</code>
 +  * rtsp 推流,使用 [[https://github.com/bluenviron/mediamtx|mediamtx]] 在8554端口建立rtsp 服务,此时可用 ffmpeg 推流:<code bash>ffmpeg -re -stream_loop -1 -i input.mp4 -vcodec copy -vbsf h264_mp4toannexb -f rtsp -rtsp_transport tcp rtsp://192.168.0.165:8554/chn_name</code>
 +  * 按比例缩放并补边:<code bash>ffmpeg -i input704x576.mp4 -vf "scale=384:216:force_original_aspect_ratio=decrease,pad=384:216:-1:-1:color=green" output.mp4</code>
 +  * 低延时播放测试:<code bash>ffplay -v debug -x 640 -y 380 https://192.168.0.151:6161/dev0.flv   -fflags nobuffer -analyzeduration 1000000</code>
 ===== FFmpeg编程 ===== ===== FFmpeg编程 =====
 ==== 硬解 ==== ==== 硬解 ====
   * ffmpeg 硬解:https://trac.ffmpeg.org/wiki/HWAccelIntro   * ffmpeg 硬解:https://trac.ffmpeg.org/wiki/HWAccelIntro
   * 硬解示例:https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/hw_decode.c   * 硬解示例:https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/hw_decode.c
-  * VAAPI: [[https://trac.ffmpeg.org/wiki/Hardware/VAAPI|ffmpeg]], 测试方式:<code>ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi -i input.mp4 -f null -</code> 注意,此条命令只测试硬解效率,实际硬解时时间主要耗费在从GPU拷贝数据 ''av_hwframe_transfer_data'' 速率慢。详见 [[https://zhuanlan.zhihu.com/p/69192869|采取GPU-COPY技术做Memory-Mapping]],   Intel 在 ffmpeg 上关于 QSV GPU-COPY 的提交:[[https://github.com/FFmpeg/FFmpeg/commit/5345965b3f088ad5acd5151bec421c97470675a4|lavc/qsvdec: Add GPU-accelerated memory copy support]] +  * VAAPI: [[https://trac.ffmpeg.org/wiki/Hardware/VAAPI|ffmpeg]], 测试方式:<code bash>ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi -i input.mp4 -f null -</code> 注意,此条命令只测试硬解效率,实际硬解时时间主要耗费在从GPU拷贝数据 ''av_hwframe_transfer_data'' 速率慢。详见  
-  * https://zhuanlan.zhihu.com/p/62246545+    * [[https://zhuanlan.zhihu.com/p/69192869|采取GPU-COPY技术做Memory-Mapping]],   
 +    * Intel 在 ffmpeg 上关于 QSV GPU-COPY 的提交:[[https://github.com/FFmpeg/FFmpeg/commit/5345965b3f088ad5acd5151bec421c97470675a4|lavc/qsvdec: Add GPU-accelerated memory copy support]] 
 +  * [[https://zhuanlan.zhihu.com/p/62246545|FFMPEG+Intel QSV硬解的环境安装]]
   * 这有个关于硬解解码后内存拷贝性能的[[https://github.com/Intel-Media-SDK/MediaSDK/issues/1550|讨论串]],看懂它   * 这有个关于硬解解码后内存拷贝性能的[[https://github.com/Intel-Media-SDK/MediaSDK/issues/1550|讨论串]],看懂它
   * Ubuntu18.04里的 ''i965_dri_video.so'' 有点老不能支持比较新的intel cpu, 判断方法:   * Ubuntu18.04里的 ''i965_dri_video.so'' 有点老不能支持比较新的intel cpu, 判断方法:
行 47: 行 56:
 00:02.0 VGA compatible controller: Intel  Corporation Device 3e98 (rev 02) 00:02.0 VGA compatible controller: Intel  Corporation Device 3e98 (rev 02)
 </code> </code>
-    * 在 [[https://github.com/intel/intel-vaapi-driver/blob/master/src/i965_pciids.h| i965_pciids.h]] 里查找上面所记的 0x3e98 如果有对应的id, 则可以编译对应新版本的 intel-vaapi-driver 来解决。如果没有,则大概需要使用 [[https://github.com/intel/media-driver|media-driver]]+    * 在 [[https://github.com/intel/intel-vaapi-driver/blob/master/src/i965_pciids.h| i965_pciids.h]] 里查找上面所记的 ''0x3e98'', 如果有对应的id, 则可以编译对应新版本的 intel-vaapi-driver 来解决。如果没有,则大概需要使用 [[https://github.com/intel/media-driver|media-driver]]
     * 更新libva 及 i965_dri_video.so 步骤:<code bash>     * 更新libva 及 i965_dri_video.so 步骤:<code bash>
 # 编译对应版本的libva # 编译对应版本的libva
-sudo apt install autoconf libtool+sudo apt install autoconf libtool build-essential pkg-config
 git clone  https://github.com/intel/libva.git git clone  https://github.com/intel/libva.git
 cd libva cd libva
行 57: 行 66:
 make make
 sudo make install sudo make install
 +
 # 编译 intel-vaapi-driver # 编译 intel-vaapi-driver
 git cone https://github.com/intel/intel-vaapi-driver.git git cone https://github.com/intel/intel-vaapi-driver.git
行 65: 行 75:
 make make
 sudo make install sudo make install
 +
 # 设置库路径就可以使用新驱动来硬解 # 设置库路径就可以使用新驱动来硬解
 export LD_LIBRARY_PATH=/opt/intel/libva/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=/opt/intel/libva/lib:$LD_LIBRARY_PATH
行 86: 行 97:
     codec_ctx_->thread_type = FF_THREAD_FRAME;     codec_ctx_->thread_type = FF_THREAD_FRAME;
 </code> </code>
 +  * 第三方库比如 libx264 libopenh264 是在解码时直接指定了才会用到,并且 ffmpeg 软解 h264 时使用的是内置解码器,所以编译 ffmpeg 时可以酌情去掉这些第三方库依赖。
 +  * 新的解码循环,''avcodec_send_packet''  与  ''avcodec_receive_frame'' 并不是一一对应的,两者是异步分开的
 +    * 例如h264软解时,解码器会缓存十几帧数据,即喂了十几个包才会出第一个帧,包与帧可按输入与接收的顺序来一一对应,或通过 pts 确定。
 +    * ''frame->best_effort_timestamp'' 可能是更好的帧播放 timestamp.
 +    * 如果 ''avcodec_send_packet''时 packet参数 为 NULL,解码器进入 flush 模式,此时可循环 ''avcodec_receive_frame'' 获取缓存的frame, 直到返回 ''AVERROR_EOF''
 +    * ''avcodec_flush_buffers'' 可直接清除解码器缓存帧,用于 seek 操作或切换流操作。
 +  * ffmpeg 在 android 上解码音频:[[https://medium.com/@donturner/using-ffmpeg-for-faster-audio-decoding-967894e94e71|using-ffmpeg-for-faster-audio-decoding]]
  
  
行 102: 行 120:
 } }
 </code> </code>
-  * 大部分错误码为PIOSIX标准中错误码的负值+  * 大部分错误码为POSIX标准中错误码的负值
   * 日志:提供了''av_log_set_callback''函数来设置日志回调函数,自行输出各等级日志,方便查看具体信息。回调函数必须线程安全。   * 日志:提供了''av_log_set_callback''函数来设置日志回调函数,自行输出各等级日志,方便查看具体信息。回调函数必须线程安全。
  
  • public/it/ffmpeg.1635321707.txt.gz
  • 最后更改: 2021/10/27 16:01
  • oakfire