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

  • Post author:
  • Post category:其他




使用命令从视频提取出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数据,这里很多头文件我就不过多展示了。

由于上面代码设置的采集摄像头的分辨率为640×480

我们使用命令播放录制的yuv数据:

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

采集的视频格式为yuyv422

以-framerate 15每秒15帧的帧率播放视频(限制视频的播放速度)



版权声明:本文为ltspyder原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。