FiReTiTi Posté(e) 12 octobre 2010 Share Posté(e) 12 octobre 2010 Bonsoir, je réalise un projet qui fait des opérations sur la webcam d'un téléphone. Pour cela je récupère dans la méthode "onPreviewFrame" la tableau de byte correspondant à ce qui est affiché à l'écran puis je le traite et enfin j'affiche les informations nécessaires/extraites par dessus. Pour tout cela, voir le petit code si-après. Seulement voilà, lorsque j'exécute mon programme, je m'aperçois que la vidéo est affichées en continue alors que mon application en est encore à traiter la première frame. Ce qui n'est pas top pour de la réalité augmentée :-( Est ce que quelqu'un saurait comment on peut forcer à ne pas ré-afficher la vidéo tant que l'image précédente n'est pas traitée (quitte à ce que ça rame) ? Merci par avance... public class CameraPreview extends Activity { private Preview mPreview = null ; /** Called when the activity is first created.*/ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) ; requestWindowFeature(Window.FEATURE_NO_TITLE) ; // Hide the window title. AugmentedReality augrea = new AugmentedReality(this) ; mPreview = new Preview(this, augrea) ; // Create our Preview view and set it as the content of our activity. FrameLayout frameLayout = new FrameLayout(this) ; frameLayout.addView(mPreview) ; frameLayout.addView(augrea) ; setContentView(frameLayout) ; } } class AugmentedReality extends View { public Infos infos = null ; public AugmentedReality(Context context) { super(context) ; } protected void onDraw(Canvas canvas) { super.onDraw(canvas) ; // Je dessine ce qui doit l'être en fonction de ce qui est passé dans Infos. } } class Preview extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder mHolder ; private Camera mCamera ; private AugmentedReality augrea = null ; public Preview(Context context, AugmentedReality augrea) { super(context) ; // Install a SurfaceHolder.Callback so we get notified when the underlying surface is created and destroyed. mHolder = getHolder() ; mHolder.addCallback(this) ; mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS) ; this.augrea = augrea ; try { // Traitement préliminaire... } catch ( Error E ) { System.exit(0) ; } catch ( Exception E ) { E.printStackTrace() ; System.exit(0) ; } Log.w("Start", "Start Camera Preview") ; } public void surfaceCreated(SurfaceHolder holder) { // The Surface has been created, acquire the camera and tell it where to draw. mCamera = Camera.open() ; mCamera.setPreviewCallback( new PreviewCallback() { public void onPreviewFrame(byte[] data, Camera camera) { augrea.matchedPoints = null ; Camera.Parameters parameters = camera.getParameters() ; int height = parameters.getPreviewSize().height ; int width = parameters.getPreviewSize().width ; // Traitement du tableau data. augrea.infos = ... ; // On passe à l'autre classe les informations à afficher. augrea.invalidate() ; // On force le ré-affichage... } } ) ; try { mCamera.setPreviewDisplay(holder) ; } catch ( Exception e ) { e.printStackTrace() ; mCamera.release() ; mCamera = null ; System.exit(0) ; } } public void surfaceDestroyed(SurfaceHolder holder) { // Surface will be destroyed when we return, so stop the preview. // Because the CameraDevice object is not a shared resource, it's very important to release it when the activity is paused. mCamera.stopPreview() ; mCamera.release() ; mCamera = null ; } private Size getOptimalPreviewSize(List sizes, int w, int h) { final double ASPECT_TOLERANCE = 0.05; double targetRatio = (double) w / h; if (sizes == null) return null; Size optimalSize = null; double minDiff = Double.MAX_VALUE; int targetHeight = h; // Try to find an size match aspect ratio and size for (Size size : sizes) { double ratio = (double) size.width / size.height; if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; if (Math.abs(size.height - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } // Cannot find the one match the aspect ratio, ignore the requirement if (optimalSize == null) { minDiff = Double.MAX_VALUE; for (Size size : sizes) { if (Math.abs(size.height - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } } return optimalSize; } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // Now that the size is known, set up the camera parameters and begin the preview. Camera.Parameters parameters = mCamera.getParameters() ; List sizes = parameters.getSupportedPreviewSizes() ; Size optimalSize = getOptimalPreviewSize(sizes, w, h) ; parameters.setPreviewSize(optimalSize.width, optimalSize.height) ; mCamera.setParameters(parameters) ; mCamera.startPreview() ; } } Lien vers le commentaire Partager sur d’autres sites More sharing options...
Jorodan Posté(e) 12 octobre 2010 Share Posté(e) 12 octobre 2010 Envoi un petit MP pour demander la suppression ou le déplacement de ton message la prochaine fois :) J'ai pas de solution à ton problème...désolé! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.