ffmpeg相关API(2)
发布人:shili8
发布时间:2024-12-23 04:05
阅读次数:0
**FFmpeg 相关 API**
本文将继续介绍 FFmpeg 相关 API 的使用。前面我们已经讨论了基本的 API 使用方法,包括打开、关闭、获取信息等功能。在这篇文章中,我们将重点介绍一些高级 API 功能。
###1. 视频和音频编解码FFmpeg 提供了多种视频和音频编解码器,可以用于压缩和解压数据。下面是一个例子,使用 H.264 编解码器进行视频压缩:
c// 打开输入文件AVFormatContext *fmt_ctx = avformat_alloc_context(); avformat_open_input(&fmt_ctx, "input.mp4", NULL, NULL); // 获取视频和音频流AVStream *video_stream = fmt_ctx->streams[0]; AVStream *audio_stream = fmt_ctx->streams[1]; // 创建输出文件AVFormatContext *out_fmt_ctx = avformat_alloc_context(); avformat_alloc_output_file(&out_fmt_ctx, NULL, "output.mp4"); // 创建编解码器AVCodecContext *video_codec_ctx = avcodec_alloc_context3(NULL); video_codec_ctx->codec_type = AVMEDIA_TYPE_VIDEO; video_codec_ctx->codec_id = AV_CODEC_ID_H264; AVCodecContext *audio_codec_ctx = avcodec_alloc_context3(NULL); audio_codec_ctx->codec_type = AVMEDIA_TYPE_AUDIO; audio_codec_ctx->codec_id = AV_CODEC_ID_AAC; // 初始化编解码器avcodec_open2(video_codec_ctx, avcodec_find_decoder(AV_CODEC_ID_H264), NULL); avcodec_open2(audio_codec_ctx, avcodec_find_decoder(AV_CODEC_ID_AAC), NULL); // 创建包装器AVPacketList *video_pkt_list = av_packet_alloc(); AVPacketList *audio_pkt_list = av_packet_alloc(); // 开始编解码while (av_read_frame(fmt_ctx, &pkt) >=0) { if (pkt.stream_index == video_stream->index) { // 处理视频流 avcodec_send_packet(video_codec_ctx, &pkt); while (avcodec_receive_frame(video_codec_ctx, &frame) >=0) { // 处理视频帧 av_packet_rescale_ts(&frame, fmt_ctx->streams[0]->time_base, out_fmt_ctx->streams[0]->time_base); av_packet_ref(&pkt, &frame); av_packet_unref(&frame); av_packet_rescale_pts(&pkt,1.0 / fmt_ctx->streams[0]->r_frame_rate); av_packet_set_side_data(&pkt, "video", NULL,0); av_interleaved_write_frame(out_fmt_ctx, &pkt); } } else if (pkt.stream_index == audio_stream->index) { // 处理音频流 avcodec_send_packet(audio_codec_ctx, &pkt); while (avcodec_receive_frame(audio_codec_ctx, &frame) >=0) { // 处理音频帧 av_packet_rescale_ts(&frame, fmt_ctx->streams[1]->time_base, out_fmt_ctx->streams[1]->time_base); av_packet_ref(&pkt, &frame); av_packet_unref(&frame); av_packet_rescale_pts(&pkt,1.0 / fmt_ctx->streams[1]->r_frame_rate); av_packet_set_side_data(&pkt, "audio", NULL,0); av_interleaved_write_frame(out_fmt_ctx, &pkt); } } } // 关闭输出文件avformat_close_input(&out_fmt_ctx); // 关闭输入文件avformat_close_input(&fmt_ctx);
###2. 图像处理FFmpeg 提供了多种图像处理功能,包括旋转、裁剪、缩放等。下面是一个例子,使用 FFmpeg 进行图像旋转:
c// 打开输入文件AVFormatContext *fmt_ctx = avformat_alloc_context(); avformat_open_input(&fmt_ctx, "input.jpg", NULL, NULL); // 获取图像流AVStream *image_stream = fmt_ctx->streams[0]; // 创建输出文件AVFormatContext *out_fmt_ctx = avformat_alloc_context(); avformat_alloc_output_file(&out_fmt_ctx, NULL, "output.jpg"); // 创建转换器AVBufferRef *buffer_ref = av_buffer_alloc(1024,0); AVPicture picture; picture.data[0] = buffer_ref->data[0]; picture.linesize[0] = buffer_ref->linesize[0]; // 开始转换while (av_read_frame(fmt_ctx, &pkt) >=0) { // 处理图像流 av_image_alloc(&picture, AV_PIX_FMT_YUV420P, pkt->width, pkt->height); av_packet_rescale_ts(&pkt, fmt_ctx->streams[0]->time_base, out_fmt_ctx->streams[0]->time_base); av_packet_ref(&pkt, &picture); av_packet_unref(&picture); // 转换图像 av_image_fill_arrays(&picture, NULL, pkt->data[0], AV_PIX_FMT_YUV420P, pkt->width, pkt->height,1); // 旋转图像 int rotate =90; for (int i =0; i < rotate /90; i++) { av_image_rotate(&picture, i *90); } // 写出图像 av_interleaved_write_frame(out_fmt_ctx, &pkt); } // 关闭输出文件avformat_close_input(&out_fmt_ctx); // 关闭输入文件avformat_close_input(&fmt_ctx);
###3. 音频处理FFmpeg 提供了多种音频处理功能,包括混响、加重等。下面是一个例子,使用 FFmpeg 进行音频混响:
c// 打开输入文件AVFormatContext *fmt_ctx = avformat_alloc_context(); avformat_open_input(&fmt_ctx, "input.wav", NULL, NULL); // 获取音频流AVStream *audio_stream = fmt_ctx->streams[0]; // 创建输出文件AVFormatContext *out_fmt_ctx = avformat_alloc_context(); avformat_alloc_output_file(&out_fmt_ctx, NULL, "output.wav"); // 创建转换器AVBufferRef *buffer_ref = av_buffer_alloc(1024,0); AVAudioFrame audio_frame; audio_frame.data[0] = buffer_ref->data[0]; audio_frame.linesize[0] = buffer_ref->linesize[0]; // 开始转换while (av_read_frame(fmt_ctx, &pkt) >=0) { // 处理音频流 av_packet_rescale_ts(&pkt, fmt_ctx->streams[0]->time_base, out_fmt_ctx->streams[0]->time_base); av_packet_ref(&pkt, &audio_frame); av_packet_unref(&audio_frame); // 混响音频 int reverb =1; for (int i =0; i < reverb /2; i++) { av_audio_frame_mix(&audio_frame, &audio_frame); } // 写出音频 av_interleaved_write_frame(out_fmt_ctx, &pkt); } // 关闭输出文件avformat_close_input(&out_fmt_ctx); // 关闭输入文件avformat_close_input(&fmt_ctx);
###4. 视频处理FFmpeg 提供了多种视频处理功能,包括加重、混响等。下面是一个例子,使用 FFmpeg 进行视频加重:
c// 打开输入文件AVFormatContext *fmt_ctx = avformat_alloc_context(); avformat_open_input(&fmt_ctx, "input.mp4", NULL, NULL); // 获取视频流AVStream *video_stream = fmt_ctx->streams[0]; // 创建输出文件AVFormatContext *out_fmt_ctx = avformat_alloc_context(); avformat_alloc_output_file(&out_fmt_ctx, NULL, "output.mp4"); // 创建转换器AVBufferRef *buffer_ref = av_buffer_alloc(1024,0); AVPicture picture; picture.data[0] = buffer_ref->data[0]; picture.linesize[0] = buffer_ref->linesize[0]; // 开始转换while (av_read_frame(fmt_ctx, &pkt) >=0) { // 处理视频流 av_packet_rescale_ts(&pkt, fmt_ctx->streams[0]->time_base, out_fmt_ctx->streams[0]->time_base); av_packet_ref(&pkt, &picture); av_packet_unref(&picture); // 加重视频 int amplify =2; for (int i =0; i < amplify /2; i++) { av_picture_amplify(&picture, &picture); } // 写出视频 av_interleaved_write_frame(out_fmt_ctx, &pkt); } // 关闭输出文件avformat_close_input(&out_fmt_ctx); // 关闭输入文件avformat_close_input(&fmt_ctx);
###5. 多媒体处理FFmpeg 提供了多种多媒体处理功能,包括混响、加重等。下面是一个例子,使用 FFmpeg