播放器 potplayer rtsp播放器

2023-11-10

目录

potplayer:

potplayer 播放万播放下一曲

播放比例设置:

html5_rtsp_player:

GitHub - Streamedian/html5_rtsp_player: Play RTSP stream from IP camera in browser in this HTML5 player without plugins

Error: Please, upgrade your dependencies to the actual version of core-js@3

Videojs播放RTMP流媒体

http://blog.csdn.net/dong_18383219470/article/details/52998278

FFmpeg3.3.2+SDL2实现流媒体音频播放

Qt+VLC编写的流媒体播放器

RTSP流媒体播放器实现


potplayer:

下载地址:

https://softforspeed.51xiazai.cn/down/2022down/12/02/PotPlayer1.7.21846.exe

h265解码器:

Releases · Nevcairiel/LAVFilters · GitHub

potplayer 播放万播放下一曲

首先我们双击打开“PotPlayer”播放器

      这时打开播放器后,点击软件左上角的“PotPlayer”

      接着打开软件选项列表后,选择“配置/语言/其他”选择

      然后我们在打开的次级菜单中,选择“收尾处理”

      在弹出的收尾处理次级菜单中,选择“播放完当前后停止”

播放比例设置:

右键,比例,保持宽高比

html5_rtsp_player:

GitHub - Streamedian/html5_rtsp_player: Play RTSP stream from IP camera in browser in this HTML5 player without plugins

Error: Please, upgrade your dependencies to the actual version of core-js@3

解决方法:

npm install --save core-js@^3

ARM+mplayer+QT+流媒体项目源代码包下载(刘继光著)

http://download.csdn.net/index.php/mobile/source/download/liuji_guang/2771211

Videojs播放RTMP流媒体

http://blog.csdn.net/dong_18383219470/article/details/52998278

FFmpeg3.3.2+SDL2实现流媒体音频播放

http://blog.csdn.net/ywl5320/article/details/76383099

Qt+VLC编写的流媒体播放器

https://sh.qihoo.com/ctranscode?userid=1a4f8abeb7b38703c3e907bc82ac9bde&fast=1&&360sodetail=1&u=http%3A%2F%2Fblog.csdn.net%2Fu012952807%2Farticle%2Fdetails%2F51659446&m=2faad55a1713f4197f47c4be009fa606a2a0b9dd&q=qt%20%20%20%20%20%E6%B5%81%E5%AA%92%E4%BD%93%E6%92%AD%E6%94%BE&t=news&sid=d9d0cc4e29c791f47f9a37b4e4bdb72b&tc_mode=news_recom

RTSP流媒体播放器实现

        最近需要做一个RTSP流媒体播放器,研究了一下,封装了一个RTSP播放类CRTSPPlayer,解码库采用ffmpeg。由于需求比较简单,时间也有限,目前只实现了播放、停止、暂停几个基本的接口。下面是基于CRTSPPlayer类实现的简单RTSP播放器。

       目前视频只测试了H264格式,其它格式的视频还未做测试。播放器也支持直接打开本地视频播放,但播放的帧率和原始视频的码率不同步。目前还不清楚如何处理这个问题,希望懂这方面的大侠指教。

       另外,还有一个开源的库VLC也可以用来开发流媒体播放器,它支持多种流媒体协议,如RTP、RTSP等,CodeProject上已经有牛人在VLCLib的基础上封装可更易使用的库VLCWrapper(地址:VLCWrapper - A Little C++-wrapper Around libvlc - CodeProject)。用它可以很方便的开发视频播放器。

        以下是CRTSPPlayer完整的代码:

头文件: view plain copy

/********************************************************************  
filename:   CRTSPPlayer.h  
created:    2013-03-25  
author:     firehood  
purpose:    ffmpeg库实现的RTSP视频播放器 
*********************************************************************/   
#pragma once  
#include "windows.h"  
  
extern "C"  
{  
#include "libavformat\avformat.h"  
#include "libavcodec\avcodec.h"  
#include "libswscale\swscale.h"  
};  
  
// 播放状态  
enum RTSP_PLAYSTATUS  
{  
    RTSP_PLAYSTATUS_NONE,       // 未知状态(未播放)  
    RTSP_PLAYSTATUS_PLAYING,    // 正在播放  
    RTSP_PLAYSTATUS_PAUSE,      // 已暂停  
    RTSP_PLAYSTATUS_STOP,       // 已停止  
};  
  
class CRTSPPlayer  
{  
public:  
    CRTSPPlayer(HWND hWnd, LPRECT lpRect);  
    ~CRTSPPlayer(void);  
public:  
    // 打开媒体文件  
    BOOL OpenMedia(LPCTSTR pFileName);  
    // 播放  
    void Play();  
    // 暂停  
    void Pause();  
    // 停止  
    void Stop();  
    // 获取播放状态  
    RTSP_PLAYSTATUS GetPlayStatus(void);  
private:  
    // 解码初始化  
    int DecodeInit(LPCTSTR pFileName);  
    // 卸载  
    void DecodeUninit();  
    // 开始解码线程  
    BOOL StartDecodeThread();  
    // 停止解码线程  
    void StopDecodeThread();  
    // 解码线程  
    static int WINAPI ThreadDecodeVideo(LPVOID lpParam);  
    // 开始解码任务  
    int BeginDecode();  
    // 显示  
    void Display();  
    // 图像转换  
    int ImgConvert(AVPicture * dst, PixelFormat dstFormt, const AVPicture * src, PixelFormat srcFormt, int src_width, int src_height);  
    // 设置播放状态  
    void SetPlayStatus(RTSP_PLAYSTATUS playStatus);  
private:  
    HANDLE  m_hDecodeThread;  
    BOOL    m_bExitDecodeThread;  
    TCHAR   m_strFilePath[MAX_PATH];  
  
    AVFormatContext* m_pFormatContext;  
    AVCodecContext*  m_pCodecContext;  
    AVCodec* m_pCodec;  
    AVPacket m_struPacket;  
    int m_nStreamIndex;  
    AVFrame* m_pFrameYUV;  
    AVFrame* m_pFrameRGB;  
    int     m_nFrameWidth;   
    int     m_nFrameHeight;  
    BYTE*   m_pBufRGB;        // 解码后的RGB数据  
  
    RTSP_PLAYSTATUS  m_nPlayStatus;  
    HWND    m_hWnd;  
    RECT    m_rcWnd;  
};  

源文件:


/********************************************************************  
filename:   CRTSPPlayer.cpp  
created:    2013-03-25  
author:     firehood  
purpose:    ffmpeg库实现的RTSP视频播放器 
*********************************************************************/   
#include "StdAfx.h"  
#include "RTSPPlayer.h"  
  
#pragma comment(lib, "avformat.lib")  
#pragma comment(lib, "avcodec.lib")  
#pragma comment(lib, "swscale.lib")  
#pragma comment(lib, "avutil.lib")  
  
#define SHOW_TITLE  
  
const char* WcharToUtf8(const wchar_t *pwStr)    
{    
    if (pwStr == NULL)    
    {    
        return NULL;    
    }    
  
    int len = WideCharToMultiByte(CP_UTF8, 0, pwStr, -1, NULL, 0, NULL, NULL);    
    if (len <= 0)    
    {    
        return NULL;    
    }    
    char *pStr = new char[len];    
    WideCharToMultiByte(CP_UTF8, 0, pwStr, -1, pStr, len, NULL, NULL);    
    return pStr;    
}    
  
CRTSPPlayer::CRTSPPlayer(HWND hWnd, LPRECT lpRect):  
m_hWnd(hWnd),  
m_rcWnd(*lpRect),  
m_hDecodeThread(NULL),  
m_bExitDecodeThread(FALSE),  
m_nFrameWidth(0),  
m_nFrameHeight(0),  
m_pFormatContext(NULL),  
m_pCodecContext(NULL),  
m_pCodec(NULL),  
m_nStreamIndex(-1),  
m_pFrameYUV(NULL),  
m_pFrameRGB(NULL),  
m_pBufRGB(NULL),  
m_nPlayStatus(RTSP_PLAYSTATUS_NONE)  
{  
    memset(m_strFilePath,0,sizeof(m_strFilePath));  
}  
  
CRTSPPlayer::~CRTSPPlayer(void)  
{  
    DecodeUninit();  
}  
  
// 打开媒体文件  
BOOL CRTSPPlayer::OpenMedia(LPCTSTR pFileName)  
{  
    if(pFileName == NULL)  
        return FALSE;  
    DecodeUninit();  
    memcpy(m_strFilePath,pFileName,sizeof(m_strFilePath));  
    DecodeInit(m_strFilePath);  
    return TRUE;  
}  
  
// 播放  
void CRTSPPlayer::Play()  
{   
    if(GetPlayStatus() == RTSP_PLAYSTATUS_STOP)  
    {  
        DecodeInit(m_strFilePath);  
    }  
    BOOL bRet = StartDecodeThread();  
    if(bRet)  
    {  
        SetPlayStatus(RTSP_PLAYSTATUS_PLAYING);  
    }  
}  
  
// 暂停  
void CRTSPPlayer::Pause()  
{  
    StopDecodeThread();  
    SetPlayStatus(RTSP_PLAYSTATUS_PAUSE);  
}  
  
// 停止  
void CRTSPPlayer::Stop()  
{  
    StopDecodeThread();  
    DecodeUninit();  
    SetPlayStatus(RTSP_PLAYSTATUS_STOP);  
}  
  
BOOL CRTSPPlayer::StartDecodeThread()  
{  
    if(m_hDecodeThread == NULL)  
    {  
        m_hDecodeThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadDecodeVideo, this, 0, NULL);  
    }  
    return m_hDecodeThread ? TRUE : FALSE;  
}  
  
void CRTSPPlayer::StopDecodeThread()  
{  
    if(m_hDecodeThread)  
    {  
        m_bExitDecodeThread = TRUE;  
        WaitForSingleObject(m_hDecodeThread,INFINITE);  
        CloseHandle(m_hDecodeThread);  
        m_hDecodeThread = NULL;  
    }  
}  
  
int CRTSPPlayer::ImgConvert(AVPicture * dst, PixelFormat dst_pix_fmt, const AVPicture * src, PixelFormat src_pix_fmt, int src_width, int src_height)  
{  
  
    unsigned char * srcSlice[4];  
    int srcStride[4] = {0};  
  
    unsigned char * dstSlice[4];  
    int dstStride[4] = {0};  
  
  
    for (int i=0; i<4; i++)  
    {  
        srcSlice[i] = src->data[i];  
        srcStride[i] = src->linesize[i];  
  
        dstSlice[i] = dst->data[i];  
        dstStride[i] = dst->linesize[i];  
    }  
  
    SwsContext *pSwsContext = sws_getContext(src_width, src_height, src_pix_fmt, src_width, src_height, dst_pix_fmt, SWS_BICUBIC, NULL, NULL, NULL);  
  
    int nRet = sws_scale(pSwsContext, srcSlice, srcStride, 0, src_height, dstSlice, dstStride);  
  
    if (pSwsContext != NULL)  
    {  
        sws_freeContext(pSwsContext);  
    }  
  
    return nRet;  
}  
  
int WINAPI CRTSPPlayer::ThreadDecodeVideo(LPVOID lpParam)  
{  
    CRTSPPlayer *pPlayer = (CRTSPPlayer*)lpParam;  
  
    pPlayer->BeginDecode();  
  
    return 0;  
}  
  
int CRTSPPlayer::DecodeInit(LPCTSTR pFileName)  
{  
    if(pFileName == NULL)  
    {  
        return -1;  
    }  
  
    av_register_all();  
  
#ifdef  UNICODE     
    const char *filePath = WcharToUtf8(pFileName);   
    // Open video  
    if (av_open_input_file(&m_pFormatContext, filePath, NULL, 0, NULL) != 0)  
    {  
        return -2; // Couldn't open file  
    }  
    delete[] filePath;  
#else  
    // Open video  
    if (av_open_input_file(&m_pFormatContext, pFileName, NULL, 0, NULL) != 0)  
    {  
        return -2; // Couldn't open file  
    }  
#endif  
    // Retrieve stream information  
    if (av_find_stream_info(m_pFormatContext) < 0)  
    {  
        return -3; // Couldn't find stream information  
    }  
  
    // Find the first video stream  
    for (UINT i=0; i<m_pFormatContext->nb_streams; i++)  
    {  
        if (m_pFormatContext->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO)  
        {  
            m_nStreamIndex = i;  
            break;  
        }  
    }  
    if (m_nStreamIndex == -1)  
    {  
        return -4; // Didn't find a video stream  
    }  
  
    // Get a pointer to the codec context for the video stream  
    m_pCodecContext = m_pFormatContext->streams[m_nStreamIndex]->codec;  
  
    // Find the decoder for the video stream  
    m_pCodec = avcodec_find_decoder(m_pCodecContext->codec_id);  
    if (m_pCodec == NULL)  
    {  
        return -5 ; // Codec not found  
    }  
  
    // Inform the codec that we can handle truncated bitstreams -- i.e.,  
    // bitstreams where frame boundaries can fall in the middle of packets  
    if (m_pCodec->capabilities & CODEC_CAP_TRUNCATED)  
    {  
        m_pCodecContext->flags |= CODEC_FLAG_TRUNCATED;  // we do not send complete frames  
    }  
  
    // Open codec  
    if (avcodec_open(m_pCodecContext, m_pCodec) < 0)  
    {  
        return -6; // Could not open codec  
    }  
  
    // Allocate video frame  
    m_pFrameYUV = avcodec_alloc_frame();  
  
    // Allocate an AVFrame structure  
    m_pFrameRGB = avcodec_alloc_frame();  
  
    // Determine required buffer size and allocate buffer  
    int numBytes = avpicture_get_size(PIX_FMT_BGR24, m_pCodecContext->width, m_pCodecContext->height);  
    m_pBufRGB = new BYTE [numBytes];  
    memset(m_pBufRGB,0,numBytes);  
    // Assign appropriate parts of buffer to image planes in m_pFrameRGB  
    avpicture_fill((AVPicture *)m_pFrameRGB, m_pBufRGB, PIX_FMT_BGR24, m_pCodecContext->width, m_pCodecContext->height);  
  
    m_nFrameWidth  = m_pCodecContext->width;  
    m_nFrameHeight = m_pCodecContext->height;  
  
    return 0;  
}  
  
void CRTSPPlayer::DecodeUninit()  
{  
    // Close the codec  
    if (m_pCodecContext)  
    {  
        avcodec_close(m_pCodecContext);  
        //av_free(m_pCodec);  
        m_pCodecContext = NULL;  
        m_pCodec = NULL;  
    }  
  
    // Close the video file  
    if (m_pFormatContext)  
    {  
        av_close_input_file(m_pFormatContext);  
        m_pFormatContext = NULL;  
    }  
  
    if (m_pFrameYUV)  
    {  
        av_free(m_pFrameYUV);  
        m_pFrameYUV = NULL;  
    }  
  
    if (m_pFrameRGB)  
    {  
        av_free(m_pFrameRGB);  
        m_pFrameRGB = NULL;  
    }  
  
    if (m_pBufRGB)  
    {  
        delete [] m_pBufRGB;  
        m_pBufRGB = NULL;  
    }  
}  
  
int CRTSPPlayer::BeginDecode()  
{  
    int bytesRemaining = 0, bytesDecoded;  
    BYTE * rawData = NULL;  
  
    int frameFinished = 0;  
  
    m_struPacket.data = NULL;  
    m_struPacket.size = 0;  
  
    m_bExitDecodeThread = FALSE;  
  
    while (!m_bExitDecodeThread && m_pFormatContext)  
    {  
        // Read the next packet, skipping all packets that aren't for this stream  
        do  
        {  
            // Read new packet  
            if (av_read_frame(m_pFormatContext, &m_struPacket) < 0)  
            {  
  
                return -2;  
            }  
        } while (m_struPacket.stream_index != m_nStreamIndex);  
  
        bytesRemaining = m_struPacket.size;  
        rawData = m_struPacket.data;  
  
        // Work on the current packet until we have decoded all of it  
        while (bytesRemaining > 0)  
        {  
            // Decode the next chunk of data  
            bytesDecoded = avcodec_decode_video(m_pCodecContext, m_pFrameYUV, &frameFinished, rawData, bytesRemaining);  
  
            // Was there an error?  
            if (bytesDecoded < 0)  
            {  
                return -1;  
            }  
  
            bytesRemaining -= bytesDecoded;  
            rawData += bytesDecoded;  
  
            // Did we finish the current frame? Then we can return  
            if (frameFinished)  
            {  
                ImgConvert(  
                    (AVPicture *)m_pFrameRGB,  
                    PIX_FMT_BGR24,  
                    (AVPicture *)m_pFrameYUV,  
                    m_pCodecContext->pix_fmt,  
                    m_pCodecContext->width,  
                    m_pCodecContext->height);  
  
                Display();  
            }  
        }  
    }  
    m_hDecodeThread = NULL;  
    return 0;  
}  
  
void CRTSPPlayer::Display()  
{  
    HDC hdc = GetDC(m_hWnd);  
    // 创建内存DC  
    HDC hMemDc = CreateCompatibleDC(hdc);       
  
    // 创建位图  
    BITMAPINFOHEADER bmpHdr = {0};    
    bmpHdr.biSize = sizeof (BITMAPINFOHEADER);    
    bmpHdr.biWidth = m_nFrameWidth;    
    bmpHdr.biHeight = -m_nFrameHeight;    
    bmpHdr.biPlanes = 1;    
    bmpHdr.biBitCount = 24;    
    bmpHdr.biCompression = BI_RGB;    
  
    BYTE *pData = NULL;     
    HBITMAP hBitmap = CreateDIBSection (NULL, (BITMAPINFO *)&bmpHdr, DIB_RGB_COLORS, (void**)&pData, NULL, 0);    
  
    try  
    {  
        memcpy(pData, m_pBufRGB, m_nFrameWidth * m_nFrameHeight * 3);  
    }  
    catch (CMemoryException* e)  
    {  
          
    }  
  
    HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDc, hBitmap);  
  
#ifdef SHOW_TITLE  
    // 设置字体参数  
    LOGFONT logfont;  
    memset(&logfont, 0, sizeof(LOGFONT));  
    logfont.lfHeight = 40;  
    logfont.lfWidth = 0;      
    logfont.lfEscapement = 0;  
    logfont.lfOrientation = 0;  
    logfont.lfWeight = 30;  
    logfont.lfItalic = 0;  
    logfont.lfUnderline = 0;  
    logfont.lfStrikeOut = 0;  
    logfont.lfCharSet = DEFAULT_CHARSET;     
    logfont.lfOutPrecision= OUT_DEFAULT_PRECIS;     
    logfont.lfClipPrecision= OUT_DEFAULT_PRECIS;     
    logfont.lfQuality = DEFAULT_QUALITY;     
    logfont.lfPitchAndFamily= DEFAULT_PITCH;    
  
    // 创建字体并选入环境  
    HFONT hFont = CreateFontIndirect(&logfont);  
    HFONT hOldFont = (HFONT)SelectObject(hMemDc, hFont);  
  
    // 设置绘图环境  
    SetBkMode(hMemDc, TRANSPARENT);    
    SetTextColor(hMemDc, RGB(255, 255, 0));  
  
    // 绘制文字  
    TextOut(hMemDc,0,0,m_strFilePath,_tcslen(m_strFilePath));  
  
    // 恢复环境释放字体  
    SelectObject(hMemDc, hOldFont);  
#endif  
    StretchBlt(    
        hdc,    
        m_rcWnd.left,     
        m_rcWnd.top,     
        m_rcWnd.right-m_rcWnd.left,     
        m_rcWnd.bottom-m_rcWnd.top,     
        hMemDc,    
        0,     
        0,     
        m_nFrameWidth,     
        m_nFrameHeight,     
        SRCCOPY);    
  
    // 恢复并释放环境      
    SelectObject(hMemDc,hOldBitmap);    
    DeleteObject(hBitmap);    
    DeleteDC(hMemDc);    
}  
  
// 获取播放状态  
RTSP_PLAYSTATUS CRTSPPlayer::GetPlayStatus(void)  
{  
    return m_nPlayStatus;  
}  
  
// 设置播放状态  
void CRTSPPlayer::SetPlayStatus(RTSP_PLAYSTATUS playStatus)  
{  
    m_nPlayStatus = playStatus;  
}  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

播放器 potplayer rtsp播放器 的相关文章

随机推荐

  • 【Linux之Shell脚本实战】监控系统的磁盘空间使用率

    Linux之Shell脚本实战 监控系统的磁盘空间使用率 一 脚本要求 二 检查本地系统环境 1 检查系统版本 2 检查系统内核版本 三 编写disk sh脚本 1 创建脚本目录 2 编写disk sh脚本 3 执行测试脚本 四 查看脚本执
  • redis哨兵模式及主从配置

    例 现有3台服务器 需要配置1主1从3哨兵 服务器1 103 162 37 166 主 redis6380 哨兵1 sentinel26380 服务器2 103 162 37 167 从 redis6380 哨兵2 sentinel2638
  • 03-用Jupyter编写数学公式

    用jupyter编写数学公式 Contents 1 两种数学模式 2 空格 3 上标和下标 4 命令 5 符号 6 头标 7 括号 8 字体及其选项 9 转义字符 10 等式对齐 11 分段函数 12 一点总结 13 附录1 数学符号表 1
  • STM32F0x高级定时器之PWM模式

    脉冲宽度调制模式允许您生成一个信号 其频率由TIMx ARR寄存器的值确定 占空比由TIMx CCRx寄存器的值决定 通过在TIMx CCMRx寄存器的OCxM位中写入 110 PWM mode 1 或 111 PWM mode 2 可以在
  • WdatePicker 限制选择最小最大日期

    1 需求 限制最小 最大日期选择 如最小日期只能选择上一年度日期 最大日期只能选择到当天日期 2 解决 使用WdatePicker日期插件 设置minDate maxDate 代码如下 div class form group div
  • 通俗易懂的LLM(上篇)

    目录 前言 一 Tuning 1 Fine Tuning 微调 2 Prompt Tuning 提示微调 2 1 In context learning 上下文学习 2 2 Pattern Verbalizer Pair PVP 2 3 P
  • 分享一个卡通人物

    这几天较忙 像它一样 代码在这里
  • MySQL将以逗号分隔的数据分成多行,再合并为一行

    最近遇到个这样的问题 MySQL中的 影片表 中 演员列 的内容是用逗号分隔的多个id存储的 例 4356 9691 11337 然后需要把他换成id对应的演员名字 例 屈菁菁 王太利 肖央 看起来很复杂 其实只要把问题拆分一下就会非常简单
  • vue3+Element-plus el-select 下拉选择 多选增加全选封装组件(2023-09-20 TSelect组件新增自定义显示下拉项label)

    2023 09 20 TSelect组件新增自定义显示下拉项label 一 效果图 含适用于条件查询组件中使用 二 参数配置 1 代码示例
  • 16LinuxC进程间通信之mmap创建匿名映射区

    1 mmap创建匿名映射区 1 创建匿名映射区非常简单 只需要加上MAP ANONYMOUS即可 参数len长度可以随便大小 fd没有传 1即可 open这些函数可以不需要了 并且匿名映射实际上就是解决中间创建的文件问题 2 并且 匿名映射
  • 【杂记】YOLOv1至YOLOv8各版本发布时间及作者

    YOLO You Only Look Once 2015 6 8 Joseph Redmon YOLOv2 YOLO9000 2016 12 25 Joseph Redmon YOLOv3 2018 4 8 Joseph Redmon YO
  • 用c语言、java、c++编写一个程序,输出九九乘法表。

    先上代码 include
  • PS故障风海报制作技术分享

    1 首先找一张看起来很酷的图 也可以选择自己喜欢的图片 2 复制图层 点击添加图层样式 选择混合选项 在高级混合里面的通道选项 有R G B三个通道选项 默认是全部勾选的状态 选择其中一个勾掉 关于通道应该选择哪一个或者哪几个 可以挨个尝试
  • GMM高斯混合模型聚类的EM估计过程matlab仿真

    目录 1 算法概述 2 仿真效果 3 MATLAB源码 1 算法概述 高斯混合模型 Gaussian Mixed Model 指的是多个高斯分布函数的线性组合 理论上GMM可以拟合出任意类型的分布 通常用于解决同一集合下的数据包含多个不同的
  • 算法,C技能树测评

    产品功能 技能树是一个帮助 IT 领域学习者进行职业成长的一站式学习工具 UI界面 产品交互 算法技能树 左边是对应算法技能树的目录 中间是内容 每个小知识点里面都会有对应的题目 完成题目这里就会显示绿色 没完成的则为白色 在中间每一题都有
  • 【TCP/IP】广播 - 定义、原理及编程实现

    本文共计2974字 预计阅读时间4分钟 目录 广播 广播的原理及形式 广播的编程与实现 套接字选项设置 发送者 接收者 拓展资料 广播 广播 Broadcast 是指封包在计算机网络中传输时 目的地址为网络中所有设备的一种传输方式 这里所说
  • PMBOK(第六版) PMP笔记——《第四章 项目整合管理》

    第 4 章 项目整合管理 从第四章开始 进入49个过程的学习 49个过程被划分为十大知识领域 分为十个章节 本章节是项目整合管理知识领域 主要讲述项目整合管理的7个过程 1 需要对什么进行整合管理 干系人需求 约束条件 项目管理各个过程 项
  • 创建图片外链——“极简图床”

    开发微信小程序项目 上传代码时要求项目文件大小不能超过2M 那么 当小程序页面里有很多图片时 如果全部放在项目文件中 就很容易使得代码包超过2M 为了压缩代码 这时就需要将图片放在其它平台上 然后在小程序项目代码中引用需要的图片的外链地址
  • Android控制界面布局的两种方式

    概念一 View Android所有UI组件都继承自View类 View类是一个抽象类 不能直接创建View类的对象 即不能直接实例化 通常是实例化View类的子类 即具体的UI组件或布局管理器 View类还有一个重要的子类 ViewGro
  • 播放器 potplayer rtsp播放器

    目录 potplayer potplayer 播放万播放下一曲 播放比例设置 html5 rtsp player GitHub Streamedian html5 rtsp player Play RTSP stream from IP c