Android IjkPlayer 播放本地(Raw) 視頻

update: 在更改代碼完后記得 Bulid -> Clean Project, 不然可能因?yàn)榫彺嬖斐墒?

平時(shí)播放視頻用的是官方DEMO下的IjkVideoView, 如果按照傳統(tǒng)方法播放raw資源文件下的視頻是不行的.

//該方法適用在系統(tǒng)自帶的VideoView中使用, 在Ijk中無(wú)法識(shí)別
String path = "android.resource://" + getPackageName() + "/" + R.raw.filename;

查閱了半天資料, 試了多種方式, 最后篩選了其中有用的兩篇, 現(xiàn)整理出來(lái)大家可以直接拿去用.

1. 實(shí)現(xiàn)接口IMediaDataSource


public class RawDataSourceProvider implements IMediaDataSource {
    private AssetFileDescriptor mDescriptor;

    private byte[]  mMediaBytes;

    public RawDataSourceProvider(AssetFileDescriptor descriptor) {
        this.mDescriptor = descriptor;
    }

    @Override
    public int readAt(long position, byte[] buffer, int offset, int size) throws IOException {
        if(position + 1 >= mMediaBytes.length){
            return -1;
        }

        int length;
        if(position + size < mMediaBytes.length){
            length = size;
        }else{
            length = (int) (mMediaBytes.length - position);
            if(length > buffer.length)
                length = buffer.length ;

            length--;
        }
        System.arraycopy(mMediaBytes, (int) position, buffer, offset, length);

        return length;
    }

    @Override
    public long getSize() throws IOException {
        long length  = mDescriptor.getLength();
        if(mMediaBytes == null){
            InputStream inputStream = mDescriptor.createInputStream();
            mMediaBytes = readBytes(inputStream);
        }


        return length;
    }

    @Override
    public void close() throws IOException {
        if(mDescriptor != null)
            mDescriptor.close();

        mDescriptor = null;
        mMediaBytes = null;
    }

    private byte[] readBytes(InputStream inputStream) throws IOException {
        ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();

        int bufferSize = 1024;
        byte[] buffer = new byte[bufferSize];

        int len = 0;
        while ((len = inputStream.read(buffer)) != -1) {
            byteBuffer.write(buffer, 0, len);
        }

        return byteBuffer.toByteArray();
    }

    public static RawDataSourceProvider create(Context context, Uri uri){
        try {
            AssetFileDescriptor fileDescriptor = context.getContentResolver().openAssetFileDescriptor(uri, "r");
            return new RawDataSourceProvider(fileDescriptor);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

2. 在IjkVideoView的openVideo()中進(jìn)行修改

因?yàn)槲业捻?xiàng)目都是在4.4以上, 并且需求簡(jiǎn)單, 只是普通的方法一個(gè)視頻, 所以沒有過(guò)多的測(cè)試, 這里如果大家有什么需求, 請(qǐng)自己完善.

//   我將此段代碼添加在else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){} 中
//判斷Uri是否是包含android.resource
if(mUri.getScheme().equals(ContentResolver.SCHEME_ANDROID_RESOURCE)){
                    RawDataSourceProvider rawDataSourceProvider = RawDataSourceProvider.create(context, mUri);
                    mMediaPlayer.setDataSource(rawDataSourceProvider);
                }

完成.

接下來(lái)只要像平時(shí)一樣使用就可以了, setVideoPath的path(或者setVideoUri) 獲取依然使用開頭的方式拼接.

參考和部分代碼來(lái)源:
https://github.com/Bilibili/ijkplayer/issues/1013
http://www.cnblogs.com/xwgblog/p/5287151.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市遗座,隨后出現(xiàn)的幾起案子停忿,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扛或,死亡現(xiàn)場(chǎng)離奇詭異洲劣,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)空幻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門烁峭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人秕铛,你說(shuō)我怎么就攤上這事约郁。” “怎么了但两?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵鬓梅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我谨湘,道長(zhǎng)绽快,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任紧阔,我火速辦了婚禮坊罢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘擅耽。我一直安慰自己活孩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布乖仇。 她就那樣靜靜地躺著憾儒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乃沙。 梳的紋絲不亂的頭發(fā)上起趾,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音警儒,去河邊找鬼阳掐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛冷蚂,可吹牛的內(nèi)容都是我干的缭保。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼蝙茶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼艺骂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起隆夯,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钳恕,失蹤者是張志新(化名)和其女友劉穎别伏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忧额,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厘肮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了睦番。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片类茂。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖托嚣,靈堂內(nèi)的尸體忽然破棺而出巩检,到底是詐尸還是另有隱情,我是刑警寧澤示启,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布兢哭,位于F島的核電站,受9級(jí)特大地震影響夫嗓,放射性物質(zhì)發(fā)生泄漏迟螺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一舍咖、第九天 我趴在偏房一處隱蔽的房頂上張望矩父。 院中可真熱鬧,春花似錦谎仲、人聲如沸浙垫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至杉武,卻和暖如春辙诞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背轻抱。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工飞涂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祈搜。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓较店,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親容燕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梁呈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件蘸秘、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評(píng)論 4 62
  • 首先說(shuō)明我是BigBang的新飯 到目前為止 喜歡他們一年半 我不是白嫖(雖然我不懂某些粉絲為什么對(duì)白嫖那么介意整...
    QQxixi閱讀 203評(píng)論 0 0
  • 和一友人聊天時(shí),抓狂的發(fā)現(xiàn)寻咒,聊的來(lái)哮翘,是多么多么重要的一件事。 聊的來(lái)意味著什么毛秘?意味著你們的興趣所在...
    中等速度和貓咪閱讀 145評(píng)論 0 2
  • 竹蓀的營(yíng)養(yǎng)價(jià)值極高饭寺,據(jù)相關(guān)數(shù)據(jù)顯示,竹蓀含粗蛋白20% 熔脂、粗脂肪26% 佩研、碳水化合物38.1% ,還含有多種氨基酸...
    妞妞_d0f7閱讀 706評(píng)論 0 0