DVPiper

Home  /   Misc  /   DVPiper


DVPiper
DVPiper allows recording, displaying, and manipulation of transport streams from digital capture devices. Currently DVPiper supports ATSC, DVB-C, DVB-S, and DVB-T.

In particular it allows simultaneous multiple recording of any channel on the same frequency multiplex with one device. Through the same principle, any channel can also be displayed and manipulated using any application that reads from stdin, for example, saving the stream as MPEG-PS using ffmpeg, mencoder, or VLC. DVPiper also has built-in UDP streaming for direct streaming to a network/LAN.

Before you can use DVPiper you will need to register the Streamer Directshow filter first by double-clicking on register.bat. The Streamer Directshow filter was created for DVPiper and receives data from a BDA Directshow device.

For recording and previewing channels with DVPiper using a web interface see here

Download DVPiper version 1.33 here
DVPiper Syntax
You can use the -buffer option to suggest the memory buffer allocation. If data is streamed to an external application that does not process at a constant rate (but on average still faster than real-time) then modifying this value according to the peaks and troughs of the external program would ensure there is no time-gap in the recording. Higher value would also help if your hard drive (usually the bottleneck) experiences intermittent heavy usage. If a recording is processing too slowly resulting in buffer overrun there will be a time gap message in DVPiper.

On the other hand, if you are streaming or watching live broadcast and want to get to as close to real-time as possible, then you would want a small value for this. Unfortunately some media players do not handle time-gaps well. E.g. the VLC --ts-out command seems to parse the first few megabytes of the stream to determine the codec parameters, so if there is any time-gap during the parsing the determined parameters may be wrong. The easiest way to fix this would be to restart it. It should then start faster due to Windows caching.

Usage: DVPiper [options]

Options:
  -fast               Faster ready time, but may not be as reliable
                      for some devices
  -tuning [value]     Tuning method: 1, 2. Choose one that works
                      best with your device and broadcast
                      1 is the default tuning method,
                      2 is a faster tuning method
  -listdevice         List all available devices
  -listdevicexml      List all available devices in XML format
  -devicenum [value]  Use a specific device. The first device is 1
  -devicename [value] Use a specific device friendly name, or
  -devicename2 [val]  Use a specific device display name
                      Partial match is accepted
  -type [value]       Device type: ATSC, DVB-C, DVB-S, DVB-T
  -recname [value]    Use a specific receiver component friendly name, or
  -recname2 [value]   Use a specific receiver component display name
                      Partial match is accepted
                      Use -recname or -recname2 to manually specify the
                      components to connect to the device
                      Use repeatedly to specify multiple components
  -frequency [value]  Carrier frequency in kHz. E.g. 571500
  -modulation [value] Modulation: 16QAM, 32QAM, 80QAM, 96QAM, 112QAM,
                      128QAM, 160QAM, 192QAM, 224QAM, 256QAM, 320QAM,
                      384QAM, 448QAM, 512QAM, 640QAM, 768QAM, 896QAM,
                      1024QAM, QPSK, BPSK, OQPSK, 8VSB, 16VSB, 8PSK,
                      16APSK, 32APSK, NBC_QPSK, NBC_8PSK, DIRECTV
                      For DVB-S2 try 8VSB. Also try the other modulations
                      Note: this may not need to be set
  -symbolrate [value] Symbol rate in kbauds. E.g. 27500
  -fec [value]        FEC: 1/2, 2/3, 3/4, 3/5, 4/5, 5/6, 5/11, 7/8,
                      1/4, 1/3, 2/5, 6/7, 8/9, 9/10
                      Note: this usually does not need to be set
  -phychannel [value] ATSC physical channel number
                      Note: use the actual frequency instead with -frequency
  -bandwidth [value]  DVB-T bandwidth in MHz. E.g. 7
  -polar [value]      DVB-S polarization: V, H, L, R
  -lowosc [value]     DVB-S LNB low oscillator frequency in kHz
  -highosc [value]    DVB-S LNB high oscillator frequency in kHz
  -lnbswitch [value]  DVB-S LNB switch frequency in kHz
  -longitude [value]  DVB-S satellite longitude in degrees. E.g. 105.5
  -dirlongitude [val] DVB-S satellite longitude direction: WEST, EAST
  -azimuth [value]    DVB-S azimuth in degrees
  -elevation [value]  DVB-S elevation in degrees
  -inputrange [value] DVB-S input range as string for DiSEqC, etc
  -diseqc [value]     DVB-S DiSEqC command in hex. E.g. -diseqc 2a03facc
                      Try -inputrange before using -diseqc
  -pilot [value]      DVB-S2 pilot: ON, OFF
                      Note: this usually does not need to be set
  -roll-off [value]   DVB-S2 roll-off: 0.2, 0.25, 0.35
                      Note: this usually does not need to be set
  -emptyexit          Exit when there is no more active recording
  -errorexit          DVPiper will apply more stringent error checks
                      and exits on failure of these checks
  -minclean [value]   DVPiper will check clean data percentage and exits
                      when it falls below the stated value. E.g. 0.05
  -minflow [value]    DVPiper will check device data flow (in byte) and exits
                      when it falls below the stated value. E.g. 1000000
  -checktimeout [val] Time-out period for data and flow checks in millisecond
  -noflowcheck        Disable flow checks
  -forceexit          Force exit method. Use if you have problem exiting
  -log [filename]     Save log messages to a file
  -priority [value]   Set priority of DVPiper
                      Possible values are (low,below,normal,above,high)
                      Default value is high
  -childprio [value]  Set priority of child processes
                      Possible values are (low,below,normal,above,high)
                      Default value is above
  -buffer [value]     Suggestion on memory buffer allocation in bytes
                      Generally higher value results in higher memory usage
                      Default is automatic
  -mtu [value]        MTU size for UDP streaming. Default is approx. 1500
  -ttl [value]        TTL for UDP streaming.
  -command [command]  Initial commands to execute upon starting
                      Type help within DVPiper for available commands
                      Enclose command within quotes "..."
                      Use two quotes "" for quote within the enclosure
                      Use -command repeatedly for multiple commands
  -help               Show this help message
  -helpcommand        Show commands available from within DVPiper


From within DVPiper the following commands are available (or use the option "-command [command]" as shown above to use from the command line):

Available commands:
  stat             Show statistics
  getrate          Show current data flow in bytes per second from device
  signal           Show signal strength, quality, and frequency locked status
  diseqc(input)    DiSEqC command in hex. E.g. diseqc(2a03fa)
                   Try channel(inputrange(...)) before using diseqc(...)
  fqbw(fr,bw)      DVB-T change frequency and bandwidth (bandwidth optional)
  channel(...)     Change channel.
                   E.g. channel(frequency(4000000),polar(H),diseqc(2a03facc))
  listprogram      Scan stream and list all programs found
  listprogramxml   Scan stream and list all programs found in XML format
  listprogram(id)  Scan stream for a certain Program ID and show details
  count            Show number of active recordings
  list             List details of all active recordings
  list(RID)        Show details of a particular recording
  stop             Stop all recordings
  stop(RID)        Stop a particular recording
  exit             Exit DVPiper

  run(...)         Run an external program
    E.g. run('"b1.exe" -op')
    optional arguments:
      For priority possible values are (low,below,normal,above,high)
        Default is inherited from -priority
      To allow user interaction with the launched program when
        DVPiper is installed as a service or as part of a service
        use the keyword interact
      E.g. run('"b1.exe"',high) or run('"b1.exe"',interact)
        or run('"b1.exe"',high,interact)
    The run command can also be used inside send(...) - see below

  record(...)      Record transport stream command
    E.g. record(rid(123),progid(135),send('a1.ts',prog('"b1.exe" -op')))

    Required arguments:
      rid(...) Recording ID
        This is to identify the recording
      send(...) Where to send the stream
        Ordinarily the transport stream will be saved to a file
          In the example above the filename is a1.ts
        prog(...) indicates send stream to stdin of a program
          prog(...) command has the same syntax as run(...) - see above
          In the example above "b1.exe -op" is executed
        udp(hostname,port,mtu(.),ttl(.)) UDP streaming
          mtu(.) and ttl(.) are optional
        namedec(...) indicates save stream to a file, but the filename
          is encoded in UTF-8 URL form (use for non-English filename)
          E.g. "%28cat%20and%20dog%29" for "(cat and dog)"
        Enclose each argument within quotes '...'
        Use two quotes '' for quote within the enclosure
        Keywords within the argument:
          $pmt          replace with the PMT PID
          $ttxsub       replace with the teletext PID
          $ttxpagesub   replace with the teletext subtitle page
          If a keyword exists but value cannot be found file
            will not be executed
        If send(...) contains more than one argument,
          DVPiper will close all if one fails

    Optional arguments:
      progid(...) Record all PIDs for a Program ID e.g. progid(135)
        To record only the video, audio, and subtitles use
        the keyword vas e.g. progid(135,vas)
        To exclude or include more PIDs use exclude(...) or include(...)
        E.g. progid(135,exclude(5,78),include(33,99))
      pid(...) Record only given PIDs e.g. pid(1,2,5)
      buildpat(ProgID,PMT_PID) When recording with progid() or pid(),
        this option rebuilds PAT to contain only the specified
        Program ID and corresponding PMT PID.
        This is necessary for some media players.
        When used with progid(), ProgID and PMT_PID can be omitted
      patchpmt(PMT_PID,pt(PID1,Type1),pt(PID2,Type2),...)
        When recording with progid() or pid(),
        this option sets the Type of each PID in the PMT
        When used with progid(), PMT_PID can be omitted
        E.g. patchpmt(9,pt(7,1)) sets PID 7 to type 1 in PMT 9
        This can be used for unknown video or audio
      buffer(...) Buffer size suggestion e.g. buffer(8000000)
      priority(...) Priority of recording
        Possible values are (low,below,normal,above,high)
        Default is inherited from -childprio


Examples:
In each of the following examples, the first line shows the command from within DVPiper.
The second line shows how the command should be modified for use with the -command option. This is necessary as Windows treats spaces and " as special characters.


To save program ID 135 as a TS to C:\Temp\a1.ts:
record(rid(1237),progid(135),send('C:\Temp\a1.ts'))

-command "record(rid(1237),progid(135),send('C:\Temp\a1.ts'))"
If there are no spaces in the command (like in this case), then it is not necessary to enclose the command within "..."


To save only the video, audio, and subtitles of program ID 135 as a TS to C:\Temp\a1.ts:
record(rid(1237),progid(135,vas),send('C:\Temp\a1.ts'))

-command "record(rid(1237),progid(135,vas),send('C:\Temp\a1.ts'))"


To save as a TS to C:\Temp\a1.ts, and rebuild the PAT to contain only Program ID 135 (this is necessary for some media players)
record(rid(1237),progid(135),buildpat,send('C:\Temp\a1.ts'))

-command "record(rid(1237),progid(135),buildpat,send('C:\Temp\a1.ts'))"


To save PID {5, 7, 8} as a TS to C:\Temp\a1.ts, and rebuild the PAT to contain only Program ID 55 with PMT PID 8:
record(rid(1237),pid(5,7,8),buildpat(55,8),send('C:\Temp\a1.ts'))

-command "record(rid(1237),pid(5,7,8),buildpat(55,8),send('C:\Temp\a1.ts'))"


To save PID {5, 7, 8} as a TS to C:\Temp\a1.ts, and change PMT 8 so that PID 5 has type 1, and PID 7 has type 3:
record(rid(1237),pid(5,7,8),patchpmt(8,pt(5,1),pt(7,3)),send('C:\Temp\a1.ts'))

-command "record(rid(1237),pid(5,7,8),patchpmt(8,pt(5,1),pt(7,3)),send('C:\Temp\a1.ts'))"


To UDP stream to localhost, port 1234:
record(rid(1237),progid(135),buildpat,send(udp(localhost,1234)))

-command "record(rid(1237),progid(135),buildpat,send(udp(localhost,1234)))"


For UDP streaming, MTU and TTL can also be specified (optional):
record(rid(1237),progid(135),buildpat,send(udp(destination,1234,mtu(3000),ttl(2))))

-command "record(rid(1237),progid(135),buildpat,send(udp(destination,1234,mtu(3000),ttl(2))))"


For streaming using VLC, use a command like the following (note that VLC 0.8.6i was used; other versions may use a different syntax):
record(rid(123),progid(135),buildpat,send(prog('"C:\Program Files\VideoLAN\VLC\vlc.exe" -I rc --rc-quiet file://- --sout #standard{access=http,mux=ts,dst=:1234} vlc://quit')))

-command "record(rid(123),progid(135),buildpat,send(prog('""C:\Program Files\VideoLAN\VLC\vlc.exe"" -I rc --rc-quiet file://- --sout #standard{access=http,mux=ts,dst=:1234} vlc://quit')))"


To save as an MPEG-PS using ffmpeg (note that ffmpeg rev 10475 was used):
record(rid(1238),progid(135),buildpat,send(prog('"C:\ffmpeg\ffmpeg.exe" -i - -vcodec copy -acodec copy -f dvd -y "C:\Temp\a1.mpg"')))

-command "record(rid(1238),progid(135),buildpat,send(prog('""C:\ffmpeg\ffmpeg.exe"" -i - -vcodec copy -acodec copy -f dvd -y ""C:\Temp\a1.mpg""')))"


To save as an MPEG-PS using VLC (note that VLC 0.8.6i was used; other versions may use a different syntax):
record(rid(1238),progid(135),buildpat,send(prog('"C:\Program Files\VideoLAN\VLC\vlc.exe" -I rc --rc-quiet file://- --sout #standard{access=file,mux=ps,dst="C:\Temp\a2.mpg"} vlc://quit')))

-command "record(rid(1238),progid(135),buildpat,send(prog('""C:\Program Files\VideoLAN\VLC\vlc.exe"" -I rc --rc-quiet file://- --sout #standard{access=file,mux=ps,dst=""C:\Temp\a2.mpg""} vlc://quit')))"


To save as an MPEG-PS using mencoder (note that mencoder rev 29355 was used):
record(rid(1238),progid(135),buildpat,send(prog('"C:\mplayer\mencoder.exe" file://- -ovc copy -oac copy -of mpeg -o "C:\Temp\a3.mpg"')))

-command "record(rid(1238),progid(135),buildpat,send(prog('""C:\mplayer\mencoder.exe"" file://- -ovc copy -oac copy -of mpeg -o ""C:\Temp\a3.mpg""')))"

Spots an error, suggestions? email me