Bonjour,
J'utilise Delphi 10.4 pour créer un simple lecteur de livre audio.
J'ai un fichier audio mp3. Dans mon application, je souhaite que TMediaPlayer lise une phrase à une position précise dans le ficher mp3,
par exemple à partir de 00:01:12.256 à 00:01:15.734 secondes, les 100 nanosecondes sont prise en compte.
Je règle MediaPlayer.CurrentTime à 00:01:12.256, lance MediaPlayer.Play,
et l'arrêt via Timer de 50 ms je fais un stop quant le MediaPlayer.CurrentTime atteint 00:01:15.734
Pour un fichier audio mp3 de 3 minutes, j'ai environ 60 plages précises à positionner.
Mon problème est que, si je position MediaPlayer.CurrentTime à 00 : ?? : ?? . ???
la lecture ne se fait pas correctement à cette position j'ai un décalage de 500 à 1100 ms.
Si je me position au début sur certains fichiers audio, la lecture se fait plus au moins correct,
mais si je me position vers la fin du fichier audio j'ai un décalage.
Sur d'autres fichiers audio j'ai le décalage au début du fichier,
la différence de ces temps n'est pas constant et n'est pas linéaire.
Je constate que le problème apparaît de manière très frappante sur un fichier.
mais il apparaît de façon moins frappante sur un autre fichier.
J'ai aussi des fichiers où le problème est absent.
Tous les fichiers ont le même format. Sous Windows les positions se font correctement.
Ma question est-ce un problème de programmation ou de codecs MP3 ?
Si c'est un problème de codec, comment puis-je déployer et utiliser des codecs avec mon application.
Ou quel serait le meilleur format pour un fichier livre audio.
Je vous serai très reconnaissant pour l'aide.
Le format Audio:
Format : MPEG Audio
Format version : Version 1
Format profile : Layer 3
Format settings : Joint stereo
Bit rate mode : Variable
Bit rate : 161 kb/s
Minimum bit rate : 32.0 kb/s
Channel(s) : 2 channels
Sampling rate : 44.1 kHz
Frame rate : 38.281 FPS (1152 SPF)
Compression mode : Lossy
Writing library : LAME3.97r
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 procedure TFormMain.Button1(Sender: TObject); var startTimeLyr : int64 ; begin startTimeLyr := 10000 * MilliSecondOfTheDay(StrToDatetime(datetostr(date) + ' ' + '00:01:12.256' )); MediaPlayer1.CurrentTime := startTimeLyr ; end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 function TFormMain.EndTimeLyr: int64; begin DTendLyr := StrToDatetime(datetostr(date) + ' ' + '00:01:15.734' ); result := 10000 * MilliSecondOfTheDay(DTendLyr); end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 procedure TFormMain.Timer1Timer(Sender: TObject); begin ... if MediaPlayer1.CurrentTime > EndTimeLyr then begin MediaPlayer1.Stop; Timer1.Enabled := False; end; end;
Partager