qt ffmpeg C++ 对磁盘指定文件视频进行h264编码

时间: 2023-12-19 13:05:18 浏览: 29
要对磁盘上的视频文件进行编码,需要做一些修改以读取视频文件并将编码后的数据写入新的文件中。以下是一个示例代码,演示了如何对指定的视频文件进行编码: ```c++ #include <QtCore/QCoreApplication> #include <QDebug> extern "C" { #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavutil/imgutils.h> #include <libswscale/swscale.h> } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // Open input file AVFormatContext *inputContext; avformat_open_input(&inputContext, "input.mp4", NULL, NULL); avformat_find_stream_info(inputContext, NULL); // Find video stream int videoStreamIdx = -1; for (int i = 0; i < inputContext->nb_streams; i++) { if (inputContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { videoStreamIdx = i; break; } } if (videoStreamIdx == -1) { qWarning() << "No video stream found in input file!"; return -1; } // Set up codec parameters AVCodecParameters *codecParams = inputContext->streams[videoStreamIdx]->codecpar; codecParams->codec_id = AV_CODEC_ID_H264; codecParams->bit_rate = 400000; // Set up output file AVFormatContext *outputContext; avformat_alloc_output_context2(&outputContext, NULL, NULL, "output.mp4"); AVStream *outputStream = avformat_new_stream(outputContext, NULL); outputStream->codecpar = codecParams; // Open codec AVCodec *codec = avcodec_find_encoder(codecParams->codec_id); AVCodecContext *codecContext = avcodec_alloc_context3(codec); avcodec_parameters_to_context(codecContext, codecParams); avcodec_open2(codecContext, codec, NULL); // Open output file avio_open(&outputContext->pb, "output.mp4", AVIO_FLAG_WRITE); avformat_write_header(outputContext, NULL); // Set up scaling context SwsContext *imgConvertCtx = sws_getContext(codecParams->width, codecParams->height, codecParams->format, codecParams->width, codecParams->height, codecParams->format, SWS_BICUBIC, NULL, NULL, NULL); // Loop through frames AVPacket *inputPacket = av_packet_alloc(); AVFrame *inputFrame = av_frame_alloc(); AVPacket *outputPacket = av_packet_alloc(); while (av_read_frame(inputContext, inputPacket) >= 0) { if (inputPacket->stream_index == videoStreamIdx) { // Decode frame avcodec_send_packet(codecContext, inputPacket); avcodec_receive_frame(codecContext, inputFrame); // Convert frame to codec format AVFrame *outputFrame = av_frame_alloc(); outputFrame->width = codecParams->width; outputFrame->height = codecParams->height; outputFrame->format = codecParams->format; av_image_alloc(outputFrame->data, outputFrame->linesize, codecParams->width, codecParams->height, codecParams->format, 32); sws_scale(imgConvertCtx, inputFrame->data, inputFrame->linesize, 0, codecParams->height, outputFrame->data, outputFrame->linesize); // Encode frame avcodec_send_frame(codecContext, outputFrame); avcodec_receive_packet(codecContext, outputPacket); // Write encoded frame to output file av_interleaved_write_frame(outputContext, outputPacket); // Clean up av_packet_unref(outputPacket); av_frame_unref(outputFrame); } av_packet_unref(inputPacket); } // Flush codec avcodec_send_frame(codecContext, NULL); while (avcodec_receive_packet(codecContext, outputPacket) == 0) { av_interleaved_write_frame(outputContext, outputPacket); av_packet_unref(outputPacket); } // Close codec, input file, output file, and cleanup avcodec_close(codecContext); avformat_close_input(&inputContext); avio_close(outputContext->pb); avformat_free_context(outputContext); sws_freeContext(imgConvertCtx); av_packet_free(&inputPacket); av_frame_free(&inputFrame); av_packet_free(&outputPacket); return a.exec(); } ``` 这个示例代码会打开一个名为 "input.mp4" 的视频文件,并将编码数据写入一个名为 "output.mp4" 的新文件中。请注意,这只是一个大致的示例,可能需要根据您的具体情况进行修改。此外,为了简化代码,一些错误检查和异常处理可能被省略了。

相关推荐

最新推荐

recommend-type

C++实验RTMP协议发送 H.264编码

RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系Flash Player和RtmpServer,如FMS, Red5, crtmpserver...
recommend-type

Java使用FFmpeg处理视频文件的方法教程

主要给大家介绍了关于Java使用FFmpeg处理视频文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
recommend-type

使用Java和ffmpeg把音频和视频合成视频的操作方法

主要介绍了使用Java和ffmpeg把音频和视频合成视频,本文通过实例代码给大家介绍的非常详细,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

使用 FFmpeg 命令拼接mp3音频文件异常问题及解决方法

主要介绍了使用 FFmpeg 命令拼接mp3音频文件异常问题及解决方法,本文给大家介绍的非常详细,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

Linux服务器安装ffmpeg+libx264+libmp3lame

ffmpeg既可以播放视频,也提供命令行工具来处理视频,另外还有强大的视频处理库用于开发,下面是以Linux为例介绍ffmpeg的安装流程的简单的命令行对视频进行转码操作。 Linux服务器安装ffmpeg+libx264+libmp3lame
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章

![:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章](https://img-blog.csdnimg.cn/img_convert/69b98e1a619b1bb3c59cf98f4e397cd2.png) # 1. 目标检测算法概述 目标检测算法是一种计算机视觉技术,用于识别和定位图像或视频中的对象。它在各种应用中至关重要,例如自动驾驶、视频监控和医疗诊断。 目标检测算法通常分为两类:两阶段算法和单阶段算法。两阶段算法,如 R-CNN 和 Fast R-CNN,首先生成候选区域,然后对每个区域进行分类和边界框回归。单阶段算法,如 YOLO 和 SSD,一次性执行检
recommend-type

info-center source defatult

这是一个 Cisco IOS 命令,用于配置 Info Center 默认源。Info Center 是 Cisco 设备的日志记录和报告工具,可以用于收集和查看设备的事件、警报和错误信息。该命令用于配置 Info Center 默认源,即设备的默认日志记录和报告服务器。在命令行界面中输入该命令后,可以使用其他命令来配置默认源的 IP 地址、端口号和协议等参数。
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。