Index: src/wp-includes/default-filters.php
===================================================================
--- src/wp-includes/default-filters.php	(revision 44934)
+++ src/wp-includes/default-filters.php	(working copy)
@@ -573,6 +573,7 @@
 add_filter( 'the_excerpt_embed', 'wp_embed_excerpt_attachment' );
 
 add_filter( 'oembed_dataparse', 'wp_filter_oembed_result', 10, 3 );
+add_filter( 'oembed_dataparse', 'wp_filter_oembed_iframe_title_attribute', 20, 3 );
 add_filter( 'oembed_response_data', 'get_oembed_response_data_rich', 10, 4 );
 add_filter( 'pre_oembed_result', 'wp_filter_pre_oembed_result', 10, 3 );
 
Index: src/wp-includes/embed.php
===================================================================
--- src/wp-includes/embed.php	(revision 44934)
+++ src/wp-includes/embed.php	(working copy)
@@ -781,6 +781,55 @@
 }
 
 /**
+ * Filters the given oEmbed HTML to make sure iframes have a title attribute.
+ *
+ * @since 5.2.0
+ *
+ * @param string $result The oEmbed HTML result.
+ * @param object $data   A data object result from an oEmbed provider.
+ * @param string $url    The URL of the content to be embedded.
+ * @return string The filtered oEmbed result.
+ */
+function wp_filter_oembed_iframe_title_attribute( $result, $data, $url ) {
+	if ( false === $result || ! in_array( $data->type, array( 'rich', 'video' ) ) ) {
+		return $result;
+	}
+
+	$title = ! empty( $data->title ) ? $data->title : '';
+
+	$pattern        = '`<iframe[^>]*?title=(\\\\\'|\\\\"|[\'"])([^>]*?)\1`i';
+	$has_title_attr = preg_match( $pattern, $result, $matches );
+
+	if ( $has_title_attr && ! empty( $matches[2] ) ) {
+		$title = $matches[2];
+	}
+
+	/**
+	 * Filters the title attribute of the given oEmbed HTML iframe.
+	 *
+	 * @since 5.2.0
+	 *
+	 * @param string $title  The title attribute.
+	 * @param string $result The oEmbed HTML result.
+	 * @param object $data   A data object result from an oEmbed provider.
+	 * @param string $url    The URL of the content to be embedded.
+	 */
+	$title = apply_filters( 'oembed_iframe_title_attribute', $title, $result, $data, $url );
+
+	if ( '' === $title ) {
+		return $result;
+	}
+
+	if ( $has_title_attr ) {
+		// Remove the old title, $matches[1]: quote, $matches[2]: title attribute value.
+		$result = str_replace( ' title=' . $matches[1] . $matches[2] . $matches[1], '', $result );
+	}
+
+	return str_ireplace( '<iframe ', sprintf( '<iframe title="%s" ', esc_attr( $title ) ), $result );
+}
+
+
+/**
  * Filters the given oEmbed HTML.
  *
  * If the `$url` isn't on the trusted providers list,
Index: tests/phpunit/tests/oembed/filterTitleAttributes.php
===================================================================
--- tests/phpunit/tests/oembed/filterTitleAttributes.php	(nonexistent)
+++ tests/phpunit/tests/oembed/filterTitleAttributes.php	(working copy)
@@ -0,0 +1,93 @@
+<?php
+
+/**
+ * @group oembed
+ */
+class Tests_Filter_oEmbed_Iframe_Title_Attribute extends WP_UnitTestCase {
+	function data_filter_oembed_iframe_title_attribute() {
+		return array(
+			array(
+				'<p>Foo</p><iframe src=""></iframe><b>Bar</b>',
+				array(
+					'type' => 'rich',
+				),
+				'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
+				'<p>Foo</p><iframe src=""></iframe><b>Bar</b>',
+			),
+			array(
+				'<p>Foo</p><iframe src="" title="Hello World"></iframe><b>Bar</b>',
+				array(
+					'type' => 'rich',
+				),
+				'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
+				'<p>Foo</p><iframe title="Hello World" src=""></iframe><b>Bar</b>',
+			),
+			array(
+				'<p>Foo</p>',
+				array(
+					'type'  => 'rich',
+					'title' => 'Hello World',
+				),
+				'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
+				'<p>Foo</p>',
+			),
+			array(
+				'<p title="Foo">Bar</p>',
+				array(
+					'type'  => 'rich',
+					'title' => 'Hello World',
+				),
+				'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
+				'<p title="Foo">Bar</p>',
+			),
+			array(
+				'<p>Foo</p><iframe src=""></iframe><b>Bar</b>',
+				array(
+					'type'  => 'rich',
+					'title' => 'Hello World',
+				),
+				'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
+				'<p>Foo</p><iframe title="Hello World" src=""></iframe><b>Bar</b>',
+			),
+			array(
+				'<iframe src="" title="Foo"></iframe>',
+				array(
+					'type'  => 'rich',
+					'title' => 'Bar',
+				),
+				'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
+				'<iframe title="Foo" src=""></iframe>',
+			),
+		);
+	}
+
+	/**
+	 * @dataProvider data_filter_oembed_iframe_title_attribute
+	 */
+	function test_oembed_iframe_title_attribute( $html, $oembed_data, $url, $expected ) {
+		$actual = wp_filter_oembed_iframe_title_attribute( $html, (object) $oembed_data, $url );
+
+		$this->assertSame( $expected, $actual );
+	}
+
+	function test_filter_oembed_iframe_title_attribute() {
+		add_filter( 'oembed_iframe_title_attribute', array( $this, '_filter_oembed_iframe_title_attribute' ) );
+
+		$actual = wp_filter_oembed_iframe_title_attribute(
+			'<iframe title="Foo" src=""></iframe>',
+			(object) array(
+				'type'  => 'rich',
+				'title' => 'Bar',
+			),
+			'https://www.youtube.com/watch?v=dQw4w9WgXcQ'
+		);
+
+		remove_filter( 'oembed_iframe_title_attribute', array( $this, '_filter_oembed_iframe_title_attribute' ) );
+
+		$this->assertSame( '<iframe title="Baz" src=""></iframe>', $actual );
+	}
+
+	function _filter_oembed_iframe_title_attribute() {
+		return 'Baz';
+	}
+}
