首页 > 其他分享 >ffmpeg视频处理

ffmpeg视频处理

时间:2023-07-30 22:45:13浏览次数:40  
标签:视频 ffmpeg 处理 avcodec nullptr packet formatContext av include

CMakeLists.txt

cmake_minimum_required(VERSION 3.25)
project(test)

set(CMAKE_CXX_STANDARD 17)

set(CMAKE_CXX_STANDARD 14)
set(FFMPEG_DIR /usr/local/ffmpeg)
set(FFMPEG_INCLUDE_DIR ${FFMPEG_DIR}/include)
set(FFMPEG_LIBRARY_DIR ${FFMPEG_DIR}/lib)


include_directories(${FFMPEG_INCLUDE_DIR})
link_directories(${FFMPEG_LIBRARY_DIR})

add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(
        ${PROJECT_NAME}
        avcodec
        avdevice
        avfilter
        avformat
        avutil
)

main.cpp

#include <iostream>

extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavutil/imgutils.h>
#include <libswscale/swscale.h>
}

using namespace std;

int main() {
    const char *url = "/home/navy/Desktop/1.mp4";
    AVFormatContext *formatContext = avformat_alloc_context();
    if (avformat_open_input(&formatContext, url, nullptr, nullptr) != 0) {
        // 打开文件失败,处理错误
        return -1;
    }
    if (avformat_find_stream_info(formatContext, nullptr) < 0) {
        // 读取流信息失败,处理错误
        return -1;
    }
    av_dump_format(formatContext, 0, url, 0);

    int videoStreamIndex = -1;
    int audioStreamIndex = -1;
    for (int i = 0; i < formatContext->nb_streams; i++) {
        if (formatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
            videoStreamIndex = i;
        } else if (formatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
            audioStreamIndex = i;
        }
    }
    if (videoStreamIndex == -1 || audioStreamIndex == -1) {
        // 找不到视频流或音频流,处理错误
        return -1;
    }
    AVCodecParameters *videoCodecParameters = formatContext->streams[videoStreamIndex]->codecpar;
    AVCodecParameters *audioCodecParameters = formatContext->streams[audioStreamIndex]->codecpar;
    const AVCodec *videoCodec = avcodec_find_decoder(videoCodecParameters->codec_id);
    const AVCodec *audioCodec = avcodec_find_decoder(audioCodecParameters->codec_id);
    if (videoCodec == nullptr || audioCodec == nullptr) {
        // 找不到视频解码器或音频解码器,处理错误
        return -1;
    }
    AVCodecContext *videoCodecContext = avcodec_alloc_context3(videoCodec);
    AVCodecContext *audioCodecContext = avcodec_alloc_context3(audioCodec);
    if (avcodec_parameters_to_context(videoCodecContext, videoCodecParameters) < 0
        || avcodec_parameters_to_context(audioCodecContext, audioCodecParameters) < 0) {
        // 设置解码器上下文参数失败,处理错误
        return -1;
    }
    if (avcodec_open2(videoCodecContext, videoCodec, nullptr) < 0
        || avcodec_open2(audioCodecContext, audioCodec, nullptr) < 0) {
        // 打开解码器失败,处理错误
        return -1;
    }
    AVPacket *packet = av_packet_alloc();
    AVFrame *videoFrame = av_frame_alloc();
    AVFrame *audioFrame = av_frame_alloc();

    while (av_read_frame(formatContext, packet) >= 0) {
        if (packet->stream_index == videoStreamIndex) {
            // 视频帧
            avcodec_send_packet(videoCodecContext, packet);
            while (avcodec_receive_frame(videoCodecContext, videoFrame) == 0) {
                // 处理视频帧

            }
        } else if (packet->stream_index == audioStreamIndex) {
            // 音频帧
            avcodec_send_packet(audioCodecContext, packet);
            while (avcodec_receive_frame(audioCodecContext, audioFrame) == 0) {
                // 处理音频帧

            }
        }
        av_packet_unref(packet);
    }

    av_packet_free(&packet);
    av_frame_free(&videoFrame);
    av_frame_free(&audioFrame);

}

  

标签:视频,ffmpeg,处理,avcodec,nullptr,packet,formatContext,av,include
From: https://www.cnblogs.com/navysummer/p/17592230.html

相关文章

  • 【ACM专项练习#02】整行字符串、输入vector、打印图形、处理n组数据以及链表操作等
    输入整行字符串平均绩点题目描述每门课的成绩分为A、B、C、D、F五个等级,为了计算平均绩点,规定A、B、C、D、F分别代表4分、3分、2分、1分、0分。输入有多组测试样例。每组输入数据占一行,由一个或多个大写字母组成,字母之间由空格分隔。输出每组输出结果占一行。如果输入的大......
  • 【工具】JS脚本|网页任意视频倍速播放(包括MOOC、本地视频、其他的视频)
    实际发布时间:2022-12-1422:54:52。csdn禁止浏览器脚本相关博客了,就只能重新发到这儿了。  只要浏览器播放视频时用的是<video>,而且当前页面只有这一个视频,就可以用这个脚本。  这是我很久以前为了倍速看MOOC视频,所以写的一个脚本,一直没有专门写博客去介绍它。刚刚,我想倍......
  • 2023.30 AI生成视频
    AI生成视频是一项复杂的任务,目前主要可以通过以下两类技术实现:1、基于GAN的视频生成GAN(生成对抗网络)可以用于生成静态图片,可以扩展到生成视频。主要思路是训练一个生成器网络,可以输出每一帧图像,然后组合成视频流。这需要大量视频数据进行训练。2、基于自动编码器的视频生成......
  • opencv顺时针,逆时针旋转视频并保存视频
    原视频代码importcv2#打开视频文件video=cv2.VideoCapture('inference/video/lianzhang.mp4')#获取原视频的宽度和高度width=int(video.get(cv2.CAP_PROP_FRAME_WIDTH))height=int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))#创建视频编写器并设置输出视频参数fou......
  • 零代码编程:用ChatGPT对Excel表格进行批量自动化处理
    F盘的“北交所上市公司全部发明专利”文件夹里面有几百个这样的Excel表格,格式一致,需要合并所有表格内容到一个表格,方便查找内容,但是不要前面两行。可以在ChatGPT中这样输入:写一段Python程序:F盘的“北交所上市公司全部发明专利”文件夹里面有很多xls格式表格,读取所有的表格文件;复制......
  • 视频剪辑教程之运动跟踪 All In One
    视频剪辑教程之运动跟踪AllInOneAI加持,手部自动跟踪视频特效demosApple可立拍拟我表情剪映专业版最新版https://www.capcut.cn/learning/template_detail/7158345452436425991(......
  • Oracle 19c 报ORA-704 ORA-01555故障处理---惜分飞
    联系:手机/微信(+8617813235971)QQ(107644445)标题:Oracle19c报ORA-704ORA-01555故障处理作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]异常断电导致数据库无法启动,尝试对数据文件进行recover操作,报ORA-00283ORA-00742ORA-00......
  • anaconda安装下载速度慢 处理方法
    (9条消息)Anaconda下载速度慢_anaconda下载太慢怎么办_Lord12Snow3的博客-CSDN博客 参照该链接到清华源软件下载速度快Indexof/anaconda/archive/|清华大学开源软件镜像站|TsinghuaOpenSourceMirror ......
  • F5 LTM 知识点和实验 6-使用虚拟服务器处理流量
    第六章:使用虚拟服务器处理流量virtualserver类型前几章描述的场景,可以简单总结为,F5设备终结了一个会话,在client-side充当服务端,在server-side充当客户端,完成了一个全代理过程,这种模型的vs类型被称为标准类型。一般在你需要将流量做负载等场景时需要。但是你也许不需要对流量做......
  • 记一次服务器被黑用于挖矿的处理记录
    某日上班,登服务器后编译AndroidROM,增量编译时间比平时长了3~4倍,htop看一下好奇怪,怎么前36个核是满的,过了半个小时看,还是这样。有点预感不妙。遂登录另外一个同配置用户只有两三个的服务器,也是前36个核被占满,并且看不到什么进程占用了CPU多半是中招了。查了netstat,有两......