[pvrusb2] Preventing drop-outs while capturing video?
Charles Green
charleswgreenjr at yahoo.com
Sun Mar 6 10:14:49 CST 2011
I did the same sort of thing on a *ix system many, many moons ago (around 20
years??), when I noticed how inefficient even 'dd' was - wrote a very simple
stdin-to-stdout copy utility using non-blocking read/write into/out_of a
circular buffer. It's amazing what a performance impact it had, yet I wouldn't
be surprised to find that today's Linix system utilities (dd, cp, et al) STILL
don't make use of this facility...
-Charles
________________________________
From: Andrew Munkres <amunkres at nyx.net>
To: pvrusb2 at isely.net
Sent: Fri, March 4, 2011 9:28:53 AM
Subject: [pvrusb2] Preventing drop-outs while capturing video?
Hello all,
I was trying to use a PVR USB2 to capture some fairly long VHS tapes. I noticed
that there were some small discontinuities in the captured video where a
split-second was missing. I was initially doing the capture with mencoder, like
this:
mencoder -ovc copy -oac copy -o output.avi /dev/video0
I think I might have also tried mplayer, doing something like this:
mplayer -dumpstream -dumpfile output.mpeg /dev/video0
I also tried cat, something like this:
cat < /dev/video0 > output.mpeg
(I might have also tried dd.) I got video drop-outs regardless of which program
I used. However, one time I did the capture sort of like this (I don't remember
exactly):
mkfifo fifo
mencoder -ovc copy -oac copy -o fifo /dev/video0 & ssh remotehost 'cat - >
out.avi' < fifo &
(The purpose of that was to store the video on another system with more free
disk space.) That time, I didn't get any drop-outs. Unlike in the earlier
examples, in this one, the program reading from /dev/video0 isn't directly
writing to a regular file on disk.
So, I'm guessing that the trouble happened because the (blocking) writes to the
disk were delaying the reads from /dev/video0. If that's the case, then it seems
like a solution would be to do non-blocking reads from /dev/video0 into a large
circular buffer, and then have a separate process (or thread) which moves the
data from the circular buffer to a regular file. (That way, the reader process
can still do reads even when the writer process is blocked waiting for a write
to finish, as long as the buffer isn't full.)
I wrote a small program which can do that; it does non-blocking reads from stdin
into a 16 MB circbuf, non-blocking writes from the circbuf to stdout, and then
you pipe its stdout to another program which does the (blocking) writes to a
file on disk. I named this program "flywheel". For example, it can be used to
capture video like this:
chrt -r 99 flywheel < /dev/video0 | cat > capture.mpeg
(In that example, flywheel runs with real-time priority but cat does not. That's
because it should be ok for the cat process to have fairly high latency, since
that just means that flywheel's circbuf will temporarily become more full.)
Then I redid one of the failed VHS captures using flywheel, and it worked on the
first try.
(Also, I've previously had similar drop-out problems when doing audio capture
from my computer's "line in", with arecord. So I tried piping the output from
arecord to flywheel, and it seemed to help there too.)
In case anyone else would find this program useful, I've now set up a public git
repository for flywheel, here:
http://gitorious.org/flywheel
So, does anyone here know whether my guess about the cause of the drop-outs is
correct or not? Any other comments?
_______________________________________________
pvrusb2 mailing list
pvrusb2 at isely.net
http://www.isely.net/cgi-bin/mailman/listinfo/pvrusb2
More information about the pvrusb2
mailing list