创建可播放的视频文件预览

时间:2016-05-18 21:27:19

标签: java android video

我有一个文件movie.mp4,我希望在VideoView中创建并播放。出于这个问题的目的,让我们说movie.mp4是30兆字节。

我想从movie.mp4中提取前10兆字节的视频,并将其保存在临时文件中。我会将此文件提供给VideoView并播放。

这是我到目前为止所做的:

// Get movie file.
File f = getMovieFile("movie.mp4");

// Create temporary file.
File t = File.createTempFile("preview", "mp4");
t.deleteOnExit();

// Create input stream.
InputStream is = new FileInputStream(f);
BufferedInputStream bis = new BufferedInputStream(is, 2048);

// Create output stream to temp file.
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(t));

byte[] buffer = new byte[16384];
int totalRead = 0;
int bytesRead;

int maxBytes = (int) Math.pow(2, 20) * 10; // 10 megabytes

// Write data from input to output.
while ((bytesRead = bis.read(buffer)) != -1 && totalRead < maxBytes) {
    bos.write(buffer, 0, bytesRead);
    bos.flush();
    totalRead += bytesRead;
}

bos.close();

// Play the preview.
mVideoView.setVideoPath(t.getAbsolutePath());
mVideoView.start();

当我运行这段代码时,Android会抱怨并告诉我该文件无法播放。如果我删除10兆字节限制并让循环运行,VideoView将正常播放该文件。

我猜测在创建预览时只复制了文件某个部分的数据时,新文件中缺少原始mp4文件中的一些重要元数据。这只是猜测。

1 个答案:

答案 0 :(得分:1)

问题出在你的视频中, 部分mp4必须在文件开头有元数据。

虽然有大量关于使用FFmpeg编码MPEG 4视频的文章,但大多数都未能提醒您:大多数视频播放器在元数据可用之前不会开始播放(这意味着如果数据放在后面文件的末尾,如某些编码器所做的那样,必须首先下载整个视频才能到达元数据并开始播放。

此示例使用ffmpeg创建mp4快速启动视频:

  

ffmpeg.exe -i INPUT_FILE_NAME_HERE -c:v libx264 -profile:v baseline   -preset slow -b:v 800k -c:libvo_aacenc -movflags faststart OUTPUT_FILE_NAME.mp4