ClassicConnect ClassicConnect
"640k ought to be enough for everybody."
 
FAQ :: Search :: Memberlist :: Usergroups :: Register
Profile :: Log in to check your private messages :: Log in

Getting Full Motion Video Working Over Dial Up

 
Post new topic   Reply to topic    ClassicConnect Forum Index -> Media
View previous topic :: View next topic  
Author Message
LyraNovaHeart
Gorts


Joined: 15 Apr 2025
Age: 27
Posts: 48
Location: Los Angeles, California

PostPosted: Sat Jul 26, 2025 10:06 pm    Post subject: Getting Full Motion Video Working Over Dial Up Reply with quote

Hey there! I'm back with another 2am type experiment, like usual. Today's being: how can I get full motion video over 52k dialup?

Alright, I hear you already: "Video over dial up was possible already!"

Yes, you're right, it was, but with a few caveats:

- Video over dial up was typically not full motion, often between 5-15FPS, which doesn't exactly qualify as full motion, ideally you want 24 or 30FPS
- Often required proprietary players and codecs, making it hard to access

Now, we do have some limits here too doing this, firstly:

- AV1 is not an option as most systems with dial up are too old to be able to decode it at a reasonable speed
- Video MUST be either 24 or 30FPS to count towards this goal
- Minimum res of 144p

The best stopgap codec we have is HEVC in this case, since at least Windows XP can have K-Lite codec pack installed, giving Windows Media Player the ability to play HEVC video. This is technically cheating a bit if you consider that HEVC is a codec that came out in 2013 and wasn't a default. HEVC, however, is used because it's about the best we can get for compression.

Now comes the source. There are a lot of options in this case, you could use a static screen recording, but that's not motion, is it? The goal is Full Motion, so I settled on one video that would be a wonderful contender.... the intro video to Dead Space. It's a little bit weird since the source is On2 VP6, however this won't matter as it will be crushed to HEVC anyway.

Source Info:

Code:
ffprobe W:\attract.vp6
ffprobe version 7.0-essentials_build-www.gyan.dev Copyright (c) 2007-2024 the FFmpeg developers
  built with gcc 13.2.0 (Rev5, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-dxva2 --enable-d3d11va --enable-d3d12va --enable-ffnvcodec --enable-libvpl --enable-nvdec --enable-nvenc --enable-vaapi --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband
  libavutil      59.  8.100 / 59.  8.100
  libavcodec     61.  3.100 / 61.  3.100
  libavformat    61.  1.100 / 61.  1.100
  libavdevice    61.  1.100 / 61.  1.100
  libavfilter    10.  1.100 / 10.  1.100
  libswscale      8.  1.100 /  8.  1.100
  libswresample   5.  1.100 /  5.  1.100
  libpostproc    58.  1.100 / 58.  1.100
Input #0, ea, from 'W:\attract.vp6':
  Duration: 00:01:25.95, start: 0.000000, bitrate: 7279 kb/s
  Stream #0:0: Video: vp6, yuv420p, 1280x720, 29.97 fps, 29.97 tbr, 29.97 tbn
  Stream #0:1: Audio: adpcm_ea_r3, 48000 Hz, 2 channels, s16p, 384 kb/s


720p source should be good enough anyway, now here comes the fun part, actually encoding the damn thing. My encoding system will be this


Code:
Model: Lenovo Legion Pro 7i Gen 9 (83DE)
CPU: Intel Core i9-14900HX, 8P+16E, up to 5.8GHz
GPU: Nvidia Geforce RTX 4090 Mobile 16GB
RAM: 32GB DDR5 5600MT/s SK Hynix
Storage: 1TB Samsung 980 Pro OEM + 2TB Samsung 980 Pro
OS: Windows 11 Enterprise 23H2


Now that that's out the way, the first encode was.... a fail. Why you may ask? VBR or Variable Bit Rate. VBR on its own is a wonderful thing to have, however, when it comes to dial up, spikes above 52k would absolutely cause stuttering and wouldn't exactly be ideal. HEVC on the one hand can go very low in terms of bitrate but it does not alleviate using VBR. How about CBR then? That doesn't exactly exist in HEVC, at least not for libx265. First attempt was x265 144p, 33kbps video + 12kbps Opus audio. Stuttered, second encode? fail as well, same issue. Now, Handbrake isnt exactly a good option in this case for this, so, I went straight to the source, aka FFMPEG. This is the command I used to make the 3rd encode, which did fit:

Code:
ffmpeg -i W:\attract.vp6 -c:v libx265 -x265-params "vbv-maxrate=32:vbv-bufsize=32:bitrate=32" -vf scale=256x144 -c:a libopus -b:a 12k -muxrate 48k output.mp4


the resulting file was this

Code:
General
Complete name                            : C:\Users\Lyra Nova Heart\Videos\output.mp4
Format                                   : MPEG-4
Format profile                           : Base Media
Codec ID                                 : isom (isom/iso2/mp41)
File size                                : 512 KiB
Duration                                 : 1 min 25 s
Overall bit rate mode                    : Variable
Overall bit rate                         : 48.8 kb/s
Frame rate                               : 29.970 FPS
Writing application                      : Lavf61.1.100

Video
ID                                       : 1
Format                                   : HEVC
Format/Info                              : High Efficiency Video Coding
Format profile                           : Main@L2@Main
Codec ID                                 : hev1
Codec ID/Info                            : High Efficiency Video Coding
Duration                                 : 1 min 25 s
Bit rate                                 : 28.1 kb/s
Width                                    : 256 pixels
Height                                   : 144 pixels
Display aspect ratio                     : 16:9
Frame rate mode                          : Constant
Frame rate                               : 29.970 FPS
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressive
Bits/(Pixel*Frame)                       : 0.025
Stream size                              : 295 KiB (58%)
Writing library                          : x265 3.5+117-b34fb2c77:[Windows][GCC 13.2.0][64 bit] 8bit+10bit+12bit
Encoding settings                        : cpuid=1111039 / frame-threads=5 / numa-pools=32 / wpp / no-pmode / no-pme / no-psnr / no-ssim / log-level=2 / input-csp=1 / input-res=256x144 / interlace=0 / total-frames=0 / level-idc=0 / high-tier=1 / uhd-bd=0 / ref=3 / no-allow-non-conformance / no-repeat-headers / annexb / no-aud / no-eob / no-eos / no-hrd / info / hash=0 / temporal-layers=0 / open-gop / min-keyint=25 / keyint=250 / gop-lookahead=0 / bframes=4 / b-adapt=2 / b-pyramid / bframe-bias=0 / rc-lookahead=20 / lookahead-slices=0 / scenecut=40 / no-hist-scenecut / radl=0 / no-splice / no-intra-refresh / ctu=64 / min-cu-size=8 / no-rect / no-amp / max-tu-size=32 / tu-inter-depth=1 / tu-intra-depth=1 / limit-tu=0 / rdoq-level=0 / dynamic-rd=0.00 / no-ssim-rd / signhide / no-tskip / nr-intra=0 / nr-inter=0 / no-constrained-intra / strong-intra-smoothing / max-merge=3 / limit-refs=1 / no-limit-modes / me=1 / subme=2 / merange=57 / temporal-mvp / no-frame-dup / no-hme / weightp / no-weightb / no-analyze-src-pics / deblock=0:0 / sao / no-sao-non-deblock / rd=3 / selective-sao=4 / early-skip / rskip / no-fast-intra / no-tskip-fast / no-cu-lossless / b-intra / no-splitrd-skip / rdpenalty=0 / psy-rd=2.00 / psy-rdoq=0.00 / no-rd-refine / no-lossless / cbqpoffs=0 / crqpoffs=0 / rc=cbr / bitrate=32 / qcomp=0.60 / qpstep=4 / stats-write=0 / stats-read=0 / vbv-maxrate=32 / vbv-bufsize=32 / vbv-init=0.9 / min-vbv-fullness=50.0 / max-vbv-fullness=80.0 / ipratio=1.40 / pbratio=1.30 / aq-mode=2 / aq-strength=1.00 / cutree / zone-count=0 / no-strict-cbr / qg-size=32 / no-rc-grain / qpmax=69 / qpmin=0 / no-const-vbv / sar=0 / overscan=0 / videoformat=5 / range=0 / colorprim=2 / transfer=2 / colormatrix=2 / chromaloc=0 / display-window=0 / cll=0,0 / min-luma=0 / max-luma=255 / log2-max-poc-lsb=8 / vui-timing-info / vui-hrd-info / slices=1 / no-opt-qp-pps / no-opt-ref-list-length-pps / no-multi-pass-opt-rps / scenecut-bias=0.05 / no-opt-cu-delta-qp / no-aq-motion / no-hdr10 / no-hdr10-opt / no-dhdr10-opt / no-idr-recovery-sei / analysis-reuse-level=0 / analysis-save-reuse-level=0 / analysis-load-reuse-level=0 / scale-factor=0 / refine-intra=0 / refine-inter=0 / refine-mv=1 / refine-ctu-distortion=0 / no-limit-sao / ctu-info=0 / no-lowpass-dct / refine-analysis-type=0 / copy-pic=1 / max-ausize-factor=1.0 / no-dynamic-refine / no-single-sei / no-hevc-aq / no-svt / no-field / qp-adaptation-range=1.00 / scenecut-aware-qp=0conformance-window-offsets / right=0 / bottom=0 / decoder-max-rate=0 / no-vbv-live-multi-pass / no-mcstf / no-sbrc
Color range                              : Limited
Codec configuration box                  : hvcC

Audio
ID                                       : 2
Format                                   : Opus
Codec ID                                 : Opus
Duration                                 : 1 min 25 s
Source duration                          : 1 min 25 s
Source_Duration_LastFrame                : -1 ms
Bit rate mode                            : Variable
Bit rate                                 : 12.0 kb/s
Sampling rate                            : 48.0 kHz
Compression mode                         : Lossy
Stream size                              : 125 KiB (24%)
Source stream size                       : 125 KiB (24%)
Default                                  : Yes
Alternate group                          : 1


Now that we have a file that does work, we obviously need a test bench. I don't have Dial Up, so I had to ask nick99nack to test. He's got a whole dial up setup a retro enthusiast can dream of, and in this case we used his Dell Latitude D630. It has a fast enough CPU to handle HEVC and has Windows XP, which can still do modems and also has support for K-Lite codec pack, which is needed to get HEVC on Windows XP. Once all that's been installed, finally onto the test. It went flawlessly, no stutters, just full motion 30fps 144p video. Is it cheating a bit? Yes. Is it still hella cool to see 30FPS video over Dial Up? Also yes. Granted it does look terrible and has very crunchy audio, but if this was available in 1996? people would be all over it for how much of a marvel it'd be at the time.

Attract.vp6: https://files.catbox.moe/3f35dp.vp6
Dial Up video encode: https://files.catbox.moe/xwmefu.mp4
_________________
I'm one day closer to being who I wanna be~
Back to top
View user's profile Send private message Visit poster's website
nick99nack
Admin


Joined: 30 Aug 2023
Age: 30
Posts: 171
Location: NJ, USA

PostPosted: Sun Jul 27, 2025 2:47 am    Post subject: Reply with quote

Indeed, it does work fine when connected to my own dial-up ISP at 52 Kbps:


_________________
If you like browsing without an ad blocker, you might also like getting rid of your virus scanner, and running around with your pants down. --SomeGuy, 2016

Back to top
View user's profile Send private message Visit poster's website AIM Address MSN Messenger
VCSMaster
Member


Joined: 25 May 2025
Age: 25
Posts: 126
Location: Southeastern USA

PostPosted: Sun Jul 27, 2025 7:01 pm    Post subject: Reply with quote

Of some interest to the participants, here I was able to watch most of the Shrek movie over a 52K download connection just fine.

The video was encoded in VP9, 228x128 at 30 FPS variable. Max bitrate 40K.
The audio was encoded with Opus in mono @ 22KHz and 8 bit samples. Max bitrate of 8K.

This meant I had a 48K stream to work with, leaving some overhead for SMB and error correction. The experience was very reasonable, despite the slow connection and Pentium III. I made it through about 45 minutes of the movie before the first stutter, and only had 2 more brief pauses towards the end during high action scenes where the bitrate was basically maxed out.

It was converted with HandBrake on a Ryzen 9 5900X and only took about 12 minutes to encode.

Considering this was done with 52K connection over v.90, I think this could be dramatically improved with v.92 (mostly from more efficient v.44 compression). A good 54666 connect with v.44 negotiated can realistically provide 100K or more throughput in many applications.

I have considered trying further with ISDN, since I've now got several US Robotics Courier I-modems to play with, but I need to hurry up and get a BRI setup before I go much further with that concept. Surely with 128K and connection compression I could get some very decent quality video!
Back to top
View user's profile Send private message Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic    ClassicConnect Forum Index -> Media All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum



smartDark Style by Smartor
Powered by phpBB 2.0.25 CC Mod © 2001, 2002 phpBB Group
 
Page generation time: 0.0133s (PHP: 92% - SQL: 8%) - SQL queries: 12 - GZIP enabled - Debug on