Skip to content

Commit 3af7f74

Browse files
authored
h265 support
1 parent 2301106 commit 3af7f74

File tree

1 file changed

+48
-3
lines changed

1 file changed

+48
-3
lines changed

publish.py

+48-3
Original file line numberDiff line numberDiff line change
@@ -1308,6 +1308,11 @@ def on_stats(promise, abin, data):
13081308
try:
13091309
if self.aom:
13101310
client['encoder'].set_property('target-bitrate', int(bitrate)) # line not active due to 'elif " av1enc " in self.pipeline:' line
1311+
elif " mpph265enc " in self.pipeline or client['encoder'].get_name().startswith('mpph265enc'):
1312+
# For mpph265enc, use bps instead of bitrate
1313+
client['encoder'].set_property('bps', int(bitrate*1000))
1314+
elif " x265enc " in self.pipeline or client['encoder'].get_name().startswith('x265enc'):
1315+
client['encoder'].set_property('bitrate', int(bitrate))
13111316
elif client['encoder']:
13121317
client['encoder'].set_property('bitrate', int(bitrate*1000))
13131318
elif client['encoder1']:
@@ -1330,6 +1335,11 @@ def on_stats(promise, abin, data):
13301335
try:
13311336
if self.aom:
13321337
client['encoder'].set_property('target-bitrate', int(bitrate)) # line not active due to 'elif " av1enc " in self.pipeline:' line
1338+
elif " mpph265enc " in self.pipeline or client['encoder'].get_name().startswith('mpph265enc'):
1339+
# For mpph265enc, use bps instead of bitrate
1340+
client['encoder'].set_property('bps', int(bitrate*1000))
1341+
elif " x265enc " in self.pipeline or client['encoder'].get_name().startswith('x265enc'):
1342+
client['encoder'].set_property('bitrate', int(bitrate))
13331343
elif client['encoder']:
13341344
client['encoder'].set_property('bitrate', int(bitrate*1000))
13351345
elif client['encoder1']:
@@ -1975,6 +1985,9 @@ async def main():
19751985
parser.add_argument('--stun-server', type=str, help='STUN server URL (stun://hostname:port)')
19761986
parser.add_argument('--turn-server', type=str, help='TURN server URL (turn(s)://username:password@host:port)')
19771987
parser.add_argument('--ice-transport-policy', type=str, choices=['all', 'relay'], default='all', help='ICE transport policy (all or relay)')
1988+
parser.add_argument('--h265', action='store_true', help='Prioritize h265/hevc encoding over h264')
1989+
parser.add_argument('--hevc', action='store_true', help='Prioritize h265/hevc encoding over h264 (same as --h265)')
1990+
parser.add_argument('--x265', action='store_true', help='Prioritizes x265 software encoder over hardware encoders')
19781991

19791992

19801993
args = parser.parse_args()
@@ -2224,6 +2237,12 @@ async def main():
22242237

22252238
if args.rtmp and not args.h264:
22262239
args.h264 = True
2240+
2241+
if args.hevc:
2242+
args.h265 = True
2243+
2244+
if args.x265:
2245+
args.h265 = True
22272246

22282247
h264 = None
22292248
if args.omx and check_plugins('omxh264enc'):
@@ -2256,8 +2275,22 @@ async def main():
22562275

22572276
if h264:
22582277
print("H264 encoder that we will try to use: "+h264)
2259-
2260-
2278+
2279+
h265 = None
2280+
if args.h265:
2281+
if args.x265 and check_plugins('x265enc'):
2282+
h265 = 'x265enc'
2283+
elif check_plugins('mpph265enc'):
2284+
h265 = 'mpph265enc'
2285+
elif check_plugins('x265enc'):
2286+
h265 = 'x265enc'
2287+
else:
2288+
print("Couldn't find an h265 encoder, falling back to h264")
2289+
args.h264 = True # Fallback to h264 if no h265 encoder found
2290+
2291+
if h265:
2292+
print("H265 encoder that we will try to use: "+h265)
2293+
22612294
if args.hdmi:
22622295
args.v4l2 = '/dev/v4l/by-id/usb-MACROSILICON_*'
22632296
args.alsa = 'hw:MS2109'
@@ -2490,7 +2523,19 @@ async def main():
24902523
pipeline_video_input += f' ! videoconvert{timestampOverlay} ! rav1enc bitrate={args.bitrate}000 name="encoder" low-latency=true error-resilient=true speed-preset=10 qos=true ! av1parse ! rtpav1pay'
24912524
elif args.qsv:
24922525
pipeline_video_input += f' ! videoconvert{timestampOverlay} ! qsvav1enc gop-size=60 bitrate={args.bitrate} name="encoder1" ! av1parse ! rtpav1pay'
2493-
2526+
elif args.h265 and h265:
2527+
if h265 == "mpph265enc":
2528+
# mpph265enc uses bps (bits per second) instead of bitrate
2529+
# bps takes value in bits per second, so multiply bitrate (kbps) by 1000
2530+
pipeline_video_input += f' ! videoconvert{timestampOverlay} ! video/x-raw,format=NV12 ! {h265} name="encoder" bps={args.bitrate * 1000} qos=true qp-init=35 qp-max=45 qp-min=20 qp-max-i=40 qp-min-i=20 rc-mode=1 ! video/x-h265,stream-format=(string)byte-stream'
2531+
elif h265 == "x265enc":
2532+
# x265enc uses bitrate in kbps
2533+
pipeline_video_input += f' ! videoconvert{timestampOverlay} ! queue max-size-buffers=10 ! {h265} bitrate={args.bitrate} speed-preset=superfast tune=zerolatency key-int-max=30 name="encoder" ! video/x-h265,profile=main,stream-format=byte-stream'
2534+
2535+
if args.rtmp:
2536+
pipeline_video_input += f' ! queue ! h265parse'
2537+
else:
2538+
pipeline_video_input += f' ! queue max-size-time=1000000000 max-size-bytes=10000000000 max-size-buffers=1000000 ! h265parse {saveVideo} ! rtph265pay config-interval=-1 ! application/x-rtp,media=video,encoding-name=H265,payload=96'
24942539
else:
24952540
if args.nvidia:
24962541
pipeline_video_input += f' ! nvvidconv ! video/x-raw(memory:NVMM) ! omxvp8enc bitrate={args.bitrate}000 control-rate="constant" name="encoder" qos=true ! rtpvp8pay ! application/x-rtp,media=video,encoding-name=VP8,payload=96'

0 commit comments

Comments
 (0)