【问题标题】:Saving HLS stream?保存 HLS 流?
【发布时间】:2018-08-22 20:04:09
【问题描述】:

我想下载一个视频流,并希望将它们保存到本地存储中,使用单个包作为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

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

【问题讨论】:

    标签: java android mp4 m3u8 mkv


    【解决方案1】:

    使用 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 的示例

    【讨论】:

    • 非常感谢@Tién 的回答,我是认真的。但是我不知道如何为其添加暂停和恢复?,如果网络中断并暂停下载怎么办?它会再次下载整个文件吗?真的在等待您的回复...
    • 嗯,我认为没有办法暂停和恢复下载。你找到解决办法了吗?
    • 当然有一种方法,我在应用程序中见过,一种是Videoder。但不幸的是我目前没有找到任何方法。
    • @Mark 你能把 Play Store 上的应用网址发给我吗?
    【解决方案2】:

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

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

    Thr FFMPEG 为你做这件事!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      • 2021-04-08
      相关资源
      最近更新 更多