两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 |
public:it:ffmpeg [2022/04/13 09:08] – [Tips] oakfire | public:it:ffmpeg [2023/08/15 14:48] (当前版本) – [FFmpeg] oakfire |
---|
* 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: 全局参数 |
</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> | * 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编程 ===== |
==== 硬解 ==== | ==== 硬解 ==== |
* 如果 ''avcodec_send_packet''时 packet参数 为 NULL,解码器进入 flush 模式,此时可循环 ''avcodec_receive_frame'' 获取缓存的frame, 直到返回 ''AVERROR_EOF'' | * 如果 ''avcodec_send_packet''时 packet参数 为 NULL,解码器进入 flush 模式,此时可循环 ''avcodec_receive_frame'' 获取缓存的frame, 直到返回 ''AVERROR_EOF'' |
* ''avcodec_flush_buffers'' 可直接清除解码器缓存帧,用于 seek 操作或切换流操作。 | * ''avcodec_flush_buffers'' 可直接清除解码器缓存帧,用于 seek 操作或切换流操作。 |
| * ffmpeg 在 android 上解码音频:[[https://medium.com/@donturner/using-ffmpeg-for-faster-audio-decoding-967894e94e71|using-ffmpeg-for-faster-audio-decoding]] |
| |
| |
} | } |
</code> | </code> |
* 大部分错误码为PIOSIX标准中错误码的负值 | * 大部分错误码为POSIX标准中错误码的负值 |
* 日志:提供了''av_log_set_callback''函数来设置日志回调函数,自行输出各等级日志,方便查看具体信息。回调函数必须线程安全。 | * 日志:提供了''av_log_set_callback''函数来设置日志回调函数,自行输出各等级日志,方便查看具体信息。回调函数必须线程安全。 |
| |