前言
这篇文章写了有一会儿了,但是我手头作业要写不完了,下周三之前估计最多也就更新一下我的面经了,因为今天晚上还要抖音的三面,阿里的下周一估计也要到hr面了。周六周天的时间,我的计组和电路学作业都还没开动,再不学我就要凉了,时间真的太紧了,见谅见谅。
文章内容参考书目《音视频开发进阶指南 -- 基于 Android 与 iOS 平台的实践》
目录
【3】【从零冲击音视频开发】FFmpeg的介绍和基本使用
FFmpeg的环境搭建
材料清单:
1. 10.15.2的OSX系统
2. HomeBrew(安装姿势:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)")
3. ffmpeg的依赖(安装姿势: brew install ffmpeg;文件路径: /usr/local/Cellar)
4. ffmpeg-4.2.2的源码(官网下)
5. NDK-r20
这是一个用于本地使用的环境,里面放置有不少的样例,但是不建议使用在开发。
我使用过了很多次,.a
的静态库在XCode
上能直接玩,在AS上就直接整不起来。所以这里要推一个交叉编译详解的文章。
- 如果你是勤劳的读者,要自己交叉编译,过程详见于【Android 音视频开发打怪升级:FFmpeg音视频编解码篇】一、FFmpeg so库编译
- 如果你是想“快速”开发的读者,可以直接“偷”我的。
FFmpeg模块介绍
bin
命令行工具所在的位置,ffplay
、ffmpeg
、ffprobe
等等。
// ffprobe各种命令
> ffprobe 文件 // 显示文件头信息
> ffprobe -show_format 文件 // 显示输出格式、时间长度、文件大小、比特率等信息
> ffprobe -pirnt_format json -show_streams 文件 // 以json格式输出具体每一个流的信息
> ffprobe -show_frames 文件 // 显示帧信息
> ffprobe -show_packets 文件 // 显示包信息
//。。。。。
// ffplay
> ffplay 文件 // 播放
> ffplay 文件 -loop 10 // 循环播放10次
> ffplay 文件 -ast 0 // 播放第0路音频流,其他路没有流的话会静音
> ffplay 文件 -vst 0 // 播放第0路视频流,其他路没有流的话会黑屏
> ffplay 文件.pcm -f s16le -channels 2 -ar 44100 // 播放pcm格式文件的方式,需要设置格式(-f),声道数(-channels),采样率(-ar)
> ffplay -f rawvideo -pixel_format yuv420p -s 480*480 文件.yuv(文件.rgb) // 查看一帧的视频帧(这个没有调试通过)
> ffplay 文件 -sync audio // 以音频为基准进行音视频同步(默认方案)
> ffplay 文件 -sync video // 以视频为基准进行音视频同步
> ffplay 文件 -sync ext // 以外部时钟为基准进行音视频同步
> ffplay 文件 -ss 50 // 跳过50s的内容
//。。。。。
// ffmpeg
// 会有很多的通过参数以图片给出,具体使用后期会慢慢看到,就不再演示
inlcude -> 8大模块
存放的是已经编译结束的静态库文件的头文件
AVCodec: 用于编码解码
AVDevice: 输入输出设备
AVFilter: 音视频滤镜库,提供音视频特效的处理。
AVFormat: 文件格式和协议库。封装了Protocol
层和Demuxer
、Muxer
层。
AVResample: 用于音频重采样 (书上说老版本才会编译出来,已经废弃,但是我的版本是最新的,有待考察)
AVUtil: 核心工具
PostProc: 用于后期处理,是使用AVFilter
时要开启的模块。
SwResample: 用于音频重采样,对音频进行声道数、数据格式、采样率等基本信息转化。
SWScale: 将图像进行格式转换,比如YUV
-> RGB
lib
存放的是已经编译完成的静态库文件,在链接阶段会使用到。
share
其实就是一个example
的位置,用于讲解FFmpeg
各个工具的使用方法,还有使用样例等等。
FFmpeg的使用
前面讲了很多东西,但是我们真正要在Java
代码中如何进行使用却完全还没有进行过,所以这里就要进行的是Java
代码中的测试了。
第一步:导包和引用
然后CMakeList.txt
中导入我们需要加载的so
。
cmake_minimum_required(VERSION 3.4.1)
# 定义变量
set(ffmpeg_lib_dir ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
set(ffmpeg_head_dir ${CMAKE_SOURCE_DIR}/ffmpeg)
add_library( # Sets the name of the library.
audioencoder
SHARED
# lame
lame/bitstream.c lame/encoder.c lame/gain_analysis.c
lame/lame.c lame/id3tag.c lame/mpglib_interface.c
lame/newmdct.c lame/presets.c lame/psymodel.c
lame/quantize.c lame/fft.c lame/quantize_pvt.c
lame/reservoir.c lame/set_get.c lame/tables.c
lame/takehiro.c lame/util.c lame/vbrquantize.c
lame/VbrTag.c lame/version.c
# mine
audioencoder/audioencoder.cpp
audioencoder/mp3_encoder.cpp)
# 添加ffmpeg相关的so库
add_library( avutil
SHARED
IMPORTED )
set_target_properties( avutil
PROPERTIES IMPORTED_LOCATION
${ffmpeg_lib_dir}/libavutil.so )
add_library( swresample
SHARED
IMPORTED )
set_target_properties( swresample
PROPERTIES IMPORTED_LOCATION
${ffmpeg_lib_dir}/libswresample.so )
add_library( avcodec
SHARED
IMPORTED )
set_target_properties( avcodec
PROPERTIES IMPORTED_LOCATION
${ffmpeg_lib_dir}/libavcodec.so )
add_library( avfilter
SHARED
IMPORTED)
set_target_properties( avfilter
PROPERTIES IMPORTED_LOCATION
${ffmpeg_lib_dir}/libavfilter.so )
add_library( swscale
SHARED
IMPORTED)
set_target_properties( swscale
PROPERTIES IMPORTED_LOCATION
${ffmpeg_lib_dir}/libswscale.so )
add_library( avformat
SHARED
IMPORTED)
set_target_properties( avformat
PROPERTIES IMPORTED_LOCATION
${ffmpeg_lib_dir}/libavformat.so )
add_library( avdevice
SHARED
IMPORTED)
set_target_properties( avdevice
PROPERTIES IMPORTED_LOCATION
${ffmpeg_lib_dir}/libavdevice.so )
find_library( # Sets the name of the path variable.
log-lib
log)
# 引入头文件
include_directories(${ffmpeg_head_dir}/include)
target_link_libraries( # Specifies the target library.
audioencoder
# ffmpeg
avutil
swresample
avcodec
avfilter
swscale
avformat
avdevice
${log-lib})
第二步:使用
当然使用方案上来说还是一样的,但是这里我们存在需要注意的地方,因为FFmpeg
是由C
编写而成的,而我们去编译的却是使用的C++
,所以套上一层extern "C"
是必须要做的事情。
这里的源码直接抄的猫哥的,做一个示范。
在Github
中带了一个用FFmpeg
去解码mp3
->pcm
的样例,当然里面有很多功能感觉也没用到吧,主要做了一个解释,详细看关注点,当然我也在源码中提了一些问题,你要是知道怎么解决,或者有什么新的问题,发评论啊、发邮件之类的,我会继续探索的。
之后理解的差不多了就会自己再开一个项目动手开发的,希望这个学习项目你们也能star
,嘿嘿嘿。
以上就是我的学习成果,如果有什么我没有思考到的地方或是文章内存在错误,欢迎与我分享。
原文 【从零冲击音视频开发】FFmpeg的介绍和基本使用 - 掘金
★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。
见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓