diff --git a/av/video/frame.pyx b/av/video/frame.pyx
index 6a3add3e1a4d86a619a80e34ca9a9f0dae1f1ab1..c2a6134be8baad5a00bd4b3e27ad5768f2b4c81c 100644
--- a/av/video/frame.pyx
+++ b/av/video/frame.pyx
@@ -66,10 +66,10 @@ cdef useful_array(VideoPlane plane, unsigned int bytes_per_pixel=1, str dtype='u
     import numpy as np
     cdef size_t total_line_size = abs(plane.line_size)
     cdef size_t useful_line_size = plane.width * bytes_per_pixel
-    arr = np.frombuffer(plane, np.dtype(dtype))
+    arr = np.frombuffer(plane, np.uint8)
     if total_line_size != useful_line_size:
         arr = arr.reshape(-1, total_line_size)[:, 0:useful_line_size].reshape(-1)
-    return arr
+    return arr.view(np.dtype(dtype))
 
 
 cdef class VideoFrame(Frame):
diff --git a/tests/test_videoframe.py b/tests/test_videoframe.py
index 09ab06b13dca5673551e572b06c51e3ce4471d22..6b9a99a4b9327a56f88c8bec5c202958062f7592 100644
--- a/tests/test_videoframe.py
+++ b/tests/test_videoframe.py
@@ -291,6 +291,17 @@ class TestVideoFrameNdarray(TestCase):
         # check endianness by examining red value of first pixel
         self.assertPixelValue16(frame.planes[0], array[0][0][0], "little")
 
+    def test_ndarray_rgb48le_align(self):
+        array = numpy.random.randint(0, 65536, size=(238, 318, 3), dtype=numpy.uint16)
+        frame = VideoFrame.from_ndarray(array, format="rgb48le")
+        self.assertEqual(frame.width, 318)
+        self.assertEqual(frame.height, 238)
+        self.assertEqual(frame.format.name, "rgb48le")
+        self.assertNdarraysEqual(frame.to_ndarray(), array)
+
+        # check endianness by examining red value of first pixel
+        self.assertPixelValue16(frame.planes[0], array[0][0][0], "little")
+
     def test_ndarray_rgba64be(self):
         array = numpy.random.randint(0, 65536, size=(480, 640, 4), dtype=numpy.uint16)
         frame = VideoFrame.from_ndarray(array, format="rgba64be")