Code Monkey home page Code Monkey logo

videodownloader's Introduction

VideoDownloader

视频下载SDK功能

  • 下载整视频,如mp4/mkv/mov/3gp等视频
  • 下载HLS,即M3U8视频
  • M3U8 视频下载完成,会生成一个本地的local.m3u8文件
  • 视频下载完成,可以点击播放视频文件
  • 视频下载数据库记录视频下载信息
  • 增加视频下载队列
  • 增加M3U8合并为MP4的功能
  • 可以定制下载视频的标题和封面
  • 增加视频下载的group-name

版本更新

5.8.0
5.7.0
  • 解决合并时的HLS 支持hls-allowed_extensions ALL
5.6.0
  • 裁剪ffmpeg库,从10M降至1M
  • 优化TS合并逻辑
  • 提供armeabi-v7a arm64-v8a x86 x86_86四种so库
5.5.0
  • 增加视频下载的分组名
5.4.0
  • 可以定制视频下载的封面和标题
5.3.0
  • 优化M3U8合并为MP4的过程,解决时间戳不连续导致的合并失败的问题
  • 优化视频下载成功率
4.2.0
  • 优化TS合并逻辑
4.1.0
  • M3U8文件下载完成后合并为MP4文件
  • 优化部分HTTPS链接下载失败的问题
3.0.0
  • 解决部分M3U8视频下载失败的问题
  • 更新playersdk版本
  • 优化fileName和filePath问题

在build.gradle中引入

allprojects {
    repositories {
	    maven { url 'https://jitpack.io' }
	}
}

在demo中直接引用

dependencies {
    implementation 'com.github.JeffMony:VideoDownloader:5.8.0'
}

如果需要使用M3U8合并为MP4的功能,还需要额外引入(因为这个包有点大,如果需要就引入吧)

dependencies {
    implementation 'com.github.JeffMony:JeffFFmpegDemo:1.6.0'
}

如果想使用的合并库小一点.也可以使用较小的库,可以裁减很大的包

dependencies {
    implementation 'com.github.JeffMony:JeffM3U8Lib:1.2.0'
}

视频下载SDK接入

1.应用启动的时候注册download config
File file = VideoDownloadUtils.getVideoCacheDir(this);
if (!file.exists()) {
    file.mkdir();
}
VideoDownloadConfig config = new VideoDownloadManager.Build(this)
    .setCacheRoot(file)
    .setUrlRedirect(true)
    .setTimeOut(DownloadConstants.READ_TIMEOUT, DownloadConstants.CONN_TIMEOUT)
    .setConcurrentCount(DownloadConstants.CONCURRENT)
    .setIgnoreCertErrors(true)
    .setShouldM3U8Merged(true)
    .buildConfig();
VideoDownloadManager.getInstance().initConfig(config);
2.注册download listener回调,这个回调只要注册一次就行了,是全局回调
VideoDownloadManager.getInstance().setGlobalDownloadListener(mListener);

private DownloadListener mListener = new DownloadListener() {

    @Override
    public void onDownloadDefault(VideoTaskItem item) {}

    @Override
    public void onDownloadPending(VideoTaskItem item) {}

    @Override
    public void onDownloadPrepare(VideoTaskItem item) {}

    @Override
    public void onDownloadStart(VideoTaskItem item) {}

    @Override
    public void onDownloadProgress(VideoTaskItem item) {}

    @Override
    public void onDownloadSpeed(VideoTaskItem item) {}

    @Override
    public void onDownloadPause(VideoTaskItem item) {}

    @Override
    public void onDownloadError(VideoTaskItem item) {}

    @Override
    public void onDownloadSuccess(VideoTaskItem item) {}
};

VideoTaskItem中信息介绍

public class VideoTaskItem implements Cloneable {

    private String mUrl;                 //下载视频的url
    private long mDownloadCreateTime;    //下载创建的时间
    private int mTaskState;              //当前任务的状态
    private String mMimeType;            // 视频url的mime type
    private String mFinalUrl;            //30x跳转之后的url
    private int mErrorCode;              //当前任务下载错误码
    private int mVideoType;              //当前文件类型
    private M3U8 mM3U8;                  //M3U8结构,如果非M3U8,则为null
    private int mTotalTs;                //当前M3U8的总分片
    private int mCurTs;                  //当前M3U8已缓存的分片
    private float mSpeed;                //当前下载速度, getSpeedString 函数可以将速度格式化
    private float mPercent;              //当前下载百分比, 0 ~ 100,是浮点数
    private long mDownloadSize;          //已下载大小, getDownloadSizeString 函数可以将大小格式化
    private long mTotalSize;             //文件总大小, M3U8文件无法准确获知
    private String mFileHash;            //文件名的md5
    private String mSaveDir;             //保存视频文件的文件目录名
    private boolean mIsCompleted;        //是否下载完成
    private boolean mIsInDatabase;       //是否存到数据库中
    private long mLastUpdateTime;        //上一次更新数据库的时间
    private String mFileName;            //文件名
    private String mFilePath;            //文件完整路径(包括文件名)
    private boolean mPaused;

}

VideoTaskState下载状态信息介绍

public class VideoTaskState {
    public static final int DEFAULT = 0;//默认状态
    public static final int PENDING = -1;//下载排队
    public static final int PREPARE = 1;//下载准备中
    public static final int START = 2;  //开始下载
    public static final int DOWNLOADING = 3;//下载中
    public static final int PROXYREADY = 4; //视频可以边下边播
    public static final int SUCCESS = 5;//下载完成
    public static final int ERROR = 6;//下载出错
    public static final int PAUSE = 7;//下载暂停
    public static final int ENOSPC = 8;//空间不足
}
3.获取当前的下载任务
VideoDownloadManager.getInstance().fetchDownloadItems(IDownloadInfosCallback callback)

public interface IDownloadInfosCallback {
    void onDownloadInfos(List<VideoTaskItem> items);
}

接口返回的List就是当前正在下载的任务

4.启动下载
VideoDownloadManager.getInstance().startDownload(item);
5.暂停下载
VideoDownloadManager.getInstance().pauseDownloadTask(item.getUrl());
6.恢复下载
VideoDownloadManager.getInstance().pauseDownloadTask(item.getUrl());
7.删除下载任务
VideoDownloadManager.getInstance().deleteVideoTask(String videoUrl, boolean shouldDeleteSourceFile)
8.全部暂停
VideoDownloadManager.getInstance().pauseDownloadTask(List<String> urlList)
9.M3U8合并接口
        VideoProcessManager.getInstance().mergeTs(inputFilePath, outputFilePath, new IM3U8MergeListener() {
            @Override
            public void onMergedFinished() {
                LogUtils.i(TAG, "onMergedFinished");
                Toast.makeText(VideoMergeActivity.this, "合并成功", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onMergeFailed(Exception e) {
                LogUtils.i(TAG, "onMergeFailed, e=" + e.getMessage());
                Toast.makeText(VideoMergeActivity.this, "合并失败", Toast.LENGTH_SHORT).show();
            }
        });
功能示意

欢迎关注我的公众号JeffMony,我会持续为你带来音视频---算法---Android---python 方面的知识分享

videodownloader's People

Contributors

jeffmony avatar litianpeng avatar tranleo148 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

videodownloader's Issues

下载完成后闪退了

我在下载完成后就闪退出来了,下面是闪退的日志,不知道是什么情况
图片

闪退日志

Build version: 1.0
Build date: 2016-07-02 20:43:26
Current date: 2023-03-10 18:53:26
Device: Vivo V2171A
Stack trace:
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/jeffmony/m3u8library/VideoProcessManager;
at com.jeffmony.downloader.VideoDownloadManager.doMergeTs(VideoDownloadManager.java:650)
at com.jeffmony.downloader.VideoDownloadManager.handleOnDownloadSuccess(VideoDownloadManager.java:624)
at com.jeffmony.downloader.VideoDownloadManager.access$1100(VideoDownloadManager.java:43)
at com.jeffmony.downloader.VideoDownloadManager$VideoDownloadHandler.dispatchDownloadMessage(VideoDownloadManager.java:581)
at com.jeffmony.downloader.VideoDownloadManager$VideoDownloadHandler.handleMessage(VideoDownloadManager.java:533)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:223)
at android.os.Looper.loop(Looper.java:324)
at android.os.HandlerThread.run(HandlerThread.java:67)
Caused by: java.lang.ClassNotFoundException: com.jeffmony.m3u8library.VideoProcessManager
... 9 more

可否添加一个额外的字段

可否添加一个额外的字段,String类型,这样可以在下载和存储的时候可以附带一些别的信息,然后JSON.parse可以直接转类,感觉这样很方便

无法mergem3u8切片

URL:https://www.qzamfz.com/20190710/BjhH5Ffw/index.m3u8
LOG:
2020-12-01 10:51:44.093 11061-19328/com.jeffmony.videodemo I/VideoDownloadManager: VideoMerge doMergeTs taskItem=VideoTaskItem[Url=https://www.qzamfz.com/20190710/BjhH5Ffw/index.m3u8,Type=1,Percent=100.0,DownloadSize=30247069,State=5,FilePath=local.m3u8,LocalFile=/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/local.m3u8]
2020-12-01 10:51:44.094 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Input_path=/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/local.m3u8, Output_path=/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/merged.mp4
2020-12-01 10:51:44.094 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening '/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/local.key' for reading
2020-12-01 10:51:44.094 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_0.ts' for reading
2020-12-01 10:51:44.094 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_1.ts' for reading
2020-12-01 10:51:44.094 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_2.ts' for reading
2020-12-01 10:51:44.094 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_3.ts' for reading
2020-12-01 10:51:44.095 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_4.ts' for reading
2020-12-01 10:51:44.095 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_5.ts' for reading
2020-12-01 10:51:44.095 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_6.ts' for reading
2020-12-01 10:51:44.095 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_7.ts' for reading
2020-12-01 10:51:44.095 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_8.ts' for reading
2020-12-01 10:51:44.095 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_9.ts' for reading
2020-12-01 10:51:44.095 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_10.ts' for reading
2020-12-01 10:51:44.095 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_11.ts' for reading
2020-12-01 10:51:44.095 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_12.ts' for reading
2020-12-01 10:51:44.095 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_13.ts' for reading
2020-12-01 10:51:44.095 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_14.ts' for reading
2020-12-01 10:51:44.095 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_15.ts' for reading
2020-12-01 10:51:44.095 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_16.ts' for reading
2020-12-01 10:51:44.095 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_17.ts' for reading
2020-12-01 10:51:44.095 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_18.ts' for reading
2020-12-01 10:51:44.095 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_19.ts' for reading
2020-12-01 10:51:44.095 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_20.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_21.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_22.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_23.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_24.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_25.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_26.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_27.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_28.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_29.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_30.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_31.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_32.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_33.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_34.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_35.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_36.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_37.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_38.ts' for reading
2020-12-01 10:51:44.096 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_39.ts' for reading
2020-12-01 10:51:44.097 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_40.ts' for reading
2020-12-01 10:51:44.097 11061-19328/com.jeffmony.videodemo I/JeffMony_TS: Opening 'crypto:/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_41.ts' for reading
2020-12-01 10:51:44.097 11061-19328/com.jeffmony.videodemo E/JeffMony_TS: Error when loading first segment '/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/video_0.ts'
2020-12-01 10:51:44.098 11061-19328/com.jeffmony.videodemo E/JeffMony_TS: Could not open input file '/storage/emulated/0/Android/data/com.jeffmony.videodemo/files/Video/Download/e546f6e1e7a649e93be7cf705a9af9ec/local.m3u8'
2020-12-01 10:51:44.098 11061-19328/com.jeffmony.videodemo I/VideoDownloadManager: VideoMerge onMergeFailed e=java.lang.Exception: Merge ts failed

下载bug

1.下载进度错乱,同时几个一起下载,有时进度显示有问题
2.全部暂停时候,正在等待中的不会暂停,只会暂停下载中的
3.全部恢复下载只会恢复准备好的,未准备的不会恢复下载(正常使用场景暂时不会出现demo中未下载这个状态,都是从暂停中起始)

部分资源下载合并后很多播放器不能播放,只有个别播放器可以播

测试
https://tx.79da.com/data/tx/5f88c1a1bf9cac7ab9b42031.m3u8

使用ffmpeg合并ts后
测试播放器,x5内核sdk内置的tbs播放器,播放有画面,无声音,自己对接的playBase播放器,也是有画面无声音。
使用QQ浏览器的播霸可以正常播。

使用Java代码(字节流拼接)合并ts后,所有播放器均可正常播放。

猜测是ffmpeg拼接后做了转码处理,这个部分我不太懂,楼主有空可查看一下,如需提供更多测试地址可邮件我[email protected]

多轨道视频默认下载第一个

有多轨道视频的时候,会默认下载第一个,而第一个视频通常是清晰度最大的那个,建议加个配置项或者下载清晰度最高的

m3u8转MP4时报错

调试发现,在调用initFFmpegOptions方法时报错如下:
E/art: No implementation found for void com.jeffmony.m3u8library.VideoProcessor.initFFmpegOptions() (tried Java_com_jeffmony_m3u8library_VideoProcessor_initFFmpegOptions and Java_com_jeffmony_m3u8library_VideoProcessor_initFFmpegOptions__)
qi请问大佬这个该怎么处理
微信图片_20220114155820

在合并TS的时候会丢失数据

我有一个12秒的数据,下载完后会有一个1.24M的10秒ts和一个496.32k的2秒视频,合并之后会生成一个867k的12秒mp4,但是播放的时候会出现从第4秒直接跳转到11秒的情况,因为我们的m3u8是带auth时效的无法提供,你们有遇到这种情况吗?我的多条链接都出现这种情况

How to cancel a download and delete the temp file

How to cancel a download? I found nothing of such in the example too. By cancel I mean, stopping the process and removing the temp file that got downloaded.
I can only see start, pause and resume

使用中遇见的一些问题。。

下载最大数 3

现在下载队列中通过startDownload加入了5个任务。
目前3个任务下载中,还有两个任务在排队中:状态为 PENDING || PREPARE.
通过pauseAllDownloadTasks暂停所有后,会停止正在下载中的任务。但是在等待中的任务会去开始下载。这个算不算bug

proxy

Can proxy settings be added to the configuration

下载HLS视频结束异常

两个问题

  1. 任何任务结束后 onSpeed 一直回调,不会结束
  2. m3u8任务文件内有950个ts切片,下载log显示有951个,导致任务没办法正常走onSuccess,一直处于 onProgress,没办法结束任务。没有成功保存local.m3u8

Crash when call native code

NI DETECTED ERROR IN APPLICATION: mid == null
in call to CallVoidMethodV
from int com.jeffmony.m3u8library.VideoProcessor.transformVideo(java.lang.String, java.lang.String):
#00 pc 0x0000000000051b7c /apex/com.android.runtime/lib64/bionic/libc.so (abort)
#00 pc 0x00000000006d29ec /apex/com.android.art/lib64/libart.so (art::Runtime::Abort(char const*))
#00 pc 0x0000000000016ea8 /apex/com.android.art/lib64/libbase.so (android::base::SetAborter(std::__1::function<void (char const*)>&&)::$_3::__invoke(char const*))
#00 pc 0x0000000000016450 /apex/com.android.art/lib64/libbase.so (android::base::LogMessage::~LogMessage())
#00 pc 0x0000000000445224 /apex/com.android.art/lib64/libart.so (art::JavaVMExt::JniAbort(char const*, char const*))
#00 pc 0x00000000005ddc58 /apex/com.android.art/lib64/libart.so (art::JNI::CallVoidMethodV(_JNIEnv*, _jobject*, _jmethodID*, std::__va_list))
#00 pc 0x0000000000001438 /data/app/~~UDf0QWjusBaxWkkIlW81pg==/video.downloader.tiktok.instagram.file.saver.vault-7-eLgJNtJvibjsogVlDMpA==/split_config.arm64_v8a.apk!libjeffmony.so (_JNIEnv::CallVoidMethod(_jobject*, _jmethodID*, ...))
#00 pc 0x0000000000001a00 /data/app/~~UDf0QWjusBaxWkkIlW81pg==/video.downloader.tiktok.instagram.file.saver.vault-7-eLgJNtJvibjsogVlDMpA==/split_config.arm64_v8a.apk!libjeffmony.so (Java_com_jeffmony_m3u8library_VideoProcessor_transformVideo)
#00 pc 0x0000000000440554 /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline)
#00 pc 0x000000000020a2b0 /apex/com.android.art/lib64/libart.so (nterp_helper)
#00 pc 0x00000000013f955a /data/app/~~UDf0QWjusBaxWkkIlW81pg==/video.downloader.tiktok.instagram.file.saver.vault-7-eLgJNtJvibjsogVlDMpA==/oat/arm64/base.vdex (g.n.b.a.run)
#00 pc 0x00000000007199bc /data/misc/apexdata/com.android.art/dalvik-cache/arm64/boot.oat (java.util.concurrent.Executors$RunnableAdapter.call)

提点遇到到问题

1.mp4下载速度有时候乱飘,有时候显示30m,其实并没有这么快
2.VideoTaskItem是否能自定义几个参数,比如视频名字 视频图片(我已复制一份源码,增加了2个数据库表名)
3.获取历史任务,可以加上,如果下载状态为准备下载且mVideoDownloadQueue不存在这个任务,则设置下载状态为暂停(重新打开app,下载状态为准备下载,但是下载队列里并没有这个任务)这个问题我也自己改了一下

点击下载出错 这是什么情况

W/DownloadFeatureActivity: onDownloadPending: VideoTaskItem[Url=https://v3.dious.cc/20201224/6Q1yAHRu/index.m3u8, Type=0, Percent=0.0, DownloadSize=0, State=-1, FilePath=null, LocalFile=null, CoverUrl= , CoverPath=null]

W/VideoDownloadManager: onInfoFailed error=java.net.MalformedURLException: no protocol:
W/DownloadFeatureActivity: onDownloadError: https://v3.dious.cc/20201224/6Q1yAHRu/index.m3u8
W/VideoDownloadManager: removeDownloadQueue size=0,0,0

6.删除任务没删除数据库记录

//Delete one task
public void deleteVideoTask(VideoTaskItem taskItem, boolean shouldDeleteSourceFile) {
....
.....
mVideoDatabaseHelper.deleteDownloadItemByUrl(taskItem);//删除数据库记录
}

m3u8合并为MP4时失败

您好,请问下合并m3u8(调用native函数transformVideo)失败,返回-21是什么原因呢?谢谢!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.