Yeah...I dont have sleep on any of my devices already. I'll try your developmental version until @KineticMan updates the stable one, I guess
Getting Tuner lost a lot now with Plex. 429 Too many requests. Matters not if source in Channels server set to HLS or MPEG-TS.
Happening durring ad breaks.
Is there any general consensus here over what FAST sources are the most reliable and trouble free as of Sept 2026?
Pluto used to be the most stable and reliable, but recent changes seem to have made that less so.
Plex, had its flare ups of issues, but was stable for a while now, but, that seems to be in question now to.
I have a couple channels from LG and Xumo enabled, that seem to have no issues(so far)
I do not watch any Sports, News, or movie channels.
Of the remaining many sources FASTchannels offers, what are yall using that are not giving you any issues....that just work.
LG Channels is nice and stable.
Pluto has definitly changed something. haven't had to mess with it while watching sitcoms. Samsung tv seems good.
I had issues with Samsung in the past, though, mostly was guide data issues i think.
+1 for LG.
I watch Get comedy on LG channels and they fill the breaks beautifully.
The other providers could learn from them.
Very stable.
Is there any reason why FastChennels Player wouldn't work with a standalong ip Encoder? Is anyone already using one with it?
A single port encoder can be set up using the basic "HDMI Capture" bridge in FastChannels. If you want to use a multi-port encoder, then you'll need to set it up using the ah4c bridge -- as that will handle the required tuner management.
I'm using the ah4c bridge myself, and it is excellent.
I was interested in ah4c, also, but seems there is a LOT of parameters to getting it all set up in portainer. Is there a simple, Getting Started anywhere on this board?
@KineticMan Thank you for working on the DRM Bridge, and thank you @bnhf for getting it integrated with ah4c so quickly! I set it up this yesterday and tuning is insanely fast.
The only issue I'm having is 4-5 black screens when starting a stream, all within the first 2 minutes. I see logs in FastChannels reflect repeated stream requests. The device is a 2nd gen ONN 4K Pro, and I see this behavior with or without ah4c integration on. Any ideas on a fix?
2026-09-06 11:14:38,281 INFO app.routes.play: [fc-player] request_id=4a82275505a5c102 ip=172.31.0.1 source=directv channel_id=302 channel_name=Nicktoons adb=XXX.XXX.XX.XXX triggered=True -> encoder
2026-09-06 11:14:56,504 INFO app.routes.play: [fc-player] request_id=c3537efaf3d73d63 ip=172.31.0.1 source=directv channel_id=302 channel_name=Nicktoons adb=XXX.XXX.XX.XXX triggered=True -> encoder
2026-09-06 11:15:13,762 INFO app.routes.play: [fc-player] request_id=5c993ed6dde89def ip=172.31.0.1 source=directv channel_id=302 channel_name=Nicktoons adb=XXX.XXX.XX.XXX triggered=True -> encoder
2026-09-06 11:15:31,029 INFO app.routes.play: [fc-player] request_id=09a080fa0c12c090 ip=172.31.0.1 source=directv channel_id=302 channel_name=Nicktoons adb=XXX.XXX.XX.XXX triggered=True -> encoder
2026-09-06 11:15:48,225 INFO app.routes.play: [fc-player] request_id=e069f0400f34815d ip=172.31.0.1 source=directv channel_id=302 channel_name=Nicktoons adb=XXX.XXX.XX.XXX triggered=True -> encoder
The ah4c Docker Compose is designed to be used with no editing required, and is basically self-documenting, with a comment next to each env var.
Probably 2/3 of the variables are optional/advanced, and between the comments and a bit of common sense, I suspect you'll be able to determine which are mandatory.
I'm glad you mentioned Portainer, as that's very much the way these more advanced Docker Composes are best deployed. There's a specific section in the Stacks Editor for your env var overrides, which are the values that are specific to your installation.
Be aware that to use multiple tuners with FastChannels, you'll need to wait for the next FastChannels update (which will be in the very near future I suspect), as there have been some important changes related to multi-tuner support.
EDIT: I'm pretty sure this is the absolute minimum set of ah4c env vars that need your specific values as overrides. No harm in adding others of course.
:
NUMBER_TUNERS=1
IPADDRESS=docker6:7654 # host:port of this proxy
STREAMER_APP=scripts/firetv/fastchannels # which script set runs the tune; this exact value is correct for FastChannels use
TUNER1_IP=firestick-desk1:5555 # adb target host:port
ENCODER1_URL=http://linkpi-encoder2:8090/stream0 # or set CMD1 instead
FASTCHANNELS_URL=http://htpc6:5523 # URL of your FastChannels installation
HOST_DIR=/data # scripts, M3Us, ADB Keys bound directory base
What are the stream settings on your encoder? It's interesting that these requests are all falling 17-18 seconds apart for the first ~2 minutes.
Maybe try a fixed framerate of 60 to see if it makes any difference. Streams can be a little wonky when they first start, as speed of delivery is prioritized over quality. This is a bit of a WAG, but maybe each time the framerate changes in your source stream, it's triggering a fresh request.
That didn't seem to make a difference, but I just caught these errors on the ah4c side. Maybe it's something with the bmitune.sh script?
2026/09/06 17:32:45 Attempting network tune for device http://XXX.XXX.XX.ZZ:8090/stream2 XXX.XXX.XX.YY directv:8220
2026/09/06 17:32:45 [EXECUTE] Running [./scripts/firetv/fastchannels/prebmitune.sh XXX.XXX.XX.YY directv:8220]
2026/09/06 17:32:45 [EXECUTE] Stdout: '[STARTING] prebmitune.sh XXX.XXX.XX.YYY
already connected to XXX.XXX.XX.YYY:5555
'
2026/09/06 17:32:45 [EXECUTE] Stderr: ''
2026/09/06 17:32:45 [EXECUTE] Finished running ./scripts/firetv/fastchannels/prebmitune.sh in 16.098404ms
2026/09/06 17:32:45 [EXECUTE] Running [./scripts/firetv/fastchannels/bmitune.sh directv:8220 XXX.XXX.XX.YY]
2026/09/06 17:33:56 [EXECUTE] Stdout: '[STARTING] bmitune.sh directv:8220 XXX.XXX.XX.YYY
[TRIGGER] http://XXX.XXX.XX.XX:5523/play/fc-player/directv/8220.m3u8?adb=XXX.XXX.XX.YYY
[WAITING] for stream to start....................
[TIMEOUT] Retrying trigger (1)
[TRIGGER] http://XXX.XXX.XX.XX:5523/play/fc-player/directv/8220.m3u8?adb=XXX.XXX.XX.YYY
................
[TIMEOUT] Retrying trigger (2)
[TRIGGER] http://XXX.XXX.XX.XX:5523/play/fc-player/directv/8220.m3u8?adb=XXX.XXX.XX.YYY
................
[TIMEOUT] Retrying trigger (3)
[TRIGGER] http://XXX.XXX.XX.XX:5523/play/fc-player/directv/8220.m3u8?adb=XXX.XXX.XX.YYY
................
[TIMEOUT] Retrying trigger (4)
[TRIGGER] http://XXX.XXX.XX.XX:5523/play/fc-player/directv/8220.m3u8?adb=XXX.XXX.XX.YYY
[FAIL] Could not confirm playback for directv:8220 on XXX.XXX.XX.YYY. Giving up.
'
2026/09/06 17:33:56 [EXECUTE] Stderr: ''
2026/09/06 17:33:56 [EXECUTE] Finished running ./scripts/firetv/fastchannels/bmitune.sh in 1m11.314325117s
2026/09/06 17:33:56 [ERR] Failed to run start script: exit status 1
FastChannels logs:
2026-09-06 17:32:46,336 INFO app.routes.play: [fc-player] request_id=7a28d12acab080e7 ip=172.31.0.1 source=directv channel_id=8220 channel_name=NBA TV adb=XXX.XXX.XX.YYY triggered=True -> encoder
2026-09-06 17:33:04,575 INFO app.routes.play: [fc-player] request_id=33fa769797af2f40 ip=172.31.0.1 source=directv channel_id=8220 channel_name=NBA TV adb=XXX.XXX.XX.YYY triggered=True -> encoder
2026-09-06 17:33:21,848 INFO app.routes.play: [fc-player] request_id=37a683abbca8c309 ip=172.31.0.1 source=directv channel_id=8220 channel_name=NBA TV adb=XXX.XXX.XX.YYY triggered=True -> encoder
2026-09-06 17:33:39,092 INFO app.routes.play: [fc-player] request_id=7299c5eb42468f29 ip=172.31.0.1 source=directv channel_id=8220 channel_name=NBA TV adb=XXX.XXX.XX.YYY triggered=True -> encoder
2026-09-06 17:33:56,336 INFO app.routes.play: [fc-player] request_id=4bdd218e3abd9583 ip=172.31.0.1 source=directv channel_id=8220 channel_name=NBA TV adb=XXX.XXX.XX.YYY triggered=True -> encoder
Maybe, although I thought you said this was happening with or without ah4c in the mix?
Are you using bnhf/fastchannels:development for the moment for multi-tuner support, or are you just using a single virtual tuner atm with either setup?
I'm definitely not seeing more than one [TRIGGER]/[WAITING] cycle:
[TRIGGER] http://htpc6:5523/play/fc-player/directv/3091.m3u8?adb=firestick-rack1:5555
[WAITING] for stream to start.....
[SUCCESS] directv:3091 has started.
Correct, it happened with a single tuner setup before I updated to your development build with ah4c. Just thought it was notable that I was seeing something in ah4c as well.
I may need to downgrade and test again with the built-in HDMI single tuner setup.
edit: Forgot to mention that I got the bmitune and other scripts from the "Export ah4c scripts" button on FastChannels. Are there newer/better versions?
Before you do that, could you add a set -x to the bmitune.sh script, and try another tune? If you could post or PM me the complete log of a tuning cycle that could be helpful.
Add set -x here:
# ah4c calls this as: bmitune.sh <channel> <tunerip>
# <channel> is FastChannels' own "source:channel_id" key (e.g. fubo:127957) —
# see the m3u FastChannels generates for ah4c's channel-id values.
set -x
STATION="$1"
TUNERIP="$2"
@alai I found it. The ONN formats the output of the command used to confirm playback slightly differently. I should be able to post an updated bmitune.sh here in a few minutes.
EDIT: @alai Please replace your current bmitune.sh with this one, and if you could confirm back to me that it works, I'd appreciate it:
#!/bin/bash
# bmitune.sh for firetv/fastchannels
# 2026.09.06
#
# ah4c "start" script for FastChannels Player (com.fastchannels.player).
# Generated by FastChannels' "Export ah4c scripts" button, with FASTCHANNELS_URL
# pre-filled to what was confirmed at export time.
#
# ah4c runs this asynchronously, after it's already relaying bytes from the
# encoder to whatever is consuming the tune (e.g. Channels DVR) — so it's fine
# for this to take a few seconds, unlike prebmitune.sh.
#
# The actual play trigger (resolving the channel, DRM license, and the adb
# `am start` into FastChannels Player) is already implemented server-side at
# /play/fc-player/<source>/<channel_id>.m3u8 — this script just calls that and
# confirms playback actually started, the same way ah4c's own bundled scripts
# confirm a Hulu/YouTube TV tune via `adb shell dumpsys media_session`.
#
# ah4c calls this as: bmitune.sh <channel> <tunerip>
# <channel> is FastChannels' own "source:channel_id" key (e.g. fubo:127957) —
# see the m3u FastChannels generates for ah4c's channel-id values.
set -x
STATION="$1"
TUNERIP="$2"
SOURCE="${STATION%%:*}"
CHANNEL_ID="${STATION#*:}"
declare -i COUNTER=0
declare -i FAILSAFE=0
STATUS="notplaying"
echo "[STARTING] bmitune.sh $STATION $TUNERIP"
if [ -z "$SOURCE" ] || [ -z "$CHANNEL_ID" ] || [ "$SOURCE" == "$CHANNEL_ID" ]; then
echo "[ERROR] Could not parse source/channel_id from STATION='$STATION' — expected source:channel_id"
exit 1
fi
is_media_playing() {
# Do not accept a playing session from the Fire TV launcher, Alexa, or a
# previous app as proof that *our* tune succeeded. Media3 publishes the
# package name immediately before its PlaybackState in dumpsys output.
#
# Accept both PlaybackState renderings: Fire OS prints "state=3", newer AOSP
# (Google TV, onn., Chromecast) prints "state=PLAYING(3)".
adb -s "$TUNERIP" shell dumpsys media_session 2>/dev/null | \
grep -A 12 "package=com.fastchannels.player" | \
grep -q -e "state=PlaybackState {state=3" -e "state=PlaybackState {state=PLAYING(3)"
}
trigger() {
# Forward the tuner adb address ah4c allocated for this tune. FastChannels does
# the `am start` server-side, so without this it would always trigger its single
# configured device — wrong once ah4c is fronting more than one streaming stick.
# Absent/empty $TUNERIP: server falls back to its configured adb address.
local url="$FASTCHANNELS_URL/play/fc-player/$SOURCE/$CHANNEL_ID.m3u8"
if [ -n "$TUNERIP" ]; then
url="$url?adb=$TUNERIP"
fi
echo "[TRIGGER] $url"
curl -s -o /dev/null --max-time 10 "$url"
}
trigger
echo -n "[WAITING] for stream to start..."
while [ "$STATUS" == "notplaying" ]; do
sleep 1
if is_media_playing; then
STATUS="playing"
echo ""
echo "[SUCCESS] $STATION has started."
else
echo -n "."
if ((COUNTER > 15)); then
((FAILSAFE++))
echo ""
echo "[TIMEOUT] Retrying trigger ($FAILSAFE)"
trigger
COUNTER=0
fi
if ((FAILSAFE > 3)); then
echo ""
echo "[FAIL] Could not confirm playback for $STATION on $TUNERIP. Giving up."
exit 1
fi
((COUNTER++))
fi
done
exit 0
