ossrs / srs

SRS is a simple, high-efficiency, real-time video server supporting RTMP, WebRTC, HLS, HTTP-FLV, SRT, MPEG-DASH, and GB28181.
https://ossrs.io
MIT License
24.7k stars 5.28k forks source link

let http-remux ts stream support guess_has_av feature; #4063

Open suzp1984 opened 1 month ago

suzp1984 commented 1 month ago

Describe

http_remux feature support config has_audio, has_video & guess_has_av prop.

https://github.com/ossrs/srs/blob/282d94d7bbfa127868caab401bb7616e26d4c54d/trunk/src/app/srs_app_http_stream.cpp#L630-L632

Take http_flv as example, srs can accept both RTMP streams with only audio, only video or both audio and video streams. It is controlled by above three properties.

But guess_has_av is not implemented by http_ts. The problem is that if I want publish a RTMP stream with audio or video track, the has_audio and has_video, which are default true/on, must to be config to match the RTMP stream, otherwise the mpegts.js player can't play the http-ts stream.

How to reproduce

  1. export SRS_VHOST_HTTP_REMUX_HAS_AUDIO=on; export SRS_VHOST_HTTP_REMUX_HAS_VIDEO=on; export SRS_VHOST_HTTP_REMUX_GUESS_HAS_AV=on; ./objs/srs -c conf/http.ts.live.conf
  2. publish rtmp stream without video: ffmpeg -re -stream_loop -1 -i srs/trunk/doc/source.200kbps.768x320.flv -vn -acodec copy -f flv rtmp://localhost/live/livestream
  3. open chrome browser, open http://localhost:8080/players/srs_player.html?schema=http, go to LivePlayer, input URL: http://localhost:8080/live/livestream.ts, click play.
  4. the http://localhost:8080/live/livestream.ts can not play.

Solution

Let http-ts support guess_has_av, http-flv already supported. The guess_has_av default value is ture/on, so the http-ts|flv can play any streams with audio, video or both.