前幾天做了一個(gè)演示的機(jī)頂盒項(xiàng)目,用到了ijkplayer播放器姨俩,此播放器功能是挺強(qiáng)大的,做時(shí)用的是在線視頻账嚎,都挺順利克滴,做完后,客戶要求換成本地視頻熄驼,這也不難像寒,想著簡單啊,誰知坑就在腳下瓜贾。接下來就說道說道诺祸。
-
1.使用本地視頻,那直接在項(xiàng)目中建個(gè)raw文件夾吧祭芦,用來放視頻資源筷笨,目錄如下:
2.進(jìn)行路徑獲取,設(shè)置給播放器使用
uri = "android.resource://" + getPackageName() + "/" + R.raw.benz;
結(jié)果播放器報(bào)錯(cuò)了
E/IJKMEDIA: android.resource://com.sh.project.yz.b/2131492864: Protocol not found
E/tv.danmaku.ijk.media.player.IjkMediaPlayer: Error (-10000,0)
播放器地址不對(duì)啊龟劲,打印出來一看R.raw.benz輸出的是視頻的id奥秆,肯定不對(duì)啊,干脆直接寫死咸灿,看看是否能播放构订,結(jié)果
E/IJKMEDIA: android.resource://com.sh.project.yizhuang.b/benz.mp4: Protocol not found
E/tv.danmaku.ijk.media.player.IjkMediaPlayer: Error (-10000,0)
還是錯(cuò)誤的。項(xiàng)目要的急避矢,那直接換其他方式算了悼瘾,直接把視頻放入assets下,看看能夠播放不审胸,結(jié)果
E/IJKMEDIA: /android_asset/benz.mp4: No such file or directory
E/tv.danmaku.ijk.media.player.IjkMediaPlayer: Error (-10000,0)
呀亥宿,還是不對(duì),路徑怎么少了點(diǎn)東西呢砂沛,寫的明明是uri = "file:///android_asset/benz.mp4"; 怎么file沒了呢烫扼,我估計(jì)是ijkplayer在底層對(duì)播放連接做了處理吧,直接給改了碍庵。急映企、急!
干脆直接把放在assets下本地視頻拷貝到指定的路徑下静浴,因?yàn)橹笆褂肬盤播放是可以的堰氓,在線播放也是沒有問題的。寫的工具類如下:
public class FileUtils {
private static volatile FileUtils instance;
private FileUtils() {
}
public static FileUtils getInstance() {
if (instance == null) {
synchronized (FileUtils.class) {
if (instance == null) {
instance = new FileUtils();
}
}
}
return instance;
}
public String getModelFilePath(Context context, String modelName) {
copyFileIfNeed(context, modelName);
return context.getFilesDir().getAbsolutePath() + File.separator + modelName;
}
/**
* 拷貝asset下的文件到context.getFilesDir()目錄下
*/
private void copyFileIfNeed(Context context, String modelName) {
InputStream is = null;
OutputStream os = null;
try {
// 默認(rèn)存儲(chǔ)在data/data/<包名>/file目錄下
File modelFile = new File(context.getFilesDir(), modelName);
is = context.getAssets().open(modelName);
if (modelFile.length() == is.available()) {
return;
}
os = new FileOutputStream(modelFile);
byte[] buffer = new byte[1024];
int length = is.read(buffer);
while (length > 0) {
os.write(buffer, 0, length);
length = is.read(buffer);
}
os.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
使用如下:
uri = FileUtils.getInstance().getModelFilePath(this, "benz.mp4");
輸出的播放地址位:/data/data/com.sh.project.yz.b/files/benz.mp4苹享,總算可以了双絮,整理整理趕緊打包演示,嘿嘿。以上只是針對(duì)本地視頻源較小的10兆以內(nèi)的囤攀,如果大資源的視頻本地播放软免,還是建議使用讀取U盤播放。
注意:使用Android系統(tǒng)自帶的播放器沒有此問題焚挠。