Drive Man نشر 19 يوليو 2023 أرسل تقرير نشر 19 يوليو 2023 @SuppressWarnings("ALL") public class uploadved extends AppCompatActivity implements difroved.ExampleDialogeListener{ RoundedImageView geter; VideoView vedgetr; public Uri videoUri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_uploadved); geter = findViewById(R.id.geter); vedgetr = findViewById(R.id.vedgetr); geter.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { // check condition if (ContextCompat.checkSelfPermission( uploadved.this, Manifest.permission .WRITE_EXTERNAL_STORAGE) == PackageManager .PERMISSION_GRANTED) { // When permission is granted // Create method selectVideo(); } else { // When permission is not granted // request permission ActivityCompat.requestPermissions( uploadved.this, new String[] { Manifest.permission .WRITE_EXTERNAL_STORAGE }, 1); } } }); private void selectVideo() { Intent intent = new Intent(Intent.ACTION_PICK); // Set type intent.setType("video/*"); // set action intent.setAction(Intent.ACTION_GET_CONTENT); // Start activity result startActivityForResult( Intent.createChooser(intent, "Select Video"), 100); } @Override public void onRequestPermissionsResult( int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult( requestCode, permissions, grantResults); // check condition if (requestCode == 1 && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // When permission is granted // Call method selectVideo(); } else { // When permission is denied // Display Toast Toast .makeText(getApplicationContext(), "Permission Denied !", Toast.LENGTH_SHORT) .show(); } } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); // Check condition if (requestCode == 100 && resultCode == RESULT_OK && data != null) { // When result is ok // Initialize Uri Uri uri = data.getData(); // Set video uri // Initialize file File file = new File( Environment.getExternalStorageDirectory() .getAbsolutePath()); // Create compress video method new CompressVideo().execute( "false", uri.toString(), file.getPath()); } } private class CompressVideo extends AsyncTask<String, String, String> { // Initialize dialog Dialog dialog; @Override protected void onPreExecute() { super.onPreExecute(); // Display dialog dialog = ProgressDialog.show( uploadved.this, "", "Compressing..."); } @Override protected String doInBackground(String... strings) { // Initialize video path String videoPath = null; try { // Initialize uri Uri uri = Uri.parse(strings[1]); // Compress video videoPath = SiliCompressor.with(uploadved.this) .compressVideo(uri, strings[2]); } catch (URISyntaxException e) { e.printStackTrace(); } // Return Video path return videoPath; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); // Dismiss dialog dialog.dismiss(); // Visible all views // Initialize file File file = new File(s); // Initialize uri Uri uri = Uri.fromFile(file); // set video uri vedgetr.setVideoURI(uri); // start both video vedgetr.start(); // Compress video size float size = file.length() / 1024f; // Set size on text view Log.d("drivetestaa",String.format("Size : %.2f KB", size)); } }} الكود ده بيضغط معايا ملف الفيديو بس بيبقى من غير صوت اقتباس
0 Hessen Nasser نشر 19 يوليو 2023 أرسل تقرير نشر 19 يوليو 2023 الكود الذي قدمته يبدو أنه يقوم بضغط ملف الفيديو بشكل مؤقت وإظهاره في `VideoView`، لكنه لا يتضمن تضمين الصوت في ملف الفيديو المضغوط. هذا يحدث لأن الكود يستخدم مكتبة `SiliCompressor` التي تهتم بضغط الفيديو فقط دون الصوت. إذا كنت ترغب في ضمان وجود الصوت في الفيديو المضغوط، يمكنك استخدام مكتبة أخرى تدعم ضغط الفيديو مع الصوت مثل `FFmpeg` أو `MediaCodec` في Android. هذه المكتبات توفر مزيدًا من التحكم على عملية الضغط وتتيح لك ضبط إعدادات الصوت والفيديو وتجميعها معًا. ومع ذلك، يُرجى ملاحظة أن استخدام مكتبات متطورة مثل `FFmpeg` يتطلب فهمًا أعمق للعمل مع الصوت والفيديو في Android وقد تحتاج إلى معالجة الاستثناءات والإعدادات المناسبة لضمان عملها بشكل صحيح. إذا كنت ترغب في مواصلة استخدام مكتبة `SiliCompressor` بدون صوت، فيمكنك متابعة استخدام الكود الحالي بنفس الطريقة التي قدمتها. وإذا كنت بحاجة إلى ضغط الفيديو مع الصوت، فعليك بالبحث عن مكتبات تدعم هذه الميزة واستخدامها بالطريقة المناسبة. اقتباس
0 Mustafa Suleiman نشر 20 يوليو 2023 أرسل تقرير نشر 20 يوليو 2023 حاول استخدام مكتبة أخرى لضغط الفيديو مثل FFmpegAndroid (تدعم جافا فقط) وهي مكتبة منفصلة يتطلب تضمينها واستخدامها في مشروع Android لديك باستخدام Gradle أو تحميل ملف JAR مباشرة. ثم أنشئ AsyncTask مماثلة للكود لديك، ولكن في دالة doInBackground()، قم بتنفيذ عملية ضغط الفيديو مع الصوت باستخدام FFmpeg. بعد ذلك استخدم FFmpeg في doInBackground() لضغط الفيديو مع الصوت، باستخدام الأمر ffmpeg -i input_video.mp4 -c:v libx264 -c:a aac -strict experimental -b:a 128k output_video.mp4 لضغط الفيديو مع الصوت بتنسيق MP4، ويُفترض أن input_video.mp4 هو المسار الكامل للفيديو الذي تم اختياره، و output_video.mp4 هو المسار الذي سيتم حفظ الفيديو المضغوط به. وفي onPostExecute()، استخدم المسار الكامل للفيديو المضغوط لتعيين VideoView. وفي حال أردت استخدام مكتبة حديثة (مكتوبة بواسطة كوتلن) وتدعم Flutter أيضًا وهي أفضل في رأي فاستخدم مكتبة LightCompressor وإليك المستند الرسمي الخاص بها: https://github.com/AbedElazizShe/LightCompressor وهي تعتمد على MediaCodec API في أندرويد. اقتباس
0 بلال زيادة نشر 22 يوليو 2023 أرسل تقرير نشر 22 يوليو 2023 من الواضح أن الكود يستخدم مكتبة SiliCompressor لضغط ملف الفيديو. لكنه يقوم بالضغط بدون مراعاة الصوت، وبالتالي يتسبب في فقدان الصوت من ملف الفيديو المضغوط. لحل هذه المشكلة والحفاظ على الصوت أثناء ضغط الفيديو، يجب أن نقوم بتعديل الكود لإضافة معالجة للصوت أثناء الضغط. سأقدم لك طريقة بسيطة لإجراء ذلك باستخدام مكتبة FFmpeg. قبل أن نبدأ، قم بتثبيت مكتبة FFmpeg على نظام التشغيل الخاص بك. يمكنك الاطلاع على موقع FFmpeg ومتابعة الخطوات المناسبة لنظام التشغيل الذي تستخدمه. بعد التأكد من تثبيت FFmpeg، يمكنك تحديث الكود على النحو التالي ليتم معالجة الصوت أثناء الضغط: import id.zelory.compressor.Compressor; import android.net.Uri; import java.io.File; import id.zelory.compressor.constraint.Compression; import id.zelory.compressor.constraint.VideoConstraint; // ... private class CompressVideo extends AsyncTask<String, String, String> { // ... @Override protected String doInBackground(String... strings) { // Initialize video path String videoPath = null; try { // Initialize uri Uri uri = Uri.parse(strings[1]); // Initialize output directory File outputDir = new File(Environment.getExternalStorageDirectory(), "CompressedVideos"); outputDir.mkdirs(); // Compress video videoPath = new Compressor(uploadved.this) .setVideoConstraints(VideoConstraint.RESOLUTION, 720, 1280) .setVideoConstraints(VideoConstraint.ASPECT_RATIO, 1, 1) .setVideoConstraints(VideoConstraint.DURATION, 30) .setVideoConstraints(VideoConstraint.VIDEO_BITRATE, 2 * 1024 * 1024) .setAudioChannels(1) .setAudioBitRate(128 * 1024) .compressToFile(uri.toString(), outputDir.getPath()); } catch (URISyntaxException e) { e.printStackTrace(); } // Return Video path return videoPath; } // ... } في هذا التحديث، قمنا بإضافة الاستخدام المناسب لمكتبة Compressor التي تعمل على تحسين ضغط الفيديو والصوت أثناء الضغط. استخدمنا setVideoConstraints لتعيين القيود والإعدادات المناسبة للفيديو. واستخدمنا setAudioChannels و setAudioBitRate لتحسين ضغط الصوت. يرجى ملاحظة أنه من الممكن أن تحتاج إلى ضبط الإعدادات بناءً على احتياجاتك الخاصة ومتطلبات جودة الفيديو والصوت. 1 اقتباس
0 Drive Man نشر 24 يوليو 2023 الكاتب أرسل تقرير نشر 24 يوليو 2023 دلوقتى انا مش لاقى مكتبة Compressor ytr.bmp 1 اقتباس
0 بلال زيادة نشر 25 يوليو 2023 أرسل تقرير نشر 25 يوليو 2023 بتاريخ 14 ساعة قال Drive Man: دلوقتى انا مش لاقى مكتبة Compressor ytr.bmp 3 MB · 3 تنزيلات حاول ارفاق الكود كاملاً لو سمحت. اقتباس
0 Drive Man نشر 25 يوليو 2023 الكاتب أرسل تقرير نشر 25 يوليو 2023 geter = findViewById(R.id.geter); uploader = findViewById(R.id.uploader); vedgetr = findViewById(R.id.vedgetr); //////////////////ffmg/////////////////// mc = new MediaController(uploadved.this); vedgetr.setMediaController(mc); geter.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // check condition if (ContextCompat.checkSelfPermission( uploadved.this, Manifest.permission .WRITE_EXTERNAL_STORAGE) == PackageManager .PERMISSION_GRANTED) { // When permission is granted // Create method selectVideo(); } else { // When permission is not granted // request permission ActivityCompat.requestPermissions( uploadved.this, new String[] { Manifest.permission .WRITE_EXTERNAL_STORAGE }, 1); } } }); private void selectVideo() { Intent intent = new Intent(Intent.ACTION_PICK); // Set type intent.setType("video/*"); // set action intent.setAction(Intent.ACTION_GET_CONTENT); // Start activity result startActivityForResult( Intent.createChooser(intent, "Select Video"), 100); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult( requestCode, permissions, grantResults); // check condition if (requestCode == 1 && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // When permission is granted // Call method selectVideo(); } else { // When permission is denied // Display Toast Toast .makeText(getApplicationContext(), "Permission Denied !", Toast.LENGTH_SHORT) .show(); } } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); // Check condition if (requestCode == 100 && resultCode == RESULT_OK && data != null) { // When result is ok // Initialize Uri videoUri = data.getData(); // Set video uri vedgetr.setVideoURI(videoUri); vedgetr.start(); // Initialize file File file = new File( Environment.getExternalStorageDirectory() .getAbsolutePath()); // Create compress video method } } private class CompressVideo extends AsyncTask<String, String, String> { @Override protected String doInBackground(String... strings) { // Initialize video path String videoPath = null; try { // Initialize uri Uri uri = Uri.parse(strings[1]); // Initialize output directory File outputDir = new File(Environment.getExternalStorageDirectory(), "CompressedVideos"); outputDir.mkdirs(); // Compress video videoPath = new Compressor(uploadved.this) .setVideoConstraints(VideoConstraint.RESOLUTION, 720, 1280) .setVideoConstraints(VideoConstraint.ASPECT_RATIO, 1, 1) .setVideoConstraints(VideoConstraint.DURATION, 30) .setVideoConstraints(VideoConstraint.VIDEO_BITRATE, 2 * 1024 * 1024) .setAudioChannels(1) .setAudioBitRate(128 * 1024) .compressToFile(uri.toString(), outputDir.getPath()); } catch (URISyntaxException e) { e.printStackTrace(); } // Return Video path return videoPath; } } 1 اقتباس
0 بلال زيادة نشر 25 يوليو 2023 أرسل تقرير نشر 25 يوليو 2023 بتاريخ 2 دقائق مضت قال Drive Man: geter = findViewById(R.id.geter); uploader = findViewById(R.id.uploader); vedgetr = findViewById(R.id.vedgetr); //////////////////ffmg/////////////////// mc = new MediaController(uploadved.this); vedgetr.setMediaController(mc); geter.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // check condition if (ContextCompat.checkSelfPermission( uploadved.this, Manifest.permission .WRITE_EXTERNAL_STORAGE) == PackageManager .PERMISSION_GRANTED) { // When permission is granted // Create method selectVideo(); } else { // When permission is not granted // request permission ActivityCompat.requestPermissions( uploadved.this, new String[] { Manifest.permission .WRITE_EXTERNAL_STORAGE }, 1); } } }); private void selectVideo() { Intent intent = new Intent(Intent.ACTION_PICK); // Set type intent.setType("video/*"); // set action intent.setAction(Intent.ACTION_GET_CONTENT); // Start activity result startActivityForResult( Intent.createChooser(intent, "Select Video"), 100); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult( requestCode, permissions, grantResults); // check condition if (requestCode == 1 && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // When permission is granted // Call method selectVideo(); } else { // When permission is denied // Display Toast Toast .makeText(getApplicationContext(), "Permission Denied !", Toast.LENGTH_SHORT) .show(); } } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); // Check condition if (requestCode == 100 && resultCode == RESULT_OK && data != null) { // When result is ok // Initialize Uri videoUri = data.getData(); // Set video uri vedgetr.setVideoURI(videoUri); vedgetr.start(); // Initialize file File file = new File( Environment.getExternalStorageDirectory() .getAbsolutePath()); // Create compress video method } } private class CompressVideo extends AsyncTask<String, String, String> { @Override protected String doInBackground(String... strings) { // Initialize video path String videoPath = null; try { // Initialize uri Uri uri = Uri.parse(strings[1]); // Initialize output directory File outputDir = new File(Environment.getExternalStorageDirectory(), "CompressedVideos"); outputDir.mkdirs(); // Compress video videoPath = new Compressor(uploadved.this) .setVideoConstraints(VideoConstraint.RESOLUTION, 720, 1280) .setVideoConstraints(VideoConstraint.ASPECT_RATIO, 1, 1) .setVideoConstraints(VideoConstraint.DURATION, 30) .setVideoConstraints(VideoConstraint.VIDEO_BITRATE, 2 * 1024 * 1024) .setAudioChannels(1) .setAudioBitRate(128 * 1024) .compressToFile(uri.toString(), outputDir.getPath()); } catch (URISyntaxException e) { e.printStackTrace(); } // Return Video path return videoPath; } } يبدو أنك تحاول استخدام مكتبة Compressor لضغط ملفات الفيديو في تطبيق Android الخاص بك. ومن خلال الشيفرة المقدمة، لاحظت أن الكود لا يتضمن مكتبة Compressor بشكل صحيح. هذا هو السبب الذي يجعلها غير موجودة عندك وتحصل على خطأ. لتصحيح ذلك، يجب عليك تضمين مكتبة Compressor في تطبيق Android الخاص بك. قبل البدء في ذلك، تأكد من أنك قمت بتضمين معرّف التبعية الصحيح في ملف build.gradle للوحدة البرمجية الخاصة بالتطبيق. يمكنك القيام بذلك عن طريق إضافة السطر التالي: implementation 'id.zelory:compressor:3.0.0' ثم، بعد ذلك، قم بمزامنة المشروع لجلب التبعيات المضافة حديثًا. الآن، يمكنك استخدام مكتبة Compressor في الكود. اتبع الخطوات التالية: استيراد مكتبة Compressor: قم بإضافة التالي في مقدمة ملف الكلاس: import id.zelory.compressor.Compressor; استخدام مكتبة Compressor في AsyncTask: قم بتعديل الدالة doInBackground لتستخدم Compressor كما يلي: @Override protected String doInBackground(String... strings) { // Initialize video path String videoPath = null; try { // Initialize uri Uri uri = Uri.parse(strings[1]); // Initialize output directory File outputDir = new File(Environment.getExternalStorageDirectory(), "CompressedVideos"); outputDir.mkdirs(); // Compress video videoPath = new Compressor(uploadved.this) .setDestinationDirectoryPath(outputDir.getPath()) .compressToFile(new File(uri.getPath())) .getAbsolutePath(); } catch (IOException e) { e.printStackTrace(); } // Return Video path return videoPath; } استخدام AsyncTask لضغط الفيديو: في دالة onActivityResult، قم بإضافة الكود التالي لاستدعاء AsyncTask وضغط الفيديو: @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); // Check condition if (requestCode == 100 && resultCode == RESULT_OK && data != null) { // When result is ok // Initialize Uri Uri videoUri = data.getData(); // Create CompressVideo AsyncTask and execute it new CompressVideo().execute(videoUri.toString()); } } بهذا الشكل، يجب أن تكون قد استخدمت مكتبة Compressor بشكل صحيح لضغط ملفات الفيديو في تطبيقك عند رفعها من الهاتف وتطبيق الضغط عليها. يرجى التأكد من وجود الإذن اللازم للكتابة إلى الذاكرة الخارجية قبل استخدام مكتبة Compressor. اقتباس
السؤال
Drive Man
الكود ده بيضغط معايا ملف الفيديو بس بيبقى من غير صوت
8 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.