我在应用程序中有一个自定义相机,在大多数设备上拍摄的图像看起来都不错,但在 Galaxy Nexus 上情况有所不同。Galaxy Nexus 中的图像模糊。我在摩托罗拉 Atrix 上也看到了颗粒状的线条。但Droid X、Droid Razr、HTC Evo、HTC难以置信都表现出了不错的成绩。知道为什么会发生吗?这是我到目前为止所拥有的。PS:我在活动中使用自动对焦。
public class CameraPreview extends SurfaceView implements
SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
public CameraPreview(Context context, Camera camera) {
super(context);
mCamera = camera;
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// The Surface has been created, now tell the camera where to draw the
// preview.
try {
mCamera.setPreviewDisplay(holder);
Camera.Parameters parameters = mCamera.getParameters();
List<String> focusModes = parameters.getSupportedFocusModes();
if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
}
parameters.set("orientation", …Run Code Online (Sandbox Code Playgroud) 如果我将左侧底座更改为右侧底座(两者都是用户的横向视图模式),则应用程序(活动)不会重新创建。Hense,相机显示为水平翻转图像。当我尝试为两种纵向模式(正常和反向)更改设备位置时,结果相同。设备正常检测到 90 度旋转。也就是说,左侧 => 纵向 => 右尺寸 => 反向纵向 => 左侧正常工作!
有没有可能解决这个问题?
我使用的是安卓 4.4.4。
代码:
Display display = ((WindowManager)context.getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
if(display.getRotation() == Surface.ROTATION_0){//0
mCamera.setDisplayOrientation(90);
}else if(display.getRotation() == Surface.ROTATION_90){//1
mCamera.setDisplayOrientation(0);
}else if(display.getRotation() == Surface.ROTATION_180){//2
mCamera.setDisplayOrientation(270);
}else if(display.getRotation() == Surface.ROTATION_270){//3
mCamera.setDisplayOrientation(180);
}
Log.d(TAG, "ROTATION:" + display.getRotation() + " ");
Run Code Online (Sandbox Code Playgroud)
编辑
我的意思是,onResume()和SurfaceCreate()我通过180度的视角旋转设备从不打电话。
编辑功能代码
SurfaceView sfv;
FrameLayout fl0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//some code to initialize
fl0 = (FrameLayout) findViewById(R.id.fl0);
sfv = new SurfaceView(this);
fl0.addView(sfv, 0);
addSurfaceHolder();
} …Run Code Online (Sandbox Code Playgroud) 我在您可以在此处找到的两个示例的帮助下使用 Camera2 API:
我正在使用与上述链接相同的源代码,因此我不会在此处复制我的源代码(除非您需要某些部分,否则我将编辑我的问题并将其发布)。
编辑:
进行了一些测试。当我尝试通过手机播放视频时,它只显示第一帧,我可以听到录音中实际存在的音频(声音)。一旦视频播放到结束,视频会以某种方式自动重新启动并按原样显示视频。
但是,当我尝试在我的 PC 上播放视频(将其从手机复制到桌面)时,我只会在最后一帧之前出现黑屏。显示最后一帧,但视频根本不播放。我可以听到音频(声音)。
我在想某些视频编码/解码可能存在问题?
问题:
在我的情况下,视频录制不起作用。我可以在目录中看到它们应该在我的手机上的两个文件,但是当我播放视频(5 秒视频)时,前 4 秒是黑色的,然后最后一秒就像我录制的一帧,就是这样,但是文件大小似乎很大(160MB)。
屏幕:
我不知道出了什么问题,有人可以帮忙吗?
有没有办法使用Camera API实现慢动作和延时录音?
我尝试过使用MediaRecorder设置VideoFrameRate,VideoBitRate VideoCaptureRate但对我来说没什么用.
我已成功使用JNI实现,但我发现它花费了太多时间而且没有进行优化.
如果您找到任何其他解决方案,请帮助我.
video android frame-rate android-camera android-mediarecorder
我在 android 中创建一个文档扫描应用程序,在我的项目中使用 OpenCV 和 Scan 库进行裁剪,我在相机视图中使用 drawrect 创建了一个矩形,现在我只需要捕获该矩形部分内的图像并将其显示在另一个活动中.
有问题的图像:
我正在尝试在手动相机控制中添加新的曝光值和 ISO 值。我正在使用 Camera2Basic 示例。我现在面临的问题是我是Android新手。我尝试查看 L-Camera,但它是在 Scala 中,这让我更加困惑。
我尝试了以下更改,但图像预览没有更新。
private void createCameraPreviewSession() {
try {
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;
// We configure the size of default buffer to be the size of camera preview we want.
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
// This is the output Surface we need to start preview.
Surface surface = new Surface(texture);
// We set up a CaptureRequest.Builder with the output Surface.
mPreviewRequestBuilder
= mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewRequestBuilder.addTarget(surface);
// Here, we create a CameraCaptureSession for camera …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我从cordova(cordova插件文件传输)中获取的图片上传到nodeJS服务器.这是我的移动应用代码:
function uploadToServer(pictureName, fileURI) {
var options = new FileUploadOptions();
options.fileKey = "file";
options.mimeType = "image/jpeg";
options.fileName = pictureName;
var ft = new FileTransfer();
ft.upload(fileURI, encodeURI(CONSTANTS.hosts.remoteSR),
function (res) {
console.log("Code = " + res.responseCode);
},
function (error) {
$log.debug(error)
alert("An error has occurred: Code = " + error.code);
},
options);
}
Run Code Online (Sandbox Code Playgroud)
PS:fileURI和pictureName是valide params,并在其他函数中正确测试.
我的节点JS服务器代码:
var express = require("express");
var multer = require('multer');
var app = express();
var storage = multer.diskStorage({
destination: function (req, file, callback) {
callback(null, './uploads'); …Run Code Online (Sandbox Code Playgroud) 我有一个代码,可以从前置摄像头访问帧流,并将它们推送到后台线程处理.现在我根本没有使用任何缓冲区,一切正常(在我的手机上).
那么问题setPreviewCallback()与setPreviewCallbackWithBuffer()这个特定的任务有何不同?
我在camera.qml中有qml相机小部件。qml 组件是从放置在后台堆栈小部件上的 Qt 小部件“WidgetCamera”加载的。该小部件在创建时就启动了相机设备。
如何使相机仅在小部件显示在前台时启动。反之亦然,当小部件进入后台时如何释放相机?
相机.qml
Item {
width: 640
height: 360
Camera {
id: camera
}
VideoOutput {
source: camera
anchors.fill: parent
}
}
Run Code Online (Sandbox Code Playgroud)
widgetCamera.h
class WidgetCamera : public QWidget
{
Q_OBJECT
public:
WidgetCamera() {
QQuickWidget *qw= new QQuickWidget;
qw->setSource(QUrl("qrc:///camera.qml"));
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
主窗口.h
class MainWindow : QMainWindow
{
Q_OBJECT
public:
MainWindow() {
QStackedWidget *sw = new QStackedWidget;
sw->addWidget(new QWidget());
sw->addWidget(new WidgetCamera());
// ...
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试修改帧速率(降低它),以便我们可以对其进行实时操作。但不能改变帧率。
可能的解决方案包括:
改变 CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES
延迟 setRepeatingRequest
我们需要降低传递给的生成帧速率,Surfaceholder以便可以进一步应用于其中的操作。
android-camera ×10
android ×8
java ×2
video ×2
camera ×1
cordova ×1
frame-rate ×1
galaxy ×1
javascript ×1
node.js ×1
opencv ×1
qml ×1
qt ×1