这篇文章写了有一下子了,可是我手头做业要写不完了,下周三以前估计最多也就更新一下个人面经了,由于今天晚上还要抖音的三面,阿里的下周一估计也要到hr面了。周六周天的时间,个人计组和电路学做业都还没开动,再不学我就要凉了,时间真的太紧了,见谅见谅。java
文章内容参考书目《音视频开发进阶指南 -- 基于 Android 与 iOS 平台的实践》git
GitHub传送门 |
---|
【1】【从零冲击音视频开发】音视频开发必备知识基础github
【2】【从零冲击音视频开发】移动环境搭建面试
【3】【从零冲击音视频开发】FFmpeg的介绍和基本使用json
材料清单:
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
复制代码
这是一个用于本地使用的环境,里面放置有很多的样例,可是不建议使用在开发。ruby
我使用过了不少次,.a
的静态库在XCode
上能直接玩,在AS上就直接整不起来。因此这里要推一个交叉编译详解的文章。bash
若是你是勤劳的读者,要本身交叉编译,过程详见于【Android 音视频开发打怪升级:FFmpeg音视频编解码篇】1、FFmpeg so库编译curl
若是你是想“快速”开发的读者,能够直接“偷”个人。ide
命令行工具所在的位置,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
// 会有不少的经过参数以图片给出,具体使用后期会慢慢看到,就再也不演示
复制代码
Protocol
层和Demuxer
、Muxer
层。AVFilter
时要开启的模块。YUV
-> RGB
example
的位置,用于讲解
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
,嘿嘿嘿。
以上就是个人学习成果,若是有什么我没有思考到的地方或是文章内存在错误,欢迎与我分享。
相关文章推荐: