流媒体学习笔记---------编码视频的预览

m3u8 视频流 h5 中预览 立即下载

这篇文章是对以前写过的《显示压缩前的和压缩后的视频》的补充和完善

 

《显示压缩前的和压缩后的视频》原文如下:

 

要想显示压缩前的和压缩后的视频流要用到IWMEncDataView 接口。要使用IWMEncDataViewCollection::Add方法增加一个IWMEncDataView 接口。

显示编码前的窗口

代码如下://一些基本设定省略。

IWMEncDataView* pPreview;

IWMEncDataViewCollection* pPreviewColl;

hr = CoCreateInstance( CLSID_WMEncPreview,
                           NULL,
                           CLSCTX_INPROC_SERVER,
                           IID_IWMEncDataView,
                           (void**)&pPreview);
// Retrieve the preview collection.
hr = pVidSrc->get_PreviewCollection( &pPreviewColl );
long lCookie = -1;//设定为-1,则编码则自动给你加一个唯一的cookie。
hr = pPreviewColl->Add( pPreview, &lCookie);
HWND hWnd;//一个窗口句柄,如果没有设定,则会自动调用一个系统的窗口。
hr = pPreview->SetViewSetting((DWORD) lCookie,                               sizeof(hWnd), 
                              (BYTE*)&hWnd);
hr = pEncoder->Start();
// Start viewing the stream in a pop-up window.
hr = pPreview->Start(lCookie); //开始编码后,显示窗口。
 
显示编码后的窗口

IWMEncDataView* pPostview;

IWMEncDataViewCollection* pPostviewColl;

hr = CoCreateInstance( CLSID_WMEncPreview,
                           NULL,
                           CLSCTX_INPROC_SERVER,
                           IID_IWMEncDataView,
                           (void**)&pPostview);
// Retrieve the preview collection.
hr = pVidSrc->get_PostviewCollection( &pPostviewColl );
long lCookie = -1;//设定为-1,则编码则自动给你加一个唯一的cookie。
hr = pPostviewColl->Add( pPostview, &lCookie);
HWND hWnd;//一个窗口句柄,如果没有设定,则会自动调用一个系统的窗口。
hr = pPostview->SetViewSetting((DWORD) lCookie,                               sizeof(hWnd), 
                              (BYTE*)&hWnd);
hr = pEncoder->Start();
// Start viewing the stream in a pop-up window.
hr = pPostview->Start(lCookie); //开始编码后,显示窗口。

 

上文只是说明了显示窗口的设置,没有文件输入和格式选择等操作,因此每次都要改源码来控制打开文件、存储路径、编码格式,改进了的程序运行界面如下:

 

其中的两个文件路径分别用Cstring m_path,  m_path1

浏览按钮的实现分别如下:

CFileDialog file(true);//true为打开一个文件,false为保存一个文件

  file.DoModal();  //响应点击事件

  m_path=file.GetPathName();  //得到文件的完整路径

  this->UpdateData(false);  //更新数据

  GetDlgItem(IDC_SCREEN)  //使屏幕捕获和视频设备的按钮无效,因为已经选择了文件编码。这样会使程序更健壮一些,否则无意中点了这两个按钮会出现意外的错误。

              ->EnableWindow(FALSE);

  GetDlgItem(IDC_DEVICE)

              ->EnableWindow(FALSE);

 

 

CFileDialog file1(false,".wmv",NULL,OFN_HIDEREADONLY,  //保存一个文件,而且以.wmv为扩展名

                     "WMV Files (*.wmv)|*.wmv|");

   file1.DoModal();

   if(m_path1=file1.GetPathName())

         GetDlgItem(IDC_COMBO)

              ->EnableWindow(TRUE);

this->UpdateData(false);

 

其中得到编码格式是通过在窗口初始化的时候加入的,通过CPreviewsDlg::Choice();调用自定义的函数,Choice()函数的具体实现如下:

void CPreviewsDlg::Choice()

{

      

       HRESULT hr;

    IWMEncoder* pEncoder;

    IWMEncProfileCollection* pProColl;

    IWMEncProfile* pPro;

    long lCount;

    int i;

 

// Initialize the COM library and retrieve a pointer

// to an IWMEncoder interface.

 

    hr = CoInitialize(NULL);

    hr = CoCreateInstance(CLSID_WMEncoder,

                          NULL,

                          CLSCTX_INPROC_SERVER,

                          IID_IWMEncoder,

                          (void**) &pEncoder);

 

// Retrieve a pointer to an IWMEncProfileCollection interface.

 

    hr = pEncoder->get_ProfileCollection(&pProColl);

 

// Loop through the profile collection and retrieve a specific

// profile.

       CString str;

       CComBSTR bstrName(L"");

 

    hr = pProColl->get_Count(&lCount);

    for (i=0; i<lCount; i++)

    {

      

        hr = pProColl->Item(i, &pPro);

        hr = pPro->get_Name(&bstrName);

        str=bstrName.Copy();

              m_choice.InsertString(i,str);

    }

       pEncoder->Release();

}

 

并使用CcomboBox类的OnSelchangeCombo()来得到选择编码的格式

void CPreviewsDlg::OnSelchangeCombo()

{

     j=m_choice.GetCurSel();  //把当前的选择赋值给j

     if(j!=100)  //j的初值为100,如果不等于100说明已经选择了格式

        GetDlgItem(IDC_START)  //使开始编码按钮有效

              ->EnableWindow(TRUE);     

}

 

关于屏幕和设备的区别是通过全局变量h来标志的,h=1是屏幕捕获, h=2是从设备得到视频。程序如下:

void CPreviewsDlg::OnScreen()

{

   h=1;

   GetDlgItem(IDC_DEVICE)

              ->EnableWindow(FALSE);

   GetDlgItem(IDC_BROWER)

              ->EnableWindow(FALSE);

}

 

void CPreviewsDlg::OnDevice()

{

   h=2; 

   GetDlgItem(IDC_SCREEN)

              ->EnableWindow(FALSE);

   GetDlgItem(IDC_BROWER)

              ->EnableWindow(FALSE);

}

 

当配置好后,就可以开始编码了,程序如下:

void CPreviewsDlg::OnStart()

{

  

hwnd=::GetDlgItem(this->GetSafeHwnd(),IDC_VIEW);  //得到预览编码前窗口的句柄

phwnd=::GetDlgItem(this->GetSafeHwnd(),IDC_POSTVIEW); //得到预览编码后窗口的句柄

//    g_MyThread->SetParentWnd(hwnd);  //可以去掉

       g_MyThread->PostThreadMessage(WM_START,0,0 );  //给线程发送消息,开始编码

       GetDlgItem(IDC_WATCH)

              ->EnableWindow(TRUE);

    GetDlgItem(IDC_STOP)

              ->EnableWindow(TRUE);

       GetDlgItem(IDC_START)

              ->EnableWindow(FALSE);

  

}

线程中的开始函数如下:

void CMyThread::OnStart( WPARAM wParam, LPARAM lParam)

{

      

    IWMEncSourceGroupCollection* pSrcGrpColl;

    IWMEncSourceGroup* pSrcGrp;

    IWMEncSource* pAudSrc1;

    IWMEncSource* pSrc1;

    IWMEncVideoSource* pVidSrc1;

//     IWMEncDataView* pPreview;

       IWMEncDataViewCollection* pPostviewColl;

    IWMEncDataViewCollection* pPreviewColl;

    IWMEncProfileCollection* pProColl;

       IWMEncSourcePluginInfoManager* pSrcPlugMgr;

    IWMEncPluginInfo* pPlugInfo;

    IWMEncProfile* pPro;

    IWMEncDisplayInfo* pDispInfo;

    IWMEncAttributes* pAttr;

    IWMEncBroadcast* pBrdcast;

    IWMEncFile* pFile;

       WMENC_ENCODER_STATE enumEncoderState;

       CComBSTR bstrResource(L"");

    long lCount;

    short i;

      

       hr = CoInitialize(NULL);

    hr = CoCreateInstance(CLSID_WMEncoder,  //初始化com库

              NULL,

              CLSCTX_INPROC_SERVER,

              IID_IWMEncoder,

              (void**) &pEncoder);

      

       // Retrieve a pointer to an IWMEncSourceGroupCollection

       // interface.

      

    hr = pEncoder->get_SourceGroupCollection(&pSrcGrpColl);

      

       // Add a source group to the collection. named "SG_1"

      

    hr = pSrcGrpColl->Add(L"SG_1", &pSrcGrp);

      

       // Add a video and audio source to the source group.

      

    hr = pSrcGrp->AddSource(WMENC_VIDEO, &pSrc1);

    hr = pSrcGrp->AddSource(WMENC_AUDIO, &pAudSrc1);

      

       // Retrieve a pointer to an IWMEncVideoSource interface.

      

       hr = pSrc1->QueryInterface(IID_IWMEncVideoSource,

              (void**)&pVidSrc1);

      

   if(h==0)  //h=0说明是编码文件

   {

           CComBSTR bstrInFile("");

              bstrInFile.Append(pThread->m_path);  //CString和CComBSTR的转化

              hr = pAudSrc1->SetInput(bstrInFile);

              hr = pVidSrc1->SetInput(bstrInFile);

   }

   else

   {

          hr = pEncoder->get_SourcePluginInfoManager(&pSrcPlugMgr);

          hr = pSrcPlugMgr->Item(0, &pPlugInfo);

          

          hr = pPlugInfo->Item(1, &bstrResource);   //设置声音的输入

       CComBSTR Aud(L"DEVICE://");

          Aud.Append(bstrResource);

          hr=pAudSrc1->SetInput(Aud);

          if(h==1)

                 hr=pVidSrc1->SetInput(L"ScreenCap://Screen Capture");  //如果h=1,视频来源为屏幕

          else

          {

                   hr = pSrcPlugMgr->Item(1, &pPlugInfo);

               hr = pPlugInfo->Item(1, &bstrResource);

            CComBSTR Vid(L"DEVICE://");    //得到视频设备的输入

               Vid.Append(bstrResource);

               hr=pVidSrc1->SetInput(Vid);

  

         }

   }

 

              // Choose a profile from the collection.

             

              CComBSTR bstrName = NULL;

              CComVariant varProfile;

              varProfile.vt = VT_DISPATCH;

              hr = pEncoder->get_ProfileCollection(&pProColl);

              hr = pProColl->get_Count(&lCount);

              for (i=0; i<lCount; i++)

              {

                     hr = pProColl->Item(i, &pPro);

                     hr = pPro->get_Name(&bstrName);

                     if(i==j)    //选择编码格式

                     {

                            // Set the profile in the source group.

                            varProfile.pdispVal = pPro;

                            hr = pSrcGrp->put_Profile(varProfile);

                            break;

                     }

              }

             

              // Retrieve a pointer to an IWMEncDisplayInfo interface.

             

              hr = pEncoder->get_DisplayInfo(&pDispInfo);

             

              // Describe the encoded content.

             

              CComBSTR bstrAuthor("Let5fly");

              CComBSTR bstrCopyright("Copyright 2000. All rights reserved.");

              CComBSTR bstrDescription("Description of the encoded content.");

              CComBSTR bstrRating("Content rating.");

              CComBSTR bstrTitle("Test the Encoder");

             

              hr = pDispInfo->put_Author(bstrAuthor);         //描述信息

              hr = pDispInfo->put_Copyright(bstrCopyright);

              hr = pDispInfo->put_Description(bstrDescription);

              hr = pDispInfo->put_Rating(bstrRating);

              hr = pDispInfo->put_Title(bstrTitle);

             

              // Retrieve a pointer to an IWMEncAttributes interface.

             

              hr = pEncoder->get_Attributes(&pAttr);

             

              // Add an attribute to the attributes collection.

             

              CComBSTR bstrAttrName(L"DateCreated: ");

              CComVariant varValue;

              varValue.vt = VT_BSTR;

              varValue.bstrVal = L"02/15/2000";

              hr = pAttr->Add(bstrAttrName,varValue);

             

              // Retrieve a pointer to an IWMEncBroadcast interface.

             

              hr = pEncoder->get_Broadcast(&pBrdcast);  

             

              // Specify a port number and a protocol.

             

              hr = pBrdcast->put_PortNumber(WMENC_PROTOCOL_HTTP, 527);  //设定广播端口为527

             

              // Retrieve a pointer to an IWMEncFile interface.

             

              hr = pEncoder->get_File(&pFile);

             

              // Specify a file in which to save encoded content.

             

              CComBSTR bstrSaveFile("");

           bstrSaveFile.Append(pThread->m_path1);   //存储编码后的文件

           hr = pFile->put_LocalFileName(bstrSaveFile);

             

              // Retrieve a pointer to a preview object.

             

              hr = CoCreateInstance( CLSID_WMEncPreview,

                     NULL,

                     CLSCTX_INPROC_SERVER,

                     IID_IWMEncDataView,

                     (void**)&pPreview);

 

              hr = CoCreateInstance( CLSID_WMEncPreview,    //分别初始化预览窗口

                           NULL,

                           CLSCTX_INPROC_SERVER,

                           IID_IWMEncDataView,

                           (void**)&pPostview);

 

             

             

              // Retrieve the preview collection.

             

              hr = pSrc1->get_PreviewCollection( &pPreviewColl );

              hr = pSrc1->get_PostviewCollection(&pPostviewColl);

 

             

              // Add the postiew object to the data view collection. If you set the

              // cookie to -1, the encoder engine automatically generates a unique

              // cookie.

             

              hr = pPreviewColl->Add( pPreview, &lCookie);

 

              hr = pPostviewColl->Add( pPostview, &lCookiePostview);

             

              // Continue configuring the encoder engine.

             

              hr = pEncoder->PrepareToEncode(VARIANT_TRUE);

             

             

              hr = pPreview->SetViewSetting((DWORD) lCookie,

                     sizeof(hwnd),

                     (BYTE*)&hwnd);

              hr = pPostview->SetViewSetting((DWORD)lCookiePostview,   //设置视频输入

                                 sizeof(phwnd),

                                (BYTE*)&phwnd);

             

              hr = pEncoder->Start();

             

              AfxMessageBox("Encoder have start!");

             

//            hr = pPreview->Start(lCookie);

             

              // Wait until the engoder engine stops before exiting the application.

              // You can do this by using the _IWMEncoderEvents object to create an

              // event sink.

             

              hr = pEncoder->get_RunState(&enumEncoderState);  //得到运行状态

      

}

其中

HRESULT hr;

IWMEncoder* pEncoder;

IWMEncDataView* pPreview;

IWMEncDataView* pPostview;

long lCookie = -1;

long lCookiePostview =2;

均定义成了全局变量,因为在其他的函数中也要用到。

 

当要观看视频时就向线程中的watch()函数发送消息

void CPreviewsDlg::OnWatch()

{

// w=2;

g_MyThread->PostThreadMessage(WM_WATCH,0,0);

    

}

 

watch()函数通过全局变量w的值判断是显示编码前的还是编码后的视频,程序如下:

void CMyThread::Watch( WPARAM wParam, LPARAM lParam)

{

 

       if(w==1)

           hr = pPreview->Start(lCookie);

       else

              hr = pPostview->Start(lCookiePostview);

       AfxMessageBox("Have previwe!");

}

 

 

最后要说明的一点是:线程在窗口初始的时候就创建了,并通过Gethwnd()得到窗口句柄。(因为要在CmyThread类中使用它的变量和函数)

g_MyThread = (CMyThread*)AfxBeginThread( RUNTIME_CLASS(CMyThread),0,0);

     g_MyThread->Gethwnd(this);

 

Gethwnd()的实现如下:

CPreviewsDlg* pThread;

       bool Gethwnd(CPreviewsDlg* pMain)

       {

              pThread=pMain;

              return 1;

       }

 

关于编码视频的预览程序介绍完了,可能说的有点乱,如果想要程序请和我联系 let5fly@msn.com

基于PLC的立体车库控制系统设计 本文介绍了基于西门子S7-1511-1PN PLC和KTP700 Basic PN HMI的立体堆垛式停车场自动化控制系统。系统通过PLC逻辑控制滑台运动,配合传感器实现车辆存取自动化,包含初始化、入库、出库和安全保护程序。程序采用模块化设计,分为安全互锁、动画显示、模式切换等六个功能模块,运用边沿触发、定时器和多级联锁确保安全。HMI界面提供模式切换、车位选择、状态显示和手动控制功能。该系统具有模块化、安全性和可扩展性特点,可应用于多车位立体停车场场景。 阅读详情

相关推荐

core_analyzer分析c++程序内存占用

环境:centos; 进程:单进程多线程c++程序; 问题:1. 分析系统内存占用; 2. 分析ptmalloc内存空洞(bins上的空闲chunk的大小); 包括:1. 占用了很大内存的c++进程; 2. gcore(在进程不core dump的情况下生成core文件); 3. core_analyzer(分析gcor...

weixin_41644391的博客 4811

流媒体视频基础 MSE 入门 & FFmpeg 制作视频预览缩略图和 fmp4

现在视频网站几乎全部都在使用 MSE 来播放视频。使用 MSE 有提供更好的用户体验,更加节约成本等好处。虽然视频播放一般使用hlsdash等协议的开源客户端来播放视频,我们自己不会使用到 MSE,但这些客户端底层都是使用 MSE,了解 MSE 才更了解这些客户端。

細水、長流√的专栏 1837

AI初识—LLM、Ollama、Llama都是些个啥?

LLM指的是大语言模型(Large Language Model),是一种基于深度学习的模型,能够理解和生成自然语言。它通过大量文本数据进行训练,具备了理解上下文、生成连贯文本和回答问题的能力。著名的LLM包括OpenAI的GPT系列和Google的BERT。在AI技术快速发展的背景下,LLM、Ollama和Llama代表了现代自然语言处理的不同方面。LLM为我们提供了强大的语言理解能力,Ollama为模型的部署和管理提供了便利,而Llama则在效率和多样性上不断推进。

小蜗牛的珍贵百宝箱 4628

流媒体服务实现H5实时预览视频

例如发布节目时复制、预览时复制,这样上传一份视频后最大会有四份拷贝(预览、普通发布、互动发布),但是却有只有一份视频是被终端播放时使用。具体方案:FFmpeg (推流) —> (RTMP协议) —>nginx-http-flv-module(流媒体服务) —> (HTTP-FLV) —> Flv.js。因为浏览器对rtmp流的支持和兼容性不一样(需要flash插件),所以需要流媒体服务器将rtmp流处理成http类型的流http-flv。结合业务需求,以及调用常用方案现状,决定采取RTMP协议推流。

weixin_43473436的博客 1543

GPMC开发笔记(TI开发者推荐笔记)

因为gpmc(General-Purpose Memory Controller)是TI特有的驱动,gpmc的资料比较少,本人开发gpmc驱动算是摸了很多石头过河的。所以想通过这遍文章可以给也做GPMC驱动开发的后来者有一点参考价值。文章如有瑕疵也请各位批评改正。 1.GPMC介绍 gpmc主要用于与nandflash,norflash,fpga进行通信。在这里主要介绍gpmc16位数据和地址线不复用nor模式下的通信。 注意:在这种模式下gpmc_a[0]引脚是没法使用的 1.1GPMC信号线

weixin_44316996的博客 7498

LightTools中VBA宏的编写入门

LightTools和VBA联动

bestgamer的博客 2348

Android 音视频开发学习之路

Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的。只能通过一点点的学习和积累把这块的知识串联积累起来。 初级入门篇: Android 音视频开发(一) : 通过三种方式绘制图片 Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件 Android 音视频开发(三):使用 AudioTrack 播放PCM音...

jiang19921002的博客 2231

Altium Designer学习---如何进行SI仿真

Altium designer 如何进行SI仿真。         1、仿真电路中需要至少一块集成电路;             2、器件的IBIS模型;              3、在规则中必须设定电源网络和地网络;              4、建立SI规则约束;              5、层堆栈必须设置正确,电源平面必须连续;     建立的文件必须是一个工程,并把相应的文件放在工程目...

weixin_34050519的博客 4902

NDK学习笔记:RtmpPusher之认识x264编码库

NDK学习笔记:RtmpPusher之认识x264编码库 在家过了个懒散年,为自己定了些小目标(譬如一个亿什么的,人要有梦想是吧)哈哈。祝大家诸事顺景,代码没bug,服务器不宕机。距离上一篇文章一个多月了,之前的文章主要是学习ffmpeg关于视音频解码同步的部分内容(native_decode),接下来的几篇文章,我们来学习关于x264/faac的视音频编码内容(native_encode),通...

vx number:zzr_admin,拉入技术交流群。 604

【Cadence】stb仿真和ac仿真——以一个简单的全差分反相放大器仿真为例

最近在补一些仿真方法学的问题,以及一些一直以来都有点模糊的概念,简单记录一下。搭建一个以两个CMOS反相器构成的全差分放大器(28nm工艺,PMOS和NMOS尺寸一致)激励的设置方便共模和差模仿真用同一个TB(这里有一个问题:这个放大器需要在开环下仿真还是闭环下?哪些放大器应用在开环,哪些闭环?这种应用场景不同会导致需要仿真得到开环还是闭环增益,或者环路增益?(我知道放大器在设计的时候肯定都是闭环应用的多,但是什么时候没必要闭环应用?光验证ac和stb仿真是否一样的话有必要有回路吗?

weixin_44951108的博客 5万+

MOS 管驱动设计细节,波形分析

一般认为MOSFET是电压驱动的,不需要驱动电流。然而,在MOS的G S两级之间有结电容存在,这个电容会让驱动MOS变的不那么简单。 如果不考虑纹波和EMI等要求的话,MOS管开关速度越快越好,因为开关时间越短,开关损耗越小,而在开关电源中开关损耗占总损耗的很大一部分,因此MOS管驱动电路的好坏直接决定了电源的效率。 对于一个MOS管,如果把GS之间的电压从0拉到管子的开启电压所用的时间越短,那么MOS管开启的速度就会越快。与此类似,如果把MOS管的GS电压从开启电压降到0V的时间越短,那么MOS管关断的

m0_50862404的博客 1万+

Android开发音视频方向学习路线及资源分享,学完还怕什么互联网寒冬?

Android OpenGL ES 开发(五): OpenGL ES 使用投影和相机视图。深入学习音视频编码,如H.264,AAC,研究使用开源编解码库,如x.264,JM 等。深入研究音视频相关的网络协议,如 rtmp,hls,以及封包格式,如:flv,mp4。Android OpenGL ES 开发(六): OpenGL ES 添加运动效果。Android OpenGL ES 开发(三): OpenGL ES 定义形状。Android OpenGL ES 开发(一): OpenGL ES 介绍。

weixin_58134620的博客 1050

Linux内核配置选项详解及编译过程

在内核编译完成后,可以通过重启系统并选择新编译的内核来使用它。可以在该菜单下选择需要编译进内核的设备驱动,也可以选择将设备驱动编译为模块。可以在该菜单下选择需要编译进内核的设备驱动,也可以选择将设备驱动编译为模块。可以选择需要的调试选项,并根据需要启用或禁用相应的功能。可以选择需要的文件系统类型,并根据需要启用或禁用相应的选项。可以选择需要的网络协议和功能,并根据需要启用或禁用相应的选项。可以选择需要的调试选项,并根据需要启用或禁用相应的功能。可以选择需要的文件系统类型,并根据需要启用或禁用相应的选项。

TechGlide的博客 746

Android音视频开发学习

本文原址链接:https://www.cnblogs.com/renhui/p/7452572.html 初级入门篇: Android 音视频开发(一) : 通过三种方式绘制图片 Android 音视频开发...

mmwwxx123的博客 613

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Android 音视频学习思路

Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的。只能通过一点点的学习和积累把这块的知识串联积累起来。 初级入门篇: Android 音视频开发(一) : 通过三种方式绘制图片 Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件 Android 音视频开发(三):使用 AudioTrack 播放PCM音频 A...

longfei1986的专栏 524

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

作为一个Android程序员,精通音视频开发,寒冬再冷也冻不到你

5239723)][外链图片转存中…(img-5SF673qQ-1711005239723)][外链图片转存中…(img-aJ6ynOo9-1711005239723)]

m0_57077948的博客 787

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android+FFmpeg音视频学习笔记

最近对音视频开发比较感兴趣,想做一个手机直播的Demo程序,大概功能是:手机摄像头采集视频,用FFmpeg编码、RTMP推流到流媒体服务器,另外一个手机可以拉流看到直播视频。 看了很多资料,包括雷神的博客,在实际动手之前,先总结一下自己计划的学习路线。 一、FFmpeg学习 1.命令行方式,结合X264,对一个YUV数据编码,并用RTMP推送到服务器; 2.调用API接口编程方式,实现上述功能; 3.读取本地视频文件,解封装,推流; 二、流媒体服务器搭建 在Linux上用Nginx搭建一个服...

JulyLion的博客 3176

作为一个Android程序员,关于音视频开发,这些你确定这些你都懂了吗

14. 深入学习一些音视频领域的开源项目,如 webrtc,ffmpeg,ijkplayer,librtmp 等等 15. 将 ffmpeg 库移植到 Android 平台,结合上面积累的经验,编写一款简易的音视频播放器 16. 将 x264 库移植到 Android 平台,结合上面积累的经验,完成视频数据 H264 软编功能 17. 将 librtmp 库移植到 Android 平台,结合上面积累的经验,完成 Android RTMP 推流功能 18. 上面积累的经验,做一款短视频 AP.

m0_70083038的博客 220

Android 音视频开发学习思路

Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的。只能通过一点点的学习和积累把这块的知识串联积累起来。 初级入门篇: Android 音视频开发(一) : 通过三种方式绘制图片 Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件 Android 音视频开发(三):使用 AudioTrack...

weixin_30835923的博客 346

GB 35114-2017 学习笔记(规避版权阉割版)

这个政府网站提供GB 35114-2017标准的的预览和下载,有需要的自行下载GB 35114-2017作为一个国家强制标准,在自己做个学习笔记,摘录了部分图片被版权投诉了。万恶的资本,无奈只能删除所有图片分享给大家了,图片部分替换成GB 35114-2017标准中的图片编号,请大家谅解。具体下载地址如下有能耐,投诉政府网站去。注:我只做了A级设备,主要对A级相关内容进行了笔记。B级和C级内容只是主要描述SVAC编码怎么添加签名和数据怎么加密的,

yjkhtddx的专栏 1744

猫抓浏览器扩展终极指南:轻松下载网页视频和音频的完整教程

你是否曾遇到过心仪的在线视频却无法下载?或者想保存网页中的背景音乐却发现没有下载按钮?在这个数字内容无处不在的时代,我们经常遇到想要保存的网络资源,但大多数网站都隐藏了下载功能。别担心,今天我要为你介绍一款开源神器——猫抓浏览器扩展,它能帮你轻松抓取网页中的视频、音频、图片等资源,让你的网络浏览体验更加自由! 猫抓是一款功能强大的浏览器资源嗅探扩展,能够智能分析网页的网络请求,自动识别并列出当前

gitblog_00495的博客 1049

DirectShow学习笔记

写这篇笔记,就当是对这个期间学习DirectShow的一个总结,假如它可以给你带来一些收获的话,那我会感到更高兴。还有我遇到的一些问题,希望和大家一起讨论。 一、基本概念 1.DirectShow概述 DirectShow的主要功能是流媒体的采集与回放。 它集成了DirectDraw,DirectSound,Direct3D的一些技术。 它是一个开放的架构,你自己可以写自己的Filter

芝麻软件工作室的专栏 634

【gstreamer中appsink和appsrc操作数据转换cv::Mat】参考文献

文章目录参考文献gstreamer知识入门重点推荐其他参考 参考文献 gstreamer知识入门 通用的gstremer知识入门 GStreamer流媒体知识介绍 详细的GStreamer开发教程 国内葛大神写的博客 用 GStreamer 简化 Linux 多媒体开发 GstAppSink简介 GstAppSrc简介 gstreamer开发手册专栏 重点推荐 几个开源仓库中包含appsink,appsrc,filesink例子的代码。可搜索appsink,appsrc,filesink直接看相关的代码

weixin_44495869的博客 3626

学习笔记-webrtc

概述 音视频直播两种方式 实时互动 会议 webRtc 流媒体分发 娱乐直播 RTMP,HTTP-FLV,HLS 两种指标 延迟指标 音视频服务质量指标 分辨率 帧率 码率 MOS 服务质量评估 压缩算法 H264 H265 AVI 直播架构 音视频采集模块 音视频编码模块 网络传输模块 音视频解码模块 音视频渲染模块 WebRtc客户端架构 接口层 Web接口 浏览器 Native接口 C++,Android,OC Session层 媒体

weixin0605的博客 444
上一篇: 流媒体学习笔记----用配置好的文件进行编码
下一篇: 流媒体学习笔记----配置一个编码进程
let5flying
博客等级 码龄25年 5粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值