我想下载一个视频流,并想用一个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
请帮助我下载这些文件。 真的很欢迎带代码的答案。
答案 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 为您做到!