java - 保存 HLS 流?

标签 java android mp4 m3u8 mkv

我想要下载视频流,并希望使用单个包作为 MP4 将它们保存到本地存储。

有关 .ts 文件(视频流 block )的所有信息都保存到名为 info_media.m3u8 的文件中,.m3u8 如下所示:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:4.000,
VideoChunk_00001.ts
#EXTINF:4.000,
VudeoChunk_00002.ts
#EXTINF:4.000,
VideoChunk_00003.ts
#EXTINF:4.000,
VideoChunk_00004.ts
#EXTINF:4.000,
VideoChunk_00005.ts
#EXTINF:4.000,
...
#EXTINF:0.600,
master_Layer1_02150.ts
#EXT-X-ENDLIST 

现在我的问题是如何准确下载这些 block ?主 .m3u8 的 URL 类似于 https://server.mine.it/video_id.m3u8 和 block URL https://server.mine.it/videoid_videochunk_*.ts

请帮我下载这些文件。 非常欢迎带有代码的答案。

最佳答案

使用 FFmpeg

String cmd = String.format("-i %s -acodec %s -bsf:a aac_adtstoasc -vcodec %s %s", INPUT_FILE, "copy", "copy", dir.toString() + "/yourvideoname.mp4");
    String[] command = cmd.split(" ");
    execFFmpegBinary(command);

INPUT_FILE 是您的 m3u8 url,dir 是要保存的文件路径。

   private void execFFmpegBinary(String[] command) {
    try {
        FFmpeg ffmpeg = FFmpeg.getInstance(MainActivity.this);
        ffmpeg.execute(command, new FFmpegExecuteResponseHandler() {
            @Override
            public void onSuccess(String message) {
                Log.i(TAG, "onSuccess: " + message);
                progressBar.dismiss();
            }

            @Override
            public void onProgress(String message) {
                Log.i(TAG, "onProgress: " + message);
                progressBar.setMessage("Progressing: \n " + message);
            }

            @Override
            public void onFailure(String message) {
                Log.i(TAG, "onFailure: " + message);
                progressBar.dismiss();
            }

            @Override
            public void onStart() {
                progressBar.show();
                Log.e("Time", System.currentTimeMillis()+"");
            }

            @Override
            public void onFinish() {
                progressBar.dismiss();
                Log.e("Time", System.currentTimeMillis()+"");
            }
        });
    } catch (FFmpegCommandAlreadyRunningException e) {
        e.printStackTrace();
    }
}

Here是来自 github 的示例

关于java - 保存 HLS 流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51974318/

相关文章:

java - 我们需要运行多少次 Java 程序来预热 JVM?

Android - SQLite 数据库是否存在?

java - 使用 xuggler 从图片创建 mp4 和 java mp3

video - FFmpeg 视频过滤器损坏 mp4 文件

python - 在python中将元数据从一个mp4文件复制到另一个文件

java - 如何使用resultset输出SQL SUM语句?

java - 为什么静态类在 Java 中是非法的?

java - 修复操作栏中搜索 View 的 getfilter

java - NotificationChannel 不适用于 Android 8 及更高版本

android - 无法解析 android.support.design。迁移到 AndroidX 后