美文网首页
二、ijkplayer:修复播放本地raw目录文件

二、ijkplayer:修复播放本地raw目录文件

作者: 緦菍亭芷 | 来源:发表于2019-10-25 17:36 被阅读0次

    参考文档

    1、https://www.jianshu.com/p/9f4379e14ab6

    播放视频用的是官方DEMO下的IjkVideoView, 如果按照传统方法播放raw资源文件下的视频是不行的.

    A.获取raw资源文件方式

        String path = "android.resource://" + videoLayout.getContext().getPackageName() + "/" + R.raw.ball_1;
    
        videoLayout.setPath(path);
    

    B.实现接口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;
        }
    }
    

    C. 在VideoLayout的openVideo()中进行修改

            Uri mUri = Uri.parse(mPath);
            String scheme = mUri.getScheme();
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
                    (TextUtils.isEmpty(scheme) || scheme.equalsIgnoreCase("file"))) {
                IMediaDataSource dataSource = new FileMediaDataSource(new File(mUri.toString()));
                mMediaPlayer.setDataSource(dataSource);
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
                if (scheme.equals(ContentResolver.SCHEME_ANDROID_RESOURCE)) {
                    RawDataSourceProvider rawDataSourceProvider = RawDataSourceProvider.create(getContext(), mUri);
                    mMediaPlayer.setDataSource(rawDataSourceProvider);
                } else {
                    mMediaPlayer.setDataSource(getContext(), mUri, mHeader);
                }
            } else {
                mMediaPlayer.setDataSource(mUri.toString());
            }
            mMediaPlayer.prepareAsync();
    

    我自己封装的

    相关文章

      网友评论

          本文标题:二、ijkplayer:修复播放本地raw目录文件

          本文链接:https://www.haomeiwen.com/subject/ptcevctx.html