• FFmpeg开发简介1


    适逢FFmpeg6.1发布,准备深入学习下FFmpeg,将会写下系列学习记录。

    在此列出主要学习资料,后续再不列,感谢这些大神的探路和分享,特别是雷神,致敬!

    1、FFmpeg组成

    命令行工具ffmpeg主命令行工具
    ffplay基于SDL的播放器
    ffprobe获取多媒体信息
    基础库libavcodec编解码库
    libavformat封装、解封库
    libavfilter滤镜库
    libavdevice多媒体输入/输出设备
    libavutil通用工具
    libswresample音频转换
    libswscale图像转换
    libpostproclibavfilter后期效果处理

    2、FFmpeg支持

    • 源代码中查看支持情况

                      ./configure --list-encoders

    查看编码器支持
    ./configure --list-decoders查看解码器支持
    ./configure --list-muxers查看封装支持
    ./configure --list-demuxers查看解封装支持
    ./configure --list-protocols查看通信协议支持

    • 编译好的FFmpeg中查看支持情况
    ffmpeg -codecs查看全部编解码器
    ffmpeg -encoders查看编码器
    ffmpeg -decoders查看解码器
    ffmpeg -filters查看滤镜
    ffmpeg --help full查看全部信息

                    ffmpeg -h encoder/decoder

                    /muxer/demuxer/filter=xxx

    查看具体参数

    3、常用指令(需要啥功能问chatGPT是最好的)

    • 提取音频流

    ffmpeg -i in.mp4 -vn -acodec copy out.aac

    • 提取H264视频流

    ffmpeg -i in.mp4 -vcodec copy -an out.h264

    • 提取H265视频流

    ffmpeg -i in.mp4 -vcodec copy -an -bsf hevc_mp4toannexb -f hevc out.hevc

    • 添加滤镜效果

    ffmpeg -i input -vf filter_name=parameters output

    4、使用FFmpeg

    命令行直接使用编译出的三个程序即可。

    二次开发则需要编译出的库,在下面博文介绍了编译方法。

    适用于嵌入式arm的ffmpeg编解码-CSDN博客

    这里看下我编译出来的文件如下图

    可以发现install中有四个文件夹:

    bin: 命令行程序

    include: 头文件

    lib: 共享库

    share: 例程及文档

    再看一下install中具体的文件树:

    1. ├── bin
    2. │   ├── ffmpeg
    3. │   ├── ffplay
    4. │   └── ffprobe
    5. ├── include
    6. │   ├── libavcodec
    7. │   │   ├── ac3_parser.h
    8. │   │   ├── adts_parser.h
    9. │   │   ├── avcodec.h
    10. │   │   ├── avdct.h
    11. │   │   ├── avfft.h
    12. │   │   ├── bsf.h
    13. │   │   ├── codec_desc.h
    14. │   │   ├── codec.h
    15. │   │   ├── codec_id.h
    16. │   │   ├── codec_par.h
    17. │   │   ├── d3d11va.h
    18. │   │   ├── defs.h
    19. │   │   ├── dirac.h
    20. │   │   ├── dv_profile.h
    21. │   │   ├── dxva2.h
    22. │   │   ├── jni.h
    23. │   │   ├── mediacodec.h
    24. │   │   ├── packet.h
    25. │   │   ├── qsv.h
    26. │   │   ├── vdpau.h
    27. │   │   ├── version.h
    28. │   │   ├── version_major.h
    29. │   │   ├── videotoolbox.h
    30. │   │   ├── vorbis_parser.h
    31. │   │   └── xvmc.h
    32. │   ├── libavdevice
    33. │   │   ├── avdevice.h
    34. │   │   ├── version.h
    35. │   │   └── version_major.h
    36. │   ├── libavfilter
    37. │   │   ├── avfilter.h
    38. │   │   ├── buffersink.h
    39. │   │   ├── buffersrc.h
    40. │   │   ├── version.h
    41. │   │   └── version_major.h
    42. │   ├── libavformat
    43. │   │   ├── avformat.h
    44. │   │   ├── avio.h
    45. │   │   ├── version.h
    46. │   │   └── version_major.h
    47. │   ├── libavutil
    48. │   │   ├── adler32.h
    49. │   │   ├── aes_ctr.h
    50. │   │   ├── aes.h
    51. │   │   ├── ambient_viewing_environment.h
    52. │   │   ├── attributes.h
    53. │   │   ├── audio_fifo.h
    54. │   │   ├── avassert.h
    55. │   │   ├── avconfig.h
    56. │   │   ├── avstring.h
    57. │   │   ├── avutil.h
    58. │   │   ├── base64.h
    59. │   │   ├── blowfish.h
    60. │   │   ├── bprint.h
    61. │   │   ├── bswap.h
    62. │   │   ├── buffer.h
    63. │   │   ├── camellia.h
    64. │   │   ├── cast5.h
    65. │   │   ├── channel_layout.h
    66. │   │   ├── common.h
    67. │   │   ├── cpu.h
    68. │   │   ├── crc.h
    69. │   │   ├── csp.h
    70. │   │   ├── des.h
    71. │   │   ├── detection_bbox.h
    72. │   │   ├── dict.h
    73. │   │   ├── display.h
    74. │   │   ├── dovi_meta.h
    75. │   │   ├── downmix_info.h
    76. │   │   ├── encryption_info.h
    77. │   │   ├── error.h
    78. │   │   ├── eval.h
    79. │   │   ├── executor.h
    80. │   │   ├── ffversion.h
    81. │   │   ├── fifo.h
    82. │   │   ├── file.h
    83. │   │   ├── film_grain_params.h
    84. │   │   ├── frame.h
    85. │   │   ├── hash.h
    86. │   │   ├── hdr_dynamic_metadata.h
    87. │   │   ├── hdr_dynamic_vivid_metadata.h
    88. │   │   ├── hmac.h
    89. │   │   ├── hwcontext_cuda.h
    90. │   │   ├── hwcontext_d3d11va.h
    91. │   │   ├── hwcontext_drm.h
    92. │   │   ├── hwcontext_dxva2.h
    93. │   │   ├── hwcontext.h
    94. │   │   ├── hwcontext_mediacodec.h
    95. │   │   ├── hwcontext_opencl.h
    96. │   │   ├── hwcontext_qsv.h
    97. │   │   ├── hwcontext_vaapi.h
    98. │   │   ├── hwcontext_vdpau.h
    99. │   │   ├── hwcontext_videotoolbox.h
    100. │   │   ├── hwcontext_vulkan.h
    101. │   │   ├── imgutils.h
    102. │   │   ├── intfloat.h
    103. │   │   ├── intreadwrite.h
    104. │   │   ├── lfg.h
    105. │   │   ├── log.h
    106. │   │   ├── lzo.h
    107. │   │   ├── macros.h
    108. │   │   ├── mastering_display_metadata.h
    109. │   │   ├── mathematics.h
    110. │   │   ├── md5.h
    111. │   │   ├── mem.h
    112. │   │   ├── motion_vector.h
    113. │   │   ├── murmur3.h
    114. │   │   ├── opt.h
    115. │   │   ├── parseutils.h
    116. │   │   ├── pixdesc.h
    117. │   │   ├── pixelutils.h
    118. │   │   ├── pixfmt.h
    119. │   │   ├── random_seed.h
    120. │   │   ├── rational.h
    121. │   │   ├── rc4.h
    122. │   │   ├── replaygain.h
    123. │   │   ├── ripemd.h
    124. │   │   ├── samplefmt.h
    125. │   │   ├── sha512.h
    126. │   │   ├── sha.h
    127. │   │   ├── spherical.h
    128. │   │   ├── stereo3d.h
    129. │   │   ├── tea.h
    130. │   │   ├── threadmessage.h
    131. │   │   ├── timecode.h
    132. │   │   ├── time.h
    133. │   │   ├── timestamp.h
    134. │   │   ├── tree.h
    135. │   │   ├── twofish.h
    136. │   │   ├── tx.h
    137. │   │   ├── uuid.h
    138. │   │   ├── version.h
    139. │   │   ├── video_enc_params.h
    140. │   │   ├── video_hint.h
    141. │   │   └── xtea.h
    142. │   ├── libswresample
    143. │   │   ├── swresample.h
    144. │   │   ├── version.h
    145. │   │   └── version_major.h
    146. │   └── libswscale
    147. │   ├── swscale.h
    148. │   ├── version.h
    149. │   └── version_major.h
    150. ├── lib
    151. │   ├── libavcodec.so -> libavcodec.so.60.31.102
    152. │   ├── libavcodec.so.60 -> libavcodec.so.60.31.102
    153. │   ├── libavcodec.so.60.31.102
    154. │   ├── libavdevice.so -> libavdevice.so.60.3.100
    155. │   ├── libavdevice.so.60 -> libavdevice.so.60.3.100
    156. │   ├── libavdevice.so.60.3.100
    157. │   ├── libavfilter.so -> libavfilter.so.9.12.100
    158. │   ├── libavfilter.so.9 -> libavfilter.so.9.12.100
    159. │   ├── libavfilter.so.9.12.100
    160. │   ├── libavformat.so -> libavformat.so.60.16.100
    161. │   ├── libavformat.so.60 -> libavformat.so.60.16.100
    162. │   ├── libavformat.so.60.16.100
    163. │   ├── libavutil.so -> libavutil.so.58.29.100
    164. │   ├── libavutil.so.58 -> libavutil.so.58.29.100
    165. │   ├── libavutil.so.58.29.100
    166. │   ├── libswresample.so -> libswresample.so.4.12.100
    167. │   ├── libswresample.so.4 -> libswresample.so.4.12.100
    168. │   ├── libswresample.so.4.12.100
    169. │   ├── libswscale.so -> libswscale.so.7.5.100
    170. │   ├── libswscale.so.7 -> libswscale.so.7.5.100
    171. │   ├── libswscale.so.7.5.100
    172. │   └── pkgconfig
    173. │   ├── libavcodec.pc
    174. │   ├── libavdevice.pc
    175. │   ├── libavfilter.pc
    176. │   ├── libavformat.pc
    177. │   ├── libavutil.pc
    178. │   ├── libswresample.pc
    179. │   └── libswscale.pc
    180. └── share
    181. ├── ffmpeg
    182. │   ├── examples
    183. │   │   ├── avio_http_serve_files.c
    184. │   │   ├── avio_list_dir.c
    185. │   │   ├── avio_read_callback.c
    186. │   │   ├── decode_audio.c
    187. │   │   ├── decode_filter_audio.c
    188. │   │   ├── decode_filter_video.c
    189. │   │   ├── decode_video.c
    190. │   │   ├── demux_decode.c
    191. │   │   ├── encode_audio.c
    192. │   │   ├── encode_video.c
    193. │   │   ├── extract_mvs.c
    194. │   │   ├── filter_audio.c
    195. │   │   ├── hw_decode.c
    196. │   │   ├── Makefile
    197. │   │   ├── mux.c
    198. │   │   ├── qsv_decode.c
    199. │   │   ├── qsv_transcode.c
    200. │   │   ├── README
    201. │   │   ├── remux.c
    202. │   │   ├── resample_audio.c
    203. │   │   ├── scale_video.c
    204. │   │   ├── show_metadata.c
    205. │   │   ├── transcode_aac.c
    206. │   │   ├── transcode.c
    207. │   │   ├── vaapi_encode.c
    208. │   │   └── vaapi_transcode.c
    209. │   ├── ffprobe.xsd
    210. │   ├── libvpx-1080p50_60.ffpreset
    211. │   ├── libvpx-1080p.ffpreset
    212. │   ├── libvpx-360p.ffpreset
    213. │   ├── libvpx-720p50_60.ffpreset
    214. │   └── libvpx-720p.ffpreset
    215. └── man
    216. ├── man1
    217. │   ├── ffmpeg.1
    218. │   ├── ffmpeg-all.1
    219. │   ├── ffmpeg-bitstream-filters.1
    220. │   ├── ffmpeg-codecs.1
    221. │   ├── ffmpeg-devices.1
    222. │   ├── ffmpeg-filters.1
    223. │   ├── ffmpeg-formats.1
    224. │   ├── ffmpeg-protocols.1
    225. │   ├── ffmpeg-resampler.1
    226. │   ├── ffmpeg-scaler.1
    227. │   ├── ffmpeg-utils.1
    228. │   ├── ffplay.1
    229. │   ├── ffplay-all.1
    230. │   ├── ffprobe.1
    231. │   └── ffprobe-all.1
    232. └── man3
    233. ├── libavcodec.3
    234. ├── libavdevice.3
    235. ├── libavfilter.3
    236. ├── libavformat.3
    237. ├── libavutil.3
    238. ├── libswresample.3
    239. └── libswscale.3

            以前在某个地方看到说so库的后缀中可以看到版本号,从ffmpeg的lib中看到这个不一致,也就是这个规则不存在的。

            拿到这个install文件,实际就相当于一个ffmpeg的sdk了,利用它就开发自己的程序了。重点看看头文件中的函数,究竟给我们提供了怎样的接口函数、怎么使用就是难点了。

  • 相关阅读:
    企业实施ERP系统遇到的问题及应对措施
    Spring(AOP)
    java计算机毕业设计社区人员管理系统源码+mysql数据库+系统+lw文档+部署
    Redis---第二篇
    Android studio访问选程https接口(.crt handshake)
    Interior (topology)
    PHP调用API接口的方法及实现(内附电商平台商品详情接口案例)
    Linux 环境Skywalking部署Elasticsearch
    react+antd封装表格组件2.0
    Java并发编程的艺术笔记-Executor框架
  • 原文地址:https://blog.csdn.net/huntenganwei/article/details/134355140