Programme permettant de simuler un gaz parfait 2D avec des particules dans une boite¶
On distribue $N$ particules en leur donnant soit des vitesses aléatoires ou régulières et des positions aléatoires ou régulières.
On peut changer leur rayon.
On considère des particules identiques, sous forme de disque ayant des interactions élastiques entre elles ou avec la parroi.
Il est intéressant de voir l'évolution de la distribution des vitesses avec le temps quand on donne au départ la même vitesse à toutes les particules (thermalisation).
Faire un film intéressant (de longueur suffisante) demande vite 500 pas ou plus et prend un peu de temps.
import os, math, pylab
import numpy as np
import numpy.random
def wall_time(pos_a, vel_a, sigma):
"""Fonction qui détermine le prochain choc d'une particule avec un mur."""
if vel_a > 0.0:
del_t = (1.0 - sigma - pos_a) / vel_a
elif vel_a < 0.0:
del_t = (pos_a - sigma) / abs(vel_a)
else:
del_t = float('inf')
return del_t
def pair_time(pos_a, vel_a, pos_b, vel_b, sigma):
"""Fonction qui détermine le temps du prochain choc d'une particule avec une autre."""
del_x = [pos_b[0] - pos_a[0], pos_b[1] - pos_a[1]]
del_x_sq = del_x[0] ** 2 + del_x[1] ** 2
del_v = [vel_b[0] - vel_a[0], vel_b[1] - vel_a[1]]
del_v_sq = del_v[0] ** 2 + del_v[1] ** 2
scal = del_v[0] * del_x[0] + del_v[1] * del_x[1]
Upsilon = scal ** 2 - del_v_sq * (del_x_sq - 4.0 * sigma ** 2)
if Upsilon > 0.0 and scal < 0.0:
del_t = - (scal + math.sqrt(Upsilon)) / del_v_sq
else:
del_t = float('inf')
return del_t
def min_arg(l):
"""Récupère à la fois le minimum d'une liste et l'indice correspondant à ce minimum."""
return min(zip(l, range(len(l))))
def compute_next_event(pos, vel):
""" Détermination du prochain "évènement", c'est-à-dire l'instant de ce
choc et la particule (ou la paire) correspondante. À noter que l'on stocke
toutes ces infos dans un seul indice (cf disjonction de cas dans
compute_new_velocities)."""
wall_times = [wall_time(pos[k][l], vel[k][l], sigma) for k, l in singles]
pair_times = [pair_time(pos[k], vel[k], pos[l], vel[l], sigma) for k, l in pairs]
return min_arg(wall_times + pair_times)
def compute_new_velocities(pos, vel, next_event_arg):
"""Calcul des nouvelles vitesses"""
if next_event_arg < len(singles): # Cas d'un choc avec le mur
collision_disk, direction = singles[next_event_arg]
vel[collision_disk][direction] *= -1.0 # seule la vitesse sur cet axe est modifiée
else: # Cas d'un choc entre deux particules de même masse
a, b = pairs[next_event_arg - len(singles)]
del_x = [pos[b][0] - pos[a][0], pos[b][1] - pos[a][1]]
abs_x = math.sqrt(del_x[0] ** 2 + del_x[1] ** 2)
e_perp = [c / abs_x for c in del_x]
del_v = [vel[b][0] - vel[a][0], vel[b][1] - vel[a][1]]
scal = del_v[0] * e_perp[0] + del_v[1] * e_perp[1]
for k in range(2):
vel[a][k] += e_perp[k] * scal
vel[b][k] -= e_perp[k] * scal
def snapshot(t, pos, vel, colors, X, Y, arrow_scale=.2):
""" La routine qui s'occupe des tracés graphiques."""
global img
nbmax = 20
pylab.subplots_adjust(left=0.0, right=1, top=1, bottom=0)
pylab.gcf().set_size_inches(12, 12*2/3)
# Le premier sous-plot: carré de 2x2
ax1 = pylab.subplot2grid((2,3),(0,0),colspan=2,rowspan=2)
pylab.setp(pylab.gca(), xticks=[0, 1], yticks=[0, 1])
pylab.plot(X,Y,'k',lw=0.8) # On y met le trajet de la dernière particule
pylab.xlim((0,1)) # On doit astreindre les côtés horizontaux
pylab.ylim((0,1)) # et verticaux
# Boucle sur les points pour rajouter les cercles colorés
for (x, y), c in zip(pos, colors):
circle = pylab.Circle((x, y), radius=sigma, fc=c)
pylab.gca().add_patch(circle)
dx,dy = vel[-1] * arrow_scale # La dernière particule a droit à son vecteur vitesse
pylab.arrow( x, y, dx, dy, fc="r", ec="r", head_width=0.02, head_length=0.05 )
pylab.text(.5, 1.03, 't = %.2f' % t, ha='center')
# Second sous-plot: histogramme de la projection suivant x et y des vitesses
ax2 = pylab.subplot2grid((2,3),(0,2),colspan=1,rowspan=1)
r = (-2,2) # Intervalle de vitesses regardé
pylab.hist(vel[:,0],bins=20,range=r,alpha=0.5)
pylab.hist(vel[:,1],bins=20,range=r, alpha=0.5)
pylab.xlim(r)
pylab.ylim((0,nbmax))
pylab.ylabel("Nombre de particules")
pylab.xlabel("$v_x$ (bleu), $v_y$ (orange)")
# Troisième sous-plot: histogramme de la norme des vitesses
ax3 = pylab.subplot2grid((2,3),(1,2),colspan=1,rowspan=1)
r = (0,2) # Intervalle de vitesses regardé
v = np.linspace(0,2,100)
mb = 10*maxbol(v,kbt)
pylab.plot(v,mb)
pylab.hist(np.sqrt(np.sum(vel**2,axis=1)),bins=20,range=r)
pylab.plot(v)
pylab.xlim(r)
pylab.ylim((0,nbmax))
pylab.ylabel("Nombre de particules")
pylab.xlabel("$||\\vec{v}||$")
pylab.savefig(os.path.join(output_dir, '{:04d}.png'.format(img)), bbox_inches="tight")
img += 1
def check_position():
""" Une routine pour s'assurer que les particules ne se chevauchent pas au
départ. Il peut se passer un certain temps avant que l'on trouve une
configuration adéquate. """
continue_condition = True # Condition de non-arrêt
c = 0 # Compteur
d2= 4*sigma**2 # Distance (carrée) de sécurité
while continue_condition:
c += 1
if c%100 == 0: # Un peu de feedback
print(c,'trials to get initial conditions and still trying...')
pos = np.random.random((N,2))*(1-2*sigma) + sigma
k = 0
for (i,j) in pairs: # Les vérifications sur toutes les paires
if sum((pos[i]-pos[j])**2) > d2: k+= 1
else:
if c%100 == 0: print(i,j)
break
if k == len(pairs): continue_condition = False
print("Let's compute some physics !")
return pos
Maxwell-Bolzmann a 2D
def maxbol(v,kbt):
mb=(v/kbt)*np.exp(-0.5*v**2/kbt)
return(mb)
def reg_position(N):
dist_ini= 1 / (np.sqrt(N)+1)
pos2=np.linspace(dist_ini,1-dist_ini,int(np.sqrt(N)))
pos3=[]
for i in pos2:
for j in pos2:
pos3.append([i,j])
pos=pos3
return(pos)
def reg_vel(N):
vel = np.zeros((N,2))+(0.5,0) # tout le monde part vers la droite avec vx=0.5
return(vel)
Les paramètres à changer¶
Nombre de particules, nombre de chocs, est-ce que la distribution des particules est régulières ou aléatoires, est-ce que les particules ont une distribution de vitesse aléatoires ou elles ont toutes la même vitesse?
On peut aussi essayer "refaire" le film inverse en partant de la dernière valeur des positions et vitesses et en inversant les vitesses. On remarque qu'il ne faut pas beaucoup de particules pour que ça ne marche pas.
Penser à changer le nom du film pour ne pas écraser l'ancien...
N = 100
vel_save = np.random.random((N,2))*2 - 1
# options for main program
reg_pos= 0 # 0: random initial positions; 1 regular initial positions
id_vel = 1 # 0: random initial velocities; 1: all initial velocities equal
reverse = 0 # 0: restart; 1: start with stored (random) velocities 2: start with end positions of last run and inversed velocities
n_steps = 500 # Nombre de chocs
moviename='Film_test.mp4'
# main program
output_dir = "PNG/T1_particules_en_boite_libre_movie"
cmd3 = 'rm ' + output_dir + '/*.png'
os.system(cmd3) #On efface les anciennes images
colors = ['grey']*N
colors[-1]='red'
img = 0
if not os.path.exists(output_dir): os.makedirs(output_dir)
sigma = 0.01 # Rayon des particules
singles = [(i,j) for i in range(N) for j in range(2)] # L'ensemble des particules (en 2D)
pairs = [(i,j) for i in range(N) for j in range(i+1,N)] # L'ensemble des paires
if reverse == 2:
vel = -vel
pos = pos # well, OK
print('if1')
elif reverse == 1:
vel = vel_save.copy() # This SHOULD take the original velocities from vel_save
# BUT for whatever reason, sometimes, vel_save *IS* (slightly) altered, so that one cannot
# restart a calculation with the same conditions ???
pos = reg_position(N)
print('if2')
elif reverse == 0 :
print('if3')
if reg_pos == 0:
print('if4')
pos = check_position() # Sélection des positions (de manière aléatoire)
else : # disposition régulière
print('if5')
pos = reg_position(N)
if id_vel == 1 :
print('if6')
vel = np.zeros((N,2))+(0.5,0) # tout le monde part vers la droite avec vx=0.5
else : vel = np.random.random((N,2))*2 - 1 # selection aléatoire des vitesses initiales
#print('vel_save avant')
#print(vel_save)
#print('vel initial')
#print(vel)
X,Y = [pos[-1][0]],[pos[-1][1]] # La dernière particule va être suivie à la loupe
t = 0.0 # Temps initial
dt = 0.01 # interval
vmoysq=0
for i in range(len(vel)):
vmoysq += vel[i][0]**2+vel[i][1]**2
vmoysq=vmoysq/len(vel) # vitesse quadratique moyenne au carré
kbt=0.5*vmoysq # parceque m=1 donne la température du gaz
print(kbt)
next_event, next_event_arg = compute_next_event(pos, vel) # On calcule la première étape
print(next_event)
print(next_event_arg)
snapshot(t, pos, vel, colors, X, Y)# et on prend une première photo.
for step in range(n_steps):
tzero = t
while t <= tzero + next_event : # Début des calculs jusqu'à la prochaine sortie
t += dt # On avance
pos += vel * dt # On met à jour les position
X.append(pos[-1][0]) # Suivi x de la dernière particule
Y.append(pos[-1][1]) # Ainsi que Y
snapshot(t,pos,vel,colors,X,Y) # Souriez pour la photo
print(t)
compute_new_velocities(pos, vel, next_event_arg)
next_event, next_event_arg = compute_next_event(pos, vel)
print('pas' , step, 'sur', n_steps) # et un peu de feedback
if3 if4 100 trials to get initial conditions and still trying... 2 82 200 trials to get initial conditions and still trying... 5 65 Let's compute some physics ! if6 0.125 0.0029291284036558896 80 0.01 pas 0 sur 500 0.02 pas 1 sur 500 pas 2 sur 500 0.03 pas 3 sur 500 0.04 0.05 pas 4 sur 500 0.060000000000000005 0.07 0.08 0.09 0.09999999999999999 pas 5 sur 500 pas 6 sur 500 0.10999999999999999 pas 7 sur 500 0.11999999999999998 0.12999999999999998 pas 8 sur 500 0.13999999999999999 pas 9 sur 500 0.15 0.16 pas 10 sur 500 pas 11 sur 500 0.17 pas 12 sur 500 0.18000000000000002 pas 13 sur 500 0.19000000000000003 0.20000000000000004 0.21000000000000005 pas 14 sur 500 pas 15 sur 500 0.22000000000000006 0.23000000000000007 0.24000000000000007 0.25000000000000006 pas 16 sur 500 0.26000000000000006 0.2700000000000001 0.2800000000000001 pas 17 sur 500 0.2900000000000001 pas 18 sur 500 pas 19 sur 500 0.3000000000000001 pas 20 sur 500 pas 21 sur 500 pas 22 sur 500 0.3100000000000001 0.3200000000000001 pas 23 sur 500 pas 24 sur 500 pas 25 sur 500 0.3300000000000001 pas 26 sur 500 0.34000000000000014 pas 27 sur 500 pas 28 sur 500 0.35000000000000014 pas 29 sur 500 0.36000000000000015 0.37000000000000016 pas 30 sur 500 pas 31 sur 500 pas 32 sur 500 0.38000000000000017 pas 33 sur 500 0.3900000000000002 pas 34 sur 500 0.4000000000000002 pas 35 sur 500 pas 36 sur 500 0.4100000000000002 pas 37 sur 500 pas 38 sur 500 0.4200000000000002 pas 39 sur 500 pas 40 sur 500 pas 41 sur 500 0.4300000000000002 pas 42 sur 500 pas 43 sur 500 0.4400000000000002 pas 44 sur 500 pas 45 sur 500 0.45000000000000023 pas 46 sur 500 0.46000000000000024 pas 47 sur 500 pas 48 sur 500 pas 49 sur 500 0.47000000000000025 0.48000000000000026 pas 50 sur 500 pas 51 sur 500 pas 52 sur 500 pas 53 sur 500 pas 54 sur 500 0.49000000000000027 pas 55 sur 500 pas 56 sur 500 pas 57 sur 500 0.5000000000000002 pas 58 sur 500 pas 59 sur 500 pas 60 sur 500 0.5100000000000002 pas 61 sur 500 pas 62 sur 500 pas 63 sur 500 0.5200000000000002 pas 64 sur 500 pas 65 sur 500 pas 66 sur 500 0.5300000000000002 pas 67 sur 500 pas 68 sur 500 pas 69 sur 500 0.5400000000000003 0.5500000000000003 pas 70 sur 500 pas 71 sur 500 pas 72 sur 500 pas 73 sur 500 pas 74 sur 500 0.5600000000000003 0.5700000000000003 pas 75 sur 500 pas 76 sur 500 pas 77 sur 500 0.5800000000000003 pas 78 sur 500 pas 79 sur 500 pas 80 sur 500 0.5900000000000003 pas 81 sur 500 pas 82 sur 500 0.6000000000000003 pas 83 sur 500 pas 84 sur 500 0.6100000000000003 pas 85 sur 500 0.6200000000000003 pas 86 sur 500 0.6300000000000003 pas 87 sur 500 pas 88 sur 500 pas 89 sur 500 pas 90 sur 500 0.6400000000000003 pas 91 sur 500 pas 92 sur 500 pas 93 sur 500 0.6500000000000004 pas 94 sur 500 0.6600000000000004 pas 95 sur 500 pas 96 sur 500 pas 97 sur 500 pas 98 sur 500 0.6700000000000004 pas 99 sur 500 pas 100 sur 500 pas 101 sur 500 0.6800000000000004 pas 102 sur 500 pas 103 sur 500 pas 104 sur 500 0.6900000000000004 pas 105 sur 500 pas 106 sur 500 pas 107 sur 500 0.7000000000000004 pas 108 sur 500 pas 109 sur 500 0.7100000000000004 pas 110 sur 500 pas 111 sur 500 pas 112 sur 500 pas 113 sur 500 0.7200000000000004 pas 114 sur 500 pas 115 sur 500 pas 116 sur 500 0.7300000000000004 pas 117 sur 500 pas 118 sur 500 pas 119 sur 500 0.7400000000000004 pas 120 sur 500 pas 121 sur 500 0.7500000000000004 pas 122 sur 500 pas 123 sur 500 pas 124 sur 500 pas 125 sur 500 0.7600000000000005 pas 126 sur 500 pas 127 sur 500 pas 128 sur 500 pas 129 sur 500 0.7700000000000005 pas 130 sur 500 pas 131 sur 500 pas 132 sur 500 pas 133 sur 500 pas 134 sur 500 pas 135 sur 500 0.7800000000000005 pas 136 sur 500 pas 137 sur 500 pas 138 sur 500 0.7900000000000005 0.8000000000000005 pas 139 sur 500 pas 140 sur 500 pas 141 sur 500 0.8100000000000005 pas 142 sur 500 0.8200000000000005 pas 143 sur 500 pas 144 sur 500 pas 145 sur 500 0.8300000000000005 pas 146 sur 500 pas 147 sur 500 0.8400000000000005 pas 148 sur 500 pas 149 sur 500 pas 150 sur 500 0.8500000000000005 pas 151 sur 500 pas 152 sur 500 pas 153 sur 500 pas 154 sur 500 pas 155 sur 500 0.8600000000000005 pas 156 sur 500 pas 157 sur 500 0.8700000000000006 pas 158 sur 500 0.8800000000000006 pas 159 sur 500 pas 160 sur 500 pas 161 sur 500 pas 162 sur 500 pas 163 sur 500 pas 164 sur 500 pas 165 sur 500 pas 166 sur 500 0.8900000000000006 pas 167 sur 500 pas 168 sur 500 pas 169 sur 500 pas 170 sur 500 0.9000000000000006 pas 171 sur 500 pas 172 sur 500 pas 173 sur 500 pas 174 sur 500 0.9100000000000006 pas 175 sur 500 pas 176 sur 500 pas 177 sur 500 0.9200000000000006 pas 178 sur 500 pas 179 sur 500 pas 180 sur 500 0.9300000000000006 pas 181 sur 500 pas 182 sur 500 pas 183 sur 500 pas 184 sur 500 0.9400000000000006 pas 185 sur 500 pas 186 sur 500 pas 187 sur 500 pas 188 sur 500 pas 189 sur 500 pas 190 sur 500 0.9500000000000006 pas 191 sur 500 pas 192 sur 500 pas 193 sur 500 0.9600000000000006 pas 194 sur 500 pas 195 sur 500 pas 196 sur 500 pas 197 sur 500 0.9700000000000006 pas 198 sur 500 pas 199 sur 500 pas 200 sur 500 pas 201 sur 500 pas 202 sur 500 0.9800000000000006 pas 203 sur 500 pas 204 sur 500 0.9900000000000007 pas 205 sur 500 pas 206 sur 500 pas 207 sur 500 pas 208 sur 500 pas 209 sur 500 pas 210 sur 500 1.0000000000000007 pas 211 sur 500 pas 212 sur 500 pas 213 sur 500 pas 214 sur 500 1.0100000000000007 pas 215 sur 500 pas 216 sur 500 pas 217 sur 500 1.0200000000000007 pas 218 sur 500 1.0300000000000007 pas 219 sur 500 pas 220 sur 500 pas 221 sur 500 pas 222 sur 500 1.0400000000000007 pas 223 sur 500 pas 224 sur 500 pas 225 sur 500 1.0500000000000007 pas 226 sur 500 pas 227 sur 500 1.0600000000000007 pas 228 sur 500 pas 229 sur 500 pas 230 sur 500 1.0700000000000007 pas 231 sur 500 pas 232 sur 500 pas 233 sur 500 pas 234 sur 500 1.0800000000000007 pas 235 sur 500 pas 236 sur 500 pas 237 sur 500 1.0900000000000007 pas 238 sur 500 pas 239 sur 500 pas 240 sur 500 pas 241 sur 500 1.1000000000000008 pas 242 sur 500 pas 243 sur 500 pas 244 sur 500 pas 245 sur 500 1.1100000000000008 pas 246 sur 500 pas 247 sur 500 pas 248 sur 500 1.1200000000000008 pas 249 sur 500 pas 250 sur 500 pas 251 sur 500 pas 252 sur 500 1.1300000000000008 pas 253 sur 500 pas 254 sur 500 1.1400000000000008 pas 255 sur 500 1.1500000000000008 pas 256 sur 500 pas 257 sur 500 pas 258 sur 500 pas 259 sur 500 pas 260 sur 500 1.1600000000000008 pas 261 sur 500 pas 262 sur 500 pas 263 sur 500 1.1700000000000008 pas 264 sur 500 pas 265 sur 500 pas 266 sur 500 pas 267 sur 500 pas 268 sur 500 1.1800000000000008 pas 269 sur 500 pas 270 sur 500 pas 271 sur 500 pas 272 sur 500 pas 273 sur 500 pas 274 sur 500 pas 275 sur 500 pas 276 sur 500 1.1900000000000008 pas 277 sur 500 pas 278 sur 500 pas 279 sur 500 pas 280 sur 500 1.2000000000000008 pas 281 sur 500 pas 282 sur 500 1.2100000000000009 pas 283 sur 500 pas 284 sur 500 pas 285 sur 500 pas 286 sur 500 pas 287 sur 500 pas 288 sur 500 1.2200000000000009 pas 289 sur 500 pas 290 sur 500 1.2300000000000009 pas 291 sur 500 pas 292 sur 500 pas 293 sur 500 1.2400000000000009 pas 294 sur 500 pas 295 sur 500 pas 296 sur 500 pas 297 sur 500 pas 298 sur 500 pas 299 sur 500 1.2500000000000009 pas 300 sur 500 pas 301 sur 500 pas 302 sur 500 pas 303 sur 500 pas 304 sur 500 pas 305 sur 500 1.260000000000001 pas 306 sur 500 pas 307 sur 500 pas 308 sur 500 pas 309 sur 500 pas 310 sur 500 1.270000000000001 pas 311 sur 500 1.280000000000001 pas 312 sur 500 1.290000000000001 pas 313 sur 500 pas 314 sur 500 pas 315 sur 500 pas 316 sur 500 1.300000000000001 pas 317 sur 500 pas 318 sur 500 pas 319 sur 500 1.310000000000001 pas 320 sur 500 pas 321 sur 500 pas 322 sur 500 1.320000000000001 pas 323 sur 500 pas 324 sur 500 pas 325 sur 500 pas 326 sur 500 pas 327 sur 500 1.330000000000001 pas 328 sur 500 pas 329 sur 500 pas 330 sur 500 pas 331 sur 500 1.340000000000001 pas 332 sur 500 pas 333 sur 500 pas 334 sur 500 pas 335 sur 500 pas 336 sur 500 pas 337 sur 500 1.350000000000001 pas 338 sur 500 pas 339 sur 500 pas 340 sur 500 1.360000000000001 pas 341 sur 500 pas 342 sur 500 pas 343 sur 500 pas 344 sur 500 1.370000000000001 pas 345 sur 500 pas 346 sur 500 pas 347 sur 500 1.380000000000001 pas 348 sur 500 pas 349 sur 500 1.390000000000001 pas 350 sur 500 pas 351 sur 500 1.400000000000001 pas 352 sur 500 pas 353 sur 500 pas 354 sur 500 1.410000000000001 pas 355 sur 500 pas 356 sur 500 pas 357 sur 500 pas 358 sur 500 pas 359 sur 500 pas 360 sur 500 pas 361 sur 500 pas 362 sur 500 pas 363 sur 500 pas 364 sur 500 1.420000000000001 pas 365 sur 500 pas 366 sur 500 pas 367 sur 500 pas 368 sur 500 pas 369 sur 500 pas 370 sur 500 pas 371 sur 500 1.430000000000001 pas 372 sur 500 pas 373 sur 500 pas 374 sur 500 pas 375 sur 500 1.440000000000001 pas 376 sur 500 pas 377 sur 500 pas 378 sur 500 pas 379 sur 500 pas 380 sur 500 1.450000000000001 pas 381 sur 500 pas 382 sur 500 pas 383 sur 500 1.460000000000001 pas 384 sur 500 pas 385 sur 500 pas 386 sur 500 1.470000000000001 pas 387 sur 500 pas 388 sur 500 pas 389 sur 500 1.480000000000001 pas 390 sur 500 pas 391 sur 500 pas 392 sur 500 pas 393 sur 500 1.490000000000001 pas 394 sur 500 pas 395 sur 500 1.500000000000001 pas 396 sur 500 pas 397 sur 500 pas 398 sur 500 pas 399 sur 500 pas 400 sur 500 1.5100000000000011 pas 401 sur 500 pas 402 sur 500 1.5200000000000011 pas 403 sur 500 pas 404 sur 500 1.5300000000000011 1.5400000000000011 pas 405 sur 500 pas 406 sur 500 pas 407 sur 500 pas 408 sur 500 1.5500000000000012 pas 409 sur 500 pas 410 sur 500 pas 411 sur 500 1.5600000000000012 pas 412 sur 500 pas 413 sur 500 pas 414 sur 500 1.5700000000000012 pas 415 sur 500 pas 416 sur 500 pas 417 sur 500 pas 418 sur 500 pas 419 sur 500 1.5800000000000012 pas 420 sur 500 pas 421 sur 500 pas 422 sur 500 pas 423 sur 500 1.5900000000000012 pas 424 sur 500 pas 425 sur 500 pas 426 sur 500 1.6000000000000012 pas 427 sur 500 pas 428 sur 500 pas 429 sur 500 pas 430 sur 500 pas 431 sur 500 1.6100000000000012 pas 432 sur 500 pas 433 sur 500 pas 434 sur 500 1.6200000000000012 pas 435 sur 500 pas 436 sur 500 pas 437 sur 500 pas 438 sur 500 1.6300000000000012 pas 439 sur 500 pas 440 sur 500 pas 441 sur 500 1.6400000000000012 pas 442 sur 500 pas 443 sur 500 1.6500000000000012 1.6600000000000013 pas 444 sur 500 1.6700000000000013 pas 445 sur 500 pas 446 sur 500 1.6800000000000013 pas 447 sur 500 pas 448 sur 500 pas 449 sur 500 1.6900000000000013 pas 450 sur 500 pas 451 sur 500 pas 452 sur 500 pas 453 sur 500 pas 454 sur 500 1.7000000000000013 1.7100000000000013 pas 455 sur 500 pas 456 sur 500 pas 457 sur 500 1.7200000000000013 pas 458 sur 500 1.7300000000000013 pas 459 sur 500 pas 460 sur 500 pas 461 sur 500 pas 462 sur 500 1.7400000000000013 pas 463 sur 500 pas 464 sur 500 1.7500000000000013 pas 465 sur 500 1.7600000000000013 pas 466 sur 500 pas 467 sur 500 1.7700000000000014 pas 468 sur 500 pas 469 sur 500 1.7800000000000014 pas 470 sur 500 pas 471 sur 500 1.7900000000000014 pas 472 sur 500 pas 473 sur 500 1.8000000000000014 pas 474 sur 500 pas 475 sur 500 1.8100000000000014 pas 476 sur 500 pas 477 sur 500 pas 478 sur 500 pas 479 sur 500 pas 480 sur 500 1.8200000000000014 pas 481 sur 500 1.8300000000000014 pas 482 sur 500 pas 483 sur 500 pas 484 sur 500 pas 485 sur 500 1.8400000000000014 pas 486 sur 500 pas 487 sur 500 1.8500000000000014 pas 488 sur 500 pas 489 sur 500 pas 490 sur 500 1.8600000000000014 pas 491 sur 500 1.8700000000000014 pas 492 sur 500 1.8800000000000014 1.8900000000000015 pas 493 sur 500 pas 494 sur 500 1.9000000000000015 pas 495 sur 500 1.9100000000000015 pas 496 sur 500 pas 497 sur 500 1.9200000000000015 pas 498 sur 500 pas 499 sur 500
cmd1 = 'rm ' + moviename
#print(cmd1)
os.system(cmd1)
#filter_complex 'scale=864:576, pad=720:576:71:57'
cmd2 = 'ffmpeg -v 0 -framerate 24 -pattern_type glob -i \'' + output_dir + '/*.png\' -vcodec libx264 -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" -pix_fmt yuv420p ' + moviename
print("Execution de la commande de conversion")
print(cmd2)
os.system(cmd2)
print("Fin de la commande de conversion")
Execution de la commande de conversion ffmpeg -v 0 -framerate 24 -pattern_type glob -i 'PNG/T1_particules_en_boite_libre_movie/*.png' -vcodec libx264 -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" -pix_fmt yuv420p Film_test.mp4 Fin de la commande de conversion
import io
import base64
from IPython.display import HTML
video = io.open(moviename, 'r+b').read()
encoded = base64.b64encode(video)
HTML(data='''<video alt="test" controls>
<source src="data:video/mp4;base64,{0}" type="video/mp4" />
</video>'''.format(encoded.decode('ascii')))
Notebook by Cécile Hébert (2019-2024). Except where otherwise noted, the content of this notebook is licensed under MIT licence.