Replace ArrayView with std::span in rtc_base/

Search&Replace MakeArrayView and ArrayView with std::span
Search&Replace include "api/array_view.h" with include <span>
Remove build dependencies on array_view target
Rename tests that were named PrefixArrayView
 from "Prefixstd::span" to "PrefixSpan"

Bug: webrtc:439801349
Change-Id: Iad951423733c8676c7356047f115eb3fcf2e885d
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/454241
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#47107}
diff --git a/modules/audio_device/mac/audio_device_mac.cc b/modules/audio_device/mac/audio_device_mac.cc
index 1ff98af..e6e97bf 100644
--- a/modules/audio_device/mac/audio_device_mac.cc
+++ b/modules/audio_device/mac/audio_device_mac.cc
@@ -15,6 +15,7 @@
 #include <sys/sysctl.h>  // sysctlbyname()
 
 #include <memory>
+#include <span>
 #include <vector>
 
 #include "modules/third_party/portaudio/pa_ringbuffer.h"
@@ -834,7 +835,7 @@
   }
 
   return GetDeviceName(kAudioDevicePropertyScopeOutput, index,
-                       ArrayView<char>(name, kAdmMaxDeviceNameSize));
+                       std::span<char>(name, kAdmMaxDeviceNameSize));
 }
 
 int32_t AudioDeviceMac::RecordingDeviceName(uint16_t index,
@@ -853,7 +854,7 @@
   }
 
   return GetDeviceName(kAudioDevicePropertyScopeInput, index,
-                       ArrayView<char>(name, kAdmMaxDeviceNameSize));
+                       std::span<char>(name, kAdmMaxDeviceNameSize));
 }
 
 int16_t AudioDeviceMac::RecordingDevices() {
@@ -1644,7 +1645,7 @@
 
 int32_t AudioDeviceMac::GetDeviceName(const AudioObjectPropertyScope scope,
                                       const uint16_t index,
-                                      ArrayView<char> name) {
+                                      std::span<char> name) {
   OSStatus err = noErr;
   AudioDeviceID deviceIds[MaxNumberDevices];
 
diff --git a/modules/audio_device/mac/audio_device_mac.h b/modules/audio_device/mac/audio_device_mac.h
index c80de22..4598e1a 100644
--- a/modules/audio_device/mac/audio_device_mac.h
+++ b/modules/audio_device/mac/audio_device_mac.h
@@ -17,6 +17,7 @@
 
 #include <atomic>
 #include <memory>
+#include <span>
 
 #include "absl/strings/string_view.h"
 #include "modules/audio_device/audio_device_generic.h"
@@ -178,7 +179,7 @@
 
   int32_t GetDeviceName(AudioObjectPropertyScope scope,
                         uint16_t index,
-                        ArrayView<char> name);
+                        std::span<char> name);
 
   int32_t InitDevice(uint16_t userDeviceIndex,
                      AudioDeviceID& deviceId,
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
index 89498c5..59fea18 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -29,7 +29,6 @@
   deps = [
     ":checks",
     ":safe_conversions",
-    "../api:array_view",
     "//third_party/abseil-cpp/absl/base:core_headers",
     "//third_party/abseil-cpp/absl/numeric:bits",
     "//third_party/abseil-cpp/absl/strings:string_view",
@@ -80,7 +79,6 @@
     ":checks",
     ":type_traits",
     ":zero_memory",
-    "../api:array_view",
     "//third_party/abseil-cpp/absl/algorithm:container",
     "//third_party/abseil-cpp/absl/base:core_headers",
     "//third_party/abseil-cpp/absl/strings:string_view",
@@ -92,7 +90,6 @@
   sources = [ "byte_order.h" ]
   deps = [
     ":checks",
-    "../api:array_view",
     "system:arch",
     "//third_party/abseil-cpp/absl/base:core_headers",
   ]
@@ -143,7 +140,6 @@
   ]
   deps = [
     ":checks",
-    "../api:array_view",
     "../api/units:data_size",
     "//third_party/abseil-cpp/absl/numeric:bits",
     "//third_party/abseil-cpp/absl/strings:string_view",
@@ -159,7 +155,6 @@
   deps = [
     ":buffer",
     ":byte_order",
-    "../api:array_view",
     "//third_party/abseil-cpp/absl/base:core_headers",
     "//third_party/abseil-cpp/absl/strings:string_view",
   ]
@@ -190,7 +185,6 @@
     ":checks",
     ":refcount",
     ":type_traits",
-    "../api:array_view",
     "../api:make_ref_counted",
     "../api:scoped_refptr",
     "system:rtc_export",
@@ -385,10 +379,7 @@
     "zero_memory.cc",
     "zero_memory.h",
   ]
-  deps = [
-    ":checks",
-    "../api:array_view",
-  ]
+  deps = [ ":checks" ]
 }
 
 rtc_library("platform_thread_types") {
@@ -643,7 +634,6 @@
   deps = [
     ":checks",
     ":safe_minmax",
-    "../api:array_view",
     "//third_party/abseil-cpp/absl/base:core_headers",
     "//third_party/abseil-cpp/absl/strings",
     "//third_party/abseil-cpp/absl/strings:string_view",
@@ -660,7 +650,6 @@
     ":logging",
     ":stringutils",
     ":timeutils",
-    "../api:array_view",
     "system:rtc_export",
     "//third_party/abseil-cpp/absl/strings:string_view",
   ]
@@ -1056,7 +1045,6 @@
     ":socket_address",
     ":socket_server",
     ":timeutils",
-    "../api:array_view",
     "../api:async_dns_resolver",
     "../api:function_view",
     "../api:location",
@@ -1124,7 +1112,6 @@
     ":ip_address",
     ":net_helpers",
     ":socket_address",
-    "../api:array_view",
     "../api/transport:ecn_marking",
     "../api/units:timestamp",
     "system:rtc_export",
@@ -1273,7 +1260,6 @@
     ":socket_factory",
     ":stringutils",
     ":threading",
-    "../api:array_view",
     "../api:field_trials_view",
     "../api:scoped_refptr",
     "../api:sequence_checker",
@@ -1332,7 +1318,6 @@
     ":socket_address",
     ":stringutils",
     ":zero_memory",
-    "../api:array_view",
     "//third_party/abseil-cpp/absl/functional:any_invocable",
     "//third_party/abseil-cpp/absl/strings",
     "//third_party/abseil-cpp/absl/strings:string_view",
@@ -1365,7 +1350,6 @@
     ":socket",
     ":socket_address",
     ":timeutils",
-    "../api:array_view",
     "../api/environment",
     "../api/units:timestamp",
     "network:received_packet",
@@ -1522,7 +1506,6 @@
     ":crypto_random",
     ":macromagic",
     ":stringutils",
-    "../api:array_view",
     "../api:sequence_checker",
     "synchronization:mutex",
     "system:no_unique_address",
@@ -1551,7 +1534,6 @@
     ":logging",
     ":macromagic",
     ":threading",
-    "../api:array_view",
     "../api:sequence_checker",
     "system:no_unique_address",
     "system:rtc_export",
@@ -1657,7 +1639,6 @@
     ":ssl_header",
     ":stringutils",
     ":timeutils",
-    "../api:array_view",
     "../api:refcountedbase",
     "../api:scoped_refptr",
     "system:rtc_export",
@@ -1733,7 +1714,6 @@
     ":stringutils",
     ":threading",
     ":timeutils",
-    "../api:array_view",
     "../api:field_trials_view",
     "../api:sequence_checker",
     "../api/task_queue",
@@ -1869,7 +1849,6 @@
     ":stringutils",
     ":threading",
     ":timeutils",
-    "../api:array_view",
     "../api:make_ref_counted",
     "../api:refcountedbase",
     "../api:scoped_refptr",
@@ -1942,7 +1921,6 @@
       "base64.h",
     ]
     deps = [
-      "../api:array_view",
       "//third_party/abseil-cpp/absl/algorithm:container",
       "//third_party/abseil-cpp/absl/strings",
       "//third_party/abseil-cpp/absl/strings:string_view",
@@ -1968,7 +1946,6 @@
     ]
     deps = [
       ":base64_rust_bridge",
-      "../api:array_view",
       "//build/rust:cxx_cppdeps",
       "//third_party/abseil-cpp/absl/strings:string_view",
     ]
@@ -2185,7 +2162,6 @@
         ":timestamp_aligner",
         ":timeutils",
         ":zero_memory",
-        "../api:array_view",
         "../api:make_ref_counted",
         "../api:ref_count",
         "../api:scoped_refptr",
@@ -2359,7 +2335,6 @@
         ":threading",
         ":timeutils",
         ":unique_id_generator",
-        "../api:array_view",
         "../api:field_trials",
         "../api:field_trials_view",
         "../api:location",
diff --git a/rtc_base/async_tcp_socket.cc b/rtc_base/async_tcp_socket.cc
index ad2867e..02aa98f 100644
--- a/rtc_base/async_tcp_socket.cc
+++ b/rtc_base/async_tcp_socket.cc
@@ -15,11 +15,11 @@
 #include <cstdint>
 #include <cstring>
 #include <memory>
+#include <span>
 #include <utility>
 
 #include "absl/base/nullability.h"
 #include "absl/memory/memory.h"
-#include "api/array_view.h"
 #include "api/environment/environment.h"
 #include "rtc_base/async_packet_socket.h"
 #include "rtc_base/byte_order.h"
@@ -127,7 +127,7 @@
 
 int AsyncTCPSocketBase::FlushOutBuffer() {
   RTC_DCHECK_GT(outbuf_.size(), 0);
-  ArrayView<uint8_t> view = outbuf_;
+  std::span<uint8_t> view = outbuf_;
   int res;
   while (!view.empty()) {
     res = socket_->Send(view.data(), view.size());
@@ -212,7 +212,7 @@
   } else {
     if (bytes_remaining > 0) {
       // Move remaining bytes to beginning of buffer.
-      inbuf_.SetData(ArrayView<uint8_t>(inbuf_).subspan(processed));
+      inbuf_.SetData(std::span<uint8_t>(inbuf_).subspan(processed));
     } else {
       inbuf_.Clear();
     }
@@ -272,7 +272,7 @@
   return static_cast<int>(cb);
 }
 
-size_t AsyncTCPSocket::ProcessInput(ArrayView<const uint8_t> data) {
+size_t AsyncTCPSocket::ProcessInput(std::span<const uint8_t> data) {
   SocketAddress remote_addr(GetRemoteAddress());
 
   size_t processed_bytes = 0;
diff --git a/rtc_base/async_tcp_socket.h b/rtc_base/async_tcp_socket.h
index fdd5e3a..c937fdd 100644
--- a/rtc_base/async_tcp_socket.h
+++ b/rtc_base/async_tcp_socket.h
@@ -14,9 +14,9 @@
 #include <cstddef>
 #include <cstdint>
 #include <memory>
+#include <span>
 
 #include "absl/base/nullability.h"
-#include "api/array_view.h"
 #include "api/environment/environment.h"
 #include "rtc_base/async_packet_socket.h"
 #include "rtc_base/buffer.h"
@@ -42,7 +42,7 @@
            size_t cb,
            const AsyncSocketPacketOptions& options) override = 0;
   // Must return the number of bytes processed.
-  virtual size_t ProcessInput(ArrayView<const uint8_t> data) = 0;
+  virtual size_t ProcessInput(std::span<const uint8_t> data) = 0;
 
   SocketAddress GetLocalAddress() const override;
   SocketAddress GetRemoteAddress() const override;
@@ -92,7 +92,7 @@
   int Send(const void* pv,
            size_t cb,
            const AsyncSocketPacketOptions& options) override;
-  size_t ProcessInput(ArrayView<const uint8_t>) override;
+  size_t ProcessInput(std::span<const uint8_t>) override;
 
  private:
   const Environment env_;
diff --git a/rtc_base/base64.h b/rtc_base/base64.h
index 9a83d8b..540fc9a 100644
--- a/rtc_base/base64.h
+++ b/rtc_base/base64.h
@@ -13,16 +13,16 @@
 
 #include <cstdint>
 #include <optional>
+#include <span>
 #include <string>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 
 namespace webrtc {
 
 std::string Base64Encode(absl::string_view data);
 
-inline std::string Base64Encode(ArrayView<const uint8_t> data) {
+inline std::string Base64Encode(std::span<const uint8_t> data) {
   return Base64Encode(absl::string_view(
       reinterpret_cast<const char*>(data.data()), data.size()));
 }
diff --git a/rtc_base/bit_buffer.cc b/rtc_base/bit_buffer.cc
index 1b862e7..ab2be82 100644
--- a/rtc_base/bit_buffer.cc
+++ b/rtc_base/bit_buffer.cc
@@ -15,10 +15,10 @@
 #include <cstdint>
 #include <cstring>
 #include <limits>
+#include <span>
 
 #include "absl/numeric/bits.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "rtc_base/checks.h"
 
 namespace webrtc {
@@ -54,7 +54,7 @@
 
 }  // namespace
 
-BitBufferWriter::BitBufferWriter(ArrayView<uint8_t> bytes)
+BitBufferWriter::BitBufferWriter(std::span<uint8_t> bytes)
     : BitBufferWriter(bytes.data(), bytes.size()) {}
 
 BitBufferWriter::BitBufferWriter(uint8_t* bytes, size_t byte_count)
diff --git a/rtc_base/bit_buffer.h b/rtc_base/bit_buffer.h
index 1c78662..575a7ef 100644
--- a/rtc_base/bit_buffer.h
+++ b/rtc_base/bit_buffer.h
@@ -14,8 +14,9 @@
 #include <stddef.h>  // For size_t.
 #include <stdint.h>  // For integer types.
 
+#include <span>
+
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/units/data_size.h"
 
 namespace webrtc {
@@ -29,7 +30,7 @@
   static constexpr DataSize kMaxLeb128Length = DataSize::Bytes(10);
 
   // Constructs a bit buffer for the writable buffer of `bytes`.
-  explicit BitBufferWriter(ArrayView<uint8_t> bytes);
+  explicit BitBufferWriter(std::span<uint8_t> bytes);
   BitBufferWriter(uint8_t* bytes, size_t byte_count);
 
   BitBufferWriter(const BitBufferWriter&) = delete;
diff --git a/rtc_base/bit_buffer_unittest.cc b/rtc_base/bit_buffer_unittest.cc
index bca818c..b607c40 100644
--- a/rtc_base/bit_buffer_unittest.cc
+++ b/rtc_base/bit_buffer_unittest.cc
@@ -13,8 +13,8 @@
 #include <cstddef>
 #include <cstdint>
 #include <limits>
+#include <span>
 
-#include "api/array_view.h"
 #include "rtc_base/bitstream_reader.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
@@ -166,7 +166,7 @@
   // That should be all that fits in the buffer.
   EXPECT_FALSE(buffer.WriteBits(1, 1));
 
-  BitstreamReader reader(MakeArrayView(bytes, 4));
+  BitstreamReader reader(std::span(bytes, 4));
   EXPECT_EQ(reader.ReadBits(3), 0x2u);
   EXPECT_EQ(reader.ReadBits(2), 0x1u);
   EXPECT_EQ(reader.ReadBits(7), 0x53u);
diff --git a/rtc_base/bitstream_reader.h b/rtc_base/bitstream_reader.h
index 622534e..5b9ee98 100644
--- a/rtc_base/bitstream_reader.h
+++ b/rtc_base/bitstream_reader.h
@@ -13,12 +13,12 @@
 
 #include <stdint.h>
 
+#include <span>
 #include <string>
 #include <type_traits>
 
 #include "absl/base/attributes.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/numerics/safe_conversions.h"
 
@@ -33,7 +33,7 @@
 class BitstreamReader {
  public:
   explicit BitstreamReader(
-      ArrayView<const uint8_t> bytes ABSL_ATTRIBUTE_LIFETIME_BOUND);
+      std::span<const uint8_t> bytes ABSL_ATTRIBUTE_LIFETIME_BOUND);
   explicit BitstreamReader(
       absl::string_view bytes ABSL_ATTRIBUTE_LIFETIME_BOUND);
   BitstreamReader(const BitstreamReader&) = default;
@@ -126,7 +126,7 @@
   mutable bool last_read_is_verified_ = true;
 };
 
-inline BitstreamReader::BitstreamReader(ArrayView<const uint8_t> bytes)
+inline BitstreamReader::BitstreamReader(std::span<const uint8_t> bytes)
     : bytes_(bytes.data()),
       remaining_bits_(checked_cast<int>(bytes.size() * 8)) {}
 
diff --git a/rtc_base/bitstream_reader_unittest.cc b/rtc_base/bitstream_reader_unittest.cc
index 4ad6624..f3f8f9a 100644
--- a/rtc_base/bitstream_reader_unittest.cc
+++ b/rtc_base/bitstream_reader_unittest.cc
@@ -15,10 +15,10 @@
 #include <cstdint>
 #include <limits>
 #include <optional>
+#include <span>
 #include <utility>
 
 #include "absl/numeric/bits.h"
-#include "api/array_view.h"
 #include "rtc_base/checks.h"
 #include "test/gtest.h"
 
@@ -197,14 +197,14 @@
 }
 
 TEST(BitstreamReaderTest, ReadZeroBits) {
-  BitstreamReader reader(ArrayView<const uint8_t>{});
+  BitstreamReader reader(std::span<const uint8_t>{});
 
   EXPECT_EQ(reader.ReadBits(0), 0u);
   EXPECT_TRUE(reader.Ok());
 }
 
 TEST(BitstreamReaderTest, ReadBitFromEmptyArray) {
-  BitstreamReader reader(ArrayView<const uint8_t>{});
+  BitstreamReader reader(std::span<const uint8_t>{});
 
   // Trying to read from the empty array shouldn't dereference the pointer,
   // i.e. shouldn't crash.
@@ -213,7 +213,7 @@
 }
 
 TEST(BitstreamReaderTest, ReadBitsFromEmptyArray) {
-  BitstreamReader reader(ArrayView<const uint8_t>{});
+  BitstreamReader reader(std::span<const uint8_t>{});
 
   // Trying to read from the empty array shouldn't dereference the pointer,
   // i.e. shouldn't crash.
@@ -324,12 +324,12 @@
   const uint8_t bytes[] = {0x00, 0xFF, 0xFF};
   // Make sure the bit buffer correctly enforces byte length on golomb reads.
   // If it didn't, the above buffer would be valid at 3 bytes.
-  BitstreamReader reader1(MakeArrayView(bytes, 1));
+  BitstreamReader reader1(std::span(bytes, 1));
   // When parse fails, `ReadExponentialGolomb` may return any number.
   reader1.ReadExponentialGolomb();
   EXPECT_FALSE(reader1.Ok());
 
-  BitstreamReader reader2(MakeArrayView(bytes, 2));
+  BitstreamReader reader2(std::span(bytes, 2));
   reader2.ReadExponentialGolomb();
   EXPECT_FALSE(reader2.Ok());
 
diff --git a/rtc_base/buffer.h b/rtc_base/buffer.h
index f030f6b..88b2ff7 100644
--- a/rtc_base/buffer.h
+++ b/rtc_base/buffer.h
@@ -22,7 +22,6 @@
 
 #include "absl/algorithm/container.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/type_traits.h"
 #include "rtc_base/zero_memory.h"
@@ -215,12 +214,12 @@
 
   T& operator[](size_t index) {
     RTC_DCHECK_LT(index, size_);
-    return ArrayView<T>(*this)[index];
+    return std::span<T>(*this)[index];
   }
 
   T operator[](size_t index) const {
     RTC_DCHECK_LT(index, size_);
-    return ArrayView<const T>(*this)[index];
+    return std::span<const T>(*this)[index];
   }
 
   iterator begin() { return std::span(*this).begin(); }
@@ -263,12 +262,12 @@
   // Replaces the data in the buffer with at most `max_elements` of data, using
   // the function `setter`, which should have the following signature:
   //
-  //   size_t setter(ArrayView<U> view)
+  //   size_t setter(std::span<U> view)
   //
-  // `setter` is given an appropriately typed ArrayView of length exactly
+  // `setter` is given an appropriately typed std::span of length exactly
   // `max_elements` that describes the area where it should write the data; it
   // should return the number of elements actually written. (If it doesn't fill
-  // the whole ArrayView, it should leave the unused space at the end.)
+  // the whole std::span, it should leave the unused space at the end.)
   template <typename U = T,
             typename F,
             typename std::enable_if<
@@ -298,9 +297,9 @@
     const size_t new_size = size_ + size;
     EnsureCapacityWithHeadroom(new_size, true);
     static_assert(sizeof(T) == sizeof(U), "");
-    ArrayView<const U> source(data, size);
-    ArrayView<T> destination =
-        ArrayView<T>(data_.get(), capacity_).subspan(size_, size);
+    std::span<const U> source(data, size);
+    std::span<T> destination =
+        std::span<T>(data_.get(), capacity_).subspan(size_, size);
     absl::c_copy(source, destination.begin());
     size_ = new_size;
     RTC_DCHECK(IsConsistent());
@@ -331,12 +330,12 @@
   // Appends at most `max_elements` to the end of the buffer, using the function
   // `setter`, which should have the following signature:
   //
-  //   size_t setter(ArrayView<U> view)
+  //   size_t setter(std::span<U> view)
   //
-  // `setter` is given an appropriately typed ArrayView of length exactly
+  // `setter` is given an appropriately typed std::span of length exactly
   // `max_elements` that describes the area where it should write the data; it
   // should return the number of elements actually written. (If it doesn't fill
-  // the whole ArrayView, it should leave the unused space at the end.)
+  // the whole std::span, it should leave the unused space at the end.)
   template <typename U = T,
             typename F,
             typename std::enable_if<
@@ -346,7 +345,7 @@
     const size_t old_size = size_;
     SetSizeInternal(old_size + max_elements);
     size_t written_elements =
-        setter(ArrayView<U>(data<U>(), size()).subspan(old_size));
+        setter(std::span<U>(data<U>(), size()).subspan(old_size));
 
     RTC_CHECK_LE(written_elements, max_elements);
     size_ = old_size + written_elements;
@@ -448,7 +447,7 @@
       // It would be sufficient to only zero "size_" elements, as all other
       // methods already ensure that the unused capacity contains no sensitive
       // data---but better safe than sorry.
-      ExplicitZeroMemory(ArrayView<T>(data_.get(), capacity_));
+      ExplicitZeroMemory(std::span<T>(data_.get(), capacity_));
     }
   }
 
@@ -456,7 +455,7 @@
   void ZeroTrailingData(size_t count) {
     RTC_DCHECK(IsConsistent());
     RTC_DCHECK_LE(count, capacity_ - size_);
-    ExplicitZeroMemory(MakeArrayView(data(), capacity_).subspan(size_));
+    ExplicitZeroMemory(std::span(data(), capacity_).subspan(size_));
   }
 
   // Precondition for all methods except Clear, operator= and the destructor.
diff --git a/rtc_base/buffer_unittest.cc b/rtc_base/buffer_unittest.cc
index 58857f4..4c22667 100644
--- a/rtc_base/buffer_unittest.cc
+++ b/rtc_base/buffer_unittest.cc
@@ -14,10 +14,10 @@
 #include <cstddef>
 #include <cstdint>
 #include <cstring>
+#include <span>
 #include <utility>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "rtc_base/checks.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
@@ -36,7 +36,7 @@
                             0xa, 0xb, 0xc, 0xd, 0xe, 0xf});
 
 uint8_t* TestDataAtIndex(int index) {
-  return ArrayView<uint8_t>(kTestData).subspan(index).data();
+  return std::span<uint8_t>(kTestData).subspan(index).data();
 }
 
 void TestBuf(const Buffer& b1, size_t size, size_t capacity) {
@@ -109,7 +109,7 @@
   EXPECT_EQ(buf, Buffer(exp));
   Buffer buf2;
   buf2.AppendData(buf);
-  buf2.AppendData(ArrayView<uint8_t>(buf));
+  buf2.AppendData(std::span<uint8_t>(buf));
   const int8_t exp2[] = {0x4, 0x5, 0x6, 0xa, 0xb, 0x4, 0x5, 0x6, 0xa, 0xb};
   EXPECT_EQ(buf2, Buffer(exp2));
 }
@@ -127,7 +127,7 @@
   buf.AppendData(TestDataContainer());
   EXPECT_EQ(6u, buf.size());
   EXPECT_EQ(0, memcmp(buf.data(), kTestData.data(), 3));
-  EXPECT_EQ(0, memcmp(ArrayView<uint8_t>(buf).subspan(3).data(),
+  EXPECT_EQ(0, memcmp(std::span<uint8_t>(buf).subspan(3).data(),
                       kTestData.data(), 3));
   EXPECT_THAT(buf, ElementsAre(0, 1, 2, 0, 1, 2));
 }
@@ -250,7 +250,7 @@
 }
 
 TEST(BufferTest, TestLambdaSetAppend) {
-  auto setter = [](ArrayView<uint8_t> av) {
+  auto setter = [](std::span<uint8_t> av) {
     for (int i = 0; i != 15; ++i)
       av[i] = kTestData[i];
     return 15;
@@ -270,7 +270,7 @@
 }
 
 TEST(BufferTest, TestLambdaSetAppendSigned) {
-  auto setter = [](ArrayView<int8_t> av) {
+  auto setter = [](std::span<int8_t> av) {
     for (int i = 0; i != 15; ++i)
       av[i] = kTestData[i];
     return 15;
@@ -290,7 +290,7 @@
 }
 
 TEST(BufferTest, TestLambdaAppendEmpty) {
-  auto setter = [](ArrayView<uint8_t> av) {
+  auto setter = [](std::span<uint8_t> av) {
     for (int i = 0; i != 15; ++i)
       av[i] = kTestData[i];
     return 15;
@@ -308,7 +308,7 @@
 }
 
 TEST(BufferTest, TestLambdaAppendPartial) {
-  auto setter = [](ArrayView<uint8_t> av) {
+  auto setter = [](std::span<uint8_t> av) {
     for (int i = 0; i != 7; ++i)
       av[i] = kTestData[i];
     return 7;
@@ -324,7 +324,7 @@
 
 TEST(BufferTest, TestMutableLambdaSetAppend) {
   uint8_t magic_number = 17;
-  auto setter = [magic_number](ArrayView<uint8_t> av) mutable {
+  auto setter = [magic_number](std::span<uint8_t> av) mutable {
     for (int i = 0; i != 15; ++i) {
       av[i] = magic_number;
       ++magic_number;
@@ -484,7 +484,7 @@
   const size_t old_capacity = buf.capacity();
   constexpr size_t offset = 1;
   // Pointer to the last five bytes of the underlying buffer.
-  auto to_be_zeroed = ArrayView<const uint8_t>(buf).subspan(2);
+  auto to_be_zeroed = std::span<const uint8_t>(buf).subspan(2);
   buf.SetData(TestDataAtIndex(offset), 2);
   // Sanity checks to make sure the underlying heap memory was not reallocated.
   EXPECT_EQ(old_data, buf.data());
@@ -498,7 +498,7 @@
 
 TEST(ZeroOnFreeBufferTest, TestZeroOnSetDataFromSetter) {
   static constexpr size_t offset = 1;
-  const auto setter = [](ArrayView<uint8_t> av) {
+  const auto setter = [](std::span<uint8_t> av) {
     for (int i = 0; i != 2; ++i)
       av[i] = kTestData[offset + i];
     return 2;
@@ -506,7 +506,7 @@
 
   ZeroOnFreeBuffer<uint8_t> buf(kTestData.data(), 7);
   const uint8_t* old_data = buf.data();
-  auto to_be_zeroed = ArrayView<const uint8_t>(buf).subspan(2);
+  auto to_be_zeroed = std::span<const uint8_t>(buf).subspan(2);
   const size_t old_capacity = buf.capacity();
   buf.SetData(2, setter);
   // Sanity checks to make sure the underlying heap memory was not reallocated.
@@ -521,7 +521,7 @@
 
 TEST(ZeroOnFreeBufferTest, TestZeroOnSetSize) {
   ZeroOnFreeBuffer<uint8_t> buf(kTestData.data(), 7);
-  auto to_be_zeroed = ArrayView<const uint8_t>(buf).subspan(2);
+  auto to_be_zeroed = std::span<const uint8_t>(buf).subspan(2);
   const uint8_t* old_data = buf.data();
   const size_t old_capacity = buf.capacity();
   buf.SetSize(2);
@@ -537,7 +537,7 @@
 
 TEST(ZeroOnFreeBufferTest, TestZeroOnClear) {
   ZeroOnFreeBuffer<uint8_t> buf(kTestData.data(), 7);
-  auto to_be_zeroed = ArrayView<const uint8_t>(buf);
+  auto to_be_zeroed = std::span<const uint8_t>(buf);
   const uint8_t* old_data = buf.data();
   const size_t old_capacity = buf.capacity();
   buf.Clear();
diff --git a/rtc_base/byte_buffer.cc b/rtc_base/byte_buffer.cc
index 719720d..b3ebb1e 100644
--- a/rtc_base/byte_buffer.cc
+++ b/rtc_base/byte_buffer.cc
@@ -12,10 +12,10 @@
 
 #include <cstdint>
 #include <cstring>
+#include <span>
 #include <string>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "rtc_base/byte_order.h"
 
 namespace webrtc {
@@ -25,7 +25,7 @@
 ByteBufferWriter::ByteBufferWriter(const uint8_t* bytes, size_t len)
     : ByteBufferWriterT(bytes, len) {}
 
-ByteBufferReader::ByteBufferReader(ArrayView<const uint8_t> bytes) {
+ByteBufferReader::ByteBufferReader(std::span<const uint8_t> bytes) {
   Construct(bytes.data(), bytes.size());
 }
 
@@ -146,7 +146,7 @@
   return true;
 }
 
-bool ByteBufferReader::ReadBytes(ArrayView<uint8_t> val) {
+bool ByteBufferReader::ReadBytes(std::span<uint8_t> val) {
   if (val.empty()) {
     return true;
   }
diff --git a/rtc_base/byte_buffer.h b/rtc_base/byte_buffer.h
index cc7d648..64648d0 100644
--- a/rtc_base/byte_buffer.h
+++ b/rtc_base/byte_buffer.h
@@ -14,11 +14,11 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include <span>
 #include <string>
 
 #include "absl/base/attributes.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/byte_order.h"
 
@@ -41,8 +41,8 @@
   const value_type* Data() const { return buffer_.data(); }
   size_t Length() const { return buffer_.size(); }
   size_t Capacity() const { return buffer_.capacity(); }
-  ArrayView<const value_type> DataView() const {
-    return MakeArrayView(Data(), Length());
+  std::span<const value_type> DataView() const {
+    return std::span(Data(), Length());
   }
   // Accessor that returns a string_view, independent of underlying type.
   // Intended to provide access for existing users that expect char*
@@ -97,12 +97,12 @@
                        val.size());
   }
   // Write an array of bytes (uint8_t)
-  [[deprecated("issues.webrtc.org/4225170 - use Write(ArrayView)")]]
+  [[deprecated("issues.webrtc.org/4225170 - use Write(std::span)")]]
   void WriteBytes(const uint8_t* val, size_t len) {
     WriteBytesInternal(reinterpret_cast<const value_type*>(val), len);
   }
 
-  void Write(ArrayView<const value_type> data) {
+  void Write(std::span<const value_type> data) {
     WriteBytesInternal(data.data(), data.size());
   }
 
@@ -157,7 +157,7 @@
 class ByteBufferReader {
  public:
   explicit ByteBufferReader(
-      ArrayView<const uint8_t> bytes ABSL_ATTRIBUTE_LIFETIME_BOUND);
+      std::span<const uint8_t> bytes ABSL_ATTRIBUTE_LIFETIME_BOUND);
 
   explicit ByteBufferReader(const ByteBufferWriter& buf);
 
@@ -168,8 +168,8 @@
   // Returns number of unprocessed bytes.
   size_t Length() const { return end_ - start_; }
   // Returns a view of the unprocessed data. Does not move current position.
-  ArrayView<const uint8_t> DataView() const {
-    return ArrayView<const uint8_t>(bytes_ + start_, end_ - start_);
+  std::span<const uint8_t> DataView() const {
+    return std::span<const uint8_t>(bytes_ + start_, end_ - start_);
   }
 
   // Read a next value from the buffer. Return false if there isn't
@@ -181,7 +181,7 @@
   bool ReadUInt64(uint64_t* val);
   bool ReadUVarint(uint64_t* val);
   // Copies the val.size() next bytes into val.data().
-  bool ReadBytes(ArrayView<uint8_t> val);
+  bool ReadBytes(std::span<uint8_t> val);
   // Appends next `len` bytes from the buffer to `val`. Returns false
   // if there is less than `len` bytes left.
   bool ReadString(std::string* val, size_t len);
diff --git a/rtc_base/byte_buffer_unittest.cc b/rtc_base/byte_buffer_unittest.cc
index 267f107..cdc34be 100644
--- a/rtc_base/byte_buffer_unittest.cc
+++ b/rtc_base/byte_buffer_unittest.cc
@@ -12,11 +12,11 @@
 
 #include <cstdint>
 #include <cstring>
+#include <span>
 #include <string>
 #include <utility>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/byte_order.h"
 #include "test/gmock.h"
@@ -56,11 +56,11 @@
     EXPECT_EQ(n64, HostToNetwork64(n64));
 
     // GetBE converts big endian to little endian here.
-    EXPECT_EQ(n16 >> 8, GetBE16(ArrayView<const uint8_t>(
+    EXPECT_EQ(n16 >> 8, GetBE16(std::span<const uint8_t>(
                             reinterpret_cast<const uint8_t*>(&n16), 2)));
-    EXPECT_EQ(n32 >> 24, GetBE32(ArrayView<const uint8_t>(
+    EXPECT_EQ(n32 >> 24, GetBE32(std::span<const uint8_t>(
                              reinterpret_cast<const uint8_t*>(&n32), 4)));
-    EXPECT_EQ(n64 >> 56, GetBE64(ArrayView<const uint8_t>(
+    EXPECT_EQ(n64 >> 56, GetBE64(std::span<const uint8_t>(
                              reinterpret_cast<const uint8_t*>(&n64), 8)));
   } else {
     // The host is little endian.
@@ -69,22 +69,22 @@
     EXPECT_NE(n64, HostToNetwork64(n64));
 
     // GetBE converts little endian to big endian here.
-    EXPECT_EQ(GetBE16(ArrayView<const uint8_t>(
+    EXPECT_EQ(GetBE16(std::span<const uint8_t>(
                   reinterpret_cast<const uint8_t*>(&n16), 2)),
               HostToNetwork16(n16));
-    EXPECT_EQ(GetBE32(ArrayView<const uint8_t>(
+    EXPECT_EQ(GetBE32(std::span<const uint8_t>(
                   reinterpret_cast<const uint8_t*>(&n32), 4)),
               HostToNetwork32(n32));
-    EXPECT_EQ(GetBE64(ArrayView<const uint8_t>(
+    EXPECT_EQ(GetBE64(std::span<const uint8_t>(
                   reinterpret_cast<const uint8_t*>(&n64), 8)),
               HostToNetwork64(n64));
 
     // GetBE converts little endian to big endian here.
-    EXPECT_EQ(n16 << 8, GetBE16(ArrayView<const uint8_t>(
+    EXPECT_EQ(n16 << 8, GetBE16(std::span<const uint8_t>(
                             reinterpret_cast<const uint8_t*>(&n16), 2)));
-    EXPECT_EQ(n32 << 24, GetBE32(ArrayView<const uint8_t>(
+    EXPECT_EQ(n32 << 24, GetBE32(std::span<const uint8_t>(
                              reinterpret_cast<const uint8_t*>(&n32), 4)));
-    EXPECT_EQ(n64 << 56, GetBE64(ArrayView<const uint8_t>(
+    EXPECT_EQ(n64 << 56, GetBE64(std::span<const uint8_t>(
                              reinterpret_cast<const uint8_t*>(&n64), 8)));
   }
 }
@@ -117,7 +117,7 @@
 
 TEST(ByteBufferTest, TestReadWriteBuffer) {
   ByteBufferWriter buffer;
-  ByteBufferReader read_buf(ArrayView<const uint8_t>{});
+  ByteBufferReader read_buf(std::span<const uint8_t>{});
   uint8_t ru8;
   EXPECT_FALSE(read_buf.ReadUInt8(&ru8));
 
@@ -183,7 +183,7 @@
 
   // Write and read bytes
   uint8_t write_bytes[] = {3, 2, 1};
-  buffer.Write(ArrayView<const uint8_t>(write_bytes, 3));
+  buffer.Write(std::span<const uint8_t>(write_bytes, 3));
   ByteBufferReader read_buf7(buffer);
   uint8_t read_bytes[3];
   EXPECT_TRUE(read_buf7.ReadBytes(read_bytes));
@@ -260,10 +260,10 @@
   EXPECT_EQ(read_buf11.Length(), 0U);
 }
 
-TEST(ByteBufferTest, TestWriteArrayView) {
+TEST(ByteBufferTest, TestWriteSpan) {
   const uint8_t write_data[3] = {3, 2, 1};
-  // Write and read arrayview
-  ArrayView<const uint8_t> write_view(write_data);
+  // Write and read std::span
+  std::span<const uint8_t> write_view(write_data);
   ByteBufferWriter buffer;
   buffer.Write(write_view);
   ByteBufferReader read_buf12(buffer);
@@ -288,7 +288,7 @@
   for (const auto& test : tests)
     buffer += test;
 
-  ArrayView<const uint8_t> bytes(reinterpret_cast<const uint8_t*>(&buffer[0]),
+  std::span<const uint8_t> bytes(reinterpret_cast<const uint8_t*>(&buffer[0]),
                                  buffer.size());
 
   ByteBufferReader read_buf(bytes);
@@ -359,9 +359,9 @@
   EXPECT_EQ(size, read_buffer.Length());
 }
 
-TEST(ByteBufferTest, ReadFromArrayView) {
+TEST(ByteBufferTest, ReadFromSpan) {
   const uint8_t buf[] = {'a', 'b', 'c'};
-  ArrayView<const uint8_t> view(buf, 3);
+  std::span<const uint8_t> view(buf, 3);
 
   ByteBufferReader read_buffer(view);
   uint8_t val;
@@ -374,18 +374,18 @@
   EXPECT_FALSE(read_buffer.ReadUInt8(&val));
 }
 
-TEST(ByteBufferTest, ReadToArrayView) {
+TEST(ByteBufferTest, ReadToSpan) {
   const uint8_t buf[] = {'a', 'b', 'c'};
-  ArrayView<const uint8_t> stored_view(buf, 3);
+  std::span<const uint8_t> stored_view(buf, 3);
   ByteBufferReader read_buffer(stored_view);
   uint8_t result[] = {'1', '2', '3'};
-  EXPECT_TRUE(read_buffer.ReadBytes(MakeArrayView(result, 2)));
+  EXPECT_TRUE(read_buffer.ReadBytes(std::span(result, 2)));
   EXPECT_EQ(result[0], 'a');
   EXPECT_EQ(result[1], 'b');
   EXPECT_EQ(result[2], '3');
-  EXPECT_TRUE(read_buffer.ReadBytes(MakeArrayView(&result[2], 1)));
+  EXPECT_TRUE(read_buffer.ReadBytes(std::span(&result[2], 1)));
   EXPECT_EQ(result[2], 'c');
-  EXPECT_FALSE(read_buffer.ReadBytes(MakeArrayView(result, 1)));
+  EXPECT_FALSE(read_buffer.ReadBytes(std::span(result, 1)));
 }
 
 }  // namespace webrtc
diff --git a/rtc_base/byte_order.h b/rtc_base/byte_order.h
index 8a31c63..bf44c45 100644
--- a/rtc_base/byte_order.h
+++ b/rtc_base/byte_order.h
@@ -14,8 +14,8 @@
 #include <cstdint>
 #include <cstdlib>
 #include <cstring>
+#include <span>
 
-#include "api/array_view.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/system/arch.h"  // IWYU pragma: keep
 
@@ -94,86 +94,86 @@
 
 // Reading and writing of little and big-endian numbers from memory
 
-inline void Set8(ArrayView<uint8_t> data, size_t offset, uint8_t v) {
+inline void Set8(std::span<uint8_t> data, size_t offset, uint8_t v) {
   data[offset] = v;
 }
 
-inline uint8_t Get8(ArrayView<const uint8_t> data, size_t offset) {
+inline uint8_t Get8(std::span<const uint8_t> data, size_t offset) {
   return data[offset];
 }
 
-inline void SetBE16(ArrayView<uint8_t> data, uint16_t v) {
+inline void SetBE16(std::span<uint8_t> data, uint16_t v) {
   RTC_DCHECK_GE(data.size(), sizeof(v));
   uint16_t val = htobe16(v);
   memcpy(data.data(), &val, sizeof(val));
 }
 
-inline void SetBE32(ArrayView<uint8_t> data, uint32_t v) {
+inline void SetBE32(std::span<uint8_t> data, uint32_t v) {
   RTC_DCHECK_GE(data.size(), sizeof(v));
   uint32_t val = htobe32(v);
   memcpy(data.data(), &val, sizeof(val));
 }
 
-inline void SetBE64(ArrayView<uint8_t> data, uint64_t v) {
+inline void SetBE64(std::span<uint8_t> data, uint64_t v) {
   RTC_DCHECK_GE(data.size(), sizeof(v));
   uint64_t val = htobe64(v);
   memcpy(data.data(), &val, sizeof(val));
 }
 
-inline uint16_t GetBE16(ArrayView<const uint8_t> data) {
+inline uint16_t GetBE16(std::span<const uint8_t> data) {
   uint16_t val;
   RTC_DCHECK_GE(data.size(), sizeof(val));
   memcpy(&val, data.data(), sizeof(val));
   return be16toh(val);
 }
 
-inline uint32_t GetBE32(ArrayView<const uint8_t> data) {
+inline uint32_t GetBE32(std::span<const uint8_t> data) {
   uint32_t val;
   RTC_DCHECK_GE(data.size(), sizeof(val));
   memcpy(&val, data.data(), sizeof(val));
   return be32toh(val);
 }
 
-inline uint64_t GetBE64(ArrayView<const uint8_t> data) {
+inline uint64_t GetBE64(std::span<const uint8_t> data) {
   uint64_t val;
   RTC_DCHECK_GE(data.size(), sizeof(val));
   memcpy(&val, data.data(), sizeof(val));
   return be64toh(val);
 }
 
-inline void SetLE16(ArrayView<uint8_t> data, uint16_t v) {
+inline void SetLE16(std::span<uint8_t> data, uint16_t v) {
   RTC_DCHECK_GE(data.size(), sizeof(v));
   uint16_t val = htole16(v);
   memcpy(data.data(), &val, sizeof(val));
 }
 
-inline void SetLE32(ArrayView<uint8_t> data, uint32_t v) {
+inline void SetLE32(std::span<uint8_t> data, uint32_t v) {
   RTC_DCHECK_GE(data.size(), sizeof(v));
   uint32_t val = htole32(v);
   memcpy(data.data(), &val, sizeof(val));
 }
 
-inline void SetLE64(ArrayView<uint8_t> data, uint64_t v) {
+inline void SetLE64(std::span<uint8_t> data, uint64_t v) {
   RTC_DCHECK_GE(data.size(), sizeof(v));
   uint64_t val = htole64(v);
   memcpy(data.data(), &val, sizeof(val));
 }
 
-inline uint16_t GetLE16(ArrayView<const uint8_t> data) {
+inline uint16_t GetLE16(std::span<const uint8_t> data) {
   uint16_t val;
   RTC_DCHECK_GE(data.size(), sizeof(val));
   memcpy(&val, data.data(), sizeof(val));
   return le16toh(val);
 }
 
-inline uint32_t GetLE32(ArrayView<const uint8_t> data) {
+inline uint32_t GetLE32(std::span<const uint8_t> data) {
   uint32_t val;
   RTC_DCHECK_GE(data.size(), sizeof(val));
   memcpy(&val, data.data(), sizeof(val));
   return le32toh(val);
 }
 
-inline uint64_t GetLE64(ArrayView<const uint8_t> data) {
+inline uint64_t GetLE64(std::span<const uint8_t> data) {
   uint64_t val;
   RTC_DCHECK_GE(data.size(), sizeof(val));
   memcpy(&val, data.data(), sizeof(val));
diff --git a/rtc_base/byte_order_unittest.cc b/rtc_base/byte_order_unittest.cc
index 75a370c..893c0e7 100644
--- a/rtc_base/byte_order_unittest.cc
+++ b/rtc_base/byte_order_unittest.cc
@@ -13,8 +13,8 @@
 #include <stdint.h>
 
 #include <cstdint>
+#include <span>
 
-#include "api/array_view.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -22,7 +22,7 @@
 // Test memory set functions put values into memory in expected order.
 TEST(ByteOrderTest, TestSet) {
   uint8_t buf[8] = {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u};
-  ArrayView<uint8_t> av(buf);
+  std::span<uint8_t> av(buf);
   Set8(av, 0, 0xfb);
   Set8(av, 1, 0x12);
   EXPECT_EQ(0xfb, buf[0]);
@@ -66,7 +66,7 @@
 // Test memory get functions get values from memory in expected order.
 TEST(ByteOrderTest, TestGet) {
   uint8_t buf[8];
-  ArrayView<const uint8_t> av(buf);
+  std::span<const uint8_t> av(buf);
   buf[0] = 0x01u;
   buf[1] = 0x23u;
   buf[2] = 0x45u;
diff --git a/rtc_base/copy_on_write_buffer.cc b/rtc_base/copy_on_write_buffer.cc
index be1fc30..68e98ce 100644
--- a/rtc_base/copy_on_write_buffer.cc
+++ b/rtc_base/copy_on_write_buffer.cc
@@ -15,11 +15,11 @@
 #include <cstdint>
 #include <cstring>
 #include <memory>
+#include <span>
 #include <utility>
 
 #include "absl/algorithm/container.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/make_ref_counted.h"
 #include "api/scoped_refptr.h"
 #include "rtc_base/checks.h"
@@ -110,7 +110,7 @@
   RTC_DCHECK(IsConsistent());
 }
 
-void CopyOnWriteBuffer::Set(ArrayView<const uint8_t> data) {
+void CopyOnWriteBuffer::Set(std::span<const uint8_t> data) {
   RTC_DCHECK(IsConsistent());
   if (data.empty()) {
     offset_ = 0;
@@ -129,7 +129,7 @@
   RTC_DCHECK(IsConsistent());
 }
 
-void CopyOnWriteBuffer::Append(ArrayView<const uint8_t> data) {
+void CopyOnWriteBuffer::Append(std::span<const uint8_t> data) {
   RTC_DCHECK(IsConsistent());
   if (data.empty()) {
     return;
diff --git a/rtc_base/copy_on_write_buffer.h b/rtc_base/copy_on_write_buffer.h
index 14554ed..cda92f1 100644
--- a/rtc_base/copy_on_write_buffer.h
+++ b/rtc_base/copy_on_write_buffer.h
@@ -14,11 +14,11 @@
 #include <cstddef>
 #include <cstdint>
 #include <memory>
+#include <span>
 #include <type_traits>
 #include <utility>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/scoped_refptr.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/checks.h"
@@ -30,7 +30,7 @@
 
 class RTC_EXPORT CopyOnWriteBuffer {
  public:
-  using const_iterator = ArrayView<const uint8_t>::iterator;
+  using const_iterator = std::span<const uint8_t>::iterator;
 
   // An empty buffer.
   CopyOnWriteBuffer();
@@ -163,7 +163,7 @@
             typename std::enable_if<
                 internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
   void SetData(const T* data, size_t size) {
-    Set(MakeArrayView(reinterpret_cast<const uint8_t*>(data), size));
+    Set(std::span(reinterpret_cast<const uint8_t*>(data), size));
   }
 
   template <typename T,
@@ -181,7 +181,7 @@
             typename std::enable_if<
                 internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
   void AppendData(const T* data, size_t size) {
-    Append(MakeArrayView(reinterpret_cast<const uint8_t*>(data), size));
+    Append(std::span(reinterpret_cast<const uint8_t*>(data), size));
   }
 
   template <typename T,
@@ -238,7 +238,7 @@
    public:
     explicit RawBuffer(size_t size);
 
-    ArrayView<uint8_t> data() { return MakeArrayView(data_.get(), size_); }
+    std::span<uint8_t> data() { return std::span(data_.get(), size_); }
     size_t capacity() const { return size_; }
 
    private:
@@ -249,7 +249,7 @@
 
   static scoped_refptr<RefCountedBuffer> CreateBuffer(size_t capacity);
 
-  ArrayView<const uint8_t> AsConstSpan() const {
+  std::span<const uint8_t> AsConstSpan() const {
     RTC_DCHECK(IsConsistent());
     if (buffer_ == nullptr) {
       return {};
@@ -257,8 +257,8 @@
     return buffer_->data().subspan(offset_, size_);
   }
 
-  void Set(ArrayView<const uint8_t> buffer);
-  void Append(ArrayView<const uint8_t> buffer);
+  void Set(std::span<const uint8_t> buffer);
+  void Append(std::span<const uint8_t> buffer);
 
   // Create a copy of the underlying data if it is referenced from other Buffer
   // objects or there is not enough capacity.
diff --git a/rtc_base/copy_on_write_buffer_unittest.cc b/rtc_base/copy_on_write_buffer_unittest.cc
index 59247e5..e42d986 100644
--- a/rtc_base/copy_on_write_buffer_unittest.cc
+++ b/rtc_base/copy_on_write_buffer_unittest.cc
@@ -13,11 +13,11 @@
 #include <cstddef>
 #include <cstdint>
 #include <cstring>
+#include <span>
 #include <type_traits>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -374,8 +374,8 @@
 TEST(CopyOnWriteBufferTest, AcceptsVectorLikeTypes) {
   std::vector<uint8_t> a = {1, 2};
   std::vector<int8_t> b = {3, 4};
-  ArrayView<uint8_t> c(a);
-  ArrayView<const int8_t> d(b);
+  std::span<uint8_t> c(a);
+  std::span<const int8_t> d(b);
 
   CopyOnWriteBuffer a_buf(a);
   CopyOnWriteBuffer b_buf(b);
diff --git a/rtc_base/memory/BUILD.gn b/rtc_base/memory/BUILD.gn
index 8162e3a..60da019 100644
--- a/rtc_base/memory/BUILD.gn
+++ b/rtc_base/memory/BUILD.gn
@@ -36,7 +36,6 @@
     "..:checks",
     "..:macromagic",
     "..:stream",
-    "../../api:array_view",
     "../../api:sequence_checker",
     "../../api/task_queue",
     "../../api/task_queue:pending_task_safety_flag",
@@ -60,7 +59,6 @@
     ":fifo_buffer",
     "..:stream",
     "..:threading",
-    "../../api:array_view",
     "../../test:test_support",
   ]
 }
diff --git a/rtc_base/memory/fifo_buffer.cc b/rtc_base/memory/fifo_buffer.cc
index faebc92..34f0fef 100644
--- a/rtc_base/memory/fifo_buffer.cc
+++ b/rtc_base/memory/fifo_buffer.cc
@@ -14,8 +14,8 @@
 #include <cstddef>
 #include <cstdint>
 #include <cstring>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/sequence_checker.h"
 #include "api/task_queue/task_queue_base.h"
 #include "rtc_base/checks.h"
@@ -56,7 +56,7 @@
   return state_;
 }
 
-StreamResult FifoBuffer::Read(ArrayView<uint8_t> buffer,
+StreamResult FifoBuffer::Read(std::span<uint8_t> buffer,
                               size_t& bytes_read,
                               int& error) {
   RTC_DCHECK_RUN_ON(&callback_sequence_);
@@ -79,7 +79,7 @@
   return result;
 }
 
-StreamResult FifoBuffer::Write(ArrayView<const uint8_t> buffer,
+StreamResult FifoBuffer::Write(std::span<const uint8_t> buffer,
                                size_t& bytes_written,
                                int& error) {
   RTC_DCHECK_RUN_ON(&callback_sequence_);
diff --git a/rtc_base/memory/fifo_buffer.h b/rtc_base/memory/fifo_buffer.h
index 70fee30..0f0de40 100644
--- a/rtc_base/memory/fifo_buffer.h
+++ b/rtc_base/memory/fifo_buffer.h
@@ -14,8 +14,8 @@
 #include <cstddef>
 #include <cstdint>
 #include <memory>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/sequence_checker.h"
 #include "api/task_queue/pending_task_safety_flag.h"
 #include "api/task_queue/task_queue_base.h"
@@ -42,10 +42,10 @@
 
   // StreamInterface methods
   StreamState GetState() const override;
-  StreamResult Read(ArrayView<uint8_t> buffer,
+  StreamResult Read(std::span<uint8_t> buffer,
                     size_t& bytes_read,
                     int& error) override;
-  StreamResult Write(ArrayView<const uint8_t> buffer,
+  StreamResult Write(std::span<const uint8_t> buffer,
                      size_t& bytes_written,
                      int& error) override;
   void Close() override;
diff --git a/rtc_base/memory/fifo_buffer_unittest.cc b/rtc_base/memory/fifo_buffer_unittest.cc
index 22f78a4..e5f2070 100644
--- a/rtc_base/memory/fifo_buffer_unittest.cc
+++ b/rtc_base/memory/fifo_buffer_unittest.cc
@@ -12,8 +12,8 @@
 
 #include <cstdint>
 #include <cstring>
+#include <span>
 
-#include "api/array_view.h"
 #include "rtc_base/stream.h"
 #include "rtc_base/thread.h"
 #include "test/gtest.h"
@@ -33,49 +33,49 @@
   // Test assumptions about base state
   EXPECT_EQ(SS_OPEN, buf.GetState());
   int error;
-  EXPECT_EQ(SR_BLOCK, buf.Read(MakeArrayView(out, kSize), bytes, error));
+  EXPECT_EQ(SR_BLOCK, buf.Read(std::span(out, kSize), bytes, error));
   EXPECT_TRUE(nullptr != buf.GetWriteBuffer(&bytes));
   EXPECT_EQ(kSize, bytes);
   buf.ConsumeWriteBuffer(0);
 
   // Try a full write
-  EXPECT_EQ(SR_SUCCESS, buf.Write(MakeArrayView(in, kSize), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Write(std::span(in, kSize), bytes, error));
   EXPECT_EQ(kSize, bytes);
 
   // Try a write that should block
-  EXPECT_EQ(SR_BLOCK, buf.Write(MakeArrayView(in, kSize), bytes, error));
+  EXPECT_EQ(SR_BLOCK, buf.Write(std::span(in, kSize), bytes, error));
 
   // Try a full read
-  EXPECT_EQ(SR_SUCCESS, buf.Read(MakeArrayView(out, kSize), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Read(std::span(out, kSize), bytes, error));
   EXPECT_EQ(kSize, bytes);
   EXPECT_EQ(0, memcmp(in, out, kSize));
 
   // Try a read that should block
-  EXPECT_EQ(SR_BLOCK, buf.Read(MakeArrayView(out, kSize), bytes, error));
+  EXPECT_EQ(SR_BLOCK, buf.Read(std::span(out, kSize), bytes, error));
 
   // Try a too-big write
-  EXPECT_EQ(SR_SUCCESS, buf.Write(MakeArrayView(in, kSize * 2), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Write(std::span(in, kSize * 2), bytes, error));
   EXPECT_EQ(bytes, kSize);
 
   // Try a too-big read
-  EXPECT_EQ(SR_SUCCESS, buf.Read(MakeArrayView(out, kSize * 2), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Read(std::span(out, kSize * 2), bytes, error));
   EXPECT_EQ(kSize, bytes);
   EXPECT_EQ(0, memcmp(in, out, kSize));
 
   // Try some small writes and reads
-  EXPECT_EQ(SR_SUCCESS, buf.Write(MakeArrayView(in, kSize / 2), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Write(std::span(in, kSize / 2), bytes, error));
   EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(SR_SUCCESS, buf.Read(MakeArrayView(out, kSize / 2), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Read(std::span(out, kSize / 2), bytes, error));
   EXPECT_EQ(kSize / 2, bytes);
   EXPECT_EQ(0, memcmp(in, out, kSize / 2));
-  EXPECT_EQ(SR_SUCCESS, buf.Write(MakeArrayView(in, kSize / 2), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Write(std::span(in, kSize / 2), bytes, error));
   EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(SR_SUCCESS, buf.Write(MakeArrayView(in, kSize / 2), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Write(std::span(in, kSize / 2), bytes, error));
   EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(SR_SUCCESS, buf.Read(MakeArrayView(out, kSize / 2), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Read(std::span(out, kSize / 2), bytes, error));
   EXPECT_EQ(kSize / 2, bytes);
   EXPECT_EQ(0, memcmp(in, out, kSize / 2));
-  EXPECT_EQ(SR_SUCCESS, buf.Read(MakeArrayView(out, kSize / 2), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Read(std::span(out, kSize / 2), bytes, error));
   EXPECT_EQ(kSize / 2, bytes);
   EXPECT_EQ(0, memcmp(in, out, kSize / 2));
 
@@ -87,23 +87,22 @@
   // XXXXWWWWWWWWXXXX 4567012345670123
   // RRRRXXXXXXXXRRRR ....01234567....
   // ....RRRRRRRR.... ................
-  EXPECT_EQ(SR_SUCCESS,
-            buf.Write(MakeArrayView(in, kSize * 3 / 4), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Write(std::span(in, kSize * 3 / 4), bytes, error));
   EXPECT_EQ(kSize * 3 / 4, bytes);
-  EXPECT_EQ(SR_SUCCESS, buf.Read(MakeArrayView(out, kSize / 2), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Read(std::span(out, kSize / 2), bytes, error));
   EXPECT_EQ(kSize / 2, bytes);
   EXPECT_EQ(0, memcmp(in, out, kSize / 2));
-  EXPECT_EQ(SR_SUCCESS, buf.Write(MakeArrayView(in, kSize / 2), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Write(std::span(in, kSize / 2), bytes, error));
   EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(SR_SUCCESS, buf.Read(MakeArrayView(out, kSize / 4), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Read(std::span(out, kSize / 4), bytes, error));
   EXPECT_EQ(kSize / 4, bytes);
   EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4));
-  EXPECT_EQ(SR_SUCCESS, buf.Write(MakeArrayView(in, kSize / 2), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Write(std::span(in, kSize / 2), bytes, error));
   EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(SR_SUCCESS, buf.Read(MakeArrayView(out, kSize / 2), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Read(std::span(out, kSize / 2), bytes, error));
   EXPECT_EQ(kSize / 2, bytes);
   EXPECT_EQ(0, memcmp(in, out, kSize / 2));
-  EXPECT_EQ(SR_SUCCESS, buf.Read(MakeArrayView(out, kSize / 2), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Read(std::span(out, kSize / 2), bytes, error));
   EXPECT_EQ(kSize / 2, bytes);
   EXPECT_EQ(0, memcmp(in, out, kSize / 2));
 
@@ -112,16 +111,16 @@
   buf.ConsumeWriteBuffer(0);
 
   // Try using GetReadData to do a full read
-  EXPECT_EQ(SR_SUCCESS, buf.Write(MakeArrayView(in, kSize), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Write(std::span(in, kSize), bytes, error));
   q = buf.GetReadData(&bytes);
   EXPECT_TRUE(nullptr != q);
   EXPECT_EQ(kSize, bytes);
   EXPECT_EQ(0, memcmp(q, in, kSize));
   buf.ConsumeReadData(kSize);
-  EXPECT_EQ(SR_BLOCK, buf.Read(MakeArrayView(out, kSize), bytes, error));
+  EXPECT_EQ(SR_BLOCK, buf.Read(std::span(out, kSize), bytes, error));
 
   // Try using GetReadData to do some small reads
-  EXPECT_EQ(SR_SUCCESS, buf.Write(MakeArrayView(in, kSize), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Write(std::span(in, kSize), bytes, error));
   q = buf.GetReadData(&bytes);
   EXPECT_TRUE(nullptr != q);
   EXPECT_EQ(kSize, bytes);
@@ -132,7 +131,7 @@
   EXPECT_EQ(kSize / 2, bytes);
   EXPECT_EQ(0, memcmp(q, in + kSize / 2, kSize / 2));
   buf.ConsumeReadData(kSize / 2);
-  EXPECT_EQ(SR_BLOCK, buf.Read(MakeArrayView(out, kSize), bytes, error));
+  EXPECT_EQ(SR_BLOCK, buf.Read(std::span(out, kSize), bytes, error));
 
   // Try using GetReadData in a wraparound case
   // WWWWWWWWWWWWWWWW 0123456789ABCDEF
@@ -140,10 +139,9 @@
   // WWWWWWWW....XXXX 01234567....CDEF
   // ............RRRR 01234567........
   // RRRRRRRR........ ................
-  EXPECT_EQ(SR_SUCCESS, buf.Write(MakeArrayView(in, kSize), bytes, error));
-  EXPECT_EQ(SR_SUCCESS,
-            buf.Read(MakeArrayView(out, kSize * 3 / 4), bytes, error));
-  EXPECT_EQ(SR_SUCCESS, buf.Write(MakeArrayView(in, kSize / 2), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Write(std::span(in, kSize), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Read(std::span(out, kSize * 3 / 4), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Write(std::span(in, kSize / 2), bytes, error));
   q = buf.GetReadData(&bytes);
   EXPECT_TRUE(nullptr != q);
   EXPECT_EQ(kSize / 4, bytes);
@@ -165,7 +163,7 @@
   EXPECT_EQ(kSize, bytes);
   memcpy(p, in, kSize);
   buf.ConsumeWriteBuffer(kSize);
-  EXPECT_EQ(SR_SUCCESS, buf.Read(MakeArrayView(out, kSize), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Read(std::span(out, kSize), bytes, error));
   EXPECT_EQ(kSize, bytes);
   EXPECT_EQ(0, memcmp(in, out, kSize));
 
@@ -180,7 +178,7 @@
   EXPECT_EQ(kSize / 2, bytes);
   memcpy(p, in + kSize / 2, kSize / 2);
   buf.ConsumeWriteBuffer(kSize / 2);
-  EXPECT_EQ(SR_SUCCESS, buf.Read(MakeArrayView(out, kSize), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Read(std::span(out, kSize), bytes, error));
   EXPECT_EQ(kSize, bytes);
   EXPECT_EQ(0, memcmp(in, out, kSize));
 
@@ -190,9 +188,8 @@
   // ........XXXXWWWW ........89AB0123
   // WWWW....XXXXXXXX 4567....89AB0123
   // RRRR....RRRRRRRR ................
-  EXPECT_EQ(SR_SUCCESS,
-            buf.Write(MakeArrayView(in, kSize * 3 / 4), bytes, error));
-  EXPECT_EQ(SR_SUCCESS, buf.Read(MakeArrayView(out, kSize / 2), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Write(std::span(in, kSize * 3 / 4), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Read(std::span(out, kSize / 2), bytes, error));
   p = buf.GetWriteBuffer(&bytes);
   EXPECT_TRUE(nullptr != p);
   EXPECT_EQ(kSize / 4, bytes);
@@ -203,23 +200,22 @@
   EXPECT_EQ(kSize / 2, bytes);
   memcpy(p, in + kSize / 4, kSize / 4);
   buf.ConsumeWriteBuffer(kSize / 4);
-  EXPECT_EQ(SR_SUCCESS,
-            buf.Read(MakeArrayView(out, kSize * 3 / 4), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Read(std::span(out, kSize * 3 / 4), bytes, error));
   EXPECT_EQ(kSize * 3 / 4, bytes);
   EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4));
   EXPECT_EQ(0, memcmp(in, out + kSize / 4, kSize / 4));
 
   // Check that the stream is now empty
-  EXPECT_EQ(SR_BLOCK, buf.Read(MakeArrayView(out, kSize), bytes, error));
+  EXPECT_EQ(SR_BLOCK, buf.Read(std::span(out, kSize), bytes, error));
 
   // Write to the stream, close it, read the remaining bytes
-  EXPECT_EQ(SR_SUCCESS, buf.Write(MakeArrayView(in, kSize / 2), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Write(std::span(in, kSize / 2), bytes, error));
   buf.Close();
   EXPECT_EQ(SS_CLOSED, buf.GetState());
-  EXPECT_EQ(SR_EOS, buf.Write(MakeArrayView(in, kSize / 2), bytes, error));
-  EXPECT_EQ(SR_SUCCESS, buf.Read(MakeArrayView(out, kSize / 2), bytes, error));
+  EXPECT_EQ(SR_EOS, buf.Write(std::span(in, kSize / 2), bytes, error));
+  EXPECT_EQ(SR_SUCCESS, buf.Read(std::span(out, kSize / 2), bytes, error));
   EXPECT_EQ(0, memcmp(in, out, kSize / 2));
-  EXPECT_EQ(SR_EOS, buf.Read(MakeArrayView(out, kSize / 2), bytes, error));
+  EXPECT_EQ(SR_EOS, buf.Read(std::span(out, kSize / 2), bytes, error));
 }
 
 TEST(FifoBufferTest, FullBufferCheck) {
diff --git a/rtc_base/memory_stream.cc b/rtc_base/memory_stream.cc
index 9134d61..7994449 100644
--- a/rtc_base/memory_stream.cc
+++ b/rtc_base/memory_stream.cc
@@ -14,8 +14,8 @@
 #include <cerrno>
 #include <cstdint>
 #include <cstring>
+#include <span>
 
-#include "api/array_view.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/stream.h"
 
@@ -25,7 +25,7 @@
   return SS_OPEN;
 }
 
-StreamResult MemoryStream::Read(ArrayView<uint8_t> buffer,
+StreamResult MemoryStream::Read(std::span<uint8_t> buffer,
                                 size_t& bytes_read,
                                 int& error) {
   if (seek_position_ >= data_length_) {
@@ -45,7 +45,7 @@
   return SR_SUCCESS;
 }
 
-StreamResult MemoryStream::Write(ArrayView<const uint8_t> buffer,
+StreamResult MemoryStream::Write(std::span<const uint8_t> buffer,
                                  size_t& bytes_written,
                                  int& error) {
   size_t available = buffer_length_ - seek_position_;
diff --git a/rtc_base/memory_stream.h b/rtc_base/memory_stream.h
index 312bde6..13dd396 100644
--- a/rtc_base/memory_stream.h
+++ b/rtc_base/memory_stream.h
@@ -14,8 +14,8 @@
 #include <stddef.h>
 
 #include <cstdint>
+#include <span>
 
-#include "api/array_view.h"
 #include "rtc_base/stream.h"
 
 namespace webrtc {
@@ -28,10 +28,10 @@
   ~MemoryStream() override;
 
   StreamState GetState() const override;
-  StreamResult Read(ArrayView<uint8_t> buffer,
+  StreamResult Read(std::span<uint8_t> buffer,
                     size_t& bytes_read,
                     int& error) override;
-  StreamResult Write(ArrayView<const uint8_t> buffer,
+  StreamResult Write(std::span<const uint8_t> buffer,
                      size_t& bytes_written,
                      int& error) override;
   void Close() override;
diff --git a/rtc_base/network.cc b/rtc_base/network.cc
index 676a112..fd1e3e7 100644
--- a/rtc_base/network.cc
+++ b/rtc_base/network.cc
@@ -16,6 +16,7 @@
 #include <cstring>
 #include <map>
 #include <memory>
+#include <span>
 #include <string>
 #include <tuple>
 #include <utility>
@@ -26,7 +27,6 @@
 #include "absl/functional/any_invocable.h"
 #include "absl/strings/match.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/environment/environment.h"
 #include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
@@ -567,7 +567,7 @@
   return nullptr;
 }
 
-bool NetworkManagerBase::IsVpnMacAddress(ArrayView<const uint8_t> address) {
+bool NetworkManagerBase::IsVpnMacAddress(std::span<const uint8_t> address) {
   if (address.data() == nullptr && address.empty()) {
     return false;
   }
@@ -910,7 +910,7 @@
             adapter_type = ADAPTER_TYPE_VPN;
           }
           if (adapter_type != ADAPTER_TYPE_VPN &&
-              IsVpnMacAddress(ArrayView<const uint8_t>(
+              IsVpnMacAddress(std::span<const uint8_t>(
                   reinterpret_cast<const uint8_t*>(
                       adapter_addrs->PhysicalAddress),
                   adapter_addrs->PhysicalAddressLength))) {
diff --git a/rtc_base/network.h b/rtc_base/network.h
index e4a5ba6..4a6bdd0 100644
--- a/rtc_base/network.h
+++ b/rtc_base/network.h
@@ -15,6 +15,7 @@
 
 #include <map>
 #include <memory>
+#include <span>
 #include <string>
 #include <tuple>
 #include <utility>
@@ -23,7 +24,6 @@
 #include "absl/base/nullability.h"
 #include "absl/functional/any_invocable.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/environment/environment.h"
 #include "api/field_trials_view.h"
 #include "api/scoped_refptr.h"
@@ -470,7 +470,7 @@
 
   // Check if MAC address in |bytes| is one of the pre-defined
   // MAC addresses for know VPNs.
-  static bool IsVpnMacAddress(ArrayView<const uint8_t> address);
+  static bool IsVpnMacAddress(std::span<const uint8_t> address);
 
  protected:
   // Updates `networks_` with the networks listed in `list`. If
diff --git a/rtc_base/network/BUILD.gn b/rtc_base/network/BUILD.gn
index 3801b73..d0705cb 100644
--- a/rtc_base/network/BUILD.gn
+++ b/rtc_base/network/BUILD.gn
@@ -26,7 +26,6 @@
   deps = [
     "..:checks",
     "..:socket_address",
-    "../../api:array_view",
     "../../api/transport:ecn_marking",
     "../../api/units:timestamp",
     "../system:rtc_export",
diff --git a/rtc_base/network/received_packet.cc b/rtc_base/network/received_packet.cc
index 3f08e2d..1677b6b 100644
--- a/rtc_base/network/received_packet.cc
+++ b/rtc_base/network/received_packet.cc
@@ -13,9 +13,9 @@
 #include <cstddef>
 #include <cstdint>
 #include <optional>
+#include <span>
 #include <utility>
 
-#include "api/array_view.h"
 #include "api/transport/ecn_marking.h"
 #include "api/units/timestamp.h"
 #include "rtc_base/checks.h"
@@ -23,7 +23,7 @@
 
 namespace webrtc {
 
-ReceivedIpPacket::ReceivedIpPacket(ArrayView<const uint8_t> payload,
+ReceivedIpPacket::ReceivedIpPacket(std::span<const uint8_t> payload,
                                    const SocketAddress& source_address,
                                    std::optional<Timestamp> arrival_time,
                                    EcnMarking ecn,
@@ -48,7 +48,7 @@
     const SocketAddress& source_address) {
   RTC_DCHECK(packet_time_us == -1 || packet_time_us >= 0);
   return ReceivedIpPacket(
-      MakeArrayView(data, size), source_address,
+      std::span(data, size), source_address,
       (packet_time_us >= 0)
           ? std::optional<Timestamp>(Timestamp::Micros(packet_time_us))
           : std::nullopt);
diff --git a/rtc_base/network/received_packet.h b/rtc_base/network/received_packet.h
index 1078f80..2868047 100644
--- a/rtc_base/network/received_packet.h
+++ b/rtc_base/network/received_packet.h
@@ -13,8 +13,8 @@
 #include <cstddef>
 #include <cstdint>
 #include <optional>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/transport/ecn_marking.h"
 #include "api/units/timestamp.h"
 #include "rtc_base/socket_address.h"
@@ -37,7 +37,7 @@
 
   // Caller must keep memory pointed to by payload and address valid for the
   // lifetime of this ReceivedPacket.
-  ReceivedIpPacket(ArrayView<const uint8_t> payload,
+  ReceivedIpPacket(std::span<const uint8_t> payload,
                    const SocketAddress& source_address,
                    std::optional<Timestamp> arrival_time = std::nullopt,
                    EcnMarking ecn = EcnMarking::kNotEct,
@@ -47,7 +47,7 @@
 
   // Address/port of the packet sender.
   const SocketAddress& source_address() const { return source_address_; }
-  ArrayView<const uint8_t> payload() const { return payload_; }
+  std::span<const uint8_t> payload() const { return payload_; }
 
   // Timestamp when this packet was received. Not available on all socket
   // implementations.
@@ -74,7 +74,7 @@
       const SocketAddress& = SocketAddress());
 
  private:
-  ArrayView<const uint8_t> payload_;
+  std::span<const uint8_t> payload_;
   std::optional<Timestamp> arrival_time_;
   const SocketAddress& source_address_;
   EcnMarking ecn_;
diff --git a/rtc_base/network_unittest.cc b/rtc_base/network_unittest.cc
index f9438b0..380580f 100644
--- a/rtc_base/network_unittest.cc
+++ b/rtc_base/network_unittest.cc
@@ -14,6 +14,7 @@
 #include <cstdlib>
 #include <cstring>
 #include <memory>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
@@ -22,7 +23,6 @@
 #include "absl/strings/match.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/environment/environment.h"
 #include "api/environment/environment_factory.h"
 #include "api/field_trials.h"
@@ -1745,7 +1745,7 @@
   EXPECT_TRUE(NetworkManagerBase::IsVpnMacAddress(global));
 
   EXPECT_FALSE(
-      NetworkManagerBase::IsVpnMacAddress(ArrayView<const uint8_t>(cisco, 5)));
+      NetworkManagerBase::IsVpnMacAddress(std::span<const uint8_t>(cisco, 5)));
   EXPECT_FALSE(NetworkManagerBase::IsVpnMacAddress(five_bytes));
   EXPECT_FALSE(NetworkManagerBase::IsVpnMacAddress(unknown));
   EXPECT_FALSE(NetworkManagerBase::IsVpnMacAddress({}));
diff --git a/rtc_base/openssl_stream_adapter.cc b/rtc_base/openssl_stream_adapter.cc
index 0a410f8..e3a75db 100644
--- a/rtc_base/openssl_stream_adapter.cc
+++ b/rtc_base/openssl_stream_adapter.cc
@@ -21,6 +21,7 @@
 #include <cstring>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
@@ -28,7 +29,6 @@
 #include "absl/functional/any_invocable.h"
 #include "absl/strings/str_format.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
 #include "api/task_queue/pending_task_safety_flag.h"
@@ -248,7 +248,7 @@
   size_t read;
   int error;
   StreamResult result = stream->Read(
-      MakeArrayView(reinterpret_cast<uint8_t*>(out), outl), read, error);
+      std::span(reinterpret_cast<uint8_t*>(out), outl), read, error);
   if (result == SR_SUCCESS) {
     return checked_cast<int>(read);
   } else if (result == SR_BLOCK) {
@@ -266,7 +266,7 @@
   size_t written;
   int error;
   StreamResult result = stream->Write(
-      MakeArrayView(reinterpret_cast<const uint8_t*>(in), inl), written, error);
+      std::span(reinterpret_cast<const uint8_t*>(in), inl), written, error);
   if (result == SR_SUCCESS) {
     return checked_cast<int>(written);
   } else if (result == SR_BLOCK) {
@@ -366,7 +366,7 @@
 
 SSLPeerCertificateDigestError OpenSSLStreamAdapter::SetPeerCertificateDigest(
     absl::string_view digest_alg,
-    ArrayView<const uint8_t> digest_val) {
+    std::span<const uint8_t> digest_val) {
   RTC_DCHECK(!peer_certificate_verified_);
   RTC_DCHECK(!HasPeerCertificateDigest());
   size_t expected_len;
@@ -521,7 +521,7 @@
   // use_context            optional, can be null, 0 (IN). Not used by WebRTC.
   bool success = false;
   key_buffer.AppendData(
-      key_material_size, [&](ArrayView<uint8_t> keying_material) -> size_t {
+      key_material_size, [&](std::span<uint8_t> keying_material) -> size_t {
         int result = SSL_export_keying_material(
             ssl_, keying_material.data(), keying_material.size(),
             kDtlsSrtpExporterLabel.data(), kDtlsSrtpExporterLabel.size(),
@@ -664,7 +664,7 @@
 //
 // StreamInterface Implementation
 //
-StreamResult OpenSSLStreamAdapter::Write(ArrayView<const uint8_t> data,
+StreamResult OpenSSLStreamAdapter::Write(std::span<const uint8_t> data,
                                          size_t& written,
                                          int& error) {
   RTC_DLOG(LS_VERBOSE) << "OpenSSLStreamAdapter::Write(" << data.size() << ")";
@@ -722,7 +722,7 @@
   // not reached
 }
 
-StreamResult OpenSSLStreamAdapter::Read(ArrayView<uint8_t> data,
+StreamResult OpenSSLStreamAdapter::Read(std::span<uint8_t> data,
                                         size_t& read,
                                         int& error) {
   RTC_DLOG(LS_VERBOSE) << "OpenSSLStreamAdapter::Read(" << data.size() << ")";
diff --git a/rtc_base/openssl_stream_adapter.h b/rtc_base/openssl_stream_adapter.h
index 5307eff..b8e531d 100644
--- a/rtc_base/openssl_stream_adapter.h
+++ b/rtc_base/openssl_stream_adapter.h
@@ -17,12 +17,12 @@
 
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <vector>
 
 #include "absl/functional/any_invocable.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/ssl_certificate.h"
 #ifdef OPENSSL_IS_BORINGSSL
@@ -82,7 +82,7 @@
   void SetServerRole(SSLRole role = SSL_SERVER) override;
   SSLPeerCertificateDigestError SetPeerCertificateDigest(
       absl::string_view digest_alg,
-      ArrayView<const uint8_t> digest_val) override;
+      std::span<const uint8_t> digest_val) override;
 
   std::unique_ptr<SSLCertChain> GetPeerSSLCertChain() const override;
 
@@ -95,8 +95,8 @@
   void UpdateRetransmissionTimeout(int timeout_ms) override;
   void SetMTU(int mtu) override;
 
-  StreamResult Read(ArrayView<uint8_t> data, size_t& read, int& error) override;
-  StreamResult Write(ArrayView<const uint8_t> data,
+  StreamResult Read(std::span<uint8_t> data, size_t& read, int& error) override;
+  StreamResult Write(std::span<const uint8_t> data,
                      size_t& written,
                      int& error) override;
   void Close() override;
diff --git a/rtc_base/physical_socket_server.cc b/rtc_base/physical_socket_server.cc
index 66f6493..fb916fb 100644
--- a/rtc_base/physical_socket_server.cc
+++ b/rtc_base/physical_socket_server.cc
@@ -17,9 +17,9 @@
 #include <cstdint>
 #include <cstring>
 #include <memory>
+#include <span>
 #include <utility>
 
-#include "api/array_view.h"
 #include "api/async_dns_resolver.h"
 #include "api/transport/ecn_marking.h"
 #include "api/units/time_delta.h"
@@ -493,7 +493,7 @@
   static constexpr int BUF_SIZE = 64 * 1024;
   buffer.payload.EnsureCapacity(BUF_SIZE);
   int received;
-  buffer.payload.SetData(BUF_SIZE, [&](ArrayView<uint8_t> payload) {
+  buffer.payload.SetData(BUF_SIZE, [&](std::span<uint8_t> payload) {
     received =
         DoReadFromSocket(payload.data(), payload.size(), &buffer.source_address,
                          &timestamp, ecn_ ? &buffer.ecn : nullptr);
diff --git a/rtc_base/server_socket_adapters.cc b/rtc_base/server_socket_adapters.cc
index 339afb7..85047e6 100644
--- a/rtc_base/server_socket_adapters.cc
+++ b/rtc_base/server_socket_adapters.cc
@@ -13,8 +13,8 @@
 #include <cstddef>
 #include <cstdint>
 #include <cstring>
+#include <span>
 
-#include "api/array_view.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/socket.h"
 #include "rtc_base/socket_adapters.h"
@@ -34,7 +34,7 @@
 
 void AsyncSSLServerSocket::ProcessInput(char* data, size_t* len) {
   // We only accept client hello messages.
-  const ArrayView<const uint8_t> client_hello =
+  const std::span<const uint8_t> client_hello =
       AsyncSSLSocket::SslClientHello();
   if (*len < client_hello.size()) {
     return;
@@ -51,7 +51,7 @@
   // Clients should not send more data until the handshake is completed.
   RTC_DCHECK(*len == 0);
 
-  const ArrayView<const uint8_t> server_hello =
+  const std::span<const uint8_t> server_hello =
       AsyncSSLSocket::SslServerHello();
   // Send a server hello back to the client.
   DirectSend(server_hello.data(), server_hello.size());
diff --git a/rtc_base/socket.cc b/rtc_base/socket.cc
index dee6caa..744311c 100644
--- a/rtc_base/socket.cc
+++ b/rtc_base/socket.cc
@@ -12,8 +12,8 @@
 
 #include <algorithm>
 #include <cstdint>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/units/timestamp.h"
 #include "rtc_base/buffer.h"
 
@@ -24,7 +24,7 @@
   int64_t timestamp = -1;
   int len;
   buffer.payload.EnsureCapacity(BUF_SIZE);
-  buffer.payload.SetData(BUF_SIZE, [&](ArrayView<uint8_t> payload) {
+  buffer.payload.SetData(BUF_SIZE, [&](std::span<uint8_t> payload) {
     len = RecvFrom(payload.data(), payload.size(), &buffer.source_address,
                    &timestamp);
     return std::max(len, 0);
diff --git a/rtc_base/socket_adapters.cc b/rtc_base/socket_adapters.cc
index 60d52b2..56b20bd 100644
--- a/rtc_base/socket_adapters.cc
+++ b/rtc_base/socket_adapters.cc
@@ -15,8 +15,8 @@
 #include <cstddef>
 #include <cstdint>
 #include <cstring>
+#include <span>
 
-#include "api/array_view.h"
 #include "rtc_base/async_socket.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
@@ -135,8 +135,8 @@
 };
 
 // static
-ArrayView<const uint8_t> AsyncSSLSocket::SslClientHello() {
-  // Implicit conversion directly from kSslClientHello to ArrayView fails when
+std::span<const uint8_t> AsyncSSLSocket::SslClientHello() {
+  // Implicit conversion directly from kSslClientHello to std::span fails when
   // built with gcc.
   return {kSslClientHello, sizeof(kSslClientHello)};
 }
@@ -163,7 +163,7 @@
 };
 
 // static
-ArrayView<const uint8_t> AsyncSSLSocket::SslServerHello() {
+std::span<const uint8_t> AsyncSSLSocket::SslServerHello() {
   return {kSslServerHello, sizeof(kSslServerHello)};
 }
 
diff --git a/rtc_base/socket_adapters.h b/rtc_base/socket_adapters.h
index 3abd888..e0954a9 100644
--- a/rtc_base/socket_adapters.h
+++ b/rtc_base/socket_adapters.h
@@ -13,8 +13,8 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <span>
 
-#include "api/array_view.h"
 #include "rtc_base/async_socket.h"
 #include "rtc_base/socket.h"
 #include "rtc_base/socket_address.h"
@@ -59,8 +59,8 @@
 // fake SSL handshake. Used for "ssltcp" P2P functionality.
 class AsyncSSLSocket : public BufferedReadAdapter {
  public:
-  static ArrayView<const uint8_t> SslClientHello();
-  static ArrayView<const uint8_t> SslServerHello();
+  static std::span<const uint8_t> SslClientHello();
+  static std::span<const uint8_t> SslServerHello();
 
   explicit AsyncSSLSocket(Socket* socket);
 
diff --git a/rtc_base/ssl_certificate.cc b/rtc_base/ssl_certificate.cc
index 403638c..e144d39 100644
--- a/rtc_base/ssl_certificate.cc
+++ b/rtc_base/ssl_certificate.cc
@@ -13,13 +13,13 @@
 #include <cstddef>
 #include <cstdint>
 #include <memory>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
 
 #include "absl/algorithm/container.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "rtc_base/base64.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/openssl.h"
@@ -83,7 +83,7 @@
 
   Buffer der_buffer;
   ToDER(&der_buffer);
-  ArrayView<const uint8_t> der_view(der_buffer);
+  std::span<const uint8_t> der_view(der_buffer);
   std::string der_base64 = Base64Encode(der_view);
 
   return std::make_unique<SSLCertificateStats>(std::move(fingerprint),
diff --git a/rtc_base/ssl_fingerprint.cc b/rtc_base/ssl_fingerprint.cc
index 5225363..6911d8b 100644
--- a/rtc_base/ssl_fingerprint.cc
+++ b/rtc_base/ssl_fingerprint.cc
@@ -14,11 +14,11 @@
 #include <cstddef>
 #include <cstdint>
 #include <memory>
+#include <span>
 #include <string>
 
 #include "absl/algorithm/container.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/logging.h"
 #include "rtc_base/message_digest.h"
@@ -68,13 +68,13 @@
 
   char value[MessageDigest::kMaxSize];
   size_t value_len =
-      hex_decode_with_delimiter(ArrayView<char>(value), fingerprint, ':');
+      hex_decode_with_delimiter(std::span<char>(value), fingerprint, ':');
   if (!value_len)
     return nullptr;
 
   return std::make_unique<SSLFingerprint>(
       algorithm,
-      ArrayView<const uint8_t>(reinterpret_cast<uint8_t*>(value), value_len));
+      std::span<const uint8_t>(reinterpret_cast<uint8_t*>(value), value_len));
 }
 
 std::unique_ptr<SSLFingerprint> SSLFingerprint::CreateFromCertificate(
@@ -96,13 +96,13 @@
 }
 
 SSLFingerprint::SSLFingerprint(absl::string_view algorithm,
-                               ArrayView<const uint8_t> digest_view)
+                               std::span<const uint8_t> digest_view)
     : algorithm(algorithm), digest(digest_view.data(), digest_view.size()) {}
 
 SSLFingerprint::SSLFingerprint(absl::string_view algorithm,
                                const uint8_t* digest_in,
                                size_t digest_len)
-    : SSLFingerprint(algorithm, MakeArrayView(digest_in, digest_len)) {}
+    : SSLFingerprint(algorithm, std::span(digest_in, digest_len)) {}
 
 bool SSLFingerprint::operator==(const SSLFingerprint& other) const {
   return algorithm == other.algorithm && digest == other.digest;
diff --git a/rtc_base/ssl_fingerprint.h b/rtc_base/ssl_fingerprint.h
index 89757f4..103e4a2 100644
--- a/rtc_base/ssl_fingerprint.h
+++ b/rtc_base/ssl_fingerprint.h
@@ -15,10 +15,10 @@
 #include <stdint.h>
 
 #include <memory>
+#include <span>
 #include <string>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "rtc_base/copy_on_write_buffer.h"
 #include "rtc_base/rtc_certificate.h"
 #include "rtc_base/ssl_certificate.h"
@@ -53,7 +53,7 @@
       const RTCCertificate& cert);
 
   SSLFingerprint(absl::string_view algorithm,
-                 ArrayView<const uint8_t> digest_view);
+                 std::span<const uint8_t> digest_view);
   // TODO(steveanton): Remove once downstream projects have moved off of this.
   SSLFingerprint(absl::string_view algorithm,
                  const uint8_t* digest_in,
diff --git a/rtc_base/ssl_identity.cc b/rtc_base/ssl_identity.cc
index 2186d3a..f68797a 100644
--- a/rtc_base/ssl_identity.cc
+++ b/rtc_base/ssl_identity.cc
@@ -18,11 +18,11 @@
 #include <ctime>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <utility>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "rtc_base/checks.h"
 #ifdef OPENSSL_IS_BORINGSSL
 #include "rtc_base/boringssl_identity.h"
@@ -206,7 +206,7 @@
   StringBuilder result;
   result << "-----BEGIN " << pem_type << "-----\n";
 
-  ArrayView<const uint8_t> data_view(data, length);
+  std::span<const uint8_t> data_view(data, length);
   std::string b64_encoded = Base64Encode(data_view);
   // Divide the Base-64 encoded data into 64-character chunks, as per 4.3.2.4
   // of RFC 1421.
diff --git a/rtc_base/ssl_stream_adapter.cc b/rtc_base/ssl_stream_adapter.cc
index d02318b..59216f0 100644
--- a/rtc_base/ssl_stream_adapter.cc
+++ b/rtc_base/ssl_stream_adapter.cc
@@ -15,13 +15,13 @@
 #include <memory>
 #include <optional>
 #include <set>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
 
 #include "absl/functional/any_invocable.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/field_trials_view.h"
 #include "rtc_base/openssl_stream_adapter.h"
 #include "rtc_base/ssl_identity.h"
@@ -181,7 +181,7 @@
     SSLPeerCertificateDigestError* error) {
   unsigned char* nonconst_val = const_cast<unsigned char*>(digest_val);
   SSLPeerCertificateDigestError ret = SetPeerCertificateDigest(
-      digest_alg, ArrayView<uint8_t>(nonconst_val, digest_len));
+      digest_alg, std::span<uint8_t>(nonconst_val, digest_len));
   if (error)
     *error = ret;
   return ret == SSLPeerCertificateDigestError::NONE;
diff --git a/rtc_base/ssl_stream_adapter.h b/rtc_base/ssl_stream_adapter.h
index f35076c..75e6729 100644
--- a/rtc_base/ssl_stream_adapter.h
+++ b/rtc_base/ssl_stream_adapter.h
@@ -17,12 +17,12 @@
 #include <memory>
 #include <optional>
 #include <set>
+#include <span>
 #include <string>
 #include <vector>
 
 #include "absl/functional/any_invocable.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/field_trials_view.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/checks.h"
@@ -191,9 +191,9 @@
   // Returns SSLPeerCertificateDigestError::NONE if successful.
   virtual SSLPeerCertificateDigestError SetPeerCertificateDigest(
       absl::string_view digest_alg,
-      ArrayView<const uint8_t> digest_val) = 0;
+      std::span<const uint8_t> digest_val) = 0;
   [[deprecated(
-      "Use SetPeerCertificateDigest with ArrayView instead")]] virtual bool
+      "Use SetPeerCertificateDigest with std::span instead")]] virtual bool
   SetPeerCertificateDigest(absl::string_view digest_alg,
                            const unsigned char* digest_val,
                            size_t digest_len,
diff --git a/rtc_base/ssl_stream_adapter_unittest.cc b/rtc_base/ssl_stream_adapter_unittest.cc
index 668a98c..67bfc10 100644
--- a/rtc_base/ssl_stream_adapter_unittest.cc
+++ b/rtc_base/ssl_stream_adapter_unittest.cc
@@ -25,6 +25,7 @@
 #include <ctime>
 #include <memory>
 #include <set>
+#include <span>
 #include <string>
 #include <tuple>
 #include <utility>
@@ -32,7 +33,6 @@
 
 #include "absl/memory/memory.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/crypto/crypto_options.h"
 #include "api/field_trials.h"
 #include "api/sequence_checker.h"
@@ -237,13 +237,13 @@
   }
   size_t GetFlushCountForTesting() { return flush_count_; }
 
-  StreamResult Read(ArrayView<uint8_t> buffer,
+  StreamResult Read(std::span<uint8_t> buffer,
                     size_t& read,
                     int& error) override {
     return stream_->Read(buffer, read, error);
   }
 
-  StreamResult Write(ArrayView<const uint8_t> data,
+  StreamResult Write(std::span<const uint8_t> data,
                      size_t& written,
                      int& error) override {
     return stream_->Write(data, written, error);
@@ -277,7 +277,7 @@
 
   StreamState GetState() const override { return SS_OPEN; }
 
-  StreamResult Read(ArrayView<uint8_t> buffer,
+  StreamResult Read(std::span<uint8_t> buffer,
                     size_t& read,
                     int& error) override {
     StreamResult r;
@@ -318,13 +318,13 @@
   }
 
   // Write to the outgoing FifoBuffer
-  StreamResult WriteData(ArrayView<const uint8_t> data,
+  StreamResult WriteData(std::span<const uint8_t> data,
                          size_t& written,
                          int& error) {
     return out_->Write(data, written, error);
   }
 
-  StreamResult Write(ArrayView<const uint8_t> data,
+  StreamResult Write(std::span<const uint8_t> data,
                      size_t& written,
                      int& error) override;
 
@@ -362,7 +362,7 @@
   StreamState GetState() const override { return SS_OPEN; }
 
   // Reading a buffer queue stream will either succeed or block.
-  StreamResult Read(ArrayView<uint8_t> buffer,
+  StreamResult Read(std::span<uint8_t> buffer,
                     size_t& read,
                     int& error) override {
     const bool was_writable = buffer_.is_writable();
@@ -376,7 +376,7 @@
   }
 
   // Writing to a buffer queue stream will either succeed or block.
-  StreamResult Write(ArrayView<const uint8_t> data,
+  StreamResult Write(std::span<const uint8_t> data,
                      size_t& written,
                      int& error) override {
     const bool was_readable = buffer_.is_readable();
@@ -762,12 +762,12 @@
       RTC_LOG(LS_VERBOSE) << "Damaging packet";
       memcpy(&buf[0], data, data_len);
       buf[data_len - 1]++;
-      return from->WriteData(MakeArrayView(&buf[0], data_len), written, error);
+      return from->WriteData(std::span(&buf[0], data_len), written, error);
     }
 
     return from->WriteData(
-        MakeArrayView(reinterpret_cast<const uint8_t*>(data), data_len),
-        written, error);
+        std::span(reinterpret_cast<const uint8_t*>(data), data_len), written,
+        error);
   }
 
   void SetDelay(int delay) { delay_ = delay; }
@@ -926,7 +926,7 @@
       size_t sent;
       int error;
       StreamResult rv =
-          client_ssl_->Write(MakeArrayView(packet, packet_size_), sent, error);
+          client_ssl_->Write(std::span(packet, packet_size_), sent, error);
       if (rv == SR_SUCCESS) {
         RTC_LOG(LS_VERBOSE) << "Sent: " << sent_;
         sent_++;
@@ -1016,7 +1016,7 @@
   std::set<int> received_;
 };
 
-webrtc::StreamResult SSLDummyStream::Write(ArrayView<const uint8_t> data,
+webrtc::StreamResult SSLDummyStream::Write(std::span<const uint8_t> data,
                                            size_t& written,
                                            int& error) {
   RTC_LOG(LS_VERBOSE) << "Writing to loopback " << data.size();
diff --git a/rtc_base/stream.h b/rtc_base/stream.h
index a819156..07da226 100644
--- a/rtc_base/stream.h
+++ b/rtc_base/stream.h
@@ -13,10 +13,10 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <span>
 #include <utility>
 
 #include "absl/functional/any_invocable.h"
-#include "api/array_view.h"
 #include "api/sequence_checker.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/system/no_unique_address.h"
@@ -74,10 +74,10 @@
   //  SR_EOS: the end-of-stream has been reached, or the stream is in the
   //    SS_CLOSED state.
 
-  virtual StreamResult Read(ArrayView<uint8_t> buffer,
+  virtual StreamResult Read(std::span<uint8_t> buffer,
                             size_t& read,
                             int& error) = 0;
-  virtual StreamResult Write(ArrayView<const uint8_t> data,
+  virtual StreamResult Write(std::span<const uint8_t> data,
                              size_t& written,
                              int& error) = 0;
 
diff --git a/rtc_base/string_encode.cc b/rtc_base/string_encode.cc
index 6b0b1e00..717b832 100644
--- a/rtc_base/string_encode.cc
+++ b/rtc_base/string_encode.cc
@@ -11,11 +11,11 @@
 #include "rtc_base/string_encode.h"
 
 #include <cstdio>
+#include <span>
 #include <string>
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "rtc_base/checks.h"
 
 namespace webrtc {
@@ -91,7 +91,7 @@
   return s;
 }
 
-size_t hex_decode_with_delimiter(ArrayView<char> cbuffer,
+size_t hex_decode_with_delimiter(std::span<char> cbuffer,
                                  absl::string_view source,
                                  char delimiter) {
   if (cbuffer.empty())
@@ -131,7 +131,7 @@
   return bufpos;
 }
 
-size_t hex_decode(ArrayView<char> buffer, absl::string_view source) {
+size_t hex_decode(std::span<char> buffer, absl::string_view source) {
   return hex_decode_with_delimiter(buffer, source, 0);
 }
 
diff --git a/rtc_base/string_encode.h b/rtc_base/string_encode.h
index fb2a6e0..187d837 100644
--- a/rtc_base/string_encode.h
+++ b/rtc_base/string_encode.h
@@ -14,12 +14,12 @@
 #include <stddef.h>
 
 #include <optional>
+#include <span>
 #include <string>
 #include <type_traits>
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/string_to_number.h"
 #include "rtc_base/strings/string_format.h"  // IWYU pragma: keep
@@ -34,13 +34,13 @@
 std::string hex_encode_with_delimiter(absl::string_view source, char delimiter);
 
 // hex_decode converts ascii hex to binary.
-size_t hex_decode(ArrayView<char> buffer, absl::string_view source);
+size_t hex_decode(std::span<char> buffer, absl::string_view source);
 
 // hex_decode, assuming that there is a delimiter between every byte
 // pair.
 // `delimiter` == 0 means no delimiter
 // If the buffer is too short or the data is invalid, we return 0.
-size_t hex_decode_with_delimiter(ArrayView<char> buffer,
+size_t hex_decode_with_delimiter(std::span<char> buffer,
                                  absl::string_view source,
                                  char delimiter);
 
diff --git a/rtc_base/string_encode_unittest.cc b/rtc_base/string_encode_unittest.cc
index d26cd6b..701e52d 100644
--- a/rtc_base/string_encode_unittest.cc
+++ b/rtc_base/string_encode_unittest.cc
@@ -11,11 +11,11 @@
 #include "rtc_base/string_encode.h"
 
 #include <cstring>
+#include <span>
 #include <string>
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -39,7 +39,7 @@
 TEST_F(HexEncodeTest, TestWithNoDelimiter) {
   std::string encoded = hex_encode(data_view_);
   EXPECT_EQ("80818283848586878889", encoded);
-  dec_res_ = hex_decode(ArrayView<char>(decoded_), encoded);
+  dec_res_ = hex_decode(std::span<char>(decoded_), encoded);
   ASSERT_EQ(sizeof(data_), dec_res_);
   ASSERT_EQ(0, memcmp(data_, decoded_, dec_res_));
 }
@@ -48,7 +48,7 @@
 TEST_F(HexEncodeTest, TestWithDelimiter) {
   std::string encoded = hex_encode_with_delimiter(data_view_, ':');
   EXPECT_EQ("80:81:82:83:84:85:86:87:88:89", encoded);
-  dec_res_ = hex_decode_with_delimiter(ArrayView<char>(decoded_), encoded, ':');
+  dec_res_ = hex_decode_with_delimiter(std::span<char>(decoded_), encoded, ':');
   ASSERT_EQ(sizeof(data_), dec_res_);
   ASSERT_EQ(0, memcmp(data_, decoded_, dec_res_));
 }
@@ -56,7 +56,7 @@
 // Test that encoding with one delimiter and decoding with another fails.
 TEST_F(HexEncodeTest, TestWithWrongDelimiter) {
   std::string encoded = hex_encode_with_delimiter(data_view_, ':');
-  dec_res_ = hex_decode_with_delimiter(ArrayView<char>(decoded_), encoded, '/');
+  dec_res_ = hex_decode_with_delimiter(std::span<char>(decoded_), encoded, '/');
   ASSERT_EQ(0U, dec_res_);
 }
 
@@ -64,7 +64,7 @@
 TEST_F(HexEncodeTest, TestExpectedDelimiter) {
   std::string encoded = hex_encode(data_view_);
   EXPECT_EQ(sizeof(data_) * 2, encoded.size());
-  dec_res_ = hex_decode_with_delimiter(ArrayView<char>(decoded_), encoded, ':');
+  dec_res_ = hex_decode_with_delimiter(std::span<char>(decoded_), encoded, ':');
   ASSERT_EQ(0U, dec_res_);
 }
 
@@ -72,7 +72,7 @@
 TEST_F(HexEncodeTest, TestExpectedNoDelimiter) {
   std::string encoded = hex_encode_with_delimiter(data_view_, ':');
   EXPECT_EQ(sizeof(data_) * 3 - 1, encoded.size());
-  dec_res_ = hex_decode(ArrayView<char>(decoded_), encoded);
+  dec_res_ = hex_decode(std::span<char>(decoded_), encoded);
   ASSERT_EQ(0U, dec_res_);
 }
 
@@ -80,7 +80,7 @@
 TEST_F(HexEncodeTest, TestZeroLengthNoDelimiter) {
   std::string encoded = hex_encode("");
   EXPECT_TRUE(encoded.empty());
-  dec_res_ = hex_decode(ArrayView<char>(decoded_), encoded);
+  dec_res_ = hex_decode(std::span<char>(decoded_), encoded);
   ASSERT_EQ(0U, dec_res_);
 }
 
@@ -88,47 +88,47 @@
 TEST_F(HexEncodeTest, TestZeroLengthWithDelimiter) {
   std::string encoded = hex_encode_with_delimiter("", ':');
   EXPECT_TRUE(encoded.empty());
-  dec_res_ = hex_decode_with_delimiter(ArrayView<char>(decoded_), encoded, ':');
+  dec_res_ = hex_decode_with_delimiter(std::span<char>(decoded_), encoded, ':');
   ASSERT_EQ(0U, dec_res_);
 }
 
 // Test that decoding into a too-small output buffer fails.
 TEST_F(HexEncodeTest, TestDecodeTooShort) {
   dec_res_ =
-      hex_decode_with_delimiter(ArrayView<char>(decoded_, 4), "0123456789", 0);
+      hex_decode_with_delimiter(std::span<char>(decoded_, 4), "0123456789", 0);
   ASSERT_EQ(0U, dec_res_);
   ASSERT_EQ(0x7f, decoded_[4]);
 }
 
 // Test that decoding non-hex data fails.
 TEST_F(HexEncodeTest, TestDecodeBogusData) {
-  dec_res_ = hex_decode_with_delimiter(ArrayView<char>(decoded_), "axyz", 0);
+  dec_res_ = hex_decode_with_delimiter(std::span<char>(decoded_), "axyz", 0);
   ASSERT_EQ(0U, dec_res_);
 }
 
 // Test that decoding an odd number of hex characters fails.
 TEST_F(HexEncodeTest, TestDecodeOddHexDigits) {
-  dec_res_ = hex_decode_with_delimiter(ArrayView<char>(decoded_), "012", 0);
+  dec_res_ = hex_decode_with_delimiter(std::span<char>(decoded_), "012", 0);
   ASSERT_EQ(0U, dec_res_);
 }
 
 // Test that decoding a string with too many delimiters fails.
 TEST_F(HexEncodeTest, TestDecodeWithDelimiterTooManyDelimiters) {
-  dec_res_ = hex_decode_with_delimiter(ArrayView<char>(decoded_, 4),
+  dec_res_ = hex_decode_with_delimiter(std::span<char>(decoded_, 4),
                                        "01::23::45::67", ':');
   ASSERT_EQ(0U, dec_res_);
 }
 
 // Test that decoding a string with a leading delimiter fails.
 TEST_F(HexEncodeTest, TestDecodeWithDelimiterLeadingDelimiter) {
-  dec_res_ = hex_decode_with_delimiter(ArrayView<char>(decoded_, 4),
+  dec_res_ = hex_decode_with_delimiter(std::span<char>(decoded_, 4),
                                        ":01:23:45:67", ':');
   ASSERT_EQ(0U, dec_res_);
 }
 
 // Test that decoding a string with a trailing delimiter fails.
 TEST_F(HexEncodeTest, TestDecodeWithDelimiterTrailingDelimiter) {
-  dec_res_ = hex_decode_with_delimiter(ArrayView<char>(decoded_, 4),
+  dec_res_ = hex_decode_with_delimiter(std::span<char>(decoded_, 4),
                                        "01:23:45:67:", ':');
   ASSERT_EQ(0U, dec_res_);
 }
diff --git a/rtc_base/strings/string_builder.cc b/rtc_base/strings/string_builder.cc
index 094bbd1..f52445a 100644
--- a/rtc_base/strings/string_builder.cc
+++ b/rtc_base/strings/string_builder.cc
@@ -13,15 +13,15 @@
 #include <cstdarg>
 #include <cstdio>
 #include <cstring>
+#include <span>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/numerics/safe_minmax.h"
 
 namespace webrtc {
 
-SimpleStringBuilder::SimpleStringBuilder(ArrayView<char> buffer)
+SimpleStringBuilder::SimpleStringBuilder(std::span<char> buffer)
     : buffer_(buffer) {
   buffer_[0] = '\0';
   RTC_DCHECK(IsConsistent());
diff --git a/rtc_base/strings/string_builder.h b/rtc_base/strings/string_builder.h
index 9f6fb33..41efe9a 100644
--- a/rtc_base/strings/string_builder.h
+++ b/rtc_base/strings/string_builder.h
@@ -12,13 +12,13 @@
 #define RTC_BASE_STRINGS_STRING_BUILDER_H_
 
 #include <cstdio>
+#include <span>
 #include <string>
 #include <utility>
 
 #include "absl/strings/has_absl_stringify.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 
 namespace webrtc {
 
@@ -29,7 +29,7 @@
 // read via `str()`.
 class SimpleStringBuilder {
  public:
-  explicit SimpleStringBuilder(ArrayView<char> buffer);
+  explicit SimpleStringBuilder(std::span<char> buffer);
   SimpleStringBuilder(const SimpleStringBuilder&) = delete;
   SimpleStringBuilder& operator=(const SimpleStringBuilder&) = delete;
 
@@ -76,7 +76,7 @@
   // size allows the buffer to be stack allocated, which helps performance.
   // Having a fixed size is furthermore useful to avoid unnecessary resizing
   // while building it.
-  const ArrayView<char> buffer_;
+  const std::span<char> buffer_;
 
   // Represents the number of characters written to the buffer.
   // This does not include the terminating '\0'.
diff --git a/rtc_base/text2pcap.cc b/rtc_base/text2pcap.cc
index 74f8448..8b0e73d 100644
--- a/rtc_base/text2pcap.cc
+++ b/rtc_base/text2pcap.cc
@@ -10,16 +10,16 @@
 #include "rtc_base/text2pcap.h"
 
 #include <cstdint>
+#include <span>
 #include <string>
 
-#include "api/array_view.h"
 #include "rtc_base/strings/string_builder.h"
 #include "rtc_base/time_utils.h"
 
 namespace webrtc {
 
 std::string Text2Pcap::DumpPacket(bool outbound,
-                                  ArrayView<const uint8_t> payload,
+                                  std::span<const uint8_t> payload,
                                   int64_t timestamp_ms) {
   webrtc::StringBuilder s;
   s << "\n" << (outbound ? "O " : "I ");
diff --git a/rtc_base/text2pcap.h b/rtc_base/text2pcap.h
index 1f384ec..5826e97 100644
--- a/rtc_base/text2pcap.h
+++ b/rtc_base/text2pcap.h
@@ -11,10 +11,9 @@
 #define RTC_BASE_TEXT2PCAP_H_
 
 #include <cstdint>
+#include <span>
 #include <string>
 
-#include "api/array_view.h"
-
 namespace webrtc {
 
 class Text2Pcap {
@@ -29,7 +28,7 @@
   // newline and has a grep-able suffix (e.g. ` # SCTP_PACKET` or ` # RTP_DUMP`)
   // for easy extraction from logs.
   static std::string DumpPacket(bool outbound,
-                                ArrayView<const uint8_t> payload,
+                                std::span<const uint8_t> payload,
                                 int64_t timestamp_ms);
 };
 
diff --git a/rtc_base/unique_id_generator.cc b/rtc_base/unique_id_generator.cc
index d09f35b..a6cac6b 100644
--- a/rtc_base/unique_id_generator.cc
+++ b/rtc_base/unique_id_generator.cc
@@ -13,11 +13,11 @@
 #include <cstdint>
 #include <limits>
 #include <optional>
+#include <span>
 #include <string>
 
 #include "absl/strings/str_cat.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/crypto_random.h"
 #include "rtc_base/string_to_number.h"
@@ -26,7 +26,7 @@
 namespace webrtc {
 
 UniqueRandomIdGenerator::UniqueRandomIdGenerator() : known_ids_() {}
-UniqueRandomIdGenerator::UniqueRandomIdGenerator(ArrayView<uint32_t> known_ids)
+UniqueRandomIdGenerator::UniqueRandomIdGenerator(std::span<uint32_t> known_ids)
     : known_ids_(known_ids.begin(), known_ids.end()) {}
 
 UniqueRandomIdGenerator::~UniqueRandomIdGenerator() = default;
@@ -49,7 +49,7 @@
 }
 
 UniqueStringGenerator::UniqueStringGenerator() : unique_number_generator_() {}
-UniqueStringGenerator::UniqueStringGenerator(ArrayView<std::string> known_ids) {
+UniqueStringGenerator::UniqueStringGenerator(std::span<std::string> known_ids) {
   for (const std::string& str : known_ids) {
     AddKnownId(str);
   }
diff --git a/rtc_base/unique_id_generator.h b/rtc_base/unique_id_generator.h
index 64491c4..4dd31ee 100644
--- a/rtc_base/unique_id_generator.h
+++ b/rtc_base/unique_id_generator.h
@@ -14,11 +14,11 @@
 #include <cstdint>
 #include <limits>
 #include <set>
+#include <span>
 #include <string>
 #include <type_traits>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/sequence_checker.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/synchronization/mutex.h"
@@ -41,7 +41,7 @@
   typedef TIntegral value_type;
   UniqueNumberGenerator();
   // Creates a generator that will never return any value from the given list.
-  explicit UniqueNumberGenerator(ArrayView<TIntegral> known_ids);
+  explicit UniqueNumberGenerator(std::span<TIntegral> known_ids);
   ~UniqueNumberGenerator();
 
   // Generates a number that this generator has never produced before.
@@ -74,7 +74,7 @@
   typedef uint32_t value_type;
   UniqueRandomIdGenerator();
   // Create a generator that will never return any value from the given list.
-  explicit UniqueRandomIdGenerator(ArrayView<uint32_t> known_ids);
+  explicit UniqueRandomIdGenerator(std::span<uint32_t> known_ids);
   ~UniqueRandomIdGenerator();
 
   // Generates a random id that this generator has never produced before.
@@ -105,7 +105,7 @@
  public:
   typedef std::string value_type;
   UniqueStringGenerator();
-  explicit UniqueStringGenerator(ArrayView<std::string> known_ids);
+  explicit UniqueStringGenerator(std::span<std::string> known_ids);
   ~UniqueStringGenerator();
 
   std::string GenerateString();
@@ -126,7 +126,7 @@
 
 template <typename TIntegral>
 UniqueNumberGenerator<TIntegral>::UniqueNumberGenerator(
-    ArrayView<TIntegral> known_ids)
+    std::span<TIntegral> known_ids)
     : counter_(0), known_ids_(known_ids.begin(), known_ids.end()) {}
 
 template <typename TIntegral>
diff --git a/rtc_base/virtual_socket_unittest.cc b/rtc_base/virtual_socket_unittest.cc
index 8a7c806..e3081b8 100644
--- a/rtc_base/virtual_socket_unittest.cc
+++ b/rtc_base/virtual_socket_unittest.cc
@@ -17,11 +17,11 @@
 #include <cstring>
 #include <ctime>
 #include <memory>
+#include <span>
 #include <utility>
 #include <vector>
 
 #include "absl/memory/memory.h"
-#include "api/array_view.h"
 #include "api/environment/environment.h"
 #include "api/transport/ecn_marking.h"
 #include "api/units/time_delta.h"
@@ -186,8 +186,8 @@
     } else if (post_ip.family() == AF_INET6) {
       in6_addr post_ip6 = post_ip.ipv6_address();
       in6_addr pre_ip6 = pre_ip.ipv6_address();
-      ArrayView<uint8_t, 16> post_bytes = post_ip6.s6_addr;
-      ArrayView<uint8_t, 16> pre_bytes = pre_ip6.s6_addr;
+      std::span<uint8_t, 16> post_bytes = post_ip6.s6_addr;
+      std::span<uint8_t, 16> pre_bytes = pre_ip6.s6_addr;
       EXPECT_THAT(post_bytes.subspan(12, 4),
                   Pointwise(Eq(), pre_bytes.subspan(12, 4)));
     }
diff --git a/rtc_base/zero_memory.h b/rtc_base/zero_memory.h
index 6229a1e..5af33ad 100644
--- a/rtc_base/zero_memory.h
+++ b/rtc_base/zero_memory.h
@@ -13,10 +13,9 @@
 
 #include <stddef.h>
 
+#include <span>
 #include <type_traits>
 
-#include "api/array_view.h"
-
 namespace webrtc {
 
 // Fill memory with zeros in a way that the compiler doesn't optimize it away
@@ -26,7 +25,7 @@
 template <typename T,
           typename std::enable_if<!std::is_const<T>::value &&
                                   std::is_trivial<T>::value>::type* = nullptr>
-void ExplicitZeroMemory(ArrayView<T> a) {
+void ExplicitZeroMemory(std::span<T> a) {
   ExplicitZeroMemory(a.data(), a.size());
 }
 
diff --git a/rtc_base/zero_memory_unittest.cc b/rtc_base/zero_memory_unittest.cc
index 5a8804c..dde2898 100644
--- a/rtc_base/zero_memory_unittest.cc
+++ b/rtc_base/zero_memory_unittest.cc
@@ -12,8 +12,8 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <span>
 
-#include "api/array_view.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -30,13 +30,13 @@
   }
 }
 
-TEST(ZeroMemoryTest, TestZeroArrayView) {
+TEST(ZeroMemoryTest, TestZeroSpan) {
   static const size_t kBufferSize = 32;
   uint8_t buffer[kBufferSize];
   for (size_t i = 0; i < kBufferSize; i++) {
     buffer[i] = static_cast<uint8_t>(i + 1);
   }
-  ExplicitZeroMemory(ArrayView<uint8_t>(buffer, sizeof(buffer)));
+  ExplicitZeroMemory(std::span<uint8_t>(buffer, sizeof(buffer)));
   for (size_t i = 0; i < kBufferSize; i++) {
     EXPECT_EQ(buffer[i], 0);
   }