Product: StreamFab for macOS
StreamFab version: 7.0.4.0
Bundle version: 1
Module: Apple TV
macOS version: 26.5.2 (Build 25F84)
Architecture: Apple Silicon / arm64
Reproducibility: Reproduced on multiple downloads
Severity: Major — completed downloads are unusable and temporary media is deleted
Summary
The Apple TV module successfully downloads, merges, and decrypts the complete video and audio streams. However, StreamFab’s final FFmpeg remux command maps an embedded EIA-608 closed-caption stream into the MP4 output without specifying a compatible subtitle encoder.
The bundled FFmpeg then fails to open the output. StreamFab nevertheless reports the remux as 100% complete, attempts to rename a nonexistent file, and ultimately reports Error 702.
Earlier attempts produced MP4 files containing the full audio track but only approximately one second of video. Later attempts produced no movie file and ended with Error 702.
Affected content
Title: Arrival (2016)
Apple TV content ID: umc.cmc.20sgkdxqbvucopzt913joa0gr
The problem occurred with both tested versions:
- 2160p HEVC Main 10 HDR10+, 3840×1606, 23.976 fps
- HD H.264, approximately 1918×802
The 2160p download contained English AC-3 5.1 audio.
Steps to reproduce
- Open the Apple TV module in StreamFab.
- Select Arrival (2016).
- Select the 2160p HEVC/HDR10+ version with English audio.
- Configure subtitles as external SRT files.
- Start the download.
- Wait for all segments to download and for merging and decryption to finish.
- Observe the final remux stage.
The issue was also reproduced after disabling FastStart.
For the final retry, MKV was selected in the user interface. However, the log still reported:
eformat: 0 extension: ".mp4"
The final recorded output path was also Arrival.mp4, suggesting the Apple TV module did not honor the selected MKV format.
Expected result
StreamFab should create a complete, playable movie containing:
- Full-length 2160p HEVC Main 10 video
- HDR10+ metadata
- English AC-3 5.1 audio
- External SRT subtitle files
- Correct duration and timestamps
If the remux fails, StreamFab should retain the decrypted temporary tracks so the remux can be retried without downloading the entire title again.
Actual result
Two different failure behaviors occurred:
Earlier attempts produced MP4 files of approximately 335 MB containing:
- Full-length audio
- Only about 1.001 seconds of video
Later attempts produced no movie file and reported:
Failed
ErrorCode: 702
External SRT files were copied successfully, but the movie itself was not created.
Evidence that downloading and decryption succeeded
StreamFab’s log reports:
Dec Video success, size: 12624254932
Dec Audio success, size: 335388123
FinalizeDownloadPipeline, cancel=false errorCode=0
The decrypted tracks were independently inspected and found to be complete and readable:
Video:
Codec: HEVC Main 10
Resolution: 3840x1606
Frame rate: 24000/1001 (23.976 fps)
Color: BT.2020 / SMPTE ST 2084
HDR: HDR10+ SMPTE 2094-40 dynamic metadata
Duration: Full movie
Size: 12,624,254,932 bytes
Audio:
Codec: AC-3
Channels: 5.1
Sample rate: 48 kHz
Bitrate: 384 kbps
Duration: Full movie
Size: 335,388,123 bytes
The video decoded successfully at the beginning, middle, and end.
Confirmed technical cause
The decrypted video container contains two streams:
Stream #0:0: HEVC Main 10 video
Stream #0:1: EIA-608 closed captions (c608)
StreamFab invokes its bundled FFmpeg with options including:
-ignore_unknown
-map 0
-c:v:0 copy
-c:a copy
-dn
-map 1
-c:v:1 png
-map 2
-c:a copy
The important problem is -map 0.
This maps every stream from the first input, including the EIA-608 subtitle stream. The -dn option disables data streams, but it does not disable subtitle streams. No compatible subtitle encoder is specified for the EIA-608 stream.
Running the relevant mapping with StreamFab’s bundled FFmpeg reproduces the failure directly:
[sost#0:1] Automatic encoder selection failed
Default encoder for format mp4 (codec none) is probably disabled.
Please choose an encoder manually.
Error selecting an encoder
Error opening output file
Error opening output files: Encoder not found
This confirms that the remux command—not the downloaded video or audio—is causing the failure.
StreamFab error handling
After FFmpeg fails to open the output, StreamFab incorrectly reports:
RemuxProcessCallback percent: 100
It then attempts to rename a file that was never created:
rename fail
remuxVideo.mp4, size: 0
Remux temp file not found
QFile::copy remux failed
The final result is:
processFinishCallback bSuccess:0
nErrorCode:702
The log also contains these subtitle-processing errors before remuxing:
ProcessSubtitle: processSubtitles failed
ProcessSubtitle: TransSubtitle failed
Despite those errors, the download pipeline returns success and continues into the invalid remux command.
Verified workaround
The same decrypted tracks were remuxed successfully by mapping only the actual video and audio streams:
ffmpeg \
-i decrypted-video.mp4 \
-i decrypted-audio.m4a \
-map 0:v:0 \
-map 1:a:0 \
-c copy \
Arrival.mkv
This excludes the problematic EIA-608 stream without re-encoding.
The resulting MKV was:
Size: 12,959,686,684 bytes
Duration: 6982.752 seconds
Video: HEVC Main 10, 3840x1606, 23.976 fps
HDR: HDR10+ metadata retained
Audio: AC-3 5.1, 48 kHz, 384 kbps
Start timestamp: 0
The corrected file played successfully throughout in both VLC and Plex, including on an LG C4 television.
This demonstrates that the downloaded and decrypted media is valid.
Requested fixes
Please update the Apple TV remux process to:
- Replace the broad
-map 0 mapping with an explicit video mapping such as:
-map 0:v:0
When subtitles are configured as external SRT files, add -sn so the embedded EIA-608 stream is not sent to the MP4 muxer.
If embedded captions are desired, explicitly convert the caption stream into an MP4-compatible subtitle format instead of allowing automatic encoder selection.
Honor the MKV output-format selection in the Apple TV module.
Check FFmpeg’s actual exit status before reporting the remux as 100% complete.
Verify that the temporary output exists and has a reasonable size before attempting to rename or copy it.
Preserve the decrypted video and audio tracks when remuxing fails so users can retry the remux without downloading thousands of segments again.