Microsoft allocates each Office 365 tenant a base 500 GB of Stream storage plus 0.5 GB for every licensed account (excluding users with frontline licenses, like F1). The storage is consumed by videos uploaded to Stream. Teams usage due has recently experienced a massive upswing due to more people working from home. Many in-person meetings have been replaced by Teams meetings. Being able to record Teams meetings is a popular feature because it allows people who can’t attend the meeting to catch up afterwards. To generate a Teams meeting recording, a bot attends the meeting and automatically uploads the recording to Stream for processing once the meeting is over.
Given the way Teams uses Stream to store recordings, it’s
reasonable to ask how much storage is consumed by these files. In the past,
I’ve seen guidance of 2 MB/minute for medium-definition videos uploaded to
Stream, but nothing about Teams recordings.
Stream Video Definitions
When it processes an uploaded video, Teams creates several versions of the video with different renditions or bitrates. When Stream plays a video back, it chooses the best possible definition. You can see the available definitions for a video using the settings (cogwheel) menu during playback (Figure 1).
Figure 1: Different definitions available for a Stream video
Storage for Teams Meetings
To understand the storage used for Teams meeting recordings,
I took nine recordings from the recent MVP Summit, which was originally
intended to be an in-person event. Due to the Covid-19 situation, Microsoft
decided to run the summit as an online event and use a mixture of Teams meetings
and Live Events for the sessions. Although I missed the opportunity for offline
chats with Microsoft engineers, Teams worked well as the foundation for an
online conference.
Each recording was for a scheduled 50-minute meeting and
featured a mixture of presentations, demos, and discussions involving up to 250
people (the current maximum for a Teams meeting). The meetings were recorded at
1080p (see note below). I consider these recordings to be representative sample
of what an enterprise tenant might generate for their meetings. Table 1 lists
the length of each meeting in minutes (decimal notation) and the size of the
recording.
1080p
Mins
Size (MB)
MB p/min
Video 1
47.66
361.55
7.586042
Video 2
39.2
303.96
7.754081
Video 3
55
417.78
7.596005
Video 4
50.5
393.03
7.782816
Video 5
51.75
403.10
7.789308
Video 6
56
435.33
7.773664
Video 7
51.4
386.63
7.522058
Video 7
61
466.12
7.641329
Video 8
48.5
385.88
7.956246
Video 9
51.5
368.29
7.151187
Average
7.655274
Table 1:
Stream recording file sizes
Overall, the average is about 7.65 MB storage consumed per minute of a Teams meeting. Your mileage might vary, but this is probably a good figure for planning purposes. A 1,000-user tenant has a 1,000 GB storage quota for Stream. A quick calculation equates to about 2,230 hours of Teams meeting recordings. Given the number of corporate meetings that take place, this isn’t many hours…
Impact of Teams Recordings on Office 365
According to Microsoft, Teams users have recently generated 900 million meeting and calling minutes daily. If these minutes were all meetings and all recorded, they would consume 6,570.57 TB of Stream (Azure) storage at 1080p. Of course, many of these minutes are 1×1 or group calls and not all meetings are recorded, but consuming storage at even 2,000 TB/day is quite a rate.
Reducing the definition eases the processing load and reduces the storage needed, so it’s easy to see why Microsoft reduced the definition for Teams meeting recordings to 720p among other steps to reduce the load on the Office 365 infrastructure. It’s likely that Microsoft will increase the definition of Teams meeting recordings back to 1080p once the current strain on the Office 365 infrastructure eases.
How Much Storage is My Tenant Using?
Given that Teams meeting recordings can consume a large proportion of the assigned Stream storage quota, it seems important to understand what storage is being used and what’s consuming the storage. After all, you don’t want to be forced to buy added storage for Stream at $100/month per 500 GB unless absolutely necessary.
The problem is that Stream isn’t very good in terms of analytics. Stream administrators can view the current consumption (Figure 2), but there’s no easy way of finding out the size of each video. Stream doesn’t support the Graph reporting API like other Office 365 workloads like Exchange, SharePoint, and OneDrive for Business do.
Figure 2: Viewing the Stream storage used in an Office 365 tenant
Stream and the Office 365 Audit Log
Maybe the Office 365 audit log can help? Well, you can certainly find events for when Stream uploads and processes videos, but the events logged don’t tell you anything about the file sizes. For instance, if we run some code to find and analyze upload events in the audit log, we can find who uploaded videos, but not much else (Figure 3).
$StartDate = (Get-Date).AddDays(-90); $EndDate = (Get-Date)
$Records = (Search-UnifiedAuditLog -Operations StreamInvokeVideoUpload -StartDate $StartDate -EndDate $EndDate -ResultSize 2000)
If ($Records.Count -eq 0) {
Write-Host "No audit records for Stream video uploads found." }
Else {
Write-Host "Processing" $Records.Count "audit records..."
$Report = [System.Collections.Generic.List[Object]]::new() # Create output file for report
# Scan each audit record to extract information
ForEach ($Rec in $Records) {
$AuditData = ConvertFrom-Json $Rec.Auditdata
$ReportLine = [PSCustomObject] @{
TimeStamp = Get-Date($AuditData.CreationTime) -format g
User = $AuditData.UserId
Action = $AuditData.Operation
VideoURL = $AuditData.ResourceURL
VideoName = $AuditData.ResourceTitle }
$Report.Add($ReportLine) } }
$Report | Sort {$_.TimeStamp -as [DateTime]} -Unique -Descending | Out-GridView
Figure 3: Office 365 audit log records for Stream uploads
One interesting thing seen in the audit records is that videos uploaded from mobile devices don’t insert the video name in the audit record. That’s not a good thing.
Microsoft Needs to Deliver Stream Analytics
The current state of Stream analytics within Office 365 might have been satisfactory before the explosion of Teams meeting recordings. It isn’t now. Microsoft needs to make it possible for tenant administrators to find out how Stream storage is consumed or provide increased base storage. After all, they want all your data to be in the cloud, don’t they?
This topic is the kind of thing the Office 365 for IT Pros writing team thinks about all the time. The outcome mightn’t end up as more than a sentence or two in the book, but it’s nice to do the research to back up what we say.
{"id":null,"mode":"button","open_style":"in_modal","currency_code":"EUR","currency_symbol":"\u20ac","currency_type":"decimal","blank_flag_url":"https:\/\/office365itpros.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/blank.gif","flag_sprite_url":"https:\/\/office365itpros.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/flags.png","default_amount":100,"top_media_type":"featured_image","featured_image_url":"https:\/\/office365itpros.com\/wp-content\/uploads\/2022\/11\/cover-141x200.jpg","featured_embed":"","header_media":null,"file_download_attachment_data":null,"recurring_options_enabled":true,"recurring_options":{"never":{"selected":true,"after_output":"One time only"},"weekly":{"selected":false,"after_output":"Every week"},"monthly":{"selected":false,"after_output":"Every month"},"yearly":{"selected":false,"after_output":"Every year"}},"strings":{"current_user_email":"","current_user_name":"","link_text":"Virtual Tip Jar","complete_payment_button_error_text":"Check info and try again","payment_verb":"Pay","payment_request_label":"Office 365 for IT Pros","form_has_an_error":"Please check and fix the errors above","general_server_error":"Something isn't working right at the moment. Please try again.","form_title":"Office 365 for IT Pros","form_subtitle":null,"currency_search_text":"Country or Currency here","other_payment_option":"Other payment option","manage_payments_button_text":"Manage your payments","thank_you_message":"Thank you for supporting the work of Office 365 for IT Pros!","payment_confirmation_title":"Office 365 for IT Pros","receipt_title":"Your Receipt","print_receipt":"Print Receipt","email_receipt":"Email Receipt","email_receipt_sending":"Sending receipt...","email_receipt_success":"Email receipt successfully sent","email_receipt_failed":"Email receipt failed to send. Please try again.","receipt_payee":"Paid to","receipt_statement_descriptor":"This will show up on your statement as","receipt_date":"Date","receipt_transaction_id":"Transaction ID","receipt_transaction_amount":"Amount","refund_payer":"Refund from","login":"Log in to manage your payments","manage_payments":"Manage Payments","transactions_title":"Your Transactions","transaction_title":"Transaction Receipt","transaction_period":"Plan Period","arrangements_title":"Your Plans","arrangement_title":"Manage Plan","arrangement_details":"Plan Details","arrangement_id_title":"Plan ID","arrangement_payment_method_title":"Payment Method","arrangement_amount_title":"Plan Amount","arrangement_renewal_title":"Next renewal date","arrangement_action_cancel":"Cancel Plan","arrangement_action_cant_cancel":"Cancelling is currently not available.","arrangement_action_cancel_double":"Are you sure you'd like to cancel?","arrangement_cancelling":"Cancelling Plan...","arrangement_cancelled":"Plan Cancelled","arrangement_failed_to_cancel":"Failed to cancel plan","back_to_plans":"\u2190 Back to Plans","update_payment_method_verb":"Update","sca_auth_description":"Your have a pending renewal payment which requires authorization.","sca_auth_verb":"Authorize renewal payment","sca_authing_verb":"Authorizing payment","sca_authed_verb":"Payment successfully authorized!","sca_auth_failed":"Unable to authorize! Please try again.","login_button_text":"Log in","login_form_has_an_error":"Please check and fix the errors above","uppercase_search":"Search","lowercase_search":"search","uppercase_page":"Page","lowercase_page":"page","uppercase_items":"Items","lowercase_items":"items","uppercase_per":"Per","lowercase_per":"per","uppercase_of":"Of","lowercase_of":"of","back":"Back to plans","zip_code_placeholder":"Zip\/Postal Code","download_file_button_text":"Download File","input_field_instructions":{"tip_amount":{"placeholder_text":"How much would you like to tip?","initial":{"instruction_type":"normal","instruction_message":"How much would you like to tip? Choose any currency."},"empty":{"instruction_type":"error","instruction_message":"How much would you like to tip? Choose any currency."},"invalid_curency":{"instruction_type":"error","instruction_message":"Please choose a valid currency."}},"recurring":{"placeholder_text":"Recurring","initial":{"instruction_type":"normal","instruction_message":"How often would you like to give this?"},"success":{"instruction_type":"success","instruction_message":"How often would you like to give this?"},"empty":{"instruction_type":"error","instruction_message":"How often would you like to give this?"}},"name":{"placeholder_text":"Name on Credit Card","initial":{"instruction_type":"normal","instruction_message":"Enter the name on your card."},"success":{"instruction_type":"success","instruction_message":"Enter the name on your card."},"empty":{"instruction_type":"error","instruction_message":"Please enter the name on your card."}},"privacy_policy":{"terms_title":"Terms and conditions","terms_body":null,"terms_show_text":"View Terms","terms_hide_text":"Hide Terms","initial":{"instruction_type":"normal","instruction_message":"I agree to the terms."},"unchecked":{"instruction_type":"error","instruction_message":"Please agree to the terms."},"checked":{"instruction_type":"success","instruction_message":"I agree to the terms."}},"email":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email address"},"success":{"instruction_type":"success","instruction_message":"Enter your email address"},"blank":{"instruction_type":"error","instruction_message":"Enter your email address"},"not_an_email_address":{"instruction_type":"error","instruction_message":"Make sure you have entered a valid email address"}},"note_with_tip":{"placeholder_text":"Your note here...","initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"empty":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"not_empty_initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"saving":{"instruction_type":"normal","instruction_message":"Saving note..."},"success":{"instruction_type":"success","instruction_message":"Note successfully saved!"},"error":{"instruction_type":"error","instruction_message":"Unable to save note note at this time. Please try again."}},"email_for_login_code":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email to log in."},"success":{"instruction_type":"success","instruction_message":"Enter your email to log in."},"blank":{"instruction_type":"error","instruction_message":"Enter your email to log in."},"empty":{"instruction_type":"error","instruction_message":"Enter your email to log in."}},"login_code":{"initial":{"instruction_type":"normal","instruction_message":"Check your email and enter the login code."},"success":{"instruction_type":"success","instruction_message":"Check your email and enter the login code."},"blank":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."},"empty":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."}},"stripe_all_in_one":{"initial":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"empty":{"instruction_type":"error","instruction_message":"Enter your credit card details here."},"success":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"invalid_number":{"instruction_type":"error","instruction_message":"The card number is not a valid credit card number."},"invalid_expiry_month":{"instruction_type":"error","instruction_message":"The card's expiration month is invalid."},"invalid_expiry_year":{"instruction_type":"error","instruction_message":"The card's expiration year is invalid."},"invalid_cvc":{"instruction_type":"error","instruction_message":"The card's security code is invalid."},"incorrect_number":{"instruction_type":"error","instruction_message":"The card number is incorrect."},"incomplete_number":{"instruction_type":"error","instruction_message":"The card number is incomplete."},"incomplete_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incomplete."},"incomplete_expiry":{"instruction_type":"error","instruction_message":"The card's expiration date is incomplete."},"incomplete_zip":{"instruction_type":"error","instruction_message":"The card's zip code is incomplete."},"expired_card":{"instruction_type":"error","instruction_message":"The card has expired."},"incorrect_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incorrect."},"incorrect_zip":{"instruction_type":"error","instruction_message":"The card's zip code failed validation."},"invalid_expiry_year_past":{"instruction_type":"error","instruction_message":"The card's expiration year is in the past"},"card_declined":{"instruction_type":"error","instruction_message":"The card was declined."},"missing":{"instruction_type":"error","instruction_message":"There is no card on a customer that is being charged."},"processing_error":{"instruction_type":"error","instruction_message":"An error occurred while processing the card."},"invalid_request_error":{"instruction_type":"error","instruction_message":"Unable to process this payment, please try again or use alternative method."},"invalid_sofort_country":{"instruction_type":"error","instruction_message":"The billing country is not accepted by SOFORT. Please try another country."}}}},"fetched_oembed_html":false}
9 Replies to “How Much Storage is Consumed by Teams Meeting Recordings?”