關於android視頻播放顯示區域不正常的問題,一些處理方法

<span style="font-size:18px;">一直以來視頻顯示不正常的問題都困擾了好久,特別是不是用標準的Mediaplayer來播放的時候,今天就來總結一下</span>
</pre><pre name="code" class="java">public static final String VIDEO_AXITS_PATH = "/sys/class/video/axis";    // 視頻顯示區域
public static final String DISPLAY_AXIS_PATH = "/sys/class/display/axis"; //ui顯示區域
public static final String OSD0_SCALE_AXIS_PATH = "/sys/class/graphics/fb0/scale_axis";
public static final String OSD1_SCALE_AXIS_PATH = "/sys/class/graphics/fb1/scale_axis";
public static final String REQUEST_2X_SCALE_PATH = "/sys/class/graphics/fb0/request2XScale"; //ui顯示區域
public static final String OSD1_SCALE_PATH = "/sys/class/graphics/fb1/scale";
public static final String OSD_PATH = "/sys/class/graphics/fb0/blank";
public static final String[] MODES = {"1080i", "1080p", "720p", "480i", "480p", "480cvbs", "576i", "576p", "576cvbs"};
public static final int[] WIDTH_DEFAULT = {1920, 1920, 1280, 720, 720, 720, 720, 720, 720};
public static final int[] HEIGHT_DEFAULT = {1080, 1080, 720, 480, 480, 480, 576, 576, 576};
writeSysFile("/sys/class/graphics/fb0/blank","2");  //這個是開啓關閉osd 2是開啓 1是關閉
writeSysFile("/sys/class/video/disable_video","0"); //視頻顯示開啓還是關閉,0是開啓,1是關閉
</pre><pre name="code" class="java">//這個完全可以替代 echo val > path 
<pre name="code" class="java">public static int writeFile(String path, String val) {
		try {
			BufferedWriter writer = new BufferedWriter(new FileWriter(path), 64);
			try {
				writer.write(val);
			} finally {
				writer.close();
			}
			return 0;

		} catch (IOException e) {
			Log.e(TAG, "IO Exception when write: " + path, e);
			return 1;
		}
	}

//這個方法完全可以替代 cat filepath
public static String readFile(String fileName) {
		String res = "";
		try {
			FileInputStream fin = new FileInputStream(fileName); // int length =
																	// fin.available();
			int length = 32;
			byte[] buffer = new byte[length];
			fin.read(buffer);
			res = EncodingUtils.getString(buffer, "UTF-8");
			res.trim();
			fin.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return res;
	}



//這個是我做cvbs的時候顯示不正常的問題,通過這樣可以正常顯示
<pre name="code" class="java">String outputmode = VideoUtil.readFile("/sys/class/display/mode");
    private void setCvbsRect(){
    	outputmode = VideoUtil.readFile("/sys/class/display/mode");
  		
  		
  		int axis[] = new int[4];

         // writeFile(VideoUtil.OSD_PATH, "1");
          
    	 getUbootAxis(axis);
         
         System.out.println("=======resume==outputmode===>>>>"+outputmode);
         
         if(outputmode.contains("1080")) {
        	 VideoUtil.writeFile(VideoUtil.DISPLAY_AXIS_PATH, (axis[0] / 2) * 2 + " " + (axis[1] / 2) * 2 + " 1920 1080 " + (axis[0] / 2) * 2 + " " + (axis[1] / 2) * 2 + " 18 18");

        	 VideoUtil.writeFile(VideoUtil.OSD0_SCALE_AXIS_PATH, "0 0 " + (960 - (axis[0] / 2) - 1) + " " + (1080 - (axis[1] / 2) - 1));

        	 VideoUtil.writeFile(VideoUtil.REQUEST_2X_SCALE_PATH, "7 " + (axis[2] / 2) + " " + axis[3]);

        	 VideoUtil.writeFile(VideoUtil.OSD1_SCALE_AXIS_PATH, "1920 1080 " + axis[2] + " " + axis[3]);

        	 VideoUtil.writeFile(VideoUtil.OSD1_SCALE_PATH, "0x10001");
        	 VideoUtil.writeFile(VideoUtil.VIDEO_AXITS_PATH, "0 -10 1918 1078");
         } else {
        	 VideoUtil.writeFile(VideoUtil.DISPLAY_AXIS_PATH, axis[0] + " " + axis[1] + " 1280 720 " + axis[0] + " " + axis[1] + " 18 18");

        	 VideoUtil.writeFile(VideoUtil.REQUEST_2X_SCALE_PATH, "16 " + axis[2] + " " + axis[3]);

        	 VideoUtil.writeFile(VideoUtil.OSD1_SCALE_AXIS_PATH, "1280 720 " + axis[2] + " " + axis[3]);

        	 VideoUtil.writeFile(VideoUtil.OSD1_SCALE_PATH, "0x10001");
        	 VideoUtil.writeFile(VideoUtil.VIDEO_AXITS_PATH, "0 -10 1278 718");
         }
    }
    
	private void getUbootAxis(int[] axis, int[] defaultWH) {
        String xEnv = "";
        String yEnv = "";
        String wEnv = "";
        String hEnv = "";
        int widthDefault = 0, heightDefault = 0;

        for (int i = 0; i < VideoUtil.MODES.length; i++) {
            String mode = VideoUtil.MODES[i];
            if (outputmode.contains(mode)) {
                xEnv = "ubootenv.var." + mode + "outputx";
                yEnv = "ubootenv.var." + mode + "outputy";
                wEnv = "ubootenv.var." + mode + "outputwidth";
                hEnv = "ubootenv.var." + mode + "outputheight";
                widthDefault = VideoUtil.WIDTH_DEFAULT[i];
                heightDefault = VideoUtil.HEIGHT_DEFAULT[i];
                break;
            }
        }

        axis[0] = SystemProperties.getInt(xEnv, 0);
        axis[1] = SystemProperties.getInt(yEnv, 0);
        axis[2] = SystemProperties.getInt(wEnv, widthDefault);
        axis[3] = SystemProperties.getInt(hEnv, heightDefault);
        defaultWH[0] = widthDefault;
        defaultWH[1] = heightDefault;
    }
	
	private void getUbootAxis(int[] axis) {
        int defaultWH[] = new int[2];
        getUbootAxis(axis, defaultWH);
    }




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章