首页
社区
课程
招聘
[原创]万能播放器FFMpeg+SSL播放 可保存正在播放的视频 可播放https网络视频
发表于: 2019-10-21 17:25 5739

[原创]万能播放器FFMpeg+SSL播放 可保存正在播放的视频 可播放https网络视频

2019-10-21 17:25
5739
本篇提供已编译好的so库供大家使用,具体编译过程请自行查询测试

注:下载压缩中apk有一个bug,在视频seek大于30分钟时,会自动跳到视频的开始处,此问题出在so中,so已替换最新的,问题已解决,本人较懒apk没有编译最新的(2019-10-31)

Demo下载

下载地址:  https://www.lanzous.com/i736mcf


更多资源传送门: https://bbs.pediy.com/user-854079.htm  
只下载视频的例子: https://bbs.pediy.com/thread-255295.htm
文中使用ffmpeg-3.3.8+openSLL-1.0.2q。
ffmpeg-4.0.3不稳定(av_bsf_alloc此方法偶崩溃),有知道原因的,可指导一下  
使用方法如下:
<com.z.view.VideoView
        android:id="@+id/vv_surface"
        android:layout_width="match_parent"
        android:layout_height=" match_parent " />
// MediaPlayer使用可参考系统默认中的使用方法
mediaPlayer = new MediaPlayer();
mediaPlayer.setVideoView(videoView);
//mediaPlayer.setWindowMode(ScaleType.FIT_ADAPT);//显示方式,默认即可
//设置最大视频可缓冲时间(秒,<=0不做最大缓冲
mediaPlayer.setNetMaxBuffer(3*60);
//设置最小视频可缓冲时间(秒,不到达此时间,将不播放,<=0不做最小缓冲
mediaPlayer.setNetMinBuffer(3);//缓冲3秒钟后播放

String CPU_ABI = android.os.Build.CPU_ABI;
Toast.makeText(this, CPU_ABI, Toast.LENGTH_SHORT).show();
Log.e(TAG,CPU_ABI);
String url = getUrl();
Log.e(TAG,"is File "+new File(url).isFile());
Log.e(TAG,url);
mediaPlayer.setSource(url);//设置要播放的链接
mediaPlayer.prepare();

//变速变调
//mediaPlayer.setSpeed(1f);
//mediaPlayer.setPicth(1.5f);

//停止正在录制的视频
//mediaPlayer.stopSaveVideo();

//播放的视频保存到此位置
//mediaPlayer.setSaveVideoFile(Environment.getExternalStorageDirectory()+File.separator+"123.mp4");

//启用硬件解码(默认开启
//mediaPlayer.setEnableHardware(false);
////////////////////////////////////////以下为初始化播放时的监听////////////////////////////////////////////////////////////
mediaPlayer.setOnPreparedListener(new OnParparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
Log.e(TAG,"准备好了,可以播放");
if(mp.isPause()) {
Log.e(TAG,"pause 暂停");
}else {
mp.start();
}
                int width = mp.getWidth();
                int height = mp.getHeight();
                Log.e(TAG,"width:"+width +"  height:"+height);
                Log.e(TAG, " 硬解码:  "+mediaPlayer.isHardware());
                int fps = mp.getFps();
                Log.e(TAG,"fps: "+fps);
                if(mediaPlayer.getDuration()>0) {
                Log.e(TAG,"播放位置:"+mediaPlayer.getCurrentPosition());
                long curr = mediaPlayer.getCurrentPosition()/1000;
                long total= mediaPlayer.getDuration()/1000;
                Log.e(TAG,"播放位置:"+curr);
                Log.e(TAG,"时长:"+total);
            tvTime.setText(getTime(curr)+"/"+getTime(total));
//             Log.e(TAG, "当前播放位置:           "+curr);
// Log.e(TAG, "总时长:       "+total);
            if(total>0) {
            int p = (int) (curr * 100 / total);
//             Log.e(TAG, "seek  "+p);
                seekBar.setProgress(p);
            }
                }
}
});
mediaPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent, long second) {
long duration = mediaPlayer.getDuration();
                                 //second 缓冲的时间(缓冲的位置-播放的位置)
// second = second/1000;
// Log.e(TAG, "视频时长(秒)  :       "+duration/1000);
}
});
        mediaPlayer.setOnLoadListener(new OnLoadListener(){
            @Override
            public void onLoad(boolean load) {
                if(load){//正在加载
                    Log.e(TAG,"加载中");
                }else{//加载完成
                    Log.e(TAG,"播放中");
                }
                Log.e(TAG,"pause "+mediaPlayer.isPause());
                
            }
        });
        mediaPlayer.setOnTimedTextListener(new OnTimeInfoListener() {
            @Override
            public void onTimeInfo(TimeInfoBean timeInfoBean) {
//                Log.e(TAG,timeInfoBean.toString());
//                Log.e(TAG,"onTimeInfo  "+timeInfoBean.getCurrentTime());
                long curr = timeInfoBean.getCurrentTime()/1000;
                long total= timeInfoBean.getTotalTime()/1000;
            tvTime.setText(getTime(curr)+"/"+getTime(total));
//             Log.e(TAG, "当前播放位置:           "+curr);
// Log.e(TAG, "总时长:       "+total);
            if(!isTouch && total>0) {
            int p = (int) (curr * 100 / total);
//             Log.e(TAG, "seek  "+p);
                seekBar.setProgress(p);
            }
//                handler.sendMessage(msg);
            }
        });
        mediaPlayer.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int code, String extra) {
Log.e(TAG,"error code:"+code);
Log.e(TAG,extra);
if(code >= 1500) {
Toast.makeText(MainActivity.this, "文件打开错", Toast.LENGTH_SHORT).show();
}else {
// Log.e(TAG,"is File ");
}
// if(code==1001) {
// String source = mediaPlayer.getSource();
// Log.e(TAG,"is File "+new File(source).isFile());
// }
return false;
}
});
        mediaPlayer.setOnCompletionListener(new OnCompleteListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Log.e(TAG,"播放结束");
}
});
        mediaPlayer.setOnValumeDBListener(new OnValumeDBListener() {
            @Override
            public void onDbValue(int db) {
//                Log.e(TAG,"分贝值:"+db);
            }
        });

[课程]Linux pwn 探索篇!

最后于 2019-10-31 16:10 被富到流油^-^编辑 ,原因: 补充说明
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
跟这个有啥区别:https://github.com/videolan/vlc
2019-10-22 11:50
0
雪    币: 506
活跃值: (3293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我觉得的功能上差不多,但项目文件个数上你看有区别不
2019-10-22 14:02
0
雪    币: 506
活跃值: (3293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
sudami 跟这个有啥区别:https://github.com/videolan/vlc
体积更小
2022-4-15 14:57
0
游客
登录 | 注册 方可回帖
返回
//