1. 程式人生 > >ffmpeg處理斷網時,生成一個檔案中遇到的問題

ffmpeg處理斷網時,生成一個檔案中遇到的問題

      由於網路環境不穩定,在實際的錄影過程中常常會將錄製的檔案儲存為多個視訊檔案,後期就需要更多的資源來進行視訊合併,並且增加了額外的時間開銷。為了解決這個問題,同時考慮到時間的開銷以及資源佔用率最小,就想出了這樣的一個辦法,在斷網時,av_read_frame()會在達到超時後,返回一個負值,由於同一個攝像機裡面的引數都一致,可以沿用前面設定的引數,後面只需要再次開啟流,不停的檢查是否能連通,連通後將對應的視訊流和音訊流寫入到對應的位置中。

在檢測流是否連通過程中,需要不斷的對avformatcontext分配記憶體,為了避免記憶體溢位,需要分配一次,就釋放一次。測試發現,當呼叫avformat_open_input()失敗時,下一次分配記憶體時,並沒有增加額外的記憶體開銷,因此就不需要擔心記憶體溢位的情況。

測試程式碼如下:

#include<iostream>
#include<thread>
extern "C"{
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswresample/swresample.h>
#include <libavutil/avstring.h>
#include <libavutil/pixfmt.h>
#include <libavutil/samplefmt.h>
#include <libavutil/channel_layout.h>
#include "MP4Encoder.h"
#include<malloc.h>
#include<Windows.h>
}
using namespace std;

bool state=false;
AVFormatContext *ifmt=NULL;

/*
返回 -1失敗,0成功
*/
int InitInputRtspStream(const char* url,AVFormatContext *ic)
{
    AVDictionary* options = NULL;  
    av_dict_set(&options,"rtsp_transport", "tcp", 0);  
    av_dict_set(&options,"stimeout","5000000",0);
    if(avformat_open_input(&ic,url,NULL,&options)!=0)
        return -1;
    if(avformat_find_stream_info(ic,NULL)<0)
        return -1;
        //顯示輸入流資訊
    printf("-----------rtsp流輸入資訊--------------\n");
    av_dump_format(ic, 0, url,0);
    printf("---------------------------------------\n");
    printf("\n");
    return 0;
}


void test()
{
    int ret=-1;
    int i=0;
    while(!state)
    {   
        i++;
        av_register_all();
        avformat_network_init();
        ifmt=avformat_alloc_context();
        printf("---第%d次 分配地址%0x  記憶體大小:%d\n",i,ifmt,sizeof(*ifmt));
        ret=InitInputRtspStream("rtsp://admin:[email protected]:554",ifmt);
        if(ret>=0)
        {
        
            avformat_close_input(&ifmt);
        }
        printf("***第%d次 分配地址%0x  記憶體大小:%d\n",i,ifmt,sizeof(*ifmt));
    }
}


void main()
{
    state=false;
    thread task(test);
    task.detach();
    printf("輸入按鍵停止\n");
    getchar();
    state=true;
    printf("退出程式\n");
    getchar();
}

測試結果

相關推薦

ffmpeg處理生成一個檔案遇到的問題

      由於網路環境不穩定,在實際的錄影過程中常常會將錄製的檔案儲存為多個視訊檔案,後期就需要更多的資源來進行視訊合併,並且增加了額外的時間開銷。為了解決這個問題,同時考慮到時間的開銷以及資源佔用率最小,就想出了這樣的一個辦法,在斷網時,av_read_frame()會在

h5 返回上一個頁面 demo (與檢測絡代碼相結合更直觀看到結果)

oct width 加載 doctype lin 測試 htm mini offline 頁面一: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8">

web工程啟動一個延遲載入Bean因為該Bean類可能還沒被JVM載入

   問題描述: (1)javaWeb專案啟動中,還沒啟動完成,在下面這個類載入另一個Bean類, (2)通過getBean方法獲取到該Bean,可以獲取到,不為null (3)但是,呼叫該Bean的方法insertSelective()方法,進不去該方法   &nb

請寫一個python邏輯計算一個檔案的大寫字母數量

    import os os.chdir(r'C:\Users\Administrator\Desktop')#os.chdir切換到指定目錄 with open('a.txt') as today: count=0 for i in today.re

python學習之網站的編寫(HTMLCSSJS)(十一)----------如何利用其它html檔案的CSS(也就是可以將共同的地方提取出來放大一個檔案利於使用)

首先說一下它的具體用處,我們已經知道,當我們寫一個html檔案的時候,不同的標籤想用相同的版式的時候,我們可以將它提取出來,然後再用一些選擇器進行應用,比如class選擇器。但是,但我們編寫多個html檔案中的時候,多個檔案都想用一些相同的版式該怎麼辦呢? 那麼就引入了這種連線的方式,首先寫一個

C++學習筆記關於一個檔案的全域性變數在其他檔案的使用

錯誤:多重定義 和 xxx變數已經在xxx.obj中定義 當在一個.cpp檔案中定義了一個全域性變數之後,需要在其他檔案中使用時,需要用到關鍵字extern 當使用extern修飾一個變數時,例如extern int x;   代表當前變數x 的定義來自於其他檔案,當進行

在做vue計算屬性v-for處理數組遇到的一個bug

this 解決 就是 com 渲染 fault post return 我想 問題 bug: You may have an infinite update loop in a component render function 無限循環 需要處理的數組(在 ** ssq

php使用新浪雲Storage儲存上傳下載檔案建立bucket、Bucket 操作、Object 上傳操作Object 下載操作Object 刪除操作、Object 複製操作生成一個能夠訪

<?php //新浪雲 Storage PHP use use sinacloud\sae\Storage as Storage; // 方法一:在新浪雲執行環境中時可以不傳認證資訊,預設會從應用的環境變數中取 $s = new Storage();

解析XMLDTD的處理--解析忽略生成XML檔案加上

一、解析XML檔案時,遇到DTD的定義要怎麼辦?     下面這段程式碼是ibatis配置檔案,用w3c Dom(其實任意一種解析方式都是這樣)都會從http://www.ibatis.com/dtd/sql-map-config-2.dtd  這 個地址找對應的DTD檔案進行校驗,如果因特網上這個地址

Mac 使用natappNginx內穿透生成可訪問域名

以下內容基於Mac ##natapp使用 使用natapp工具,官網連結https://natapp.cn 下載完成後,根據官方教程進行配置,連結如下: https://natapp.cn/article/natapp_newbie 下載下來的檔案不可直接執行,先執行chmod

處理物件陣列根據某個屬性名相同求某一項的和。

當我們從後臺得到資料格式如下,我們需要求每個使用者money的和,就可以這樣做。 var arry = [ {user_id:1,money:100}, {user_id:2,money:33}, {user_

C#匯出 Excel 生成 CheckBox 控制元件

在使用 Microsoft.Office.Interop.Excel 元件匯出Excel 表格時,要把匯出前的  CheckBox 控制元件一同匯出到 excel 表格中,對於這個功能 看似很簡單,但 Microsoft.Office.Interop

【教程】解決小米筆記本Pro連線無線出現WiFi閃一下然後無網路問題

造成原因: 周邊5GWiFi過多。 解決: 改變網絡卡接收的頻段: 一:此電腦->右擊選擇管理   二:選擇裝置管理器   三:點開網路配適器-->選擇第三個右擊-->屬性-->高階 四:選擇80

QtEmbedded-4.8.6-arm 編譯選擇從 動態庫變化到靜態庫 生成的Makefile連結庫路徑下如果有動態庫和靜態庫優先選擇動態庫編譯應用

問題:QtEmbedded-4.8.6-arm 編譯選擇從 動態庫到靜態庫 時,發現的一個疑惑:,生成的Makefile連結庫路徑下如果有動態庫和靜態庫,優先選擇動態庫編譯應用 具體現象: 我最初是使用動態庫的 QtEmbedded-4.8.6-arm (編譯器選擇時,是 ./co

模仿事物一個功能執行不成功一個也不能執行

        double d = 0;         double f = 1;         double g = d / f;

IOT-15893 多個遙控器一個遙控器上設定控制裝置使用另一個遙控器也可控制

這個bug改了我一天半的時間 真的是絞盡腦汁 首先是因為公司產品A8遙控器功能分為組1 組2 組1-2 三個組,而遙控器是屬於離線裝置無法上報資料 ,我們app在新增到遙控器的時候 給他設定三個groupID ,但是因為之前的機制太亂 會出現groupID給重複,引起的不同遙控器groupID卻是相

TV_指定遙控器方向鍵盤的上下左右被按下一個獲得焦點控制元件的控制元件

android:nextFocusUp- 定義當點up鍵時,哪個控制元件將獲得焦點 android:nextFocusDown-定義當點down鍵時,哪個控制元件將獲得焦點 android:nextFocusLeft-定義當點left鍵時,哪個控制元件將獲得焦點 android:nextFo

傳值到介面生成一個下拉框

得到一個裝港id和卸港id,然後在介面的生成一個下拉框,這個很簡單的。但是不熟練,記一下,下次直接複製。 var portId = obj.children('td').eq(5).html()+"";//卸港id var loadingPortId = obj.children('td').eq(

那些方法在執行動態生成一個java類

一:java compiler 可以對類進行編譯,生成位元組碼 也可以直接操作位元組碼。比如asm ,javasist ,cglib 二: 位元組碼和類載入怎麼無縫轉化的? 用到了,java 底層的 defineclass 方法,將java位元組碼 byte [] 進行載入。 動態代理也是位元組碼操

多執行緒執行如果一個邏輯需要等若干個執行緒執行完成後再執行怎麼實現?

實際開發過程中,尤其是大型的業務系統中或批量處理系統中,我們通常會用到多執行緒來進行任務拆分,來提高系統的處理能力。當對業務不斷拆分時,多執行緒各自任務之間也形成了錯綜複雜的關係。 我們常常遇到這樣的情況,業務模組A 拆分成了 A1 、A2.....An個多執行緒,來提高處理速度,可是 Ak(1<k&