我使用Intent MediaStore.ACTION_VIDEO_CAPTURE视频录制方法.
默认情况下,录制的视频存储为.3gp文件.我想录制视频并将其存储为.mp4文件.
这可能吗?.
我正在尝试使用Android图片中的数据.我不喜欢JPEG格式,因为最终我会使用灰度数据.YUV格式对我很好,因为前半部分是灰度级的.
来自Android开发教程,
public final void takePicture(Camera.ShutterCallback shutter,Camera.PictureCallback raw,Camera.PictureCallback postview,Camera.PictureCallback jpeg)
在API级别5中添加
触发异步图像捕获.随着图像捕获的进行,相机服务将启动对应用程序的一系列回调.捕获图像后发生快门回调.这可以用于触发声音以让用户知道已捕获图像.原始图像数据可用时发生原始回调(注意:如果没有可用的原始图像回调缓冲区或原始图像回调缓冲区不足以容纳原始图像,则数据将为null).当缩放的,完全处理的postview图像可用时,会发生postview回调(注意:并非所有硬件都支持此功能).当压缩图像可用时,将发生jpeg回调.如果应用程序不需要特定的回调,则可以传递null而不是回调方法.
它谈到了"原始图像数据".但是,我找不到有关原始图像数据格式的信息?你对此有什么想法吗?
我想获取照片拍摄的照片的灰度数据,并且数据位于手机存储器中,因此不需要花费时间来写入/读取图像文件,或者在不同的图像格式之间进行转换.或者也许我必须牺牲一些才能得到它?
我有一个应用程序,我使用设备相机.
现在我只在正常流量下释放相机.
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
if(camera != null) {
camera.stopPreview();
camera.release();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,应用程序以意外的方式退出相机模式 - 即强制关闭(由于OutOfMemoryError) - 相机被锁定.释放它的唯一方法是重启设备.
申请开始后,我得到:
RuntimeException: Fail to connect to camera service
我怎么能确定,相机在任何情况下都会被释放?
我想启动默认摄像头,但希望它像从启动器启动一样(即生成的图片应该由相机应用程序存储到用户的图库,而不是返回到我的应用程序).如果我使用Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);,相机应用程序使用"确定?重试?" - 用户界面并不保存图片.我宁愿不使用"直接" com.android.camera意图,因为很多设备都使用自定义相机应用程序.我已经看到库存gallery3d-app使用别名实现com.android.camera/.Camera,但我不确定每个预先加载的制造商相机应用程序是否这样做.
似乎有一些Android设备有光学变焦,例如
有没有办法以编程方式检测这个?
由于相机通常需要几秒钟来初始化,在我的应用程序中有一些流程我启动相机预期用户即将使用它(因此应用程序感觉更快,当他们实际按下我的应用内相机按钮) .如果相机具有光学变焦,那么我不想这样做,因为镜头滑出并使用户烦恼.
如果我必须将这些设备列入黑名单,是否有人知道所有带有光学变焦的Android设备的列表,最好是使用他们的Build.MANUFACTURER和Build.PRODUCT字符串?
如果它有帮助,这里是我最近购买的S4 Zoom的Camera.Parameters:
{preferred-preview-size-for-video=704x528, factory-af-led-lv-limit=-1,-1, zoom=0, factory-af-scan-limit=-1,-1, max-num-detected-faces-hw=0, continuous-mode=off, zoom-supported=true, metering=center, whitebalance=auto, scene-mode=auto, jpeg-quality=1, factory-testno=0, factory-af-diff-check=-1,-1, preview-format-values=yuv420sp,yuv420p, best-mode=off, red-eye-fix=fail, jpeg-thumbnail-quality=100, preview-format=yuv420sp, low-light-mode=off, zoom-action=zoom-stop, face-detection=off, video-size-values=1920x1080,1280x720,800x450,768x512,640x480,320x240,176x144, factory-zoom-slope-check-data=-1,-1, preview-size=960x540, focal-length=4.300000, flash-charging=0, factory-cap-range=-1,-1, factory-iris-range=-1,-1, flash-mode-values=off,auto,red-eye,on,fillin,slow,red-eye-fix, preview-frame-rate-values=30,15, factory-af-scan-range=-1,-1, max-num-metering-areas=0, preview-frame-rate=30, focus-mode-values=auto,infinity,macro,fixed,face-detection,continuous,continuous-picture,continuous-video,manual,multi,touch,object-tracking, jpeg-thumbnail-width=224, video-size=0x0, scene-mode-values=auto,portrait,landscape,night,beach,snow,sunset,fireworks,sports,party,candlelight,dusk-dawn,fall-color,back-light,text, preview-fps-range-values=(7000,30000), jpeg-thumbnail-size-values=224x126,160x120,192x128,0x0, zoom-ratios=100,120,140,160,180,220,310,420,560,790,1000, preview-size-values=960x540,768x512,704x576,704x528,640x524,640x480,320x240, smart-scene-detection=0, factory-zoom-range-check-data=-1,-1, factory-af-led-range=-1,-1,-1,-1, picture-size-values=4608x2592,3264x2448,4608x3456,4608x3072,4096x2304,3960x2640,3648x2736,2592x1944,2304x1728,1984x1488,1920x1080,1024x768,960x720,640x480, preview-fps-range=7000,30000, auto-whitebalance-lock=false, min-exposure-compensation=-6, antibanding=off, max-num-focus-areas=1, vertical-view-angle=46.3, factory-wb-value=-1,-1,-1,-1, zoom-ring=-1, horizontal-view-angle=67, video-stabilization-supported=false, jpeg-thumbnail-height=126, continuous-fps=, focus-mode=auto, factory-sc-speedtime=-1,-1, factory-gyro-range-data=-1,-1,-1,-1, auto-whitebalance-lock-supported=true, video-frame-format=yuv420sp, max-num-detected-faces-sw=0, …Run Code Online (Sandbox Code Playgroud) 我发现当使用textureview而不是surfaceview作为相机预览(两者都通过mediarecorder连接到相机)时,预览会更加模糊.
模糊的意思是在纹理视图中你可以看到像素,特别是在缩放时.使用surfaceview时不是这种情况.为什么会这样?
android surfaceview android-camera android-mediarecorder textureview
我是Android开发中的新手,所以如果我的问题很简单,我会提前道歉.在我的应用程序的一部分,我需要我的后置摄像头的实时预览,所以我创建了一个自定义类,扩展SurfaceView并实现SurfaceHolder.Callback(我基本上遵循了android文档中的说明).
不幸的是,我正在Nexus 5x中测试我的应用程序,我刚刚意识到它已经以相反的方式安装了相机传感器.出于这个原因,在我的Nexus 5x上运行时,我的应用程序的相机预览显示为颠倒,这是我不想要的.
似乎新的android.hardware.camera2 API能够自动处理这个问题.最终我需要使用这个新API更新我的所有代码,但是现在我需要的是使用旧相机API时的快速修复.
所以我在那里读书,我发现了一段代码,我需要在SurfaceChanged方法中引入以解决这个问题.这里是:
Display display = ((WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
if(display.getRotation() == Surface.ROTATION_0)
{
parameters.setPreviewSize(capHeight, capWidth);
camera.setDisplayOrientation(90);
}
if(display.getRotation() == Surface.ROTATION_90)
{
parameters.setPreviewSize(capWidth, capHeight);
}
if(display.getRotation() == Surface.ROTATION_180)
{
parameters.setPreviewSize(capHeight, capWidth);
}
if(display.getRotation() == Surface.ROTATION_270)
{
parameters.setPreviewSize(capWidth, capHeight);
camera.setDisplayOrientation(180);
}
camera.setParameters(parameters);*/
camera.startPreview();
Run Code Online (Sandbox Code Playgroud)
问题是我没有看到某些事情发生了变化.
有什么想法吗?
我一直试图解决这个问题,但出于某种原因,当我开始使用相机录制视频时,预览会放大.我从以下示例中获得以下代码:
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Camera.Parameters myParameters = mCamera.getParameters();
List<Camera.Size> sizes = myParameters.getSupportedPreviewSizes();
Camera.Size myBestSize = getBestPreviewSize(sizes, width, height);
if (myBestSize != null) {
myParameters.setPreviewSize(myBestSize.width, myBestSize.height);
myParameters.setVideoStabilization(false);
mCamera.setParameters(myParameters);
mCamera.startPreview();
mCamera.unlock();
}
}
private Camera.Size getBestPreviewSize(List<Camera.Size> sizes, int width, int height) {
final double ASPECT_TOLERANCE = 0.05;
double targetRatio = (double) width / height;
if (sizes == null) return null;
Camera.Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = height;
// …Run Code Online (Sandbox Code Playgroud) 我需要使用WebRTC for android将特定的裁剪(面部)视频发送到videoChannel.我能够操作CameraRession类WebRTC来裁剪面部.现在我将它设置为ImageView.
listenForBytebufferFrames()的Camera1Session.java
private void listenForBytebufferFrames() {
this.camera.setPreviewCallbackWithBuffer(new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera callbackCamera) {
Camera1Session.this.checkIsOnCameraThread();
if(callbackCamera != Camera1Session.this.camera) {
Logging.e("Camera1Session", "Callback from a different camera. This should never happen.");
} else if(Camera1Session.this.state != Camera1Session.SessionState.RUNNING) {
Logging.d("Camera1Session", "Bytebuffer frame captured but camera is no longer running.");
} else {
mFrameProcessor.setNextFrame(data, callbackCamera);
long captureTimeNs = TimeUnit.MILLISECONDS.toNanos(SystemClock.elapsedRealtime());
if(!Camera1Session.this.firstFrameReported) {
int startTimeMs = (int)TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - Camera1Session.this.constructionTimeNs);
Camera1Session.camera1StartTimeMsHistogram.addSample(startTimeMs);
Camera1Session.this.firstFrameReported = true;
}
ByteBuffer byteBuffer1 = ByteBuffer.wrap(data); …Run Code Online (Sandbox Code Playgroud) 根据docs,您可以CamcorderProfile用来获取设备的默认视频编解码器格式,然后将其设置为MediaRecorder,如下所示:
CamcorderProfile mProfile = CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_HIGH);
//
mMediaRecorder.setVideoEncoder(mProfile.videoCodec);
Run Code Online (Sandbox Code Playgroud)
但是由于某种原因,它返回了错误的格式。
我正在使用CameraView库,并在FullVideoRecorder类中定义了以下内容:
switch (mResult.getVideoCodec()) {
case H_263: mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); break;
case H_264: mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); break;
case DEVICE_DEFAULT: mMediaRecorder.setVideoEncoder(mProfile.videoCodec); break;
}
Run Code Online (Sandbox Code Playgroud)
当我将视频编码器设置为时,遇到问题的设备可以很好地工作H_263,但是由于某种原因,当我将其设置为默认时,它会崩溃-在这种情况下,默认意味着CamcorderProfile应选择设备默认的视频编解码器格式。
我的问题:
有什么原因CamcorderProfile.videoCodec会返回错误的值,如何解决?
编辑 -添加更多信息
我实现了以下内容,以确保是否CamcoderProfile返回了错误的值:
//In onCreate
CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
//getVideoCodec method below
String profileCodec = getVideoCodec(camcorderProfile.videoCodec);
//Log the result I get
Log.e("Video Codec =", profileCodec);
private String getVideoCodec(int videoCodec){
switch(videoCodec){
case MediaRecorder.VideoEncoder.H263:
return …Run Code Online (Sandbox Code Playgroud) android ×10
android-camera ×10
surfaceview ×2
video ×2
android-view ×1
apprtcdemo ×1
java ×1
textureview ×1
webrtc ×1