USB采集卡如何打pts

这篇具有很好参考价值的文章主要介绍了USB采集卡如何打pts。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、使用采集卡提供的pts
二、手动打pts
1.usb采集设备pts的问题
2.采集卡驱动,UVC/UAC,ffmpeg的关系
3.如何自己打pts
4.音视频同步调优
5.NTP等联网调时工具带来的不同步问题

一、使用采集卡提供的pts

我们用使用pc摄像头和使用pc麦克风声卡里的方法,用ffmpeg采集后会得到音视频的pts。
我们应该尽量用好这些pts,因为他们的时间间隔很精准,比如48000,每次采集1024,发现每帧间隔21ms;视频采集1080p25,每帧间隔40ms。
使用之前我们需要把他们同步到同一个时间戳,其中一个方法是:
dif = Unix_Timestamp - 第一帧采集到的视频时间戳
然后以后每次pts = pts + dif。
V:

AVDictionary *options = NULL;
av_dict_set(&options, “video_size”,1920x1080”, 0);
av_dict_set(&options, “framerate”,30, 0);
//以上参数如果不设置的话,ffmpeg就会用默认值,但默认值摄像头不一定支持
int re = avformat_open_input(&ic,/dev/video0”, ifmt, &options);

A:

av_dict_set(&options, "sample_rate", "48000", 0); // 只能是48000不支持改动
av_dict_set(&options, "channels", "2", 0);        // 无法改,不支持改动
long long GetCurTime()
{
    struct timeval tv;
    gettimeofday(&tv, NULL);
    // ZlogInfo("second:%ld\n",tv.tv_sec);  //秒
    // ZlogInfo("millisecond:%ld\n",tv.tv_sec*1000 + tv.tv_usec/1000);  //毫秒
    // ZlogInfo("microsecond:%ld\n",tv.tv_sec*1000000 + tv.tv_usec);  //微秒
    long long temp_time = tv.tv_sec * 1000000 + tv.tv_usec;
    return temp_time;
}
if(this->dif_PTS == 0) this->dif_PTS = GetCurTime() - read_pkt.pts;
read_pkt.pts = read_pkt.pts + this->dif_PTS;

这样下来read_pkt.pts应该约等于当下的Unix_Timestamp才对,那么我们为什么不直接用Unix_Timestamp,因为我需要用采集卡pts的每帧的均匀间隔。

二、手动打pts

1.usb采集设备pts的问题
decklink的采集卡,会把音视频的pts给好,并且是可靠的。但小的厂商就不一定了。我这里使了一个台湾和国内的厂商,一个是pci采集卡(sdi/hdmi采集转pci口),这个采集卡支持UVC和UAC协议,另一个是usb(hdmi转usb口)采集卡。这两个价格都在千元左右。

跟这两个采集卡的原厂技术沟通,pts存在以下问题
1:音频和视频的pts没有关系,没有共同的起点或相关的联系。
2.pts经过一夜测试后发现,有跳变的现象。
3.采集1080p30时,视频的pts,每帧之间只增加20ms,而不是33ms,其他分辨率无此问题。
因为这些设备的用户大多数不是开发者,所以这些问题都不会用到,对于开发者来说则需要原厂定制开发了。

2.采集卡驱动,UVC/UAC,ffmpeg的关系

在与原厂电话微信后,对usb的采集卡有初步的了解,对于音频来说,采集卡的驱动并不会提供pts给系统,因为对于音频来说,确定好采样率,声道数,位深,那么在播放端,它的采样数对应的播放时间是固定的,采集卡只有一个晶振在控制着采集频率,音频从采集卡采集到其提供给系统,延时可以忽略。
视频采集卡的驱动也不会有pts,它的启动只会对上层提供类似于1,2,3…等视频的序号的标签,采集卡从采集到提供给系统,可能会有几帧,如4帧延时。
那么我们用ffmpeg采集到的音视频,都含有pts,那么这些pts是什么呢。音频是1970年开始到现在的us,视频则是开机的时间us。他们都是UVC和UAC协议对采集卡驱动提供的音视频帧打的pts。
因此数据的传输是这样的,采集卡->采集卡驱动->系统内核->UVC/UAC->ffmpeg
硬件厂商改一个问题,要改好几个版本,经常引入其他bug,看来天下程序员都一样。

3.如何自己打pts

那么我们该怎么自己打pts呢?
在两个线程里分别采集音视频:

av_read_frame()

我们把Unix_Timestamp的PTS赋值给每次采集到的音视频数据。
A:

re = av_read_frame(ic_a, &read_pkt_a);   
read_pkt_a.pts = GetCurTime();

V:

re = av_read_frame(ic, &read_pkt);   
read_pkt.pts = GetCurTime();
ZlogInfo("dif:%ld\n", (shm_->GetCurTime() - LAST_PTS) / 1000);
LAST_PTS = shm_->GetCurTime();

视频每次从这个函数返回的时间间隔分别是:
//1080p25 39 40 39 40 39 40 39 40 39 40 39 40 ms
音频分别是:
//1080p25 41 0 42 0 42 0 41 0 41 0 42 0 ms
有时是
//1080p25 21 0 41 21 0 40 22 0 41 1 40 0 42 0 41 22 0 41 0 42 0 42 1 40 22 0 41 21 1 40

0并非没有间隔而是小于1ms,这里有精度损失。
可以看到间隔并不标准,因为av_read_frame()维护了一个缓存,他每次从采集卡拿到一阵或多帧音频或视频数据放入缓存,然后分包,返回一帧音频或视频数据,下次再调用直接去缓存里拿,如果缓存没有则阻塞住,直到采集卡提供了数据。

我们需要让他们的时间间隔相对均匀,那么每次的pts就和上次比较,如果少于一定时间则睡眠。

ZlogInfo("dif:%ld\n", (shm_->GetCurTime() - LAST_PTS) / 1000);
if((shm_->GetCurTime() - LAST_PTS) / 1000 < 10) usleep(10000);
pkt->pts = shm_->GetCurTime();
ZlogInfo("dif_last:%ld\n", (shm_->GetCurTime() - LAST_PTS) / 1000);
LAST_PTS = shm_->GetCurTime();

那么再次打印如下:
V:
//39 40 39 40 39 40 39 40 39 39 39 39 40 40
A:
//1080p25 31 12 30 10 32 10 31 11 31 10 32 11 30 10 32 10 32 10 30 10 31 11 31 10 31 10

4.音视频同步调优
因为采集视频到交给ffmpeg可能有几帧的缓存,因此每次的视频数据可以减去100ms左右,看看播出后的视频效果。

pkt->pts = shm_->GetCurTime() - 100000;

播放器的音视频同步策略一般都是按以音频为基准,音频是线性均匀的,那么音频的pts本身是没有意义的,两帧之间的间隔并不代表播放的时间间隔,它的意义主要是用于视频与他同步。
如果想要音频的间隔再均匀一些,可以调节以下睡眠的时间。

5.NTP等联网调时工具带来的不同步问题
pc每次开机联网后,系统自带NTP开始核对时间,并改变自身时间,那么你每次打的pts就会产生突变。NTP每次调剂的幅度可能在500ms左右,可以关闭它,或换小一点的工具,每次调解幅度在10ms左右的。文章来源地址https://www.toymoban.com/news/detail-627472.html

USB采集卡如何打pts,ffmpeg,ffmpeg,usb,pts,采集卡USB采集卡如何打pts,ffmpeg,ffmpeg,usb,pts,采集卡USB采集卡如何打pts,ffmpeg,ffmpeg,usb,pts,采集卡

到了这里,关于USB采集卡如何打pts的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 4通道高速数据采集卡推荐哪些呢

    4通道高速数据采集卡推荐哪些呢

    FMC141是一款基于VITA57.4标准的4通道2.8GSPS/2.5GSPS/1.6GSPS采样率16位DA播放FMC子卡,该板卡为FMC+标准,符合VITA57.4与VITA57.1规范,16通道的JESD204B接口通过FMC+连接器连接至FPGA的高速串行端口。 该板卡采用TI公司的DAC39J84芯片,该芯片是一款具有JESD204B接口的低功耗、16位4通道2.8GSPS数模

    2024年02月14日
    浏览(8)
  • 线扫相机DALSA--采集卡Base模式设置

    线扫相机DALSA--采集卡Base模式设置

    采集卡默认加载“1 X Full Camera Link”固件,Base模式首先要将固件更新为“2 X Base Camera Link”。 右键SCI图标,选择“打开文件所在的位置”,找到并打开SciDalsaConfig的Demo,如上图所示: 左键单击“获取相机”,稍等1-2分钟后提示“获取相机列表成功”; 获取相机列表成功后点

    2024年02月06日
    浏览(13)
  • 提高视觉检测系统稳定性的隐藏办法——10G高速图像采集卡

    提高视觉检测系统稳定性的隐藏办法——10G高速图像采集卡

    提高视觉检测系统稳定性的隐藏办法——10G高速图像采集卡 目前,随着我国各方面配套基础设施建设的完善,企业技术、资金的积累,各行各业积极探索和大胆的尝试机器视觉技术,实现工业自动化、智能化。在机器视觉系统的使用过程中,机器视觉设备的持续稳定性以及传

    2024年02月15日
    浏览(11)
  • 基于Zynq的雷达10Gbps高速PCIE数据采集卡方案(一)总体设计

    基于Zynq的雷达10Gbps高速PCIE数据采集卡方案(一)总体设计

    2.1 引言 本课题是来源于雷达辐射源识别项目,需要对雷达辐射源中频信号进行采集传输 和存储。本章基于项目需求,介绍采集卡的总体设计方案。采集卡设计包括硬件设计 和软件设计。首先对采集卡的性能和指标进行分析,接着提出硬件的总体设计,在硬 件设计基础上提

    2024年02月05日
    浏览(8)
  • 【全志T113-S3_100ask】14-1 linux采集usb摄像头实现拍照(FFmpeg、fswebcam)

    【全志T113-S3_100ask】14-1 linux采集usb摄像头实现拍照(FFmpeg、fswebcam)

    在开发板上有一个csi转dvp接口的摄像头,但是,目前还不会驱动,先使用usb摄像头来采集图像数据。 本小节使用ffmpeg和fswebcam实现拍照。 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流

    2023年04月08日
    浏览(54)
  • 【GStreamer 】3-2 gstreamer实现USB相机采集图片和录像

    【GStreamer 】3-2 gstreamer实现USB相机采集图片和录像

            感觉网上看这一类说明,常常最大的疑惑就是,为什么别人能用,我自己就不成了,其实很多时候都是各自的环境交代不清楚所致。所以我觉得讲操作前,必须先交代自己的测试环境。         我自己使用的是TX1核心模块,安装ubuntu 18.04 的环境。安装了英伟达

    2024年02月09日
    浏览(7)
  • RK3588安装Qt+opencv+采集USB摄像头画面

    RK3588安装Qt+opencv+采集USB摄像头画面

    Qt:5.12.8 opencv:3.4.14 qt安装 ---------------------------------------------------------------------------------- 因为使用官网下载的版本始终安装失败,所以我可以直接使用命令行进行下载安装: 1:首先先将ubuntu的软件更新,并更新镜像源 sudo apt-get update sudo apt-get upgrade 2:使用如下步骤安装Qt

    2023年04月10日
    浏览(12)
  • 基于USB总线技术的数据采集系统接口FPGA实现——高效、稳定的数据采集神器!

    基于USB总线技术的数据采集系统接口FPGA实现——高效、稳定的数据采集神器! USB总线技术已经成为了当今数据传输领域的主流技术,它具有现场可编程性强、对外部器件兼容性好以及传输速度高等优点。因此,基于USB总线技术的数据采集系统已经广泛应用于各种实际场景。

    2024年02月09日
    浏览(12)
  • 基于USB总线技术的数据采集系统接口——FPGA实现Matlab

    基于USB总线技术的数据采集系统接口——FPGA实现Matlab USB总线技术是一种常用的数据传输接口,广泛应用于各种设备和系统中。在数据采集系统中,USB接口可以用于连接外部传感器、测量设备等,将采集到的数据传输到计算机或其他处理设备上进行处理和分析。本文将介绍如

    2024年02月08日
    浏览(11)
  • FPGA 68013 USB2.0 多通道数据采集,工程验证过

    FPGA 68013 USB2.0 多通道数据采集,工程验证过

    FPGA 68013  USB2.0  多通道数据采集,工程验证过 FPGA 68013 USB2.0 多通道数据采集,工程验证过 随着科技的发展和信息技术的不断进步,数据采集技术在各个领域的应用越来越广泛,其中,多通道数据采集技术尤为重要。在这种技术领域中,FPGA 68013 USB2.0 多通道数据采集技术成为

    2024年02月21日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包