IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Forcer à faire un travail après l'autre pour le traitement de vidéos : synchronisation des threads


Sujet :

Android

  1. #1
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut Forcer à faire un travail après l'autre pour le traitement de vidéos : synchronisation des threads
    Bonsoir,

    j'exécute le code précédemment décrit dans cette discussion.

    J'ai ajouté une ligne de traitement dans la méthode "onPreviewFrame". Mais cette ligne lance un traitement assez lourd.

    Or pendant que ce traitement s'exécute, je vois que l'affichage de la caméra à l'écran continu.

    Ce que je voudrais, c'est que mon appli ne fasse rien tant que l'instruction que j'ai lancée n'est pas terminée.

    Est ce possible ?

    Merci par avance


    PS : voici le code exact...
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
     
    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<Size> 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<Size> sizes = parameters.getSupportedPreviewSizes() ;
    	Size optimalSize = getOptimalPreviewSize(sizes, w, h) ;
    	parameters.setPreviewSize(optimalSize.width, optimalSize.height) ;
     
    	mCamera.setParameters(parameters) ;
    	mCamera.startPreview() ;
    	}
    }
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Au choix soit du vieux wait()/join() mais bon, un peu lourdingue.

    Ou alors tu gère ça via un ExecutorService dont tu fixes la taille du pool à 1. De fait dans ce pool, il ne pourra y avoir qu'un seul runnable actif à la fois.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Citation Envoyé par sinok Voir le message
    Ou alors tu gère ça via un ExecutorService dont tu fixes la taille du pool à 1. De fait dans ce pool, il ne pourra y avoir qu'un seul runnable actif à la fois.
    Mmm... je n'ai jamais fait ça, mais je peux essayer. Est ce que tu aurais un exemple simple d'utilisation ?

    Par contre, on est bien d'accord que cela permet à un thread de travailler, disons la vidéo, cette vidéo va appeler son callback qui contient le traitement, donc dans celui là je pourrai bloquer la vidéo pendant le traitement, puis lorsque le traitement est terminé, pouvoir relancer le thread de la vidéo.
    Allright ?
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  4. #4
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Au temps pour moi, je ne m'étais pas apperçu qu'il s'agissait d'Android. Toutefois cela tombe bien, l'ExecutorService existe également sous Android

    http://developer.android.com/referen...orService.html

    En fait l'exemple qui pourrait t'intéresser le plus se trouve dans la classe Future (qui est l'objet renvoyé par la méthode submit d'un Executor.

    http://developer.android.com/referen...html#get%28%29
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  5. #5
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Salut,

    Je ne sais pas quelles solutions te proposer car tu as créés pas mal de sujets qui ont l'air d'être tous plus ou moins en rapport.
    Pourrais-tu résumer la finalité de ton programme ?
    De ce que j'ai compris :
    1)tu veux récupérer le flux de la caméra
    2)analyser chacune des images
    3)modifier les images
    4)afficher les images que tu as modifiées ou afficher le flux d'origine ?
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  6. #6
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Citation Envoyé par MrDuChnok Voir le message
    Je ne sais pas quelles solutions te proposer car tu as créés pas mal de sujets qui ont l'air d'être tous plus ou moins en rapport.
    Tous les problèmes sont différents, mais c'est le même programme.


    Citation Envoyé par MrDuChnok Voir le message
    Pourrais-tu résumer la finalité de ton programme ?
    De ce que j'ai compris :
    1)tu veux récupérer le flux de la caméra (déjà fait).
    2)analyser chacune des images (également).
    3) Afficher une couche résultat SUR le flux d'origine
    Pour le 3), je sais déjà faire grâce à toi :p. Mais ce que je n'arrive pas à faire, c'est synchroniser la sur-couche à afficher avec le flux. Car comme le traitement prend un certain temps, les images du flux défilent et le résultat est plutôt décalé avec le flux. Mais surtout, le thread qui gère le flux, a un priorité trop haute (car il va trop vite) et il faudrait que je lui en mette une beaucoup plus faible.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  7. #7
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Ou alors tu te fais une image qui sert de buffer, que le premier thread initialise, que le second surcharge et qui est swappée après que le second ait dessiné dessus (avec une gestion de statut, genre 0 invalide, 1 dessinée par thread 1 et 2 dessinée par Thread 2, donc le thread 1 ne prend la main que quand l'image vient d'être swappée - statut 0- dessine et la passe en statut 1. Le thread 2 ne dessine sur l'image que si elle est en statut 1 et la passe en statut 2 puis un 3e thread s'occupe de swapper les images (ou alors un mécanisme à base d'observer/observable pourrait faire l'affaire...)...

    Avec bien sur un file sur les images en entrée où le thread 1 pioche l'image initiale...
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 10/11/2014, 16h23
  2. Réponses: 9
    Dernier message: 14/08/2012, 16h38
  3. Réponses: 6
    Dernier message: 05/03/2008, 20h53
  4. comment faire pour démarrer une tâche apres une autre
    Par dh01 dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 04/12/2005, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo