We've been looking for an HDMI capture card that
- works on Linux;
- has low latency;
- and has an USB interface so it can be used with our laptops on stage.
Our main use for this would be to capture what's happening live onstage and display it on a projector.
A cheap option
Magewell have a USB 3.0 capture card, USB Capture HDMI, that is available at the time of writing for around £300. However, being the enterprising sort, we found very similar looking unbranded cards for around £100 from various Chinese suppliers.
So for £112.54 + postage + import tax, we ordered one.
N.B. we purchased from TomTop and it was sold as the HDV-UH60 USB 3.0 Capture H to USB3.0 Video Capture Dongle HD.
Does it work?
Yes. On Arch Linux and Windows 7. Note: on Arch Linux one of us had problems with the video freezing, although we couldn't reproduce it on the other one's laptop.
But - it is cheap for a reason. The audio quality seemed to be fine, but the video was not true HD and suffered from latency.
High latency and low quality video
There's about 200ms of latency to the input on linux, which is too high to feel realtime. Using qv4l2 to open the device.
Again the same, around 200ms of latency. This was captured using PotPlayer.
The video quality isn't true HD. This is some weird hack to fill the screen with pixels.
Here's a screen shot of a frame coming from qv4l2, (I had exactly the same results on Windows 7, so it does not seem to be an OS/driver issue).
Something's not quite right - let's zoom in on some of the straight lines, e.g., Lloyd's glasses.
Not good - we can see some strange jagged, zig-zag artefacts on the glasses frame.
Is it interlaced? Let's use GIMP's deinterlace filter.
That didn't fix it, just made it a different kind of blocky.
Let's zoom in further and look at these artefacts in the original image.
Now we can see that a pattern in these artefacts, it seems that there are two rows of pixels alternating in an ABAB pattern.
Let's try shifting it to be an AABB pattern using a bit of python.
import numpy as np import matplotlib.pyplot as plt from scipy import misc image = misc.imread('uvc-snapshot.png') image_shifted = np.array(image, copy=True) for i, row in enumerate(image): sub_index = i % 4 if sub_index == 0 or sub_index == 3: next_index = i elif sub_index == 1: next_index = i + 1 elif sub_index == 2: next_index = i - 1 next_index = min(next_index, image_shifted.shape - 1) image_shifted[next_index] = row misc.imsave('figure.png', image_shifted) plt.imshow(image_shifted) plt.show()
Which outputs something like this...
Which has better looking zig-zags, but still doesn't look right. It would also need to be implemented as a filter in native to be feasible to run in realtime.
A close up of the new AABB pattern
Overall it seems that they are cheating by only using half the horizontal resolution (so at 1080p, they would have 540 rows instead of 1080, half the processing), and then reusing rows. Maybe this allows them to use a cheaper FPGA chip, thus reducing the price.
It would be interesting to see how different the board layout is to a Magewell card. If anyone has one, and is willing to take off their case, feel free to send a photo.
We can see it has some sort of FPGA board under the heatsink (we didn't take the heatsink off, so we don't know what chip it is). There is an unpopulated JTAG header for programming for using the FPGA.
The other chips are
- in U10 a CYUSB3014-BZXC USB 3.0 Controller
- in U5 a ADV7611 HDMI Receiver
- in U2 it looks like D9RZH is some DRAM, can't find an exact product page.
Good points -
- Audio works
- Driverless, works on Linux and Windows 7
Bad points -
- Not really HD
- Weird, ugly scaling artifacts
- High latency, not useful for realtime application
- Freezing issues on some Linux machines