我有一个文件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
文件中的一些重要元数据。这只是猜测。
答案 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