Ace Stream un protocolo P2P para streaming de multimedia utilizando la tecnología Bitorrent.
Suele utilizar el puerto 8621
Aplicación multimedia universal con todas las funciones con cliente P2P incorporado y reproductor multimedia.
El encargado de procesar contenido de Acestream. Sin él, no podemos ver nada en este formato. Sin embargo, es posible enviar la salida a cualquier reproductor de vídeo gracias a su API HTTP.
Con el engine funcionando, tendremos disponible:
http://localhost:6878/ace/getstream
locahost es el equipo que ejecuta en engine de Acestream.Si tenemos una ID de Acestream, podríamos reproducirla mediante la URL:
http://127.0.0.1:6878/ace/getstream?id=<ID_ACESTREAM>
Donde ID_ACESTREAM sería el “canal” de Acestream que queremos reproducir.
Cualquier reproductor de vídeo que permita la reproducción de contenido de red, será capaz de visualizarlo.
Para listas HLS:
http://127.0.0.1:6878/hls/manifest.m3u8?manifest_url=<URL_LISTA.m3u8>
Ejemplo:
http://127.0.0.1:6878/hls/manifest.m3u8?manifest_url=https://bitcdn-kronehit.bitmovin.com/v2/hls/playlist.m3u8
Reproducir un torrent. A través de la URL:
http://127.0.0.1:6878/ace/getstream?infohash=24eb6655740f4f63d00845b9d2024f0e9eeaf656
El identificador que va en infohash es el info-hash contenido en el archivo .torrent.
Hay versión también para teléfonos Android y dispositivos con Android TV. Recordamos:
Para Docker hay varios proyectos para no tener que instalar directamente Ace Stream como por ejemplo acestream-http-proxy
Motor Acestream y LiveTV para poner la lista de reproducción de los canales. Para terminales Android.
Permite abrir enlaces Acestream desde el reproductor que digamos (por defecto, VLC):
acestream-laucher acestream://1234abcde
Para lanzarlo con otro reproductor, por ejemplo mpv:
acestream-launcher acestream://1234abcde --player mpv
Debe ejecutarse el motor de Acestream antes de poder usarlo:
sudo systemctl start acestream-engine.service
Si no se tiene la unit para systemd, se lanza:
/usr/bin/acestreamengine --client-console --bind-all
Existe un proyecto independiente que, usando Docker integra Ace Stream Engine y aceproxy, permite poder ver contenido Acestream sin tener que instalar un reproductor específico u otras dependencias de Acestream.
docker run -t -p 8000:8000 ikatson/aceproxy
Una vez que esté en funcionamiento el contenedor, desde un reproductor que soporte la reproducción de medios de red, podremos abrir contenido de Acestream con la siguiente URL:
http://<IP_SERVIDOR>:8000/pid/<ID_ACESTREAM>/stream.mp4
IP_SERVIDOR: dirección IP del equipo que esté ejecutando el contenedor de Docker con el Aceproxy.ID_ACESTREAM: identificador del contenido Acestream que queremos reproducir.stream.mp4: nombre del fichero que va a reproducir. Podemos darle el nombre que queramos.
Por ejemplo: http://192.168.0.100:8000/pid/608ffde844a8e6f4f7c7fb9783aa3459c818b9f8/stream.mp4
Lo mismo, pero con Docker Compose y un fichero docker-compose.yml con el contenido:
---
version: '3.3'
services:
acestream:
image: ikatson/aceproxy
container_name: aceproxy
ports:
- '8000:8000'
Si queremos retransmitir a través de Acestream. Para ello, necesitamos tener el engine de Ace Stream.
En engine de Ace Stream solo soporta streams de entrada en formato MPEG TS sobre HTTP y HLS.
docker run --name nombredocker --rm -p 8630:8630/tcp -p 8630:8630/udp \
-v acestream:/data lob666/myroom --stream-source --port 8630 \
--skip-internal-tracker --tracker "udp://tracker.openbittorrent.com:80, http://www.proxmox.com:6969/announce, udp://seedbay.net:2710/announce" \
--name "nombre_del_canal" --title "Nombre leglible del canal" \
--publish-dir "/tmp" --cache-dir "/data" --quality "HD" \
--category "amateur" --service-access-token "pass" --service-remote-access --stats-report-peers --log-debug "1" \
--max-peers "30" --max-upload-slots "30" --source-read-timeout 60 --source-reconnect-interval 1 \
--host "<DIRECCION_IP_HOST>" --source "<URL_STREAMING.ts>" --bitrate "0" \
--max-connections "300"
Cambios para mejorar tiempos de reconexion a los source: --source-read-timeout 15 --source-reconnect-interval 1
Donde:
--stream-source indica que queremos que el engine se encargue de coger un stream de entrada y generar el stream P2P (Ace Stream).--service-remote-access: activa una interfaz web para ver estadísticas.--service-access-token: contraseña/token para poder ver las estadísticas (ver parámetro service-remote-access).--name: nombre del stream (solo se permite [a-z0-9_-].--title: nombre legible del stream.--source: URL del stream MPEG TS / HLS que queremos retransmitir.--source-read-timeout: tiempo de espera de lectura del streaming de origen (en segundos).--source-reconnect-interval: tiempo entre reconexiones del streaming de origen (en segundos).--bitrate: bit rate de media del streaming de salida. 0 para automático.--publish-dir: directorio donde se crean los ficheros de transporte--skip-internal-tracker: no usar el traker interno.--port: puerto de funcionamiento del nodo (por defecto 7764)--permanent: marca la emisión como 24/7 (disponible siempre)--date-start: hora de inicio del streaming.--date-end: fecha de fin del streaming.--quality: auto, SD, HD--category: categoría del streaming.--logo-url: URL del logo del stream--description: descripción del streaming.--tracker: URL de trackers externos. No poner más de 2 para no dispersar conexiones (queremos que se encuentren todos los peers). Si no funcionasen los trackers, se usa DHT.--max-connections: número máximo de conexiones TCP y UDP connections (por defecto 1000).--max-peers: número máximo de conexiones TCP y UDP a otros nodos (por defecto, 50). Se suele limitar al 70% de la conexion para que los clientes descarguen lo mas rápido posible los chunks.--cache-dir: ruta al directorio donde se guarda la caché.--publish-dir: ruta al directorio donde se crean los ficheros de transporte.
Los diferentes valores aceptados en category:
informationalentertainingeducationalmoviesdocumentariessportfashionmusicregionalethnicreligionteleshoperotic_18_plusother_18_pluscyber_gamesamateurwebcamkidsseries
Si no queremos que cambie la ID del canal generado, debemos usar el mismo bitrate, nombre de canal (--name), trackers, puerto y directorio de caché.
Si lo hemos activado, podremos acceder a una interfaz web desde http://ip.host:puerto/app/monitor
Si hemos indicado contraseña: http://ip.host:puerto/app/<CONTRASEÑA>/monitor
Veremos un fichero JSON de este estilo:
{ "download_from": [], "source_reconnects": 0, "pid": 1, "upload_speed": 25470, "max_upload_slots": 50, "download_speed": 0, "transport_stats": { "real": { "my_first": 191, "pp": [], "window_first": 191, "min": 191, "max": 217, "storage": [], "pos": 217, "my_last": 217, "window_last": 217 } }, "port": 8630, "max_connections": 1000, "upload_slots": 50, "memory_usage": null, "cpu_percent": 1.2, "download_limit": 0, "upload_to": [], "download_hash": "98b6d854bdf4ea3061e3a240d5abfda07f1f7e25", "version": "3.1.49", "type": "source", "source_connected": true, "status": "running", "source_last_connect": 1660912012, "timestamp": 1660912088, "connected_peers": [], "last_stats_update": 1660912072, "private_node": false, "run_time": 76, "stats_report_peers": 0, "upload_limit": 0, "stats_report_interval": 60, "active_connections_count": 1, "connected_peers_count": 1, "max_peers": 50, "content_id": "965145724cda1c0f12c862e91b6429fedca3a1f5", "source_download_rate": 199625 }
content_id contendría la ID del canal de Ace Stream que hemos generado y estamos emitiendo.
Podemos utilizar la API HTTP para modificar algunas opciones. Por ejemplo:
http://ip.host:puerto/app/<CONTRASEÑA>/update?max_peers=100&max_upload_slots=30
Para poder reproducir un “canal” de Acestream es necesario tener instalado el acestream engine.
Pegamos la ID de Acestream en el apartado Open Link. Ace Stream Media también incluye el Ace Player que es una versión de VLC modificada para reproducir Acestream.
Le pasaremos la siguiente ruta de red:
http://127.0.0.1:6878/ace/getstream?id=<ID_ACESTREAM>
Donde:
127.0.0.1 es la dirección IP del equipo que tiene el acestream engine.ID_ACESTREAM es el identificador de Acestream que queremos reproducir.
Si queremos arrancar un engine de Acestream utilizando Docker, podemos usar la imagen de blaiseio/acelink. Ejemplo de docker-compose.yml:
version: '3.3' services: acestream: image: blaiseio/acelink container_name: acestream-server ports: - '6878:6878'
Luego, podrías reproducir a través de la dirección http://ip.servidor:6878/ace/getstream?id=<CONTENT_ID>
Esto permite reproducir solo un streaming a la vez. Para reproducir varios a la vez, podemos añadir el parámetro sid seguido de un número que no se repita. Ejemplo: http://ip.servidor:6878/ace/getstream?id=<CONTENT_ID>&sid=1. Luego podríamos tener http://ip.servidor:6878/ace/getstream?id=<OTRO_CONTENT_ID>&sid=2 y http://ip.servidor:6878/ace/getstream?id=<Y_OTRO_CONTENT_ID>&sid=3, etc.
http://127.0.0.1:6878/ace/getstream?infohash=<INFO_HASH_TORRENT>
Donde:
127.0.0.1 es la dirección IP del equipo que tiene el acestream engine.INFO_HASH_TORRENT es el info hash del fichero torrent.Por ejemplo, para reproducir mediante Acestream el corto hecho con Blender “Big Buck Bunny”:
http://127.0.0.1:6878/ace/getstream?infohash=88594aaacbde40ef3e2510c47374ec0aa396c08e
Esto puede ser muy útil para reproducir enlaces magnet ya que contienen el info hash del torrent y así no hay que calcularlo.
Es posible hacer “cast” desde la aplicación para Android y así enviar el contenido Acestream a una televisión y que se vea en ella en lugar de en el dispositivo Android.
El móvil se convertirá en el mando a distancia. Durante todo el tiempo, el móvil tendrá que estar conectado a la misma red que la televisión.
http://ip.engine.acestream:6878/ace/getstream?format=json&id=<ID_ACESTREAM>
Ejemplo de salida:
{ "response": { "stat_url": "http://ip.engine.acestream:6878/ace/stat/d58233fb0ba99e3d052a344a44c684f7d21be704/e16419dfdb5db7b8e3f11e123f4a962e", "playback_session_id": "9b145a8dc5eb1761a7ec2b526804bc59362b3fd8", "is_live": 1, "playback_url": "http://ip.engine.acestream:6878/ace/r/d58233fb0ba99e3d052a344a44c684f7d21be704/e16419dfdb5db7b8e3f11e123f4a962e", "is_encrypted": 0, "command_url": "http://ip.engine.acestream:6878/ace/cmd/d58233fb0ba99e3d052a344a44c684f7d21be704/e16419dfdb5db7b8e3f11e123f4a962e", "client_session_id": -1, "infohash": "d58233fb0ba99e3d052a344a44c684f7d21be704" }, "error": null }
http://ip.engine.acestream:6878/ace/getstream?id=<ID_ACESTREAM>
Como respuesta, si ha ido bien, devolverá el streaming progresivo que podremos verlo con cualquier reproductor que permita la reproducción por red.
La estructura de un archivo m3u debe contener una serie de etiquetas determinadas distribuidas en tres líneas, que vamos a explicar a continuación:
#EXTM3U: obligatoria. Debe ir al principio del documento y solo aparece una vez. Indica a los reproductores que esa es una lista M3U Extendida (incluye atributos adicionales que no están presentes en una lista M3U básica). #EXTINF: Indica donde comienzan los metadatos adicionales de cada streaming. Debe usarse una línea para cada streaming incluido en la lista. Por ejemplo si listamos 5 canales de TV, habrá que crear 5 líneas
La etiqueta #EXTINF tiene la siguiente estructura:
#EXTINF:(duración), (atributos),(título del canal)
duración: duración en segundos del archivo multimedia referenciado. Si es un directo, se pone 0 (se puede pausar y reanudar) o -1 (no se puede pausar).atributos:tvg-idtvg-shift: ajuste horario para la lista EPG. +1, -1, etc.tvg-name: nombre interno del canalgroup-titletvg-logoaudio-track
Si queremos tener EPG, indicaríamos la ubicación de la guía con el atributo url-tvg, por ejemplo:
#EXTM3U url-tvg="https://raw.githubusercontent.com/dracohe/CARLOS/master/guide_IPTV.xml"
Para referenciarlo luego en la línea con el canal correspondiente, usaremos el atributo tvg-id con el mismo nombre que aparezca en la etiqueta channel del fichero con la guía:
#EXTM3U url-tvg="https://raw.githubusercontent.com/dracohe/CARLOS/master/guide_IPTV.xml" #EXTINF:-1 tvg-id="EUROSPORT1HD" ,EuroSport 1 1080 acestream://123a37534656efcc6179c1b7693335d5e8212123
Ejemplo de lista M3U:
#EXTM3U url-tvg="https://raw.githubusercontent.com/dracohe/CARLOS/master/guide_IPTV.xml" #EXTINF:-1 group-title="EuroSport" tvg-id="EUROSPORT1HD" tvg-logo="https://img.sport-tv-guide.live/images/tv-station-es-eurosport-1-615.png" ,EuroSport 1 1080 acestream://123a37534656efcc6179c1b7693335d5e8212123 #EXTINF:-1 group-title="EuroSport" tvg-id="EUROSPORT2HD" tvg-logo="https://img.sport-tv-guide.live/images/tv-station-es-eurosport-2-616.png" ,EuroSport 2 1080 acestream://1234779c721fc7d87eb6d7df7ab11bf751ceb123 #EXTINF:-1 group-title="Otro contenido" tvg-id="CUATRO HD" tvg-logo="https://img.sport-tv-guide.live/images/tv-station-cuatro-619.png" ,CUATRO 1080 acestream://123ec35f4662be1af96963245bfa88fb7d024123 #EXTINF:-1 group-title="Otro contenido" tvg-id="BE MAD" tvg-logo="https://img.sport-tv-guide.live/images/tv-station-be-mad-621.png" ,x_BeMad acestream://12367a00f264736c1d47c1cc3e754447ca8fa123 #EXTINF:-1 group-title="Otro contenido" tvg-id="NAT GEO HD" tvg-logo="https://brandlogos.net/wp-content/uploads/2016/05/national-geographic-channel-logo-vector-download-400x400.jpg" ,National Geographic acestream://123eaac59852e51d467dc88a890be24562309123 #EXTINF:-1 group-title="Otro contenido" tvg-id="HISTORIA" tvg-logo="https://1000logos.net/wp-content/uploads/2020/09/History-Channel-Logo-500x313.jpg" ,Historia acestream://1235a124f24deca70fb59fa1c413dfe580f19123 #EXTINF:0 group-title="Nada" tvg-logo="https://m.drawgaze.online/img/md_home_logo.png" ,Un texto cualquiera https://?