FFMPEG对USB摄像头视频进行UDP推流
利用FFMPEG对USB摄像头进行推流直播,采用命令行的方式无论是rtmp还是udp推流,延迟均较为严重,延迟3-6秒。小白一枚,无奈之下参考雷神和众多网友的文章,反复折腾,终于发现使用奥尼摄像头进行UDP推流可以实现视频传输延迟<1秒.
程序代码
```cpp
```/*
* 目的:测试USB摄像头采用 UDP 推流
* 注意:① 摄像头使用video=aoni webcam A30,其本身是mjpeg格式,不转码直接推流;
* ② 配置摄像头的帧数为15帧(帧率大延迟严重),忽略PTS部分,因其压缩包自带了pts;
* ③ 播放命令:ffplay udp://localhost:6666 ,不要使用ffplay -vcodec mpeg2video udp://localhost:6666;
* 指定了播放解码器会出错,原因可能是解码器本身不匹配;
* ④ UDP 推流无需服务器,直接推,直接播。
* 运行结果:延时 < 1秒 。
*/
#include <stdio.h>
#include <time.h>
#define __STDC_CONSTANT_MACROS
#ifdef _WIN32
//Windows
extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libavdevice/avdevice.h"
#include "libavutil/time.h"
};
#endif
//Output YUV420P
#define OUTPUT_YUV420P 0
#define USE_DSHOW 0
//枚举摄像头
void show_dshow_device(){
AVFormatContext *pFormatCtx = avformat_alloc_context(); // (pFormatCtx - ★★★)
AVDictionary* options = NULL;
av_dict_set(&options,"list_devices","true",0);
AVInputFormat *iformat = av_find_input_format("dshow");
printf("========Device Info=============\n");
//参数:上下文、文件名、文件格式、选项
//作用:参数挂载,打印显示系统摄像头信息
avformat_open_input(&pFormatCtx,"video=dummy",ifo