ffmpeg h264 h265 视频格式操作

01.01 基本工具

H265 视频确认工具

ffmpeg下载:

参考: Win10系统如何安装64位ffmpeg
从 https://github.com/BtbN/FFmpeg-Builds/releases 下载win10 版本的static 版本的 ffmpeg 发布版本。
解压后把 ffmpeg.exe 的目录 ffmpeg-n5.0-latest-win64-gpl-5.0\bin 加入 PATH 环境变量。

注意:
A:文件名含 shared 是动态库版本,为了测试方便,尽量使用静态库版本,就是不带 shared 的。
B:gpl版本支持h264/h265,lgpl版本不支持h264/h265。

cmd 或者 Windows Terminal 中运行 ffmpeg -version 可以查看版本信息。

01.02 ffmpeg录屏

:: 1. 查看FFmpeg版本是否支持dshow设备
ffmpeg -formats | findstr dshow
:: 2 列举该计算机下所有视频捕捉设备(包括虚拟设备)
ffmpeg -list_devices true -f dshow -i dummy
:: 3 查看设备支持选项
ffmpeg -list_options true -f dshow -i video="Integrated Camera"
:: 4 直接播放笔记本电脑摄像头数据
ffplay -f dshow video="Integrated Camera"

# 录屏+声音,输出h264格式
# [麦克风阵列 (Realtek High Definition Audio)] 是麦克风的名称
ffmpeg -framerate 25  -thread_queue_size 4096 -f gdigrab -rtbufsize 670200k   -i desktop -thread_queue_size 4096  -f dshow -i audio="麦克风阵列 (Realtek High Definition Audio)" -crf 18 -vf scale=iw*0.8:ih*0.8  -vcodec libx264 -pix_fmt yuv420p -preset:v ultrafast -tune:v zerolatency -y h264.mp4

# 录屏+声音,输出h265格式
ffmpeg -framerate 25  -thread_queue_size 4096 -f gdigrab -rtbufsize 670200k   -i desktop -thread_queue_size 4096  -f dshow -i audio="麦克风阵列 (Realtek High Definition Audio)" -crf 18 -vf scale=iw*0.8:ih*0.8  -vcodec libx265 -pix_fmt yuv420p -preset:v ultrafast -tune:v zerolatency -y h265.mp4

# 给视频加水印
ffmpeg -i input.mp4 -i picture.jpg -filter_complex "overlay=20:20" output.mp4

[-i input.mp4]输入视频文件
[-i picture.jpg]输入图片文件
[-filter_complex “overlay=20:20”] -filter_complex这个参数是添加滤镜的,这里我们添加的滤镜是贴图,设置的位置是"overlay=20:20",意思就是距离顶部20个像素,距离左侧20个像素,也就是它会在左上角显示

# 用h265的 mp4 文件生成 h265的 m3u8 文件
ffmpeg -i panda265.mp4 -c:v libx265 -c:a aac -strict -2  -hls_time 4 -hls_list_size 6  -f hls pandah265.m3u8

# 查看可用设备
ffmpeg -hide_banner -devices

*********************************************************
Devices:
 D. = Demuxing supported
 .E = Muxing supported
 --
 D  dshow           DirectShow capture
 D  gdigrab         GDI API Windows frame grabber
 D  lavfi           Libavfilter virtual input device
  E sdl,sdl2        SDL2 output device
 D  vfwcap          VfW video capture
********************************************************

# 转换视频格式 h264 to h265
ffmpeg -i output.mp4  -vcodec  libx265 -preset slow -b:v 2000k  -crf  21 -strict -2 outh265.mp4

把一个 non-fragment MP4 转换成 fragment MP4。可以使用 FFmpeg 的 -movflags 来转换。

# 格式转换, 对于原始文件为非 MP4 文件:
ffmpeg -i trailer_1080p.mov -c:v copy -c:a copy -movflags frag_keyframe+empty_moov bunny_fragmented.mp4

# 格式转换,原始 MP4 转成 fragmented格式:
ffmpeg -i non_fragmented.mp4 -movflags frag_keyframe+empty_moov fragmented.mp4
# 也可以用 mp4fragment
mp4fragment --fragment-duration 1000 --force-i-frame-sync auto input.mp4 fragmented.mp4

# h264 mp4 转 fmp4,不能自动播放
ffmpeg -i non_fragmented.mp4 -movflags frag_keyframe+empty_moov fragmented.mp4
# h264 mp4 转 fmp4,可自动播放
mp4fragment --fragment-duration 1000 --force-i-frame-sync auto h265_mp4.mp4 h265_mse2.mp4
# h264 mp4 转 fmp4,(自动播放?)
ffmpeg -i panda264.mp4 -c copy -movflags frag_keyframe+faststart panda264mse.mp4
# h265 mp4 转 fmp4,(自动播放?)
ffmpeg -i panda265.mp4 -c copy -movflags frag_keyframe+faststart panda265mse.mp4


# 格式转换,fmp4 转 dash
ffmpeg -hide_banner -y -threads 0 -i hevc_ali_fragment.mp4 -c:v:0 libx265 -crf 25 -preset veryslow -c:v:1 libx265 -crf 27 -preset veryslow -g 150 -sc_threshold 0 -b_strategy 0 -seg_duration 2 -use_timeline 0 -use_template 1 -single_file 1 -adaptation_sets "id=0,streams=v id=1,streams=a" -f dash hevc_ali_dash5.mpd
# 格式转换 fmp4 转 dash
mp4dash fragmented.mp4


# 生成mp4 转换为 hls格式
ffmpeg -i panda264.mp4 -c:v libx264 -c:a aac -strict -2 -hls_time 4 -hls_list_size 6 -f hls pandah264hls.m3u8
ffmpeg -i panda265.mp4 -c:v libx265 -c:a aac -strict -2 -hls_time 4 -hls_list_size 6 -f hls pandah265hls.m3u8

参考

FFmpeg个人使用指南

Web端H.265播放器研发解密

修改Chromium源码实现HEVC/H.265 4K视频播放

ffmpeg 录制屏幕

FFmpeg 命令行 dshow滤镜使用说明

【FFmpeg】转码、压制、录屏、裁切、合并、提取、直播…(ffmpeg笔记)

FFMPEG硬件编解码器使用

流媒体视频基础 MSE 入门 & FFmpeg 制作视频预览缩略图和 fmp4

shaka-packager(分离音频和视频,支持 HLS 和 DASH)

mse-learning h265 demo

HLS+FMP4方案对H.265+AAC支持要点

三种 hevc 类型的demo文件
HEVC HLS with fMP4
HEVC HLS with TS (not supported by Apple)
HEVC MPEG-DASH

ffmpeg-all

ffmpeg-bitstream-filters

mp4parser可以在线查看mp4的具体格式,可能需要vpn

HTML 5 Audio/Video DOM canPlayType() 方法

mse 介绍

H5直播系列二 MSE(Media Source Extensions)

mp4info查看mp4 文件信息,可以直接下载编译好的工具)
mp4info download
mp4info download win

测试视频2

浏览器支持H.265解码总结

Chrome/Chromium HTML5 video 视频播放硬件加速

修改Chromium源码,实现HEVC/H.265 4K视频播放

Fragmented mp4(fmp4)

H5流式播放(FMP4转封装与mediaSource)
FMP4与DASH的概念理解

自适应流媒体传输(二)——为什么要使用fragmented MP4

在windows上使用ffmpeg命令行录制摄像头和桌面数据

mp4box 下载
mp4box winx64 下载
MP4Box wiki

项目记录:MPEG-DASH整理1
项目记录:MPEG-DASH整理2
项目记录:MPEG-DASH整理3
Nginx 搭建DASH服务器(从mp4文件生产dash的mpd,h265也可)

播放dash的demo

使用MediaCodec硬解码h.265视频及音频进行播放
mediacodec配置h265解码
Android音视频【七】H265硬编解码&视频通话
Android音视频【五】H265/HEVC&码流结构

未验证

Linux 下使用 ffmpeg 录屏

ffmpeg -f alsa -i pulse -f x11grab -r 30 -s 1920x1080 -i :0.0 -acodec aac -ac 1 -ar 44100 -qscale 0.01 -vcodec libx264 -preset ultrafast -crf 0 output.mp4
#-f alsa 指定录取声音的驱动
#-i pulse
#-f x11grab 指定录取的视频驱动,这里指屏幕
#-s 1920x1080 指定录制的像素
#-acodec aac 指定音频编码
#-vcodec libx264 指定视频编码
// 去掉视频中的音频
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
// -an: 去掉音频;-vcodec:视频选项,一般后面加copy表示拷贝
ffmpeg -i h264_mp4.mp4 -vcodec copy -an h264_mp4_no_sound.mp4
fmp4 格式
fmp4 是基于 MPEG-4 Part 12 的流媒体格式。

D:\ffmpeg\bin>ffmpeg -re -i d:\test.264 -g 52 -acodec libvo_aacenc -ab 64k -vcodec libx264 -vb 448k -f mp4 -movflags frag_keyframe+empty_moov d:\output.mp4


D:\ffmpeg\bin>ffmpeg -i d:\test.264 -g 52 -vcodec copy -f mp4 -movflags frag_keyframe+empty_moov d:\output.mp4

 

frag_keyframe 导致碎片输出,
empty_moov将导致输出100%分段; 没有这个,第一个片段将被多路复用为短片(使用moov),其后是片段中的其余媒体,
-re 在实时流传输(在媒体比特率上输出)时很有用,如果您正在创建文件,不要使用它,
-g 52 强制(至少)每第52帧作为关键帧

https://ffmpeg.org/ffmpeg-formats.html#Examples-9