我在我的项目中使用 0.4.2 版本的 jar 来录制视频并上传它。从 SimpleCameraHost.getVideoFileName() 返回的文件名在我的 Nexus 4 上是错误的。
看起来文件名带有时间戳,并且我在设备上有一个文件 Video_20131113_223704.mp4 但该方法将 Video_20131113_223708.mp4 返回了 4 秒?
我应该做些什么来获得正确的文件名吗?
PS 如果我有足够的代表,我会添加一个 cwac-camera 标签...
我在我的项目中使用 0.4.2 版本的 jar 来录制视频并上传它。从 SimpleCameraHost.getVideoFileName() 返回的文件名在我的 Nexus 4 上是错误的。
看起来文件名带有时间戳,并且我在设备上有一个文件 Video_20131113_223704.mp4 但该方法将 Video_20131113_223708.mp4 返回了 4 秒?
我应该做些什么来获得正确的文件名吗?
PS 如果我有足够的代表,我会添加一个 cwac-camera 标签...
在您的 CameraFrament 类中启动和停止记录在我的设备上创建了一个以 _223704.mp4 结尾的文件
这是因为getVideoPath()
被设计为由CameraView
, 调用来生成用于视频的文件名。getVideoFileName()
,反过来,被 使用getVideoPath()
。这必须在视频开始录制之前完成。
然后在我的子类中调用 SimpleCameraHost 方法 getVideoFileName() 返回一个以 _223708.mp4 结尾的 videoFileName,因此当我尝试上传从您的方法返回的文件时,它失败了,因为该文件不存在。
你不打电话 getVideoFileName()
,你实现它。期望是,如果您使用的是 stock 实现,您自己的代码中不需要文件名。如果您需要文件名,覆盖getVideoFileName()
(和/或相关方法,如getVideoPath()
),返回您想要的(很可能是超类返回的任何内容),并保留结果以供以后使用。
我对照片也有同样的问题,但基本上我也认为 getPhotoPath 会返回我刚刚拍摄的照片的路径。
所以我仔细阅读了 CommonsWare 的答案,尤其是他解释 getVideoPath() 工作原理的部分。
这是因为 getVideoPath() 被设计为由 CameraView 调用,以生成用于视频的 >filename。getVideoFileName() 反过来由 getVideoPath() 使用。>这必须在视频开始录制之前完成。
我的理解是 getVideoPath() 是由系统而不是开发人员使用的。getVideoPath() 调用 getVideoFilename() 和 getVideoDirectory() 来构建视频路径,稍后系统将使用该路径来保存视频。
话虽如此,我们需要做的(就像 CommonsWare 已经说过的那样)是告诉系统我们希望将文件保存在哪个路径。我们通过覆盖 getVideoFilename()、getVideoDirectory() 或 getVideoPath() 来做到这一点。
一旦我们控制了它,我们就可以在保存视频后随时调用 getVideoPath() ,以确保我们有正确的路径。
因此,由于我对默认目录感到满意,因此我只是像这样覆盖 getPhotoFilename() :
public class MyCameraHost extends SimpleCameraHost {
private String photoName;
private String extension = ".png";
public MyCameraHost(Context _ctxt) {
super(_ctxt);
// TODO Auto-generated constructor stub
}
@Override
protected String getPhotoFilename() {
// TODO Auto-generated method stub
return this.photoName + this.extension;
}
public void setPhotoName (String name){
this.photoName = name;
}
}
在我的相机活动中,我的 takePhoto() 方法如下所示:
private void takePicture() {
CameraFragment f = (CameraFragment) getFragmentManager().findFragmentByTag(TAG_CAMERA_FRAGMENT);
if (f != null && f.isVisible()) {
cameraHost.setPhotoName("test");
f.takePicture();
pictureFile = cameraHost.getPhotoPath();
}
}
希望这可以帮助。感谢 CommonWares 提供了这个很棒的库以及您对我们问题的回答。