关于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);
    }




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