亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

FFmpeg獲取網絡攝像頭數據解碼

2020-01-26 13:26:45
字體:
來源:轉載
供稿:網友

對USB攝像頭實時編碼,在前面已經探討過了。這次改變下思路,嘗試去截取網絡攝像頭的H264碼流,將其解碼播放。

這里的測試代碼,是在??禂z像頭的基礎上進行的。

解碼的大致流程和以前的保持一致,只不過增加了部分函數。

FFmpeg打開媒體文件并查看媒體文件的信息,有三個步驟:

avformat_open_input;

avformat_find_stream_info;

av_dump_format;

依次調用三個函數后,我們可以很清楚的知道碼流的各種信息。

完整的代碼:

#include <stdio.h>#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <windows.h>#include "queue.h" extern "C"{#include <libavformat/avformat.h>#include <libavcodec/avcodec.h>#include <libswscale/swscale.h>} #pragma comment(lib, "avcodec.lib")#pragma comment(lib, "avformat.lib")#pragma comment(lib, "avutil.lib") #pragma comment(lib ,"swscale.lib") using namespace std;using namespace cv; DWORD WINAPI opencv_imshow(LPVOID lparam){ result_link_type* result_link = (result_link_type*)lparam; struct result_node_datatype *result_node2 = NULL; while (1) { result_node2 = result_pop(result_link); if (result_node2 == NULL) { Sleep(1); continue; } imshow("frame", result_node2->result); waitKey(1); }} int main(int argc, const char * argv[]){ HANDLE thread1; result_link_type *result_link = new result_link_type; result_link->head = result_link->end = NULL; result_link->result_num = 0; thread1 = CreateThread(NULL, 0, opencv_imshow, (LPVOID)result_link, 0, NULL);  int i; int videoStream; int frameFinished; int numBytes; int ret; int got_picture; long prepts = 0; bool first_time = true;  AVCodec *pCodec; AVFrame *pFrame; AVFrame *pFrameRGB; AVPacket packet; AVCodecContext *pCodecCtx; AVFormatContext *pFormatCtx = NULL;//結構體AVFormatContext:包含碼流參數較多  static struct SwsContext *img_convert_ctx;  uint8_t *buffer; Mat pCvMat;  char filepath[] = "rtsp://admin:jdh123456@10.170.6.187/axis-media/media.amp?camera=2";//碼流的獲取路徑  av_register_all();//注冊編解碼器 avformat_network_init();//加載socket庫以及網絡加密協議相關的庫  if (avformat_open_input(&pFormatCtx, filepath, NULL, NULL) != 0)//打開多媒體數據并且獲得信息 { return -1; }  if (avformat_find_stream_info(pFormatCtx, NULL) < 0)//讀取視音頻數據并且獲得信息 { return -1; }  av_dump_format(pFormatCtx, 0, argv[1], false);//手工調試函數,看到pFormatCtx->streams的內容  videoStream = -1;  for (i = 0; i < pFormatCtx->nb_streams; i++) { if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) { videoStream = i; break; } }  if (videoStream == -1) { return -1; }  pCodecCtx = pFormatCtx->streams[videoStream]->codec;  pCodec = avcodec_find_decoder(pCodecCtx->codec_id);//查找解碼器  if (pCodec == NULL) { return -1; }  if (avcodec_open2(pCodecCtx, pCodec, 0) < 0)//初始化AVCodecContext { return -1; }  if (pCodecCtx->time_base.num > 1000 && pCodecCtx->time_base.den == 1) { pCodecCtx->time_base.den = 1000; }  pFrame = av_frame_alloc();//分配內存 pFrameRGB = av_frame_alloc();  i = 0; while (1) { if (av_read_frame(pFormatCtx, &packet) >= 0)//讀取碼流中的音頻若干幀或者視頻一幀 { if (packet.stream_index == videoStream) { ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, &packet);//開始解碼 if (ret < 0) {  printf("Decode Error.(解碼錯誤)/n");  return ret; } if (got_picture)//解碼成功,got_picture返回任意非零值 {  if (first_time)  {  //初始化SwsContext  img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, AV_PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL);  if (img_convert_ctx == NULL)  {  fprintf(stderr, "Cannot initialize the conversion context!/n");  exit(1);  }   numBytes = avpicture_get_size(AV_PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height);  buffer = (uint8_t *)av_malloc(numBytes);  avpicture_fill((AVPicture *)pFrameRGB, buffer, AV_PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height); // allocator memory for BGR buffer   pCvMat.create(cv::Size(pCodecCtx->width, pCodecCtx->height), CV_8UC3);  first_time = false;  }   //處理圖像數據  sws_scale(img_convert_ctx, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);  memcpy(pCvMat.data, buffer, numBytes);  struct result_node_datatype *result_node = new struct result_node_datatype;  result_node->result = pCvMat;  result_push(result_link, result_node); } } av_free_packet(&packet); } }  //free(buffer); av_free(buffer); av_free(pFrameRGB); av_free(pFrame); avcodec_close(pCodecCtx); avformat_close_input(&pFormatCtx); system("Pause"); return 0;}

隊列函數:

#include "queue.h"#include <iostream> using namespace std; void result_push(result_link_type* result_link, result_node_datatype * result_node) //入隊操作{ if (result_link->head == NULL) { result_link->head = result_node; result_link->end = result_link->head; result_link->result_num++; } else { result_link->end->next = result_node; result_link->end = result_node; result_link->result_num++; }} struct result_node_datatype* result_pop(result_link_type* result_link) //出隊操作{ struct result_node_datatype* tmp_node; if (result_link->head == NULL) return NULL; else if (result_link->head == result_link->end) { return NULL; } else { tmp_node = result_link->head; result_link->head = result_link->head->next; result_link->result_num--; return tmp_node; }}

隊列函數的頭文件:

#ifndef QUEUE_H#define QUEUE_H#include <stdio.h>#include <stdlib.h>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>using namespace cv; typedef struct result_link_datatype{ struct result_node_datatype *head; struct result_node_datatype *end; int result_num;}result_link_type; struct result_node_datatype{ Mat result; struct result_node_datatype* next;}; void result_push(result_link_type* result_link, result_node_datatype * result_node); //入隊操作struct result_node_datatype* result_pop(result_link_type* result_link);//出隊操作 #endif

解碼后的數據進入隊列,再從隊列中取出,利用opencv將其顯示(opencv顯示是另外開的一個線程函數)。

admin:jdh123456@10.170.6.187,這里是攝像頭的名稱和IP地址。

測試代碼下載:點擊打開鏈接

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产v综合v亚洲欧美久久| 青草青草久热精品视频在线观看| 日韩一二三在线视频播| 国产一区深夜福利| 日本精品一区二区三区在线| 成人午夜一级二级三级| 欧美日韩美女在线| 国产做受69高潮| 欧美亚洲激情视频| 少妇高潮久久久久久潘金莲| 亚洲国产日韩精品在线| 亚洲自拍偷拍一区| 日韩av在线网站| 亚洲国产精品久久久久久| 92裸体在线视频网站| 中文字幕在线看视频国产欧美| 国产精品视频内| 国产精品久久久久久av福利软件| 久久久精品国产亚洲| 久久视频国产精品免费视频在线| 亚洲电影免费观看高清完整版在线观看| 欧美色另类天堂2015| 97超级碰在线看视频免费在线看| 韩国美女主播一区| 久久精品福利视频| 亚洲 日韩 国产第一| 欧美xxxx14xxxxx性爽| 亚洲欧美在线免费观看| 丝袜美腿亚洲一区二区| 日韩视频亚洲视频| 欧美成人剧情片在线观看| 亚洲精品久久久久中文字幕二区| 亚洲缚视频在线观看| 91精品久久久久久久| 久久国产精品网站| 日本一本a高清免费不卡| 亚洲一级黄色av| 亚洲午夜av电影| 夜夜嗨av一区二区三区免费区| 国产不卡精品视男人的天堂| 亚洲视频国产视频| 欧美激情综合色综合啪啪五月| 亚洲高清一区二| 97精品国产97久久久久久免费| 日韩美女视频免费在线观看| 日韩中文字幕在线播放| 国产精品视频午夜| 国内外成人免费激情在线视频网站| 久久理论片午夜琪琪电影网| 另类少妇人与禽zozz0性伦| 国产精品色午夜在线观看| 欧美亚洲视频在线观看| 国产日韩欧美一二三区| 成人欧美在线视频| 91精品综合久久久久久五月天| 国产这里只有精品| 亚洲综合中文字幕68页| 国产成人在线精品| 亚洲免费高清视频| 欧美精品videofree1080p| 久久久久国色av免费观看性色| 黄网动漫久久久| 亚洲伊人成综合成人网| 国产成人精品视频在线| 超薄丝袜一区二区| 欧美成人精品在线播放| 7777精品久久久久久| 欧美日韩国产999| 欧美在线亚洲在线| 国产成人91久久精品| 亚洲欧美一区二区三区久久| 日韩精品中文字| 国产美女精彩久久| 国产欧美一区二区三区在线看| 国语自产在线不卡| 在线视频欧美日韩| 91网站在线免费观看| 国产精品99久久久久久久久| 亚洲国产高清自拍| 九九精品视频在线观看| 色综合91久久精品中文字幕| 中文字幕亚洲国产| 亚洲精品按摩视频| 日本人成精品视频在线| 成人免费视频97| 97成人超碰免| 影音先锋欧美精品| 久久久久久久久久国产| 欧美国产日韩视频| 欧美激情在线播放| 国内揄拍国内精品少妇国语| 亚洲欧美日韩精品久久| 国产精品美女主播| 91精品在线观看视频| 欧美在线视频观看| 久久天天躁狠狠躁夜夜躁2014| 色综合五月天导航| 欧美区二区三区| 欧美精品成人91久久久久久久| 亚洲精品电影网在线观看| 韩国美女主播一区| 亚洲色图激情小说| 国产手机视频精品| 国产成人精品国内自产拍免费看| 国产精品第1页| 日韩在线视频网| 亚洲人成绝费网站色www| 亚洲自拍高清视频网站| 国产欧美一区二区三区久久| 91在线观看免费高清完整版在线观看| 韩国视频理论视频久久| 久久久极品av| 国产精品香蕉在线观看| 久久久久久久久久久国产| 国产精品免费一区| 亚洲精品一区二区三区婷婷月| 亚洲国产成人久久综合一区| 国产欧美日韩中文字幕在线| 国产精品久久久久久久久粉嫩av| 久久99国产精品久久久久久久久| 国产精品久久久久久久久久久不卡| 欧美电影免费播放| 国产精品扒开腿爽爽爽视频| 大伊人狠狠躁夜夜躁av一区| 国产狼人综合免费视频| 97免费中文视频在线观看| 欧美国产精品va在线观看| 亚洲人线精品午夜| 中文字幕精品在线视频| 久久精品国产视频| 久久久999精品免费| 亚洲福利精品在线| 国产一区二区久久精品| 欧美激情乱人伦一区| 日韩av在线网页| 欧美专区在线播放| 国产午夜精品一区二区三区| 国产丝袜一区视频在线观看| 91亚洲国产成人精品性色| 永久免费毛片在线播放不卡| 国产精品视频永久免费播放| 青青a在线精品免费观看| 亚洲国产精久久久久久| 欧美成aaa人片在线观看蜜臀| 欧美老少配视频| 欧美日韩亚洲精品一区二区三区| 日韩精品在线视频观看| 久久久女女女女999久久| 精品女厕一区二区三区| 国产精品久久久久久五月尺| 91免费的视频在线播放| 国产做受69高潮| 久久国产精品首页| 久久天天躁狠狠躁夜夜av| 欧美性生交大片免费| 欧美一区三区三区高中清蜜桃| 亚洲tv在线观看| 亚洲最大成人免费视频| 国产成人精品久久亚洲高清不卡| 国产色婷婷国产综合在线理论片a| 久久久亚洲精选| 68精品久久久久久欧美| 久久色免费在线视频| 91免费高清视频|