Переглянути джерело

修复本地视频方向问题;
修复小米手机无法正常使用插件的兼容性问题

zengjiebin 7 роки тому
батько
коміт
a4c9885c44

+ 1 - 1
app/src/main/java/com/sheep/gamegroup/module/find/fragment/FgtMediaPickerVideo.java

@@ -68,7 +68,7 @@ public class FgtMediaPickerVideo extends BaseListFragment6<MediaBean> {
                 helper.setVisible(R.id.item_video_play_no_tv, false);
                 ImageView item_video_cover = helper.getView(R.id.item_video_cover);
                 TextView item_video_time_tv = helper.itemView.findViewById(R.id.item_video_time_tv);
-                ViewUtil.setViewWH(item_video_cover, width, item.getHeight() * 1.0f / item.getWidth());
+                ViewUtil.setViewWH(item_video_cover, width, item.getRadio());
                 ViewUtil.setImagePath(item_video_cover, item.getOriginalPath(), G.getRealPix(5));
                 ViewUtil.setText(item_video_time_tv, TimeUtil.getDurationText(item.getDuration() / 1000));
             }

+ 2 - 5
media/app/src/main/AndroidManifest.xml

@@ -102,14 +102,11 @@
                 <action android:name="android.intent.action.VIEW" />
             </intent-filter>
         </activity>
-        <activity android:name=".activity.ActCutVideo1"
-            android:theme="@style/Theme.AppCompat.Light.DarkActionBar"
-            android:screenOrientation="portrait"/>
         <activity android:name=".activity.ActCutVideo"
-            android:theme="@style/Theme.AppCompat.Light.DarkActionBar"
+            android:theme="@style/media_AppTheme"
             android:screenOrientation="portrait"/>
         <activity android:name=".activity.ActEditVideo"
-            android:theme="@style/Theme.AppCompat.Light.DarkActionBar"
+            android:theme="@style/media_AppTheme"
             android:screenOrientation="portrait"/>
     </application>
 </manifest>

+ 11 - 0
media/app/src/main/java/com/kfzs/cfyl/media/bean/VideoFrame.java

@@ -10,6 +10,8 @@ public class VideoFrame {
     private int width;
     private int height;
     private long atTime;
+    //图片方向
+    private int orientation;
 
     public String getVideoPath() {
         return videoPath;
@@ -46,4 +48,13 @@ public class VideoFrame {
         this.atTime = atTime;
         return this;
     }
+
+    public int getOrientation() {
+        return orientation;
+    }
+
+    public VideoFrame setOrientation(int orientation) {
+        this.orientation = orientation;
+        return this;
+    }
 }

+ 3 - 1
media/app/src/main/java/com/kfzs/cfyl/media/customview/VideoFramesView.java

@@ -23,6 +23,7 @@ import com.chad.library.adapter.base.BaseViewHolder;
 import com.kfzs.cfyl.media.R;
 import com.kfzs.cfyl.media.bean.VideoFrame;
 import com.kfzs.cfyl.media.glide.VideoFrameTransform;
+import com.kfzs.cfyl.media.util.ViewUtil;
 import com.kfzs.cfyl.share_library.util.LogUtil;
 import com.sheep.gamegroup.model.entity.Video;
 
@@ -366,6 +367,7 @@ public class VideoFramesView extends RelativeLayout {
 //            LogUtil.println(VideoFramesView.class.getSimpleName(), "showVideoList2", duration, i, per, atTime);
             videoFrameList.add(new VideoFrame().setVideoPath(path).setAtTime(atTime)
                     .setWidth(video.getWidth()).setHeight(video.getHeight())
+                    .setOrientation(video.getOrientation())
             );
         }
         recyclerView.setLayoutManager(new GridLayoutManager(activity.getApplicationContext(), size));
@@ -373,7 +375,7 @@ public class VideoFramesView extends RelativeLayout {
             @Override
             protected void convert(BaseViewHolder helper, VideoFrame item) {
                 ImageView imageView = helper.getView(R.id.media_item_iv);
-                Glide.with(activity.getApplicationContext()).load(R.drawable.media_qiandao)
+                Glide.with(activity.getApplicationContext()).load(ViewUtil.getNetImgByName("alter_original"))
                         .apply(new RequestOptions().transform(new VideoFrameTransform(item)))
                         .into(imageView);
             }

+ 14 - 1
media/app/src/main/java/com/kfzs/cfyl/media/util/VideoUtil.java

@@ -15,6 +15,7 @@ import com.sheep.gamegroup.model.entity.Video;
 import java.nio.ByteBuffer;
 import java.util.Locale;
 
+import cn.finalteam.rxgalleryfinal.utils.MediaUtils;
 import rx.functions.Action1;
 import wseemann.media.FFmpegMediaMetadataRetriever;
 
@@ -32,7 +33,19 @@ public class VideoUtil {
             mmr.setDataSource(videoFrame.getVideoPath());
             durationTime = System.currentTimeMillis();
 //            LogUtil.println(VideoFramesView.class.getSimpleName(), "getScaledFrameAtTime", videoFrame.getWidth(), videoFrame.getHeight(), videoFrame.getAtTime());
-            return mmr.getScaledFrameAtTime(videoFrame.getAtTime(), FFmpegMediaMetadataRetriever.OPTION_CLOSEST, videoFrame.getWidth(), videoFrame.getHeight());
+            Bitmap bitmap = mmr.getScaledFrameAtTime(videoFrame.getAtTime(), FFmpegMediaMetadataRetriever.OPTION_CLOSEST, videoFrame.getWidth(), videoFrame.getHeight());
+            switch (videoFrame.getOrientation()) {
+                case 0:
+                    return bitmap;
+                default:
+                    Bitmap newBitmap = MediaUtils.rotateBimap(videoFrame.getOrientation(), bitmap);
+                    try {
+                        bitmap.recycle();
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    return newBitmap;
+            }
         } catch (Exception e) {
             e.printStackTrace();
             Log.i("videoUtil", (System.currentTimeMillis() - time) + "\t"+ (durationTime - time) + "\t" + e.getMessage());

+ 15 - 1
media/share_library/src/main/java/cn/finalteam/rxgalleryfinal/bean/MediaBean.java

@@ -3,6 +3,8 @@ package cn.finalteam.rxgalleryfinal.bean;
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import com.sheep.gamegroup.model.entity.Video;
+
 import java.io.File;
 
 /**
@@ -43,7 +45,7 @@ public class MediaBean implements Parcelable {
     //经度
     private double longitude;
     //图片方向
-    private int orientation;
+    private int orientation = -1;
     //文件大小
     private long length;
     //时长
@@ -280,4 +282,16 @@ public class MediaBean implements Parcelable {
                 ", thumbnailSmallPath='" + thumbnailSmallPath + '\'' +
                 '}';
     }
+
+    public float getRadio() {
+        if(orientation < 0 || width < 1 || height < 1){
+            return 1;
+        }
+        switch (orientation / 90 % 2) {
+            case 0:
+                return height * 1.0f / width;
+            default:
+                return width * 1.0f / height;
+        }
+    }
 }

+ 21 - 10
media/share_library/src/main/java/cn/finalteam/rxgalleryfinal/utils/MediaUtils.java

@@ -2,8 +2,11 @@ package cn.finalteam.rxgalleryfinal.utils;
 
 import android.content.ContentResolver;
 import android.content.Context;
+import android.content.Intent;
 import android.database.Cursor;
+import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
 import android.media.ExifInterface;
 import android.media.MediaMetadataRetriever;
 import android.net.Uri;
@@ -137,17 +140,18 @@ public class MediaUtils {
                     mediaBeanList.add(item);
                     //检查并重新设置宽高
                     if (item != null && item.getOriginalPath() != null) {
-                        if (item.getHeight() <= 0 || item.getWidth() <= 0) {
+                        if (item.getHeight() <= 0 || item.getWidth() <= 0 || item.getOrientation() == -1) {
                             try {
-
-                            MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever();
-                            metadataRetriever.setDataSource(context, Uri.parse(item.getOriginalPath()));
-                            String width = metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); // 视频宽度
-                            String height = metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); // 视频高度
-//                            String rotation = metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); // 视频旋转方向
-
-                            item.setWidth(Float.valueOf(width).intValue());
-                            item.setHeight(Float.valueOf(height).intValue());
+                                MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever();
+                                metadataRetriever.setDataSource(context, Uri.parse(item.getOriginalPath()));
+                                String width = metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); // 视频宽度
+                                String height = metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); // 视频高度
+                                String rotation = metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); // 视频旋转方向
+
+                                item.setWidth(Float.valueOf(width).intValue());
+                                item.setHeight(Float.valueOf(height).intValue());
+                                item.setOrientation(Float.valueOf(rotation).intValue());
+                                LogUtil.println("getMediaWithVideoList", width, height, rotation);
                             } catch (Exception e){
                                 LogUtil.println("getMediaWithVideoList", e.getMessage());
                             }
@@ -478,4 +482,11 @@ public class MediaUtils {
         BitmapFactory.decodeFile(filePath, options); // 此时返回的bitmap为null
         return options;
     }
+    //旋转bitmap
+    public static Bitmap rotateBimap(float degree, Bitmap srcBitmap) {
+        Matrix matrix = new Matrix();
+        matrix.reset();
+        matrix.setRotate(degree);
+        return Bitmap.createBitmap(srcBitmap,0,0,srcBitmap.getWidth(),srcBitmap.getHeight(),matrix,true);
+    }
 }

+ 22 - 0
media/share_library/src/main/java/com/sheep/gamegroup/model/entity/Video.java

@@ -17,6 +17,8 @@ public class Video implements Serializable {
     private String filePath;//文件对应地址
     private int topicId;//选择的话题的id
     private int topicIndex = -1;//选择的话题的id
+    //图片方向
+    private int orientation;
 
     public String getFilePath() {
         return filePath;
@@ -66,6 +68,14 @@ public class Video implements Serializable {
         this.topicIndex = topicIndex;
     }
 
+    public int getOrientation() {
+        return orientation;
+    }
+
+    public void setOrientation(int orientation) {
+        this.orientation = orientation;
+    }
+
     //通过MediaBean获取Video
     public static Video from(MediaBean item) {
         Video video = new Video();
@@ -73,6 +83,18 @@ public class Video implements Serializable {
         video.setHeight(item.getHeight());
         video.setDuration(item.getDuration());
         video.setFilePath(item.getOriginalPath());
+        video.setOrientation(item.getOrientation());
         return video;
     }
+    public float getRadio() {
+        if(orientation < 0 || width < 1 || height < 1){
+            return 1;
+        }
+        switch (orientation / 90 % 2) {
+            case 0:
+                return height * 1.0f / width;
+            default:
+                return width * 1.0f / height;
+        }
+    }
 }