C# ffmpeg.autogen无法以正常速度或者倍速播放本地视频?只需要一行代码

  1. 首先,确保你已经安装了 ffmpeg 并且在你的项目中引用了 ffmpeg.autogen 库。

  2. 创建一个 FFmpeg.AutoGen.FFmpeg 对象,这将是你与 ffmpeg 库进行交互的入口点。

    FFmpeg.AutoGen.FFmpeg ffmpeg = new FFmpeg.AutoGen.FFmpeg();

  3. 初始化 ffmpeg 库并打开视频文件。
    ffmpeg.av_register_all();
    ffmpeg.avcodec_register_all();
    
    string videoPath = "your_video_path";
    AVFormatContext* formatContext = null;
    
    // 打开视频文件
    if (ffmpeg.avformat_open_input(&formatContext, videoPath, null, null) != 0)
    {
        // 处理打开失败的情况
        return;
    }
    
    // 检索视频流信息
    if (ffmpeg.avformat_find_stream_info(formatContext, null) < 0)
    {
        // 处理获取流信息失败的情况
        return;
    }

  4. 查找视频流,并获取视频解码器。
    AVCodec* videoCodec = null;
    int videoStreamIndex = ffmpeg.av_find_best_stream(formatContext, AVMediaType.AVMEDIA_TYPE_VIDEO, -1, -1, &videoCodec, 0);
    if (videoStreamIndex < 0)
    {
        // 处理未找到视频流的情况
        return;
    }
    
    // 获取视频解码器上下文
    AVCodecContext* codecContext = formatContext->streams[videoStreamIndex]->codec;

  5. 打开视频解码器。
    if (ffmpeg.avcodec_open2(codecContext, videoCodec, null) < 0)
    {
        // 处理视频解码器打开失败的情况
        return;
    }

  6. 创建一个视频帧对象,并分配内存。
    AVFrame* frame = ffmpeg.av_frame_alloc();
    AVFrame* frameRGB = ffmpeg.av_frame_alloc();
    
    int numBytes = ffmpeg.av_image_get_buffer_size(AVPixelFormat.AV_PIX_FMT_RGB24, codecContext->width, codecContext->height, 1);
    byte* buffer = (byte*)ffmpeg.av_malloc((ulong)numBytes);
    
    ffmpeg.av_image_fill_arrays(frameRGB->data, frameRGB->linesize, buffer, AVPixelFormat.AV_PIX_FMT_RGB24, codecContext->width, codecContext->height, 1);

  7. 读取视频帧并进行解码。
    AVPacket packet;
    
    while (ffmpeg.av_read_frame(formatContext, &packet) >= 0)
    {
        // 只处理视频流的数据包
        if (packet.stream_index == videoStreamIndex)
        {
            // 解码视频帧
            if (ffmpeg.avcodec_send_packet(codecContext, &packet) == 0)
            {
                while (ffmpeg.avcodec_receive_frame(codecContext, frame) == 0)
                {
                    // 在这里处理解码后的视频帧数据
                    
                    // 控制播放速度,例如使用 Thread.Sleep() 方法休眠一段时间
                    Thread.Sleep(33); // 按照每秒30帧的速度播放,休眠33毫秒
                    
                    // 释放帧数据的引用计数
                    ffmpeg.av_frame_unref(frame);
                }
            }
        }
    
        // 释放数据包的引用计数
        ffmpeg.av_packet_unref(&packet);
    }

在循环读取流的时候,增加睡眠代码啊,如果视频时每秒25帧,则sleep 40毫秒,如果时30帧则sleep 33毫秒,这样就可以正常速度播放了。

如果想实现本地视频的倍速播放,那就控制睡眠时长就可以了,以每秒25帧为例,正常1倍速的话sleep40毫秒,想实现2倍速,就sleep20毫秒,4倍速sleep10毫秒,类推,每秒30帧同理。

猜你喜欢

转载自blog.csdn.net/u013543846/article/details/132295210