正在保存HLS流?

时间:2018-08-22 20:04:09

标签: java android mp4 m3u8 mkv

我想下载一个视频流,并想用一个MP4的单个包将它们保存到本地存储中。

有关.ts文件(即视频流的大部分)的所有信息都保存到名为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 

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

请帮助我下载这些文件。 真的很欢迎带代码的答案。

2 个答案:

答案 0 :(得分:0)

使用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网址,而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的示例

答案 1 :(得分:0)

很简单,你可以运行这个命令,然后等待完成流:

ffmpeg -i https://server.mine.it/video_id.m3u8 -c copy -bsf:a aac_adtstoasc output.mp4

Thr FFMPEG 为您做到!