数据是通过套接字接收的,没有更多的外壳,它们是纯 IPB 帧,以 NAL 标头(类似于 00 00 00 01)开头。我现在使用 pyav 来解码帧,但我只能在收到第二个 pps 信息(在关键帧中)后解码数据(因此我发送到解码线程的数据块可以以 pps 和 sps 开头),否则解码()或demux()将返回错误“不存在的PPS 0引用的decode_slice_header错误”。
我想将数据馈送到可以记住前一个 P 帧的支持解码器,因此在馈送一个 B 帧后,解码器返回一个已解码的视频帧。或者某种形式的 IO,可以作为容器打开并继续由另一个线程向其中写入数据。
这是我的关键代码:
#read thread... read until get a key frame, then make a new io.BytesIO() to store the new data.
rawFrames = io.BytesIO()
while flag_get_keyFrame:()
....
content= socket.recv(2048)
rawFrames.write(content)
....
#decode thread... decode content between two key frames
....
rawFrames.seek(0)
container = av.open(rawFrames)
for packet in container.demux():
for frame in packet.decode():
self.frames.append(frame)
....
Run Code Online (Sandbox Code Playgroud)
我的代码将播放视频,但有 3~4 秒的延迟。所以我不会把所有的东西都放在这里,因为我知道它实际上并没有达到我想要实现的目标。我想在收到第一个关键帧后播放视频,并在收到后立即解码以下帧。Pyav opencv …
设置背景颜色很好,但我的界面有一个 Qwidget,它会在某个时刻更改其背景颜色。这将导致程序崩溃,当我注释掉颜色改变代码时崩溃停止。
下面的代码在运行一段时间后肯定会崩溃。
import sys
from PySide2.QtWidgets import QWidget,QPushButton,QApplication,QListWidget,QGridLayout,\
QLabel,QMainWindow,QLineEdit,QScrollArea,QVBoxLayout,QMessageBox
from PySide2.QtCore import QTimer,QDateTime,QSize,Qt
from PySide2.QtGui import *
import requests,json
import configparser #
import os
import time
import threading #
from pynput import keyboard #
import requests,json
from math import *
from functools import partial
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.resize(320,100)
self.setWindowTitle('aaaa')
self.setStyleSheet("QMainWindow\
{\
background-color:white;\
color:white;\
margin:0px\
}")
self.InitializeWindow()
self.i=0
def InitializeWindow(self):
self.statebar=QWidget(self)
self.statebar.setGeometry(0, 40, 320, 54)
print(sys._getframe().f_lineno)
self.statebar.setStyleSheet("QWidget{background-color:#1EC5CD}")
self.th_countdown=threading.Thread(target=self.countdown,args=())
self.th_countdown.setDaemon(True)
self.th_countdown.start()
self.message_main=QLabel(self.statebar)
self.message_main.setGeometry(150,7,40,37)
self.message_main.setStyleSheet("background:transparent;color:white;margin:0px;font-size:45px;font-weight:bold")
self.message_main.setWordWrap(True)
self.message_main.hide()
self.message_main.setAlignment(Qt.AlignTop|Qt.AlignLeft)
self.message_signature=QLabel(self.statebar) …Run Code Online (Sandbox Code Playgroud)