前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android平台如何实现外部编码后(H.264/H.265)数据实时预览播放

Android平台如何实现外部编码后(H.264/H.265)数据实时预览播放

原创
作者头像
音视频牛哥
发布于 2023-05-17 02:06:50
发布于 2023-05-17 02:06:50
50100
代码可运行
举报
运行总次数:0
代码可运行

技术背景

我们在对接开发者的时候,遇到这样的诉求:除了正常的RTMP、RTSP直播播放外,有些硬件设备输出编码后(H.264/H.265)的数据,比如无人机或类似硬件产品,回调出来的H.264/H.265数据,除了正常转推到RTMP、轻量级RTSP服务或GB28181外,还需要本地预览甚至重新对数据做二次处理,基于这样的场景诉求,我们开发了外部编码后数据实时预览播放模块。

接口设计

废话不多说,外部H.264/H.265投递接口设计如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    // SmartPlayerJniV2.java
    // Author: daniusdk.com
    /**
	 * 投递视频包给外部Live Source
	 *
	 * @param codec_id: 编码id, 当前仅支持H264和H265, 1:H264, 2:H265
	 *
	 * @param packet: 视频数据, ByteBuffer必须是DirectBuffer, 包格式请参考H264/H265 Annex B Byte stream format, 例如:
	 *                0x00000001 nal_unit 0x00000001 ...
	 *                H264 IDR: 0x00000001 sps 0x00000001 pps 0x00000001 IDR_nal_unit .... 或 0x00000001 IDR_nal_unit ....
	 *                H265 IDR: 0x00000001 vps 0x00000001 sps 0x00000001 pps 0x00000001 IDR_nal_unit .... 或 0x00000001 IDR_nal_unit ....
	 *
	 * @param offset: 偏移量
	 * @param size: packet size
	 * @param timestamp_ms: 时间戳, 单位毫秒
	 * @param is_timestamp_discontinuity: 是否时间戳间断,0:未间断,1:间断
	 * @param is_key: 是否是关键帧, 0:非关键帧, 1:关键帧
	 * @param extra_data: 可选参数,可传null, 对于H264关键帧包, 如果packet不含sps和pps, 可传0x00000001 sps 0x00000001 pps
	 *                    ,对于H265关键帧包, 如果packet不含vps,sps和pps, 可传0x00000001 vps 0x00000001 sps 0x00000001 pps
	 * @param extra_data_size: extra_data size
	 * @param width: 图像宽, 可传0
	 * @param height: 图像高, 可传0
	 *
	 * @return {0} if successful
	 */
	public native int PostVideoPacketByteBuffer(long handle, int codec_id,
									  java.nio.ByteBuffer packet, int offset, int size, long timestamp_ms, int is_timestamp_discontinuity, int is_key,
									  byte[] extra_data, int extra_data_size, int width, int height);


	/*
	* 请参考 PostVideoPacketByteBuffer说明
	 */
	public native int PostVideoPacketByteArray(long handle, int codec_id,
												byte[] packet, int offset, int size, long timestamp_ms, int is_timestamp_discontinuity, int is_key,
												byte[] extra_data, int extra_data_size, int width, int height);

PostVideoPacketByteBuffer()和PostVideoPacketByteArray()接口设计基本类似,唯一的区别在于,一个数据类型是ByteBuffer,一个是byte数组。

其中codec_id,系编码id,目前仅支持H.264和H.265类型。

packet视频数据,需要注意的是,ByteBuffer必须是DirectBuffer, 包格式请参考H264/H265 Annex B Byte stream format, 例如:

0x00000001 nal_unit 0x00000001 ... H264 IDR: 0x00000001 sps 0x00000001 pps 0x00000001 IDR_nal_unit .... 或 0x00000001 IDR_nal_unit .... H265 IDR: 0x00000001 vps 0x00000001 sps 0x00000001 pps 0x00000001 IDR_nal_unit .... 或 0x00000001 IDR_nal_unit ....

extra_data: 可选参数,可传null, 对于H264关键帧包,如果packet不含sps和pps,可传0x00000001 sps 0x00000001 pps,对于H265关键帧包,如果packet不含vps,sps和pps, 可传0x00000001 vps 0x00000001 sps 0x00000001 pps

调用逻辑

下面我们看看逻辑调用,本文基于大牛直播SDK的RTSP|RTMP转RTMP推送demo做展示,先拉取到RTSP或RTMP的流数据,然后把拉取到的H.264/H.265数据回调上来,调用我们外部live source数据接口,投递到底层,实现实时数据的播放,如果外部数据,可以忽略拉流这块,直接在数据回调的地方,调live source数据投递接口即可。

数据投递:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void onVideoDataCallback(int ret, int video_codec_id, int sample_size, int is_key_frame, long timestamp, int width, int height, long presentation_timestamp)
		{
			//Log.i("onVideoDataCallback", "ret: " + ret + ", video_codec_id: " + video_codec_id + ", sample_size: " + sample_size + ", is_key_frame: "+ is_key_frame +  ", timestamp: " + timestamp +
			//		",presentation_timestamp:" + presentation_timestamp);

			if ( video_buffer_ == null)
				return;

			video_buffer_.rewind();

			if (0 == ret && ex_live_src_player_handle_ !=0) {
				libPlayer.PostVideoPacketByteBuffer(ex_live_src_player_handle_, video_codec_id, video_buffer_, 0, sample_size, timestamp, 0, is_key_frame, null,0, 0, 0);
			}

		}

启动外部数据播放:

可以看到,外部数据可以用软解码或硬解码播放,如果分辨率很大可以考虑特定机型硬解码,外部数据播放,依然可以设置铺满或按比例显示。如果需要针对数据做二次处理,也可以把设置RGB或YUV数据回调,对回调后的数据做二次处理,甚至二次编码(如做视频分析、实时水印等)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private long start_ex_live_src_player(SmartPlayerJniV2 lib_player, Context context, SurfaceView surface_view, boolean is_hardware_decoder) {
		if (null ==lib_player || null == context || null == surface_view)
			return 0;

		long handle = lib_player.SmartPlayerOpen(context);
		if (0 == handle) {
			Log.e(TAG, "start_ex_live_src_player open player failed");
			return 0;
		}

		// 设置0, 尽可能降低预览延时
		lib_player.SmartPlayerSetBuffer(handle, 0);

		lib_player.SmartPlayerSetUrl(handle, "ntexternal://livesource/implemention0");

		lib_player.SmartPlayerSetSurface(handle, surface_view);

		// 图像等比例缩放或铺满view
		lib_player.SmartPlayerSetRenderScaleMode(handle, 1);

		lib_player.SmartPlayerSetFastStartup(handle, 1);

		// 不要播放音频,静音就好
		lib_player.SmartPlayerSetMute(handle, 1);

		// 大分辨率可能需要硬解,小分辨率推荐软解,硬解延时可能大些
		if (is_hardware_decoder) {
			lib_player.SetSmartPlayerVideoHevcHWDecoder(handle, 1);
			lib_player.SetSmartPlayerVideoHWDecoder(handle, 1);
		}

		// 有些场景可能需要解码出来的图像用来做分析或重新编码
		// 这里可以设置yuv或rgb callback, 把图像给Caller
		// lib_player.SmartPlayerSetExternalRender(handle, new RGBAExternalRender());
		// lib_player.SmartPlayerSetExternalRender(handle, new I420ExternalRender());

		if (0 == lib_player.SmartPlayerStartPlay(handle))
			return handle;

		lib_player.SmartPlayerClose(handle);

		return 0;
	}

停止外部数据播放:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void stop_ex_live_src_play(SmartPlayerJniV2 lib_player, long handle) {
		if (null == lib_player)
			return;

		if (0 == handle)
			return;

		lib_player.SmartPlayerStopPlay(handle);
		lib_player.SmartPlayerClose(handle);
	}

总结

Android平台外部编码后H.264/H.265数据实时预览播放,在一些传统行业里面,可以说是意义非常大,除了可以预览回调过来的数据外,还可以针对外部数据做二次视频分析、二次编辑投递(实时水印、字符叠加等),感兴趣的开发者可以试试看。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android平台如何实现第三方模块编码后(H.264/H.265/AAC/PCMA/PCMU)数据实时预览播放
我们在做GB28181设备对接模块和RTMP直播推送模块的时候,遇到这样的技术需求,设备(如执法记录仪)侧除了采集传统的摄像头外,还需要对接比如大疆等第三方数据源,确保按照GB28181规范和RTMP协议规范,接入到国标平台侧和RTMP服务,除了正常的接入需求外,还需要对第三方数据源回调过来的编码后视频、音频数据实时预览和播放。
音视频牛哥
2023/07/24
2710
Android平台如何实现第三方模块编码后(H.264/H.265/AAC/PCMA/PCMU)数据实时预览播放
Android平台外部编码数据(H264/H265/AAC/PCMA/PCMU)实时预览播放技术实现
是的,一般场景是用不到的,我们在开发这块前几年已经开发了非常稳定的RTMP、RTSP直播播放模块,不过也遇到这样的场景,部分设备输出编码后(视频:H.264/H.265,音频:AAC/PCMA/PCMU)的数据,比如无人机或部分智能硬件设备,回调出来的H.264/H.265数据,除了想转推到RTMP、轻量级RTSP服务或GB28181外,还需要本地预览甚至对数据做二次处理(视频分析、实时水印字符叠加等,然后二次编码),基于这样的场景诉求,我们开发了Android平台外部编码数据实时预览播放模块。
音视频牛哥
2023/05/19
6670
Android平台外部编码数据(H264/H265/AAC/PCMA/PCMU)实时预览播放技术实现
GB28181设备接入侧如何对接外部编码后音视频数据并实现预览播放
我们在对接GB28181设备接入模块的时候,遇到这样的技术诉求,好多开发者期望能提供编码后(H.264/H.265、AAC/PCMA)数据对接,确保外部采集设备,比如无人机类似回调过来的数据,直接通过模块,对接到GB28181平台侧,此外,还期望不支持或者内网没有外部网络权限的RTSP设备,也能间接接入到国标平台。
音视频牛哥
2023/08/19
2560
GB28181设备接入侧如何对接外部编码后音视频数据并实现预览播放
​​Android平台GB28181历史视音频文件回放规范解读及技术实现
在实现GB28181历史视音频文件回放之前,我们已完成了历史视音频文件检索和下载,历史视音频回放,在GB28181平台非常重要,比如执法记录仪等前端设备,默认录像数据存储在前端设备侧,如果需要上传到平台统一保存,除了到工作站拷贝外,还可以通过GB28181的历史视音频文件下载到指挥中心。如果指挥中心需要直接看历史视音频文件,也可以通过GB28181历史视音频回放实现。
音视频牛哥
2023/11/07
1.3K1
​​Android平台GB28181历史视音频文件回放规范解读及技术实现
​​Android平台GB28181历史视音频文件下载规范探讨及技术实现
上篇blog,我们提到了​​Android平台GB28181历史视音频文件检索规范探讨及技术实现​​,文件检索后,GB28181平台侧,可以针对文件列表进行回放或下载操作,本文主要探讨视音频文件下载相关。
音视频牛哥
2023/09/06
6390
​​Android平台GB28181历史视音频文件下载规范探讨及技术实现
H264和H265的nalu介绍
本篇介绍下H264和H264的编码格式,包括avcc,annexb,以及转换方法。annexb 用于实时流的场景,avcc用于多媒体文件,如mp4,mkv等场景。
一只小虾米
2022/10/25
2.9K0
H264和H265的nalu介绍
如何支持RTSP播放H.265(HEVC)流
随着H.265的普及,越来越多的开发者希望大牛直播SDK(Github)能支持低延迟的RTSP H.265播放,并分享相关经验:
音视频牛哥
2019/09/18
2.6K0
H264之NALU解析
H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准⾥称 为H.264,在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10,⼜叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC:
用户6280468
2022/03/21
2.4K0
H264之NALU解析
音视频八股文(8)-- h264 AnnexB
H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准⾥称为H.264,在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10,⼜叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC。
福大大架构师每日一题
2023/06/09
6760
音视频八股文(8)-- h264 AnnexB
H264和H265的视频编码
H.264是一种高度压缩数字视频编解码器标准,由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组建的联合视频组(JVT,Joint Video Team)共同制定,由此H.264既是ITU-T的H.264标准,又是ISO/IEC的MPEG-4标准的第10部分:高级视频编码(AVC,Advanced Video Coding),因而H.264别名为AVC、MPEG-4 Part 10以及ISO/IEC 14496-10,H.264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。
春江花月夜
2023/12/24
4.9K1
H264和H265的视频编码
SkeyeRTMPClient扩展支持HEVC(H.265)解决方案之兼容H264和H265帧数据解析详解
在之前两篇关于SkeyeRTMPClient扩展支持HEVC(H.265)解决方案的文章中,我们已经完成了对H265的支持,本文主要阐述将H26和H265支持兼容起来,实现不同视频编码格式的自适应兼容适配。
Openskeye
2023/04/21
4990
H.264编码格式简单分析
  H.264的重要性不再提了。本文主要记录一下H.264的编码格式。H.264官方文档:https://github.com/jiayayao/DataSheet/tree/master/encode-decode/h264。
望天
2019/07/11
2.1K0
H.264编码格式简单分析
Android平台GB28181设备接入模块开发填坑指南
为什么要开发Android平台GB28181设备接入模块?这个问题不再赘述,在做Android平台GB28181客户端的时候,媒体数据这块,我们已经有了很好的积累,因为在此之前,我们就开发了非常成熟的RTMP推送、轻量级RTSP服务、录像模块、针对音视频的对接处理单元。这让我们在做Android平台GB28181设备接入模块的时候,可以有更多的精力在信令交互和国标平台对接。
音视频牛哥
2023/11/26
7450
Android平台GB28181设备接入模块开发填坑指南
H.264封装成FLV
H264是一个个NALU单元组成的,每个单元以00 00 01 或者 00 00 00 01分隔开来,每2个00 00 00 01之间就是一个NALU单元。我们实际上就是将一个个NALU单元封装进FLV文件。
Helloted
2022/06/07
1.3K0
H.264封装成FLV
如何实现Android视音频数据对接到GB28181平台(SmartGBD)
在做Android平台GB28181接入模块之前,我们在RTMP推送播放、RTSP轻量级服务、转发、播放这块,已经有很多年的经验,这意味着,我们不需要重复造轮子,已有屏幕、摄像头或编码前(目前支持的有YV12/NV21/NV12/I420/RGB24/RGBA32/RGB565等数据类型)或编码后(H.264/HEVC)数据,只需要实现GB28181的信令交互,和媒体处理,即可实现不具备国标音视频能力的 Android终端,通过平台注册接入到现有的GB/T28181—2016服务。
音视频牛哥
2023/10/26
4950
如何实现Android视音频数据对接到GB28181平台(SmartGBD)
H265/HEVC编码NAL的单元的介绍
与H.264/AVC 类似,H265/HEVC也采用视频编码层(Video Coding Layer,VCL)和网络适配层(Network Abstract Layer, NAL)的双层结构,以适应不同网络环境和视频应用。网络适配层的主要任务是对视频压缩后的数据进行划分和封装,并进行必要的标识,使其更好的适应各种网络环境。
用户4148957
2022/06/14
3.3K0
H265/HEVC编码NAL的单元的介绍
H.264格式分析
一.H.264基本流结构 H.264 的基本流(elementary stream,ES)的结构分为两层,包括视频编码层(VCL)和网络适配层(NAL)。视频编码层负责高效的视频内容表示,而网络适配层负责以网络所要求的恰当的方式对数据进行打包和传送。引入NAL并使之与VCL分离带来的好处包括两方面:1、使信号处理和网络传输分离,VCL 和NAL 可以在不同的处理平台上实现;2、VCL 和NAL 分离设计,使得在不同的网络环境内,网关不需要因为网络环境不同而对VCL比特流进行重构和重编码。 ☆VCL(Vide
_gongluck
2018/03/08
5.1K0
H.264格式分析
iOS AVDemo(10):视频解封装,从 MP4 解出 H.264/H.265丨音视频工程示例
iOS/Android 客户端开发同学如果想要开始学习音视频开发,最丝滑的方式是对音视频基础概念知识有一定了解后,再借助 iOS/Android 平台的音视频能力上手去实践音视频的采集 → 编码 → 封装 → 解封装 → 解码 → 渲染过程,并借助音视频工具来分析和理解对应的音视频数据。
关键帧
2022/06/13
6810
iOS AVDemo(10):视频解封装,从 MP4 解出 H.264/H.265丨音视频工程示例
H.264编码及AAC编码基础
本节重点讲解了 H.264 编码以及 AAC 编码,在对其进行讲解前先介绍了视频编码的实现原理。
Gnep@97
2023/09/10
1.3K0
H.264编码及AAC编码基础
音视频开发之旅(56) -H264/AVC基本结构
音视频编码的标准由标准发展组织制定,主要两大组织:ISO(国际标准化组织和国际电工委员会)和ITU-T(国际电信联盟的电信标准化部门)
音视频开发之旅
2021/09/04
1K0
推荐阅读
相关推荐
Android平台如何实现第三方模块编码后(H.264/H.265/AAC/PCMA/PCMU)数据实时预览播放
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验