tunnel
在最新的Android版本上(AndroidO)为了降低播放4K60FPS片源对整机性能的过度消耗,Android出现了一种新的视频播放模式tunnel Mode。
下面是关键的几步适配Tunnel Mode的方式:
1.需要Audio sessionID,这个是由Audio Manager生成的
audiOSessionId = ((AudioManager)ctx.getSystemService(context.AUDIO_SERVICE)).generateAudioSessionId();
2.配置docoder尾tunnel mode模式
format.setFeatureEnabled(MediaCodecInfo.CodecCapabilities.FEATURE_TunneledPlayback, true);
3.通过audio sessionid来配置video decoder
format.setinteger(android.media.MediaFormat.KEY_AUDIO_SESSION_ID, audioSessionId);
4.通过SessionId创建auditrack,同时设置FLAG_HW_AV_SYNC flag让底层知道需要硬件同步
AudioAttributes attr = new AudioAttributes.builder()
.setLegacyStreamType(AudioManager.STREAM_MUSIC)
.setFlags(AudioAttributes.FLAG_HW_AV_SYNC)
.build();
AudioFormat fmt = new AudioFormat.Builder()
.setEncoding(targetEncoding)
.setSampleRate(sampleRate)
.setChannelMask(channelConfig)
.build();
AudioTrack audioTrack = new android.media.AudioTrack(attr, fmt, bufferSize, 575 android.media.AudioTrack.MODE_STREAM, audioSessionId);
5.video decoder不需要调用dequeueOutputBuffer和releaseOutPutBuffer
6.需要在音频写入audiotrack的时候在头部插入一个16 byte的avsync header
private ByteBuffer avSyncHeader = null;
avSyncHeader = ByteBuffer.allocate(16);
avSyncHeader.order(ByteOrder.BIG_ENDIAN);
avSyncHeader.position(0);
avSyncHeader.order(ByteOrder.BIG_ENDIAN);
avSyncHeader.putInt(AVSYNC_START_CODE);
avSyncHeader.putInt(bufferBytesRemaining);
avSyncHeader.putLong(presentationTimeUs * 1000 );
avSyncHeader.position(0);
这个header包含一个起始码,pts(nano sec),和数据的size。再写入audio数据前先写入这个header data。
具体调试中还会有一些坑,这个得调试的过程中才能一一分析解决。
相关阅读
最近在一台新电脑上面装XX-Net,刚开始扫描IP贼慢,当时没多在意,今天在github上面突然发现XX-Net新增了一条日志: 2017-09-228月份开
我是一个VB初学者,最近苦恼于VB的窗体和控件的ScaleMode问题,VB里默认的ScaleMode是twip,而往往我们希望它是pixel,虽然在属性面板里
Model、ModelMap和ModelAndView的使用详解
1.前言 最近SSM框架开发web项目,用得比较火热。spring-MVC肯定用过,在请求处理方法可出现和返回的参数类型中,最重要就是Model和Mod
ipad提示exit safe mode是什么原因该如何解决
ipad exit safe mode怎么解决?小编带来了ipad exit safe mode解决方法,有果粉在使用iPad时会突然提示“exit safe mode&rdquo
第一步:连接好ADSL线路,将计算机“本地连接”的“IP地址”和“DNS服务器地址”设为“自动获取