اذهب إلى المحتوى

السؤال

نشر
    
@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));
        }
    }}

الكود ده بيضغط معايا ملف الفيديو بس بيبقى من غير صوت 

Recommended Posts

  • 0
نشر

الكود الذي قدمته يبدو أنه يقوم بضغط ملف الفيديو بشكل مؤقت وإظهاره في `VideoView`، لكنه لا يتضمن تضمين الصوت في ملف الفيديو المضغوط. هذا يحدث لأن الكود يستخدم مكتبة `SiliCompressor` التي تهتم بضغط الفيديو فقط دون الصوت.

 

إذا كنت ترغب في ضمان وجود الصوت في الفيديو المضغوط، يمكنك استخدام مكتبة أخرى تدعم ضغط الفيديو مع الصوت مثل `FFmpeg` أو `MediaCodec` في Android. هذه المكتبات توفر مزيدًا من التحكم على عملية الضغط وتتيح لك ضبط إعدادات الصوت والفيديو وتجميعها معًا.

 

ومع ذلك، يُرجى ملاحظة أن استخدام مكتبات متطورة مثل `FFmpeg` يتطلب فهمًا أعمق للعمل مع الصوت والفيديو في Android وقد تحتاج إلى معالجة الاستثناءات والإعدادات المناسبة لضمان عملها بشكل صحيح.

 

إذا كنت ترغب في مواصلة استخدام مكتبة `SiliCompressor` بدون صوت، فيمكنك متابعة استخدام الكود الحالي بنفس الطريقة التي قدمتها. وإذا كنت بحاجة إلى ضغط الفيديو مع الصوت، فعليك بالبحث عن مكتبات تدعم هذه الميزة واستخدامها بالطريقة المناسبة.

  • 0
نشر

حاول استخدام مكتبة أخرى لضغط الفيديو مثل  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 وإليك المستند الرسمي الخاص بها:

وهي تعتمد على MediaCodec API في أندرويد.

  • 0
نشر

من الواضح أن الكود يستخدم مكتبة 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 لتحسين ضغط الصوت.

يرجى ملاحظة أنه من الممكن أن تحتاج إلى ضبط الإعدادات بناءً على احتياجاتك الخاصة ومتطلبات جودة الفيديو والصوت.

 

  • 0
نشر

        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;
        }
    }

 

  • 0
نشر
بتاريخ 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.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...