ffmpeg将图片转为视频

项目需要一款java录制屏幕的软件。 找了半天找到java截屏的API,因此获取了一组的图片。


一大组图片存在许多冗余的信息,因此需要转为视频,粗略计算 100长图大小10M, 转成视频变成180+KB,由此可见进行处理的必要性


查找资料找到:

FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。

但是window下ffmpeg编译非常麻烦,看了许多此类的文章仍然编译失败。火都着了。

还好有看到官网现在已经有编译好的window版本ffmpeg,下载链接

然后使用dos下的ffmpeg命令进行操作:

ffmpeg -f image2 -i  f:/images/%d.jpg -vcodec libx264 -r 25 -b 200k  test.mp4


-r 25 表示每秒播放25帧

-b 200k 指定码率为200k

图片的文件名从0开始依次递增






FFmpeg是一个广泛使用的开源库,用于处理多媒体文件,包括音频、视频流的编码、解码、转换等。在C++中使用FFmpeg进行图像转为视频,通常涉及以下几个步骤: 1. **安装FFmpeg**:首先需要从FFmpeg官网下载源代码并编译安装,或者直接在项目中引用预编译的静态库。 2. **包含头文件**:在C++代码中,你需要包含`libavcodec/avcodec.h` 和 `libavformat/avformat.h` 等头文件,这些包含了FFmpeg的主要函数声明。 3. **初始化上下文**:创建AVFormatContext和AVCodecContext结构体实例,分别用于表示媒体格式和编码器。 4. **加载输入图像**:使用`avformat_open_input()`打开图片文件,并读取其像素数据。 5. **选择编码器**:找到适合的视频编码器,比如H.264或WebM,通过`avcodec_find_encoder_by_name()`函数获取对应的编码器。 6. **分配帧缓冲区**:为编码器分配内存,用于存储每一帧的数据。 7. **编码过程**:创建一个AVPacket来封装图像数据,然后调用编码器的`encode_frame()`函数进行编码。循环这个过程直到所有图像都被编码。 8. **创建输出文件**:使用`avformat_alloc_output_context2()`创建一个新的AVFormatContext,指定输出文件名和所需的容器格式。 9. **写入编码后的帧**:将编码好的AVPackets写入到输出文件,调用`av_interleaved_write_frame()`完成帧的写入。 10. **清理资源**:关闭所有的上下文和文件,释放内存。 ```cpp // 示例代码片段 #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> int main() { // 初始化FFmpeg av_register_all(); // ... (继续上述步骤) // 创建输出文件 AVOutputFormat* format = av_guess_format("output.mp4", NULL, NULL); if (!format) { std::cerr << "Failed to guess output format" << std::endl; return -1; } AVWriter* writer = avformat_new_writer(output_file, format->oformat); if (!writer) { std::cerr << "Failed to create output file" << std::endl; return -1; } // 写入帧 for (int i = 0; i < num_images; ++i) { // 编码图像... AVPacket packet; int result = encode_image_to_packet(&packet); if (result < 0) { std::cerr << "Failed to encode frame" << std::endl; break; } int written = av_interleaved_write_frame(writer, &packet); if (written < 0) { std::cerr << "Failed to write frame" << std::endl; break; } } // 清理 avio_close(writer->pb); avformat_free_context(writer); avformat_close_input(&input); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值