mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-05-30 23:40:40 +02:00
[Bug]: EAC3 playback fails on browser and some android devices. #3070
Closed
opened 2026-04-25 00:13:26 +02:00 by adam
·
25 comments
No Branch/Tag Specified
master
book_tags_genres_dedupe
episode_download_fallback
Issue-4540-SortBy-StartedDate-and-FinishedDate
episode_meta_tagging
fix_authorize_race_condition
redirect_transcode_requests
progress_updated_sort
fix_ereader_socket_event
fix_change_empty_root_password
fix_podcast_session_track_index
fix_set_token
session_modal_user
localize_durations
fix_oidc_create_user
jwt_auth_refactor
fix_scanner_deleting_single_file_books
fix_mediaprogress_updatedat_2
experimental_next_client
podcast_episode_duration
episode-timestamps-clickable
book_author_secondary_sort_title
podcast_useragents
pathexists_user_access
fix_pathexists_join
book_author_secondary_sort
clean_duplicate_mediaprogress
sanitize_html_description
trix_prevent_attachments
check_path_api_fix
fix_mediaprogress_updatedat
increase_express_json_limit
fix_dockerfile_nunicode
search_episodes
audiobook_tools_update
episode_secondary_sorts
hls_stream_url_update
new_session_track_endpoint
audiobook_tools_enhancements
watcher_rescans_update
player_track_tooltip
fix_exclude_prefixes_crash
socket_item_events
fix_podcast_episode_scanner_promise
new_stats_controller
count_cache_for_userpermissions
parsing-opf-v3
validate_migration_files
fix-quick-match-all-crash
fix-chapter-end-sleep-timer
stringify_sequelize_query
remove-col-ambiguity
fix_next_prev_edit_description
details_trim_whitespace
fix_content_url_basepath
fix_logger_fatal
progress_bar_visibility
batch-edit-populate-map-details
feed_generator_updates
bookmark-modal-updates
migrate-library-item-in-scanner
migrate-new-library-items
migrate-podcasts-new-library-item-2
migrate-podcasts-new-library-item
fix-remove-episode-from-playlist
playback-session-use-new-library-item
refactor-library-item
fix-heatmap-caption
feed-episodes-upsert
share-media-player-media-session-api
remove-old-playlist
remove_old_collection_object
plugin-implementation-demo
feed_migration
refactor-feeds-from-item
fix_remove_authors_no_books
v2.17.3-fk-constraints-migration
migrations-first-upgrade
sqlite_2
feature/nuxt-target-server
waveform
sqlite
playlists
video
v2.35.1
v2.35.0
v2.34.0
v2.33.2
v2.33.1
v2.33.0
v2.32.1
v2.32.0
v2.31.0
v2.30.0
v2.29.0
v2.28.0
v2.27.0
v2.26.3
v2.26.2
v2.26.1
v2.26.0
v2.25.1
v2.25.0
v2.24.0
v2.23.0
v2.22.0
v2.21.0
v2.20.0
v2.19.5
v2.19.4
v2.19.3
v2.19.2
v2.19.1
v2.19.0
v2.18.1
v2.18.0
v2.17.7
v2.17.6
v2.17.5
v2.17.4
v2.17.3
v2.17.2
v2.17.1
v2.17.0
v2.16.2
v2.16.1
v2.16.0
v2.15.1
v2.15.0
v2.14.0
v2.13.4
v2.13.3
v2.13.2
v2.13.1
v2.13.0
v2.12.3
v2.12.2
v2.12.1
v2.12.0
v2.11.0
v2.10.1
v2.10.0
v2.9.0
v2.8.1
v2.8.0
v2.7.2
v2.7.1
v2.7.0
v2.6.0
v2.5.0
v2.4.4
v2.4.3
v2.4.2
v2.4.1
v2.4.0
v2.3.5
v2.3.4
v2.3.3
v2.3.2
v2.3.1
v2.3.0
v2.2.23
v2.2.22
v2.2.21
v2.2.20
v2.2.19
v2.2.18
v2.2.17
v2.2.16
v2.2.15
v2.2.14
v2.2.13
v2.2.12
v2.2.11
v2.2.10
v2.2.9
v2.2.8
v2.2.7
v2.2.6
v2.2.5
v2.2.4
v2.2.3
v2.2.2
v2.2.1
v2.2.0
v2.1.5
v2.1.4
v2.1.3
v2.1.2
v2.1.1
v2.1.0
v2.0.24
v2.0.23
v2.0.22
v2.0.21
v2.0.20
v2.0.19
v2.0.18
v2.0.17
v2.0.16
v2.0.15
v2.0.14
v2.0.13
v2.0.12
v2.0.11
v2.0.10
v2.0.9
v2.0.8
v2.0.7
v2.0.6
v2.0.5
v2.0.4
v2.0.3
v2.0.2
v2.0.1
v1.7.2
v1.7.1
v1.7.0
v1.6.0
v1.5.5
v1.5.0
v1.4.11
v1.4.9
v1.4.7
v1.4.6
v1.4.4
v1.4.2
v1.4.0
v1.4.1
v1.3.4
v1.3.3
v1.3.1
v1.2.8
v1.2.6
v1.2.5
v1.2.4
v1.2.1
v1.1.15
v1.1.14
v1.1.13
v1.1.12
v1.1.11
v1.1.10
v1.1.9
v1.1.8
v1.0.0
0.9.61-beta.0
0.9.61-beta
Labels
Clear labels
authentication
backlog
bug
chapter editor
config-issue
ebooks
encoding/embedding
enhancement
help wanted
listening sessions & progress
planned
possible plugin
progress sync
pull-request
sorting/filtering/searching
unable to reproduce
upload
users & permissions
waiting
Mirrored from GitHub Pull Request
No Label
bug
Milestone
No items
No Milestone
Projects
Clear projects
No project
Assignees
adam (Adam Melkus)
Clear assignees
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: starred/audiobookshelf#3070
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @kpmgeek on GitHub (Nov 4, 2025).
What happened?
Dolby Atmos E-AC3 encoded MP4 files fail to play in the browser on Firefox on linux, and also fail to play on some android phones using both the official app and Lissen due to those phones not included said codec for MediaCodec. Playback reports progress but no audio is ever produced. On iOS and Android devices supporting EAC3 decoding internally, this works perfectly.
What did you expect to happen?
I expected playback to work, presumably by server-side transcoding. Bundling an ffmpeg-based decoder on the client side would also work.
Steps to reproduce the issue
Audiobookshelf version
2.30.0
How are you running audiobookshelf?
Docker
What OS is your Audiobookshelf server hosted from?
Linux
If the issue is being seen in the UI, what browsers are you seeing the problem on?
Firefox
Logs
Additional Notes
No response
@kpmgeek commented on GitHub (Nov 4, 2025):
An alternative would be supporting an M4B with two tracks, where the Dolby audio is available to switch to on supported devices.
@nichwall commented on GitHub (Nov 4, 2025):
Have you confirmed that we can transcode the file using the ffmpeg version bundled with Audiobookshelf? Some formats and codecs are not supported by a distributable build due to licensing restrictions and must be built by the end user, such as with widevine and xHE-ACC
https://github.com/advplyr/audiobookshelf/issues/4236
@kpmgeek commented on GitHub (Nov 4, 2025):
It is decodable with the linux binary of ffmpeg 5.1 here https://ffbinaries.com/downloads
FFMPEG reverse engineered their own decoder in 2009 and have included it as a default build option since 0.5.
@Vito0912 commented on GitHub (Nov 4, 2025):
Can you please check which mimetype ABS thinks this is?
@kpmgeek commented on GitHub (Nov 4, 2025):
@Vito0912 commented on GitHub (Nov 4, 2025):
It should be part of the API response under
audioFiles@kpmgeek commented on GitHub (Nov 4, 2025):
What is a user-facing way to query that?
@nichwall commented on GitHub (Nov 4, 2025):
Press the "Probe Audio File" button
@kpmgeek commented on GitHub (Nov 4, 2025):
{"programs": [],
"streams": [
{
"index": 0,
"codec_name": "eac3",
"codec_long_name": "ATSC A/52B (AC-3, E-AC-3)",
"profile": "Dolby Digital Plus + Dolby Atmos",
"codec_type": "audio",
"codec_tag_string": "ec-3",
"codec_tag": "0x332d6365",
"sample_fmt": "fltp",
"sample_rate": "48000",
"channels": 6,
"channel_layout": "5.1(side)",
"bits_per_sample": 0,
"initial_padding": 0,
"id": "0x1",
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"time_base": "1/48000",
"start_pts": 0,
"start_time": "0.000000",
"duration_ts": 1391494608,
"duration": "28989.471000",
"bit_rate": "768000",
"nb_frames": "905921",
"disposition": {
"default": 1,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0,
"timed_thumbnails": 0,
"non_diegetic": 0,
"captions": 0,
"descriptions": 0,
"metadata": 0,
"dependent": 0,
"still_image": 0
},
"tags": {
"language": "und",
"handler_name": "SoundHandler",
"vendor_id": "[0][0][0][0]"
},
"side_data_list": [
{
"side_data_type": "Audio Service Type",
"service_type": 0
}
]
},
{
"index": 1,
"codec_name": "bin_data",
"codec_long_name": "binary data",
"codec_type": "data",
"codec_tag_string": "text",
"codec_tag": "0x74786574",
"id": "0x3",
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"time_base": "1/1000",
"start_pts": 0,
"start_time": "0.000000",
"duration_ts": 28989471,
"duration": "28989.471000",
"nb_frames": "19",
"extradata_size": 43,
"disposition": {
"default": 0,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0,
"timed_thumbnails": 0,
"non_diegetic": 0,
"captions": 0,
"descriptions": 0,
"metadata": 0,
"dependent": 0,
"still_image": 0
},
"tags": {
"language": "eng",
"handler_name": "SubtitleHandler"
}
},
{
"index": 2,
"codec_name": "mjpeg",
"codec_long_name": "Motion JPEG",
"profile": "Progressive",
"codec_type": "video",
"codec_tag_string": "[0][0][0][0]",
"codec_tag": "0x0000",
"width": 2400,
"height": 2400,
"coded_width": 2400,
"coded_height": 2400,
"closed_captions": 0,
"film_grain": 0,
"has_b_frames": 0,
"sample_aspect_ratio": "1:1",
"display_aspect_ratio": "1:1",
"pix_fmt": "yuvj420p",
"level": -99,
"color_range": "pc",
"color_space": "bt470bg",
"chroma_location": "center",
"refs": 1,
"id": "0x0",
"r_frame_rate": "90000/1",
"avg_frame_rate": "0/0",
"time_base": "1/90000",
"start_pts": 0,
"start_time": "0.000000",
"duration_ts": 2609052390,
"duration": "28989.471000",
"bits_per_raw_sample": "8",
"disposition": {
"default": 0,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 1,
"timed_thumbnails": 0,
"non_diegetic": 0,
"captions": 0,
"descriptions": 0,
"metadata": 0,
"dependent": 0,
"still_image": 0
}
}
],
"chapters": [
{
"id": 0,
"time_base": "1/1000",
"start": 0,
"start_time": "0.000000",
"end": 671458,
"end_time": "671.458000",
"tags": {
"title": "Foreword"
}
},
{
"id": 1,
"time_base": "1/1000",
"start": 671458,
"start_time": "671.458000",
"end": 1722333,
"end_time": "1722.333000",
"tags": {
"title": "Chapter 1: The Dursleys"
}
},
{
"id": 2,
"time_base": "1/1000",
"start": 1722333,
"start_time": "1722.333000",
"end": 4389124,
"end_time": "4389.124000",
"tags": {
"title": "Chapter 2: The Potters and the Malfoys"
}
},
{
"id": 3,
"time_base": "1/1000",
"start": 4389124,
"start_time": "4389.124000",
"end": 7516832,
"end_time": "7516.832000",
"tags": {
"title": "Chapter 3: Wands"
}
},
{
"id": 4,
"time_base": "1/1000",
"start": 7516832,
"start_time": "7516.832000",
"end": 9246790,
"end_time": "9246.790000",
"tags": {
"title": "Chapter 4: How the Wizarding World Works"
}
},
{
"id": 5,
"time_base": "1/1000",
"start": 9246790,
"start_time": "9246.790000",
"end": 9839706,
"end_time": "9839.706000",
"tags": {
"title": "Chapter 5: The Tri-Wizard Schools"
}
},
{
"id": 6,
"time_base": "1/1000",
"start": 9839706,
"start_time": "9839.706000",
"end": 10548122,
"end_time": "10548.122000",
"tags": {
"title": "Chapter 6: Alternate Histories"
}
},
{
"id": 7,
"time_base": "1/1000",
"start": 10548122,
"start_time": "10548.122000",
"end": 11825330,
"end_time": "11825.330000",
"tags": {
"title": "Chapter 7: Dark Creatures"
}
},
{
"id": 8,
"time_base": "1/1000",
"start": 11825330,
"start_time": "11825.330000",
"end": 12758621,
"end_time": "12758.621000",
"tags": {
"title": "Chapter 8: Animal Magic"
}
},
{
"id": 9,
"time_base": "1/1000",
"start": 12758621,
"start_time": "12758.621000",
"end": 13451121,
"end_time": "13451.121000",
"tags": {
"title": "Chapter 9: Wizarding Pastimes"
}
},
{
"id": 10,
"time_base": "1/1000",
"start": 13451121,
"start_time": "13451.121000",
"end": 14778996,
"end_time": "14778.996000",
"tags": {
"title": "Chapter 10: Fame in the Wizarding World"
}
},
{
"id": 11,
"time_base": "1/1000",
"start": 14778996,
"start_time": "14778.996000",
"end": 15685496,
"end_time": "15685.496000",
"tags": {
"title": "Chapter 11: Wizarding Transport"
}
},
{
"id": 12,
"time_base": "1/1000",
"start": 15685496,
"start_time": "15685.496000",
"end": 16301496,
"end_time": "16301.496000",
"tags": {
"title": "Chapter 12: The Journey to Hogwarts"
}
},
{
"id": 13,
"time_base": "1/1000",
"start": 16301496,
"start_time": "16301.496000",
"end": 16698037,
"end_time": "16698.037000",
"tags": {
"title": "Chapter 13: Sorting"
}
},
{
"id": 14,
"time_base": "1/1000",
"start": 16698037,
"start_time": "16698.037000",
"end": 23649037,
"end_time": "23649.037000",
"tags": {
"title": "Chapter 14: The Hogwarts Curriculum"
}
},
{
"id": 15,
"time_base": "1/1000",
"start": 23649037,
"start_time": "23649.037000",
"end": 24808620,
"end_time": "24808.620000",
"tags": {
"title": "Chapter 15: Magical Artifacts"
}
},
{
"id": 16,
"time_base": "1/1000",
"start": 24808620,
"start_time": "24808.620000",
"end": 27481286,
"end_time": "27481.286000",
"tags": {
"title": "Chapter 16: Hogwarts Alumni"
}
},
{
"id": 17,
"time_base": "1/1000",
"start": 27481286,
"start_time": "27481.286000",
"end": 28754244,
"end_time": "28754.244000",
"tags": {
"title": "Chapter 17: Exploring Hogwarts"
}
},
{
"id": 18,
"time_base": "1/1000",
"start": 28754244,
"start_time": "28754.244000",
"end": 28989471,
"end_time": "28989.471000",
"tags": {
"title": "End Credits"
}
}
],
"format": {
"filename": "/mnt/abs/Audiobook/J.K. Rowling/From the Wizarding Archive/From the Wizarding Archive.m4b",
"nb_streams": 3,
"nb_programs": 0,
"format_name": "mov,mp4,m4a,3gp,3g2,mj2",
"format_long_name": "QuickTime / MOV",
"start_time": "0.000000",
"duration": "28989.471000",
"size": "2783653190",
"bit_rate": "768183",
"probe_score": 100,
"tags": {
"major_brand": "mp42",
"minor_version": "512",
"compatible_brands": "mp42dby1iso2mp41",
"title": "From the Wizarding Archive",
"artist": "J.K. Rowling; Evanna Lynch - foreword",
"album_artist": "J.K. Rowling; Evanna Lynch - foreword",
"composer": "Evanna Lynch; Hugh Quarshie; Finlay Robertson; Lara Sawalha",
"album": "From the Wizarding Archive: Curated Writing from the World of Harry Potter",
"date": "2024",
"encoder": "cm4b",
"comment": "
Winner, 2024 Good Housekeeping Kids’ Book Award
If you’ve ever wondered why Squibs are never offered a place at Hogwarts, what happened when Vernon Dursley first met James Potter, or how Dumbledore and McGonagall formed their lifelong friendship, From the Wizarding Archive should go straight to the top of your wish list. Containing 80 articles written by J.K. Rowling for the original Pottermore website and available for the first time in audio, exclusively from Audible, Harry Potter fans everywhere are in for a treat.
If there’s one thing Harry Potter fans have in common (apart from impeccably good taste), it’s questions… so many questions. From the simple details that perplex us all – was Professor Umbridge always that awful? Why don’t wizards just use phones? – to the personal details that bring us closer to J.K. Rowling’s writing process – from her least favourite school subject and its impact on Professor Snape’s career, to the personal significance of King’s Cross and why it’s always where the Hogwarts Express departs – this is a veritable treasure trove of answers.
Narrated by Evanna Lynch, Hugh Quarshie, Finlay Robertson and Lara Sawalha, and with an exclusive foreword by Evanna Lynch, this spellbinding audiobook is essential listening for any Harry Potter aficionado.
The articles in From the Wizarding Archive were originally written by J.K. Rowling for pottermore.com and remain free to read in English on wizardingworld.com. 35 of the 80 articles were originally published across three Pottermore Presents eBooks. This is the first time any of the content has been available in audio format.
Theme music composed by Sara Carvalho.
Available in Dolby Atmos on Audible.
","genre": "Fantasy",
"media_type": "2"
}
}
}
@Vito0912 commented on GitHub (Nov 4, 2025):
Just searching for mime didn't show any results. I don't know if it's listed under another name. But I guess the mimetype is the same as aac, so it's basically impossible for the app to request a transcode.
The app should use the native players, so if they can't play the files, it's probably a hardware incompatibility, but not sure here. (And because it does not fail, just not sound it also does not tries to transcode)
@kpmgeek commented on GitHub (Nov 4, 2025):
Yeah, just from my linux client box, it recognizes the mime type of the file as video/mp4 so it would be identical.
On the client app on android, wouldn't it be possible to add a routine to check MediaCodec support for EAC3 and behave differently when it encounters such codecs such as using a bundled decoder? But that doesn't address the web playback.
These are only going to become more common as more and more productions use immersive audio.
@nichwall commented on GitHub (Nov 4, 2025):
Do the server logs say anything when you are trying to play the file? The client will try to direct play the file and if it fails the server will attempt to transcode. Codec, mine type, and container support is not well documented for most devices, or can have custom implementations so we rely on whether the client fails to play the file.
@Vito0912 commented on GitHub (Nov 4, 2025):
I think the problem being that the client never failed. Like iOS does not fail when playing MP3 in M4B. It just plays silence.
Sadly if it's that: this is nothing that abs can fix
@layanto commented on GitHub (Nov 7, 2025):
This error message momentarily flash in Audiobookshelf android app
@TheStaticTurtle commented on GitHub (Nov 7, 2025):
Support for AC3 on browsers seem very mixed, and it seems very dependent on hardware and software support for chromium-based browsers if enabled at all.
Here are some methods to check if the browser supports the
ac-3codec:https://github.com/cjw1115/enable-chromium-ac3-ec3-system-decoding?tab=readme-ov-file#how-to-verify-if-ac3ec3-supported
That said I can confirm that on a Windows 10 system which has the DolbyDecMFT dll I can play an AC3 audiobook with:
However, on every other browser it fails with these errors:
Just looking at the dev tools, there is a first request to the
playendpoint after which there is a fail message in the console[PlayerHandler] Audio player error switching to HLS stream.This triggers a second request to the
playendpoint this time withforceTranscode: trueand the player manages to load but as fails again because the actual data in the.tsfiles is still AC-3.Is audiobookshelf capable of transcoding to an other codec?
On a separate note, when I initially tested this I had a huge CPU spike when loading the album with separate M4A AC-3 files per chapter, not sure if this related tho.
I also have the same error as @layanto on android
@Vito0912 commented on GitHub (Nov 7, 2025):
Ignore, mixed up container and codec for a second here:
It should transcode to HLS. I am not sure if it might not be possible to transcode from AC3 to HLS?@TheStaticTurtle commented on GitHub (Nov 7, 2025):
Yeah, according to the specification HLS supports AAC, MP3, AC-3 and EAC-3.
Maybe the client could specifically tell the server that it doesn't have support for AC-3 in which case the server could transcode to AAC or MP3. This would mean loosing fidelity, and it might be nice to inform the client that this is happening.
As for the android app I have no idea how it could be done, streaming would be fine but downloaded files would still be AC-3
@Vito0912 commented on GitHub (Nov 7, 2025):
I do not have an AC-3 file to test, but I assume it has something to do with the mimetype.
As far as I can tell, it only tries specified formats for aac, and probably EAC-3 is already treated as aac (not entirely sure). There is a property that forces the aac codec to be used, but it is never used anywhere. I could make a version where you can supply it as post data, but since I do not have any file for this, I cannot test it and can only assume. But I guess this is the error.
That's the problem with proprietary formats ig
@Vito0912 commented on GitHub (Nov 7, 2025):
@TheStaticTurtle #4808
And thanks!
@TheStaticTurtle commented on GitHub (Nov 7, 2025):
Awesome, I spun up a dev environment with this PR and did a test with the full audiobook, and I can confirm that it now works on multiple browsers.
However the android app still fails for both streaming and downloaded media.
Downloaded media still fails with the same error as @layanto probably because local media isn't transcoded before sending to the client so any codec issue would still be present?
Streaming on the other hand shows a generic
Playback Failed: Source errormessage and nothing more in the app logs. I do see theForcing AAC for tracks with mime type audio/mp4 and codec eac3in the server logs. Looking at the logcat via adb, I can see the expected lines:But a few lines later i'm greeted by:
(
Response code: 404being the issue)Which I also noticed on the browser. Sometimes the transcode isn't ready yet and it takes quite a while for the first
.tsfile to exist. However unlike the app, the browser client re-tries the same segment up to 8 times ([HLS] Server 404 for fragment retry 2 of 8) before fully error-ing out which usually is enough time for the transcode to catch up.This is probably worsened by the very slow dev machine I used for this test but I guess the android app doesn't have that retry mechanism.
@Vito0912 commented on GitHub (Nov 7, 2025):
Yes. It never has and probably never will be (but I am not a maintainer).
HLS always fails after a few seconds, then no transcoding would work, so there should be an retry (but I don't do dev on the official apps). One idea I have is to edit the duration. I don't know what it does, I just noticed it's higher for AAC. In the file I edited, there's a part of the code with
500 : 3000(could be the other way around. Memory). For testing, please try increasing the 500 to 3000 or higher. I'm not completely sure what it does, and I'm on mobile so I can't test it, but maybe it's the time the client has to fetch.@nichwall does dev on the offical app, maybe he can say more about retrying
@TheStaticTurtle commented on GitHub (Nov 8, 2025):
It looks like this code is only triggered if the transcode needs to be stopped and re-started, since AAC takes longer, the timeout that notifies that the stream is ready comes later. It doesn't affect the first transcode of a session.
What i'm noticing is that the player starts playing as soon as it gets the m3u8 playlist even if the segments don't exist. It appears that there already is a mechanism to tell the client when the HLS stream is ready (
stream_readyevent) but the app doesn't seem to use it.Web is almost transparent (apart from the wait time) because of the re-try, however the android app just stops playing if it gets a 404 on a segment. If I restart everything (app & server & progress) I am able to start the stream, going backwards works but playback stops immediately due to a 404 if I jump into a non buffered section.
That's probably fair, it seems that on android E-AC3 support is mixed, VLC plays it (of course lol) but not anything else I tested. There is apparently a plugin for MX-Player but it looks like they just embeded ffmpeg.
@hypnotoad08 commented on GitHub (Nov 8, 2025):
I does look like their is a way to support E-AC3 in the android media player per Dolby - https://professionalsupport.dolby.com/s/article/ExoPlayer-example-code-for-Dolby-Atmos-support?language=en_US
@hypnotoad08 commented on GitHub (Nov 8, 2025):
Even better, code examples - https://professionalsupport.dolby.com/s/article/Enabling-Dolby-Atmos-in-Android-Mobile-media-apps?language=en_US
@github-actions[bot] commented on GitHub (Dec 2, 2025):
Fixed in v2.31.0.