使用exoplayer2 播放AES加密過的視頻流认境。
目的是為了實現(xiàn)邊解密邊播放。
轉(zhuǎn)載
https://blog.csdn.net/wanniu/article/details/78533796
//google音視頻播放框架
compile 'com.google.android.exoplayer:exoplayer:r2.5.4'
利用exoplayer自定義了DataSource來解密AES加密的流课竣。
核心代碼:
// 1.創(chuàng)建一個默認TrackSelector,測量播放過程中的帶寬嘉赎。 如果不需要置媳,可以為null。
DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
//從MediaSource中選出media提供給可用的Render S來渲染,在創(chuàng)建播放器時被注入
TrackSelection.Factory videoTrackSelectionFactory =
new AdaptiveTrackSelection.Factory(bandwidthMeter);
//自適應(yīng)軌道
TrackSelector trackSelector =
new DefaultTrackSelector(videoTrackSelectionFactory);
//控制MediaSource緩存media
DefaultLoadControl loadControl = new DefaultLoadControl();
WeimsDataSourceFactory 復(fù)制 DefaultDataSourceFactory
核心方法:
public DataSource createDataSource() {
return new WeimsDataSource(context, listener, baseDataSourceFactory.createDataSource());
}
WeimsDataSource 復(fù)制 DefaultDataSource
核心方法
if (Util.isLocalFileUri(dataSpec.uri)) {
if (dataSpec.uri.getPath().endsWith(".weims")) {
Aes128DataSource aes128DataSource =
new Aes128DataSource(getFileDataSource(), WEKey.getBytes(), WEKey.getBytes());
dataSource = aes128DataSource;
}else {
對本地url增加一個判斷
直接使用框架里既有的
Aes128DataSource
new Aes128DataSource(getFileDataSource(), WEKey.getBytes(), WEKey.getBytes());
上流的數(shù)據(jù)流用fileDataSource包裝一次公条。讓其具有文件的長度判斷拇囊。
(mp4格式頭信息在datasourse前 或者 尾部 到至解碼失敗。
)
upstream The upstream {@link DataSource}.
邊解密邊播放的定制explay
現(xiàn)在出現(xiàn)的問題:
mp4格式頭信息在datasourse前 或者 尾部 到至解碼失敗靶橱。
解決思路:QtFastStart 工具類寥袭。可以轉(zhuǎn)換moov位置
把moov提到mdat之前抓韩。
播放時無法seekto
解決思路:重寫框架里的ParsableByteArray
public int readUnsignedIntToInt() {
int result = readInt();
if(result<0)
{
result = -result;
}
return result;
}
這樣修改后纠永,會出現(xiàn),畫面顯示顏色落差谒拴,以及聲音音量尝江。錯亂。
思路:
發(fā)現(xiàn)CBC加密方式英上,是填充和異或前一個加密塊的炭序,來加密現(xiàn)在這個明文塊。
發(fā)現(xiàn)CBC方式苍日,不適合流加解密惭聂。
然后選擇CFB128加解密,只因(CFB模式非常適合對流數(shù)據(jù)進行加密相恃,解密可以并行計算辜纲。大佬博文說的:https://blog.csdn.net/chaiyu2002/article/details/79757697)
發(fā)現(xiàn)此加解密方式,延時更長拦耐,上述問題還是發(fā)生耕腾。反而CBC方法更好些。問題還待研究杀糯。研究源碼在解密的時候扫俺,發(fā)現(xiàn)H264 NULLenght 獲取simple長度有問題。MP4格式的H264 特點是:8.MP4文件中的NAL
MP4文件中的一個sample由多個NALU組成固翰。大體結(jié)構(gòu)如下:Length1+NALU1+Length2+NALU2+狼纬。。骂际。疗琉。其中Length表示下一個NALU的長度(不包括Length本身的長度),而NALU的第一個字節(jié)是表示該NALU的頭部歉铝。通過NALU頭部的信息可以得到該NALU的類型没炒。但是具體細節(jié)還是不懂呀