小编Der*_*ery的帖子

如何使用 pyav 或 opencv 解码原始 H.264 数据的实时流?

数据是通过套接字接收的,没有更多的外壳,它们是纯 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 …

python opencv ffmpeg h.264 pyav

5
推荐指数
1
解决办法
1万
查看次数

Qwidget 背景颜色改变时程序随机崩溃

设置背景颜色很好,但我的界面有一个 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)

python python-multithreading qtstylesheets pyside2

4
推荐指数
1
解决办法
1128
查看次数