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

我想从movie.mp4中提取视频的前10 MB,并将其保存在一个临时文件中。我将把这个文件输入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 MB的限制并让循环运行,VideoView会很好地播放文件。

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

最佳答案

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

尽管有大量关于使用FFmpeg编码MPEG 4视频的文章,但大多数文章都未对某些内容发出警告:大多数视频播放器在元数据可用之前不会开始播放(这意味着是否将数据放置在FFmpeg的后端)。文件(如某些编码器所做的那样),必须先下载整个视频以获取元数据并开始播放)。

此示例使用ffmpeg创建mp4快速入门视频:


  ffmpeg.exe -i INPUT_FILE_NAME_HERE -c:v libx264 -profile:v基准
  -预设慢速-b:v 800k -c:a libvo_aacenc -movflags快速启动OUTPUT_FILE_NAME.mp4

09-10 07:03
查看更多