mirror of
https://github.com/MillironX/vimeo-bitrate-chooser.git
synced 2024-12-28 02:11:42 -05:00
111 lines
No EOL
4.6 KiB
Matlab
111 lines
No EOL
4.6 KiB
Matlab
% BitrateChooser v. 0.0.0.1
|
|
% Copyright (c) 2016, Thomas A. Christensen II
|
|
% All rights reserved.
|
|
%
|
|
% Redistribution and use in source and binary forms, with or without
|
|
% modification, are permitted provided that the following conditions are
|
|
% met:
|
|
%
|
|
% 1. Redistributions of source code must retain the above copyright notice,
|
|
% this list of conditions and the following disclaimer.
|
|
%
|
|
% 2. Redistributions in binary form must reproduce the above copyright
|
|
% notice, this list of conditions and the following disclaimer in the
|
|
% documentation and/or other materials provided with the distribution.
|
|
%
|
|
% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
|
% IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
% THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
% PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
% CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
% EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
% PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
% PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
% LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
% NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
% SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
%
|
|
% This script accepts inputs and chooses the appropriate bitrate and codec
|
|
% for a video matching those specifications to be uploaded to Vimeo
|
|
|
|
% Prepare the workspace for computation
|
|
clear
|
|
clc
|
|
close all
|
|
|
|
% Ask the user for input
|
|
userFrameHeight = input('Please input frame height (px): ');
|
|
userFrameWidth = input('Please input frame width (px): ');
|
|
userFrameRate = input('Please input the framerate (fps): ');
|
|
userMotionRank = input('Please input the Kush motion rank (1, 2, or 4): ');
|
|
userVideoLength = input('Please input video length (s): ');
|
|
|
|
% Determine if ProRes is an available option for the user
|
|
userMac = input('Do you own an Apple Macintosh computer? (0/1) ');
|
|
if userMac == 1
|
|
% The documented bitrate of ProRes Proxy is 45 Mbps for a
|
|
% 1920x1080p29.87 video.
|
|
% Set the DI codec rate to this number coverted to bits/pixel
|
|
diDataRate = 45*1000000/(1920*1080*29.97);
|
|
else
|
|
% The documented bitrate of Cineform Low-Quality is 10 MBps for a
|
|
% 1920x1080p23.976 video.
|
|
% Set the DI codec rate to this number converted to bits/pixel
|
|
diDataRate = 10*8*1000000/(1920*1080*24.976);
|
|
end
|
|
|
|
% Define common frame heights of videos to use
|
|
% (Frame heights taken from: https://en.wikipedia.org/wiki/2K_resolution#/
|
|
% media/File:Vector_Video_Standards8.svg)
|
|
frameHeights = [4096 3840 3440 2560 2048 1920 1680 1440 1366 1280 1152 1080 ...
|
|
1024 960 854 800 768 720 640 540 480 384 352 320];
|
|
|
|
% Determine where the video fits within these preset frame heights and
|
|
% delete any sizes larger that that
|
|
smallFrameHeightI = find(frameHeights<=userFrameHeight);
|
|
frameHeights = frameHeights(smallFrameHeightI); %#ok<FNDSB>
|
|
clear smallFrameHeightI
|
|
|
|
% Calculate the aspect ratio (width/height)
|
|
aspectRatio = userFrameWidth / userFrameHeight;
|
|
|
|
% Calculate the correct framerate
|
|
reFrameRate = userFrameRate;
|
|
while reFrameRate > 30
|
|
reFrameRate = reFrameRate / 2;
|
|
end
|
|
|
|
% Calculate the size of a Vimeo Basic weekly quota in bits
|
|
vimeoBasicQuota = 500*1000000*8;
|
|
|
|
% Determine the settings for each codec and frame size
|
|
for n = 1:length(frameHeights)
|
|
% Calculate the new frame information for this size
|
|
reFrameHeight = frameHeights(n);
|
|
reFrameWidth = frameHeights(n)*aspectRatio;
|
|
|
|
% Calculate the amount of data used by this video in DI codec
|
|
diVideoLength = diDataRate*reFrameHeight*reFrameWidth*reFrameRate*...
|
|
userVideoLength;
|
|
|
|
% Determine if this amount of data is allowed in the Vimeo quota
|
|
if diVideoLength <= vimeoBasicQuota
|
|
DiCodecDisplay(reFrameHeight, reFrameWidth, reFrameRate, userMac);
|
|
return
|
|
end
|
|
|
|
% Calculate the amount of data this video will require according to the
|
|
% Kush guage
|
|
kushVideoLength = 0.07*reFrameHeight*reFrameWidth*reFrameRate*...
|
|
userVideoLength*userMotionRank;
|
|
|
|
% Determine if this amount of data is allowed in the Vimeo quota
|
|
if kushVideoLength <= vimeoBasicQuota
|
|
% Calculate the bitrate that maximizes the Vimeo quota
|
|
maxBitrate = vimeoBasicQuota / userVideoLength;
|
|
|
|
% Display results to the user
|
|
H264CodecDisplay(reFrameHeight, reFrameWidth, reFrameRate, maxBitrate);
|
|
return
|
|
end
|
|
end |