private long getVideoBitrateBasedOnFileBitrate() { // file bitrate String fileBitrate = conversionSetting.getFfProbe().getFormat().getBit_rate(); long fbr; if (fileBitrate == null || fileBitrate.trim().length() == 0) { return 0l; } else { try { fbr = Long.parseLong(fileBitrate); } catch (Exception e) { // number format exception return 0l; } } // audio bitrate long abr; Stream audioStream = getStream(CODEC_TYPE_AUDIO); String audioBitrate = audioStream.getBit_rate(); try { abr = Long.parseLong(audioBitrate); } catch (Exception e) { // number format exception abr = Settings.getDefaultPerChannelAudioBitRate() * audioStream.getChannels(); } return fbr - abr; }
private long getVideoBitrateBasedOnVideoStreamBitRate() { Stream videoStream = getStream(CODEC_TYPE_VIDEO); try { return Long.parseLong(videoStream.getBit_rate()); } catch (Exception e) { // number format exception return 0l; } }
private void addAudioConversion(List<String> cmd) { cmd.add("-c:a"); cmd.add("libfdk_aac"); /* High Efficiency profile is giving trouble for some encodings. e.g.: pcm_s16le, 8000 Hz, 1 channels, s16, 128 kb/s (video from a mini camera I have) */ // cmd.add("-profile:a"); // cmd.add("aac_he"); cmd.add("-cutoff"); cmd.add("18000"); boolean bitRateAdded = false; Stream audioStream = getStream(CODEC_TYPE_AUDIO); String audioBitRate = audioStream.getBit_rate(); if (audioBitRate == null || audioBitRate.trim().length() == 0) { // if it doesn't have, just let FFMPEG do its default thing bitRateAdded = true; } else { try { long abr = Long.parseLong(audioBitRate); if (abr > Settings.getMaxPerChannelAudioBitRate(conversionSetting) * audioStream.getChannels()) { bitRateAdded = true; cmd.add("-b:a"); cmd.add( Long.toString( Settings.getMaxPerChannelAudioBitRate(conversionSetting) * audioStream.getChannels())); } } catch (Exception e) { /* number format */ } } if (!bitRateAdded) { cmd.add("-b:a"); cmd.add(audioBitRate); } }
private String getVideoBitrate() { /* I found cases where mpeg1 streams return the uncompressed bitrate, rendering absurdly high bit rates. So we're getting the smaller from the two */ long br_stream = getVideoBitrateBasedOnVideoStreamBitRate(); long br_file = getVideoBitrateBasedOnFileBitrate(); long br = br_file > br_stream ? br_stream : br_file; if (br <= 0) return null; else return Long.toString(br); }