Android音视频(三)FFmpeg Camera2推流直播
Android音视频(二)音频AudioRecord和AudioTrack
自己花了点时间实现了一个使用FFmpeg将Camera2视频数据推送到RTMP服务的简单Demo,在这里分享下,里面用到知识很多都是之前博客中用到的,难度不大。
1、 定义方法
定义了三个JNI方法
1 | public class FFmpegHandler { |
2、Camera2实时数据
具体使用可查看Android音视频(一) Camera2 API采集数据
将ImageReader作为预览请求的Target之一,这样我们就可以将预览的数据拿到在onImageAvailable中进行处理推送。
1 | mImageReader = ImageReader.newInstance(640, 480,ImageFormat.YUV_420_888, 1); |
1 | Surface imageSurface = mImageReader.getSurface(); |
将获取的Image数据解析为YUV数据,Y、U、V数据分别存储。具体请看YUV数据格式与YUV_420_888。
目前这块暂时这样写着,网上的博客都比较旧了,有点不太合适,我想应该还会有更好的方法,后面再做优化。(或者这块你有什么好的处理方法,欢迎留言)。
1 | private final ImageReader.OnImageAvailableListener mOnImageAvailableListener |
3、初始化FFmpeg
直播推送的过程整体就是一个先将视频数据编码,再将编码后的数据写入数据流中推送给服务器的过程。
下面初始化的过程就是准备好数据编码器和一条已经连上服务器的数据流
1 | JNIEXPORT jint JNICALL Java_com_david_camerapush_ffmpeg_FFmpegHandler_init |
4、开始传输
对YUV数据编码,并将编码后数据写入准备好的直播流中。
1 | JNIEXPORT jint JNICALL Java_com_david_camerapush_ffmpeg_FFmpegHandler_pushCameraData |
效果
这是Demo运行后的结果,推送视频OK,但是可能会有2到3秒的延迟(可能也跟网速有关)。目前就做到这种程度,后面会优化延迟、音频直播、音视频同步等都会慢慢加上去。
Tips:
图片中使用的在Windows下的nginx-rtmp-win32,不需要编译,点击exe就可以运行。