1.硬编码,使用MediaCodec实现
2.软编码,使用FFmpeg或者libx264库来实现。
本文分享在Android平台视频编码-软编码的实现,也就是用FFmpeg来实现视频的编码,rtmp推流到服务器上,相机采集视频将在下一篇文章分享。
流媒体服务器使用 nginx-rtmp-module 来进行搭建。
本文所使用FFmpeg的版本是4.1,关于FFmpeg编译成Android平台so库如果有需要,我将在下一篇文章分享说明。
视频编码比较耗cpu,上传视频数据的会耗网络io,所以需要开启新线程去处理,这里我用HandlerThread来处理视频的编码上传。
初始化编码相关 *** 作
这里我们使用的是FFmpeg,所以在编码前我们会先做一些初始化以及参数设置工作。
FFmpeg初始化
av_register_all()
创建输出格式上下文
avformat_alloc_output_context2()
获取编码器
avcodec_find_encoder(AV_CODEC_ID_H264) 获取H264的编码器
设置编码器参数
使用给定的编码器和参数初始化编码上下文
avcodec_open2(pCodecCtx, pCodec, &param)
创建视频流
video_st = avformat_new_stream(ofmt_ctx, pCodec)
打开输出上下文
avio_open(&ofmt_ctx->pb, out_path, AVIO_FLAG_READ_WRITE)
写入输出头信息
avformat_write_header(ofmt_ctx, NULL)
像素格式转换
AV_PIX_FMT_YUV420P,它是纯平面存储。总共三个平面,分别存放,Y、U、V数据。
当图像宽是width,高是height时,Y分量的大小就是width×heitht,而U是width×heitht/4,V也是U是width×heitht/4。
H264编码
首先我们需要了解两个数据结构AVFrame、AVPacket
AVFrame存放的是原始数据、AVPacket存放的是编码后的数据。
创建AVPacket
av_new_packet(&enc_pkt, picture_size)
开始编码
ret = avcodec_encode_video2(pCodecCtx, pFrameYUV)
输出一帧编码后的视频数据
ret = av_write_frame(pCodecCtx, &enc_pkt)
释放资源
小伙伴们有疑问的可以在下方评论区评论。
就拿使用ZEGO即构的实时音视频产品举个例子,要想实现android rtmp推流 *** 作,可以通过调用开始推流 startPublishingStream 的 API 接口,向远端用户发送本端的音视频流。如果不需要继续推流,可调用 stopPublishingStream 停止推流(开始推流前,建议开发者在开始推流前对推流参数、本地预览视图进行设置)。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)