在Ubuntu虚拟机使用ffmpeg采集摄像头的yuv视频数据

使用命令从视频提取出yuv数据

提取yuv视频数据

提取命令:

ffmpeg -i ./cl.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv

./cl.mp4为当前目录下的cl.mp4视频文件
-an其中a代表是audio,n代表是none,意思就是过滤掉音频
-c:v代表的是视频的编解码器
rawvideo代表我们使用rawvideo这个工具对视频进行处理
-pix_fmt yuv420p表示我们指定输出yuv视频的格式,这里我们指定为yuv420p
最后一个就是我们输出的yuv文件名。

播放提取出来的yuv视频数据命令

ffplay -pix_fmt yuv420p -s 1440x720 out.yuv

单独播放yuv的单个分量命令
以播放y分量为例

ffplay -pix_fmt yuv420p -s 1440x720 -vf extractplanes='y' out.yuv

如果要播放其他分量话,更改extractplanes='y’参数即可

单独提取视频的y分量或u、v分量

提出命令:

ffmpeg -i ./cl.mp4 -filter_complex 'extractplanes=y+u+v[y][u][v]' -map '[y]' y.yuv -map '[u]' u.yuv -map '[v]' v.yuv

通过filter_complex复杂滤波器输出多个分量

播放命令:

ffplay -pix_fmt gray -s 1440x720 y.yuv

使用gray指定播放单色
如果要播放u分量或者v分量的话,需要考虑到yuv的格式,由于默认的是yuv420的格式,所以分辨率的长和宽需要除以2.(具体的yuv格式自己去百度,在这里我就不介绍了)

通过摄像头获取yuv数据

在这里我就废话不多说直接放代码直观明了

#include "ffmpeg_function.h"
void ffmpeg_video(void)
{
    char errors[1024]={0};
    int file_fd=0;
    //create file
    file_fd=open("./video.yuv",O_CREAT|O_RDWR,0666);
    //ctx
    AVFormatContext *fmt_ctx=NULL;
    AVDictionary *option =NULL;
    //packet
    int count =0;
    AVPacket pkt;
    char *devicename="/dev/video0";
    //注册设备
    avdevice_register_all();
    AVInputFormat *iformat=av_find_input_format("video4linux2");
    av_dict_set(&option,"video_size","640x480",0);
    //av_dict_set(&option,"framerate","30",0);      //指定帧率
    //av_dict_set(&option,"pixel_format","nv12",0); //指定格式
    //打开设备
    int ret=avformat_open_input(&fmt_ctx,devicename,iformat,&option);
    if (ret<0)
    {
        av_strerror(ret,errors,1024);
        return;
    }
    av_init_packet(&pkt);
    while (ret=av_read_frame(fmt_ctx,&pkt)==0&&count++<300)
    {
        printf("packet size is %d(%p),count=%d\n",pkt.size,pkt.data,count);
        write(file_fd,(pkt.data),pkt.size);
    }
    av_packet_unref(&pkt); 
    close(file_fd);
    avformat_close_input(&fmt_ctx);
    av_log_set_level(AV_LOG_DEBUG);
    av_log( NULL, AV_LOG_DEBUG,"hello,word\n");
}

直接调用ffmpeg_video()函数即可完成录制摄像头的yuv数据,这里很多头文件我就不过多展示了。

由于上面代码设置的采集摄像头的分辨率为640x480
我们使用命令播放录制的yuv数据:

ffplay -pix_fmt yuyv422 -framerate 15 -s 640x480 video.yuv

采集的视频格式为yuyv422
以-framerate 15每秒15帧的帧率播放视频(限制视频的播放速度)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值