我想要下载视频流,并希望使用单个包作为 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/