shijing 1 rok temu
rodzic
commit
1096d58110
14 zmienionych plików z 251 dodań i 6 usunięć
  1. BIN
      cap.mkv
  2. 2 0
      ffmpeg_cmd.md
  3. 30 0
      ffmpeg_io.md
  4. 210 6
      ffmpeg工具手册.md
  5. 9 0
      ffmpeg整体学习框架.md
  6. BIN
      img_10.png
  7. BIN
      img_11.png
  8. BIN
      img_12.png
  9. BIN
      img_13.png
  10. BIN
      img_14.png
  11. BIN
      img_8.png
  12. BIN
      img_9.png
  13. BIN
      out.avi
  14. BIN
      out.png

BIN
cap.mkv


+ 2 - 0
ffmpeg_cmd.md

@@ -4,6 +4,8 @@
 
 1. ffmpeg  命令打印过程中都是些什么含义
 2. 常用场景
+3. 采集时使用大分辨率,输出是指定`-c copy`,输出 yuv 文件,播放时视频分辨率不正确,画面上下滚动?
+   > ![img_11.png](img_11.png)
 
 ```Shell
 usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

+ 30 - 0
ffmpeg_io.md

@@ -10,6 +10,36 @@ https://zhuanlan.zhihu.com/p/597299940
 
 https://zhuanlan.zhihu.com/p/618769012#:~:text=1%20%E5%85%A8%E5%B1%80%E5%8F%82%E6%95%B0%EF%BC%9A%E6%97%A5%E5%BF%97%E8%BE%93%E5%87%BA%EF%BC%8C%E6%96%87%E4%BB%B6%E8%A6%86%E7%9B%96%E7%AD%89%E5%85%A8%E5%B1%80%E9%80%89%E9%A1%B9.%202%20%E8%BE%93%E5%85%A5%E6%96%87%E4%BB%B6%E5%8F%82%E6%95%B0%EF%BC%9A%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6%E7%9A%84%E8%BE%93%E5%85%A5%E9%80%89%E9%A1%B9%203%20%E8%BE%93%E5%85%A5%E6%96%87%E4%BB%B6,4%20%E8%BE%93%E5%87%BA%E6%96%87%E4%BB%B6%E5%8F%82%E6%95%B0%EF%BC%9A%E8%BD%AC%E6%8D%A2%EF%BC%88%E7%BC%96%E8%A7%A3%E7%A0%81%E5%99%A8%EF%BC%8C%E8%B4%A8%E9%87%8F%E7%AD%89%EF%BC%89%E6%88%96%E8%BF%87%E6%BB%A4%E6%88%96%E6%B5%81%E6%98%A0%E5%B0%84%205%20%E8%BE%93%E5%87%BA%E6%96%87%E4%BB%B6%206%20%E5%8F%82%E6%95%B0%E5%A4%AA%E5%A4%9A%E7%9A%84%E6%97%B6%E5%80%99%EF%BC%8C%E4%B8%BA%E4%BA%86%E4%BE%BF%E4%BA%8E%E6%9F%A5%E7%9C%8B%EF%BC%8Cffmpeg%20%E5%91%BD%E4%BB%A4%E5%8F%AF%E4%BB%A5%E5%86%99%E6%88%90%E5%A4%9A%E8%A1%8C%E3%80%82
 
+https://zhuanlan.zhihu.com/p/117523405
+
+
+Codecs:
+D..... = Decoding supported
+.E.... = Encoding supported
+..V... = Video codec
+..A... = Audio codec
+..S... = Subtitle codec
+..D... = Data codec
+..T... = Attachment codec
+...I.. = Intra frame-only codec
+....L. = Lossy compression
+.....S = Lossless compression
+
+D. = Demuxing supported
+.E = Muxing supported
+
+T.. = Timeline support
+.S. = Slice threading
+..C = Command support
+
+I.... = Supported Input  format for conversion
+.O... = Supported Output format for conversion
+..H.. = Hardware accelerated format
+...P. = Paletted format
+....B = Bitstream format
+
+.D.........
+
 ### 输入
 
 1. 文件输入

+ 210 - 6
ffmpeg工具手册.md

@@ -30,7 +30,7 @@
 
 视频处理 - 抽帧:
 
-视频输出 - 播放:
+<a id="video-play-title">[视频输出 - 播放](#video-play)</a>
 
 视频输出 - 文件:
 
@@ -56,7 +56,7 @@
 
 音频处理 - 变速:
 
-音频输出 - 播放:
+<a id="audio-play-title">[音频输出 - 播放](#audio-play)</a>
 
 音频输出 - 文件:
 
@@ -97,7 +97,17 @@
    > [avfoundation @ 0x7fe78f204300]   0rgb  
    > [avfoundation @ 0x7fe78f204300]   bgr0
 3. `-vframes` 视频帧数
-4. `-framerate` / `-r` 指定视频帧率, 默认是 ntsc, 60ifps, 使用摄像头时必须指定
+4. `-framerate` / `-r` 指定视频帧率, 默认是 ntsc, 60ifps 输入设备选择选择摄像头时,如果设备不支持,不会自动默认,必须手动指定
+   > [avfoundation @ 0x131e06650] Selected framerate (29.970030) is not supported by the device.  
+   > [avfoundation @ 0x131e06650] Supported modes:  
+   > [avfoundation @ 0x131e06650]   1920x1080@[1.000000 30.000000]fps  
+   > [avfoundation @ 0x131e06650]   1280x720@[1.000000 30.000000]fps  
+   > [avfoundation @ 0x131e06650]   1080x1920@[1.000000 30.000000]fps  
+   > [avfoundation @ 0x131e06650]   1760x1328@[1.000000 30.000000]fps  
+   > [avfoundation @ 0x131e06650]   640x480@[1.000000 30.000000]fps  
+   > [avfoundation @ 0x131e06650]   1328x1760@[1.000000 30.000000]fps  
+   > [avfoundation @ 0x131e06650]   1552x1552@[1.000000 30.000000]fps
+   >
    > i 代表隔行扫描,p 代表逐行扫描  
    > ![img_5.png](img_5.png)
 5. `-video_size` / `-s` 指定视频帧宽高
@@ -110,6 +120,74 @@
 
 ##### 不常用参数/不常用参数取值,如何通过help获取
 
+1. `-rc_override override` 运行时覆盖编码器和解码器的参数
+2. `-pass n -passlogfile prefix` 指定两次编码过程中日志文件路径,便于第二次编码参考第一次编码日志进行优化
+3. `-vstats` 将视频编码统计数据转储到vstats_HHMMSS.log
+4. `-vstats_file file` 将视频编码统计信息转储到文件
+5. `-vstats_version` 指定要使用哪个版本的 vstats 格式
+6. `-intra_matrix matrix` 指定自定义的帧内预测矩阵
+7. `-chroma_intra_matrix` 指定自定义的色度帧内预测矩阵
+8. `-vtag fourcc/tag` 指定视频编码器标签(Video Tag)的选项, 示例: `-vtag h264`
+9. `-fps_mode` 设置视频同步方法/帧率模式
+   > passthrough (0) 每个帧及其时间戳从解复用器传递到复用器  
+   > cfr (1) 帧将被复制和丢弃,以准确实现所请求的恒定帧速率  
+   > vfr (2) 帧会连同其时间戳一起通过或丢弃,以防止 2 个帧具有相同的时间戳   
+   > drop 作为直通,但会破坏所有时间戳,使复用器根据帧速率生成新的时间戳  
+   > auto (-1) 根据复用器功能在 CFR 和 VFR 之间进行选择。这是默认方法
+10. `-force_fps` 用于强制设置输出视频的帧率,无论输入视频的原始帧率是多少
+11. `-streamid streamIndex:value` 将新的stream-id值分配给输出流
+    > 例如,要将输出 mpegts 文件的流 0 PID 设置为 33,将流 1 PID 设置为 36  
+    `ffmpeg -i inurl -streamid 0:33 -streamid 1:36 out.ts`
+12. `-force_key_frames timestamps` 强制在指定的时间点或帧数处生成关键帧(I帧)
+    > 使用示例:  
+    `-force_key_frames 0:05:00,chapters-0.1` 在 5 分钟处,加入每章节开始前 0.1 秒的 I 帧
+
+    > 高级使用示例:`-force_key_frames expr:expr`  
+    expr中的表达式可以包含以下常量:
+    >> n 当前处理的帧数,从0开始  
+    n_forced 强制帧数  
+    prev_forced_n 前一个强制帧的编号,即NAN尚未强制关键帧时  
+    prev_forced_t 上一个强制帧的时间,即NAN尚未强制关键帧时  
+    t 当前处理帧的时间
+
+    > `-force_key_frames expr:gte(t,n_forced*5)`  
+    `-force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))`
+13. `-hwaccels` 列出可用加速设备
+14. `-hwaccel hwaccel name` 使用硬件加速来解码匹配的流,如果所选的 hwaccel 不可用或所选解码器不支持,则此选项无效。
+    > none 不使用任何硬件加速(默认)  
+    auto 自动选择硬件加速方式。   
+    vdpau 使用 VDPAU(适用于 Unix 的视频解码和演示 API)硬件加速。   
+    dxva2 使用DXVA2(DirectX视频加速)硬件加速。   
+    d3d11va 使用D3D11VA(DirectX视频加速)硬件加速。  
+    vaapi 使用VAAPI(视频加速API)硬件加速。  
+    qsv 使用 Intel QuickSync 视频加速进行视频转码。
+    >> 与大多数其他值不同,此选项不启用加速解码(每当选择 qsv 解码器时自动使用),而是加速转码,而不将帧复制到系统内存中。  
+    为了使其正常工作,解码器和编码器都必须支持 QSV 加速,并且不得使用任何滤波器。
+15. `-hwaccel_device devicename` 选择用于硬件加速的设备
+16. `-hwaccel_output_format format` 指定硬件加速解码后的输出像素格式(pixel format)
+17. `-fix_sub_duration_heartbeat` 将特定的输出视频流设置为心跳流,在收到随机访问数据包时根据该心跳流分割并推送当前正在进行的字幕
+18. `-vpre preset` 指定输出视频的质量 参数主要调节编码速度和质量的平衡,有:
+    > ultrafast(转码速度最快,视频往往也最模糊)  
+    superfast  
+    veryfast  
+    faster  
+    fast  
+    medium  
+    slow  
+    slower  
+    veryslow  
+    placebo  
+    共10个选项,从快到慢
+19. `-tune` 主要配合 preset 视频类型和视觉优化的参数,tune的值有:
+    > film: 电影、真人类型  
+    animation: 动画  
+    grain: 需要保留大量的grain时用  
+    stillimage: 静态图像编码时使用  
+    psnr: 为提高psnr做了优化的参数  
+    ssim: 为提高ssim做了优化的参数  
+    fastdecode: 可以快速解码的参数  
+    zerolatency:零延迟,用在需要非常低的延迟的情况下,比如电视电话会议的编码
+
 ##### 常见实例:相较简单的场景
 
 ```Shell
@@ -127,6 +205,8 @@ ffmpeg -f avfoundation -pixel_format bgr0 -i "default:none" out.avi
 
 ##### 使用中常见的error,原因及解决方法
 
+![img_13.png](img_13.png)
+
 #### <a id="audio-cap">[音频输入 - 采集](#audio-cap-title)</a>
 
 ##### 常用参数、参数含义及常用取值
@@ -142,33 +222,109 @@ ffmpeg -f avfoundation -pixel_format bgr0 -i "default:none" out.avi
 
 ##### 不常用参数/不常用参数取值,如何通过help获取
 
-#### 视频输出 - 播放
+1. `-atag fourcc/tag`    force audio tag/fourcc
+2. `-sample_fmt format`  set sample format
+3. `-channel_layout layout`  set channel layout
+4. `-ch_layout layout`   set channel layout
+5. `-guess_layout_max`   set the maximum number of channels to try to guess the channel layout
+6. `-apre preset`        set the audio options to the indicated preset
+
+##### 使用中常见的error,原因及解决方法
+
+![img_12.png](img_12.png)
+
+![img_14.png](img_14.png)
+
+#### <a id="video-play">[视频输出 - 播放](#video-play-title)</a>
+
+##### 播放时的默认参数有哪些
+
+1. `-video_size` 视频宽高比,默认值 iw x ih
+2. `-pixel_format` 像素格式
+3. `-byte` 按字节进行拖动 0=off, 1=on, -1=auto
+4. `-seek_interval` 自定义左右方向键拖动间隔,默认是 10s
+5. `-window_title` 窗口名称,默认是输入文件名称
+6. `-showmode` 设置显示模式,0=视频,1=音频波形,2=显示音频频谱,默认为 0,如果不存在视频,默认为 2
+7. `-stats / -nostats` 是否显示音视频流详情 pts 等信息,默认开启
+8. `-sync` 主时钟以谁为准,默认是 audio,可选项:audio (type=audio) / video (type=video) / external (type=ext)
 
-#### 音频输出 - 播放
+##### 不常用参数/不常用参数取值,如何通过help获取
+
+1. `-fs` 全屏模式
+2. `-an / -vn / -sn` 禁用音频/视频/字幕
+3. `-nodisp` 无图形化窗口,也没有视频
+4. `-ss` 指定播放位置
+5. `-t` 指定播放时长
+6. `-loop` 指定播放循环次数
+7. `-noboder` 指定图形化窗口没有边框
+8. `-volume` 指定初始化音量大小
+9. `-vf / -af` 指定音视频过滤器
+10. `-ast / -vst / -sst` 如果一个 m3u8 包含多条视频流/多条音频流/多条字幕流,可以在初始化的时候指定 视频 1 播放视频 2
+    的音频,展示视频 3 的字幕流
+11. `-autoexit` 自动退出
+
+#### <a id="audio-play">[音频输出 - 播放](#audio-play-title)</a>
 
 ### 常见使用需求或复杂使用场景
 
+```Shell
+ffplay lk_start.mkv
+```
+
 // 应该有一个每个需求如何详细展示的例子,需要包含命令和其他什么?
 
 #### 音频
 
 录制一段音频
 
+```Shell
+ffmpeg -f avfoundation -i ':0' cap.aac
+```
+
 播放一段音频
 
+```Shell
+ffplay cap.aac
+```
+
 播放PCM格式音频
 
+```Shell
+ffplay -f s16le -sample_fmt s16 -ar 48000 -ac 2 -f s16le cap.pcm
+```
+
 边采集边播放音频
 
 mp4提取音频,格式WAV
 
+```Shell
+ffmpeg -i lk.mp4 -vn lk.wav
+```
+
 WAV格式音频转成PCM格式
 
+```Shell
+# 如果输入音频的采样率太大,必须指定 ar
+ffmpeg -i lk-mp4.wav -ar 44100 lk-mp4.pcm
+```
+
 音频变速
 
+```Shell
+ffplay -af 'atempo=2' lk-mp4.wav
+```
+
 播放抓包文件
 
-音频格式转码
+音频格式转码 ???
+
+```Shell
+# 正常
+ffmpeg -i lk.aac -c:a libmp3lame lk-01.mp3 
+
+# !!! !!! 失败
+ffmpeg -f s16le -ar 44100 -ac 2 -i lk-mp4.pcm -c:a libmp3lame lk-mp4.mp3
+```
 
 抽取pcm数据
 
@@ -186,38 +342,86 @@ WAV格式音频转成PCM格式
 
 录制一段摄像头视频
 
+```Shell
+ffmpeg -f avfoundation -pix_fmt uyvy422 -r 30 -i '0:' cap.mp4
+```
+
 录制一段屏幕视频
 
+```Shell
+ffmpeg -f avfoundation -pix_fmt uyvy422 -r 30 -i '1:' cap.mp4
+```
+
 播放一段视频
 
+```Shell
+ffplay cap.mp4
+```
+
 播放YUV格式视频
 
+```Shell
+ffplay -pixel_format yuv420p -video_size vga cap.yuv
+```
+
 播放h264格式视频
 
 边采集边播放视频
 
+```Shell
+ffmpeg -s 1280x720 -r 30.0 -pix_fmt nv12 -f avfoundation -i '1:0' -c:v libx264 -c:a aac -f mpegts udp://127.0.0.1:1234 | ffplay -i udp://127.0.0.1:1234
+
+ffmpeg -f avfoundation -r 30 -video_size 1280x720 -i "default" -vf "format=yuv420p" -f rawvideo -pix_fmt rgb24 - | ffplay -f rawvideo -pixel_format rgb24 -video_size 1280x720 -
+```
+
 mp4提取视频,格式YUV
 
+```Shell
+ffmpeg -i lk_start.mp4 lk_start.yuv
+```
+
 拼接视频片段
 
 视频变速
 
+```Shell
+ffplay -pixel_format yuv420p -video_size 1920x1080 -vf 'setpts=PTS/2'  lk_start.yuv
+```
+
 间隔1s提取视频帧换面,保存为图片
 
 截取视频片段
 
+```Shell
+ffmpeg -i lk_start.mp4 -ss 00:00:05 -t 10 lk_short.mp4 
+```
+
 添加时间水印,自定义位置,颜色,大小
 
 视频指定分辨率转码
 
+```Shell
+ffmpeg -i lk_start.mp4 -vf 'scale=640:-2' lk_scale.mp4
+```
+
 加水印
 
+```Shell
+ffmpeg -i lk_start.mp4 -vf 'drawtext=text="niubality“:x=10:y=10:fontcolor=red' lk_start_wp.mp4
+
+ffmpeg -i lk_start.mp4 -i img.png -filter_complex '[0:v] [1:v] overlay=10:10 [out]' -map '[out]' lk_start_wpp.mp4
+```
+
 抽取264数据
 
 播放抓包文件
 
 视频格式转码
 
+```Shell
+ffmpeg -pix_fmt yuv420p -s 1920x1080 -i lk_start.yuv lk_start-01.mp4 
+```
+
 播放rtp流
 
 视频文件加字幕

+ 9 - 0
ffmpeg整体学习框架.md

@@ -117,12 +117,16 @@ graph LR;
 
 1. 帮助文档
 
+![img_10.png](img_10.png)
+
 ```Shell
 ffmpeg -h full
 ```
 
 2. 有哪些解/复用器
 
+![img_8.png](img_8.png)
+
 ```Shell
 ffmpeg -formats
 
@@ -139,6 +143,8 @@ ffmpeg -h demuxer=mp4
 
 3. 有哪些编解码器
 
+![img_9.png](img_9.png)
+
 ```Shell
 ffmpeg -codecs
 
@@ -197,6 +203,9 @@ ffmpeg -bsfs
 
 # 协议
 ffmpeg -protocols
+
+# 编译配置
+ffmpeg -buildconf
 ```
 
 #### help 示例

BIN
img_10.png


BIN
img_11.png


BIN
img_12.png


BIN
img_13.png


BIN
img_14.png


BIN
img_8.png


BIN
img_9.png


BIN
out.avi


BIN
out.png