diff --git src/wp-includes/media.php src/wp-includes/media.php
index 8965da9..1812672 100644
--- src/wp-includes/media.php
+++ src/wp-includes/media.php
@@ -2495,6 +2495,7 @@ function wp_get_video_extensions() {
  * WordPress mp4s in a post.
  *
  * @since 3.6.0
+ * @since ?.?.? The `controls` attribute was added.
  *
  * @global int $content_width
  * @staticvar int $instance
@@ -2512,6 +2513,7 @@ function wp_get_video_extensions() {
  *                            Default 'metadata'.
  *     @type string $class    The 'class' attribute for the `<video>` element.
  *                            Default 'wp-video-shortcode'.
+ *     @type string $controls The 'controls' attribute for the `<video>` element. Default true.
  * }
  * @param string $content Shortcode content.
  * @return string|void HTML content to display video.
@@ -2555,6 +2557,7 @@ function wp_video_shortcode( $attr, $content = '' ) {
 		'width'    => 640,
 		'height'   => 360,
 		'class'    => 'wp-video-shortcode',
+		'controls' => true,
 	);
 
 	foreach ( $default_types as $type ) {
@@ -2676,10 +2679,11 @@ function wp_video_shortcode( $attr, $content = '' ) {
 		'loop'     => wp_validate_boolean( $atts['loop'] ),
 		'autoplay' => wp_validate_boolean( $atts['autoplay'] ),
 		'preload'  => $atts['preload'],
+		'controls' => wp_validate_boolean( $atts['controls'] ) ? 'controls' : '',
 	);
 
 	// These ones should just be omitted altogether if they are blank
-	foreach ( array( 'poster', 'loop', 'autoplay', 'preload' ) as $a ) {
+	foreach ( array( 'poster', 'loop', 'autoplay', 'preload', 'controls' ) as $a ) {
 		if ( empty( $html_atts[ $a ] ) ) {
 			unset( $html_atts[ $a ] );
 		}
@@ -2694,7 +2698,7 @@ function wp_video_shortcode( $attr, $content = '' ) {
 	if ( 'mediaelement' === $library && 1 === $instance ) {
 		$html .= "<!--[if lt IE 9]><script>document.createElement('video');</script><![endif]-->\n";
 	}
-	$html .= sprintf( '<video %s controls="controls">', join( ' ', $attr_strings ) );
+	$html .= sprintf( '<video %s>', join( ' ', $attr_strings ) );
 
 	$fileurl = '';
 	$source  = '<source type="%s" src="%s" />';
diff --git tests/phpunit/tests/media.php tests/phpunit/tests/media.php
index 1fe2228..bfe427f 100644
--- tests/phpunit/tests/media.php
+++ tests/phpunit/tests/media.php
@@ -874,7 +874,8 @@ VIDEO;
 	}
 
 	/**
-	 * @ticket  35367
+	 * @ticket 35367
+	 * @ticket 40590
 	 * @depends test_video_shortcode_body
 	 */
 	function test_wp_video_shortcode_attributes() {
@@ -891,6 +892,7 @@ VIDEO;
 		$this->assertContains( 'width="640"', $actual );
 		$this->assertContains( 'height="360"', $actual );
 		$this->assertContains( 'class="wp-video-shortcode"', $actual );
+		$this->assertContains( 'controls="controls"', $actual );
 
 		$actual = wp_video_shortcode(
 			array(
@@ -902,6 +904,7 @@ VIDEO;
 				'width'    => 123,
 				'height'   => 456,
 				'class'    => 'foobar',
+				'controls' => false,
 			)
 		);
 
@@ -913,6 +916,7 @@ VIDEO;
 		$this->assertContains( 'width="123"', $actual );
 		$this->assertContains( 'height="456"', $actual );
 		$this->assertContains( 'class="foobar"', $actual );
+		$this->assertNotContains( 'controls="controls"', $actual );
 	}
 
 	/**
