微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将 gst-element avdec_h264 设置为多线程解码

如何解决如何将 gst-element avdec_h264 设置为多线程解码

我使用 gstreamer 1.16.2,在 ubuntu20.04 之类的 os 上运行,没有硬件来加速解码。我的想法是通过优化解码的 cpu 成本来减少视频延迟。这是我接收和解码远程rtp流的管道。

200390  200356 54 20:15 ?        00:01:05 /usr/bin/gst-launch-1.0 -v udpsrc port=1991 caps="application/x-rtp,media=video" ! rtpjitterbuffer latency=20 ! rtpmp2tdepay ! tsdemux name=demuxer demuxer. ! queue name=video_ch max-size-buffers=0 max-size-time=0 ! h264parse ! queue name=dec0 ! avdec_h264 max-threads=2 skip-frame=1 ! videoconvert n-threads=4 ! xvimagesink display=:0 sync=false demuxer. ! queue name=audio_ch max-size-buffers=0 max-size-time=0 ! aacparse ! avdec_aac ! audioconvert ! audioresample ! autoaudiosink
    

但我发现 avdec_h264 在多线程下不起作用,我认为“最大线程”应该可以工作。见下面的“top -H”打印,所有解码工作都加载在200398线程上,命名为“dec0”。

    top -H | grep dec
 200398 root      20   0 1164484  69284  46408 S  57.9   0.9   0:42.92 dec0:src                                                                                                                                    
 200398 root      20   0 1161412  66248  43372 R  32.3   0.8   0:43.90 dec0:src                                                                                                                                    
 200398 root      20   0 1164484  69284  46408 S  82.6   0.9   0:46.41 dec0:src                                                                                                                                    
 200398 root      20   0 1161412  66248  43372 R  82.9   0.8   0:48.93 dec0:src                                                                                                                                    
 200398 root      20   0 1164484  69284  46408 S  59.0   0.9   0:50.73 dec0:src                                                                                                                                    
 200398 root      20   0 1164484  69284  46408 S  32.9   0.9   0:51.73 dec0:src                                                                                                                                    
 200398 root      20   0 1164484  69284  46408 S  24.4   0.9   0:52.47 dec0:src                                                                                                                                    
 200398 root      20   0 1164484  69284  46408 S  24.3   0.9   0:53.21 dec0:src                                                                                                                                    
 200398 root      20   0 1164484  69284  46408 S  24.0   0.9   0:53.94 dec0:src 

这是“父PID”200390的pstree打印,它是/usr/bin/gst-launch-1.0程序。

pstree -pt 200390

gst-launch-1.0(200390)─┬─{audio_ch:src}(200399)
                       ├─{audio_ch:src}(201471)
                       ├─{dec0:src}(200398)
                       ├─{dec0:src}(200405)
                       ├─{gmain}(200404)
                       ├─{gst-launch-1.0}(200397)
                       ├─{rtpjitterbuffer}(200402)
                       ├─{timer}(200401)
                       ├─{udpsrc0:src}(200403)
                       ├─{video_ch:src}(200400)
                       ├─{videoconvert}(200406)
                       ├─{videoconvert}(200407)
                       └─{videoconvert}(200408)

我调试线程20045,它是200398的兄弟解码线程,它似乎被阻塞了:pthread_cond_wait,因为spawned。

(gdb) bt
#0  0x0000007f83073038 in **pthread_cond_wait**@@GLIBC_2.17 () at /lib/aarch64-linux-gnu/libpthread.so.0
#1  0x0000007f800c5cbc in  () at /lib/aarch64-linux-gnu/libavutil.so.56
#2  0x0000007f8306c4fc in start_thread () at /lib/aarch64-linux-gnu/libpthread.so.0
#3  0x0000007f82fc530c in  () at /lib/aarch64-linux-gnu/libc.so.6

这是线程信息:

Attaching to process 200390
[New LWP 200397]
[New LWP 200398]
[New LWP 200399]
[New LWP 200400]
[New LWP 200401]
[New LWP 200402]
[New LWP 200403]
[New LWP 200404]
[New LWP 200405]
[New LWP 200406]
[New LWP 200407]
[New LWP 200408]
[New LWP 201471]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/aarch64-linux-gnu/libthread_db.so.1".
0x0000007f82ceedb8 in poll () from /lib/aarch64-linux-gnu/libc.so.6
(gdb) info threads
  Id   Target Id                                          Frame
* 1    Thread 0x7f83114790 (LWP 200390) "gst-launch-1.0"  0x0000007f82ceedb8 in poll () from /lib/aarch64-linux-gnu/libc.so.6
  2    Thread 0x7f7866e1e0 (LWP 200397) "gst-launch-1.0"  0x0000007f82cc541c in clock_nanosleep () from /lib/aarch64-linux-gnu/libc.so.6
  3    Thread 0x7f77e6d1e0 (LWP 200398) "dec0:src"        0x0000007f82cf4760 in syscall () from /lib/aarch64-linux-gnu/libc.so.6
  4    Thread 0x7f776311e0 (LWP 200399) "audio_ch:src"    0x0000007f82cf4760 in syscall () from /lib/aarch64-linux-gnu/libc.so.6
  5    Thread 0x7f76e301e0 (LWP 200400) "video_ch:src"    0x0000007f82cf4760 in syscall () from /lib/aarch64-linux-gnu/libc.so.6
  6    Thread 0x7f7662f1e0 (LWP 200401) "timer"           0x0000007f82cf4760 in syscall () from /lib/aarch64-linux-gnu/libc.so.6
  7    Thread 0x7f75e2e1e0 (LWP 200402) "rtpjitterbuffer" 0x0000007f82cf4760 in syscall () from /lib/aarch64-linux-gnu/libc.so.6
  8    Thread 0x7f7562d1e0 (LWP 200403) "udpsrc0:src"     0x0000007f82ceedb8 in poll () from /lib/aarch64-linux-gnu/libc.so.6
  9    Thread 0x7f74e2c1e0 (LWP 200404) "gmain"           0x0000007f82ceedb8 in poll () from /lib/aarch64-linux-gnu/libc.so.6
  10   Thread 0x7f57fff1e0 (LWP 200405) "dec0:src"        0x0000007f82da6038 in pthread_cond_wait@@GLIBC_2.17 () from /lib/aarch64-linux-gnu/libpthread.so.0
  11   Thread 0x7f574fe1e0 (LWP 200406) "videoconvert"    0x0000007f82cf4760 in syscall () from /lib/aarch64-linux-gnu/libc.so.6
  12   Thread 0x7f56cfd1e0 (LWP 200407) "videoconvert"    0x0000007f82cf4760 in syscall () from /lib/aarch64-linux-gnu/libc.so.6
  13   Thread 0x7f564fc1e0 (LWP 200408) "videoconvert"    0x0000007f82cf4760 in syscall () from /lib/aarch64-linux-gnu/libc.so.6
  14   Thread 0x7f554031e0 (LWP 201471) "audio_ch:src"    0x0000007f82ceedb8 in poll () from /lib/aarch64-linux-gnu/libc.so.6
(gdb) c
Continuing.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。