EasyDelphi Q&A
0 تصويتات
39 مشاهدات
السلام عليكم ورحمة الله وبركاته

قمت ببرمجة تطبيق أندرويد يقوم بتشغيل ملفات صوتية مدمجة مع التطبيق باستخدام نسخة 10.3.1 التطبيق شغال 100% والحمد لله

ولكن لم أستطع رفع التطبيق على متجر جوجل بسبب ساسته الجديدة بأن يدعم Android x64 , وقد تم حل المشكل في النسخة الأخيرة 10.3.3

ولكن طلعلي مشكل جديد Mediaplayer.currentime لا تشتغل وتعطي قيم عشوائية (أحيانا موجبة وأحيانا سالبة) فقط في تطبيق الأندرويد لو أنفدو على الويندوز يشتغل عادي, جربت الكود في نسخة 10.3.2 نفس المشكلة.

بحثت كثير على حل ما لاقيت, طرحت المشكل في منتذى أجنبي, تم الرد علي بأنه Bug في الدلفى بحد داته ولكن لم ألقى حل للموضوع.

هل فيه طريقة بديلة لمعرفة وقت التشغيل الحالي والتحكم فيه بمكون Trackbar

أو فيه مكونات تانية غير الميديا بلاير؟

وبارك الله فيكم ☺
سُئل في تصنيف fmx بواسطة (220 نقاط) | 39 مشاهدات

4 إجابة

+1 تصويت

بعد مراجعة لكود .FMX.Media.Android.pas . اعتقد انه يجب :

١ ـ نسخ الملف إلى مجلد المشروع . هذا سيسمح لك بالتجربة بدون التاثير على الملف الاساسي. الكومبايلر سيعتمد هذا الملف ويتجاهل الاساسي.

افتح الملف وغير كل ( عبارة واحدة وليس كل كلمة لوحده ) .

MSecsPerSec/MediaTimeScale

إلى 

Int64(MSecsPerSec/MediaTimeScale)

 

واخبرنا النتيجة .

 

ملاحظة انا لم اجربها . هذه توقعات . انه يجب ان تكون بهذا الشكل . 

ان كان الحل مناسب . فيرجى اختيار هذه الإجابة كإجابة الافضل . حتى يستفيد الجميع . 

جربها واعطنا النتيجة . حاليا لا يوجد عندي نسخة 10.3.3 حتى اتاكد منها

تم الرد عليه بواسطة (31,160 نقاط)
0

طلعلي ايرور

طلعلي إيرور مثل مانو موضح بالصورة

+1

حول Round كلها إلى int64 . 

... seekTo ( Max(0, int64( Round( Value * MSecsPerSec / MediaTimeScale)....

 

0
لم يحل المشكل , مازال ال currentime يعطي قيم عشوائية

دورت كثير على حل وجدت هذا الفيكس

http://git.kngstr.com/KngStr/delphi-fixes/src/7ee91c7c74594a38744594238ce11a51bddea79e

هو خاص بالنسة 10.3.2 جربتو حل المشكل ولكن ظهر مشكل آخر لما يصل قرائة الملف الصوتي للتوقيت 03:40 يعيد من الأول ولو أحاول تقديم الوقت أكثر من ذلك باستخدام ال TrckBar لأي وقت أكثر من 03:40 يرجع يقرأ الملف من الأول, غيرت الملف الصوتي نفس الشي
+1 تصويت

وعليكم السلام ورحمة الله وبركاته

تفضل كحل مبدئي فقط

https://3.top4top.net/p_1435ipxl71.png

https://4.top4top.net/p_1435mhwk51.png

 

  TrackBar1.Max :=100;
  TrackBar1.Value :=MediaPlayer1.CurrentTime div  Int64(100000000);
  LBStat.Text:=TrackBar1.Value.ToString+' %';

 

تم الرد عليه بواسطة (2,800 نقاط)
0
أهلا أخي , جربت الكود باقي نفس المشكلة , المشكل في الدالة currentime ممكن في تشغيل ملف فيديو تعمل صح ولكن في ملف صوتي باقي قيمها عشوائية للأسف
+1
طيب راح اشوف الامر ان شاء الله
+1 تصويت

جرب كمحاولة فقط جلب حجم الملف هذه فنكشن

 function GetFileSize(const AFileName: string): Int64;
var
  FStream: TFileStream;
begin
  FStream := TFileStream.Create(AFileName, fmOpenRead and fmShareDenyNone);
  try
    Result := FStream.Size;
  finally
    FStream.Free;
  end;
end;

 

TrackBar1.Max :=100;
  TrackBar1.Value :=(Int64(MediaPlayer1.CurrentTime) div (filesize * 5) ) ;
  LBStat.Text:=TrackBar1.Value.ToString+' %';

يكون التغيير في العدد 5 هذا ما استطعت لحد الان الوصول اليه لاني جئت متعب من كرة القدم هههه  راح احاول غدا ان لم ينفع معك

تم الرد عليه بواسطة (2,800 نقاط)
0
شكرا أخي على اجتهادك معي, الكود يرجع قيمة واحدة فقط 0%
+1
جربته على ملفات صوتية ويعمل عادي  ممكن ترفق السورس الخاص بك للتجربة
0

هذا رابط لمثال تطبيقي بسيط , فيه الطريقة القديمة التي كانت شغالة على النسخ القديمة والطريقة التي اقترحتها

http://www.mediafire.com/file/wxhrrcwae9pgmia/audioplayer.7z/file

+1

Eagle, لا تنسى الinitialization لل result, فلو كان المسار خاطئ لن تحدث مشاكل.

المتغيرات المحلية ليست لها قيمة مبدئية.

Local variables are not intialized by default.

+1 تصويت

المشكل عندك في الكود اخي

تفضل

public
    myfile: string;
    filesize: Int64;
  end;
var
  Form1: TForm1;
 implementation
{$R *.fmx}
 procedure TForm1.Circle1Click(Sender: TObject);
 begin
//  myfile := TPath.GetDocumentsPath + PathDelim + '1.mp3';
    myfile := system.SysUtils.GetCurrentDir+ PathDelim + '1.mp3' ;
  filesize := GetFileSize(myfile);
  MediaPlayer1.FileName := myfile;
  MediaPlayer1.Play;
  Timer1.Enabled := true;
end;
 function TForm1.GetFileSize(const AFileName: string): Int64;
var
  FStream: TFileStream;
begin
  FStream := TFileStream.Create(AFileName, fmOpenRead and fmShareDenyNone);
  try
    Result := FStream.Size;
  finally
    FStream.Free;
  end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  { //old method working perfectly on XE10.2.3
    TrackBar2.Tag := 1;
    TrackBar2.Value := MediaPlayer1.CurrentTime;
    TrackBar2.Tag := 0;
    time_txt.Text:=FormatDatetime('hh:nn:ss', Mediaplayer1.CurrentTime / 1000 / (24*60*60)); }
     // 2- Eagle Master Method
  TrackBar2.Max := 100;
  TrackBar2.Value := (Int64(MediaPlayer1.CurrentTime) div (filesize * 5));
  time_txt.Text := TrackBar2.Value.ToString + ' %';
end;

 

 

 

تم الرد عليه بواسطة (2,800 نقاط)
0

أخي الكود شغال 100% على الويندوز (حتى الكود القديم شغال 100% عليه), المشكل على الأندرويد .

جرب هاذ الكود على الويندوز يشتغل عادي وتقدر تقدم وتأخر الصوت عن طريق ال Trackbar بدون مشاكل.

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Media,
  FMX.Objects, FMX.Effects, FMX.StdCtrls, FMX.Controls.Presentation, FMX.Layouts,system.ioutils;

type
  TForm1 = class(TForm)
    bottom: TRectangle;
    Layout1: TLayout;
    Layout2: TLayout;
    TrackBar2: TTrackBar;
    top: TRectangle;
    menuButton: TButton;
    ShadowEffect100: TShadowEffect;
    Sharebtn: TButton;
    Circle1: TCircle;
    Brush1: TBrushObject;
    Label1: TLabel;
    ShadowEffect1: TShadowEffect;
    Timer1: TTimer;
    MediaPlayer1: TMediaPlayer;
    time_txt: TLabel;
    procedure Timer1Timer(Sender: TObject);
    procedure Circle1Click(Sender: TObject);
    procedure TrackBar2Change(Sender: TObject);
  private
    { Private declarations }
     function GetFileSize(const AFileName: string): Int64;
  public
      myfile: string;
    filesize: Int64;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Circle1Click(Sender: TObject);
begin
  //myfile := TPath.GetDocumentsPath + PathDelim + '1.mp3';
    myfile := system.SysUtils.GetCurrentDir+ PathDelim + '1.mp3' ;
  filesize := GetFileSize(myfile);
  MediaPlayer1.FileName := myfile;
  MediaPlayer1.Play;
  Timer1.Enabled := true;
end;

function TForm1.GetFileSize(const AFileName: string): Int64;
var
  FStream: TFileStream;
begin
  FStream := TFileStream.Create(AFileName, fmOpenRead and fmShareDenyNone);
  try
    Result := FStream.Size;
  finally
    FStream.Free;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin

   //old method working perfectly on XE10.2.3
   TrackBar2.Max := MediaPlayer1.Duration;
    TrackBar2.Tag := 1;
    TrackBar2.Value := MediaPlayer1.CurrentTime;
    TrackBar2.Tag := 0;
    time_txt.Text:=FormatDatetime('hh:nn:ss', Mediaplayer1.CurrentTime / 10000000 / (24*60*60));
 {    // 2- Eagle Master Method
  TrackBar2.Max := 100;
  TrackBar2.Value := (Int64(MediaPlayer1.CurrentTime) div (filesize * 5));
  time_txt.Text := TrackBar2.Value.ToString + ' %';      }

end;

procedure TForm1.TrackBar2Change(Sender: TObject);
begin
   if TrackBar2.Tag = 0 then
    MediaPlayer1.CurrentTime := Round(TrackBar2.Value);

end;

end.

اسئلة متعلقة

+2 تصويتات
11 إجابة
0 تصويتات
1 إجابة
سُئل ديسمبر 2، 2019 في تصنيف MySQL بواسطة nacertaker (220 نقاط) | 31 مشاهدات
+1 تصويت
1 إجابة
سُئل ديسمبر 3، 2019 في تصنيف fmx بواسطة وليد غديري (360 نقاط) | 26 مشاهدات
+1 تصويت
1 إجابة
سُئل نوفمبر 12، 2019 في تصنيف fmx بواسطة xorpas (1,320 نقاط) | 29 مشاهدات
ادعُ اصدقائك في الفايسبوك لمشاركتك
Comodo SSL

مرحبًا بك إلى EasyDelphi Q&A، حيث يمكنك طرح الأسئلة والحصول على الإجابة عليها من المستخدمين الآخرين.

لا يسمح بطلب او السؤال عن كراك او تفعيل او كسر او فك او اي شيء يخالف اتفاقيات الترخيص  مهما كان السبب ومهما كان البرنامج ونوعه. ولا حتى نشر روابط تحتوي على مثل هذه الاشياء لا في الاسئلة ولا في الاجابات ولا التعليقات . نهائيا

480 سؤال
741 إجابة
1,394 تعليق
250 مستخدم