maitrungduc1410 / react-native-video-trim

Video trimmer for React Native App
MIT License
60 stars 24 forks source link

retriever.setDataSource(source) not working on older phones #80

Open LianVyv opened 3 days ago

LianVyv commented 3 days ago

@maitrungduc1410 I have came across this issue where my one Huawei phone is not working when setting the retriever.setDataSource(source). It keeps returning a null.

I have ended up fixing it by doing the following

public static MediaMetadataRetriever getMediaMetadataRetriever(String source) {
    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    try {
      if (source.startsWith("http://") || source.startsWith("https://")) {
        retriever.setDataSource(source, new HashMap<>());
      } else {
        try (FileInputStream fis = new FileInputStream(new File(source.replace("file://", "")))) {
            retriever.setDataSource(fis.getFD());
        } catch (IOException e) {
            retriever.release();
            Log.e(TAG, "Error setting data source from file descriptor", e);
            return null;
        }
      }
      return retriever;
    } catch (Exception e) {
      Log.e(TAG, "Error setting data source", e);
      try {
        retriever.release();
      } catch (Exception ee) {
        Log.e(TAG, "Error releasing retriever", ee);
      }
      return null;
    }
  }

I have tested on my other Android phones and it seems to work fine. But not sure what impact that has on other phones. I also realised if I run

 File file = new File(mSourceUri.toString());
      if (!file.exists()) {
           map.putString("File check", "file not found");       
      }

Then I always get File not found.

So I have had to add a .replace("file://", "")

Can I create a PR for this or you see any problems?

maitrungduc1410 commented 3 days ago

what is your phone version? (API version)

LianVyv commented 3 days ago

I think it is Android Version 12

IMG_2214

maitrungduc1410 commented 3 days ago

you should search for "software information" in Settings, it should show something like Android version

LianVyv commented 3 days ago

Android version 10(Q)

maitrungduc1410 commented 3 days ago

hi @LianVyv in this case the catch block will run, can you check what do you have in the error? (try to get stacktrace, message,...)

Like this:

public static MediaMetadataRetriever getMediaMetadataRetriever(String source) {
  MediaMetadataRetriever retriever = new MediaMetadataRetriever();
  try {
    if (source.startsWith("http://") || source.startsWith("https://")) {
      retriever.setDataSource(source, new HashMap<>());
    } else {
      retriever.setDataSource(source);
    }
    return retriever;
  } catch (Exception e) {
    Log.e(TAG, "Error setting data source");
    Log.e(TAG, e.printStackTrace());
    Log.e(TAG, e.getMessage());
    try {
      retriever.release();
    } catch (Exception ee) {
      Log.e(TAG, "Error releasing retriever", ee);
    }
    return null;
  }
}