Ubuntu下使用ffmpeg调用设备摄像头采集视频,使用libx264编码视频,保存h264文件
主要流程代码:
#define V_WIDTH 640
#define V_HEIGHT 480
void MainWindow::rec_video()
{
AVFormatContext *fmt_ctx = NULL;
AVPacket packet;
AVCodecContext *enc_ctx = NULL;
AVFrame *frame = NULL;
AVPacket *newpkt = NULL;
av_init_packet(&packet);
int ret = 0;
int base = 0; // 用于给frame->pts赋值,pts需要是连续的值
// 设置日志级别
av_log_set_level(AV_LOG_DEBUG);
// 注册设备
avdevice_register_all();
// 创建文件
char *outPath = "/opt/document/video.yuv"; // 保存视频文件
FILE *outFile = fopen(outPath, "wb+");
char *encodePath = "/opt/document/encode.h264"; // 保存视频文件
FILE *encodefile = fopen(encodePath, "wb+");
if (!outFile)
{
goto __ERROR;
}
// 打开设备
fmt_ctx = open_dev();
// 打开视频编码器
open_encoder(V_WIDTH, V_HEIGHT, &enc_ctx);
// 创建AVFrame
frame = create_frame(V_WIDTH, V_HEIGHT);
// 创建编码后输出的packet
newpkt = av_packet_alloc();
if (!newpkt)
{
printf("failed to alloc avpacket!/n");
goto __ERROR;
}
if (!fmt_ctx)
{
goto __ERROR;
}
while ((ret = av_read_frame(fmt_ctx, &packet) == 0) && m_status)
{
av_log(NULL, AV_LOG_INFO, "Packet size: %d(%p)\n",
packet.size, packet.data);
unsigned char *yuv420_buf = (unsigned char *)malloc(3*640*480/2*sizeof(unsigned char));
yuyv_to_yuv420p(packet.data, yuv420_buf, 640, 480);
memcpy(frame->data[0], yuv420_buf,