使用命令从视频提取出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数据:文章来源:https://www.toymoban.com/news/detail-410048.html
ffplay -pix_fmt yuyv422 -framerate 15 -s 640x480 video.yuv
采集的视频格式为yuyv422
以-framerate 15每秒15帧的帧率播放视频(限制视频的播放速度)文章来源地址https://www.toymoban.com/news/detail-410048.html
到了这里,关于在Ubuntu虚拟机使用ffmpeg采集摄像头的yuv视频数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!