c# - FFmpeg av_interleaved_write_frame 缓冲

标签 c# ffmpeg

嗨,我正在使用 FFmpeg Autogen C#。当我使用 mkv 输出作为文件并使用 h264 rtsp 流作为输入时,一切正常。编解码器是 libx264

  ffmpeg.avio_open(&container->pb, filename, 2),
  fmpeg.avformat_write_header(container, null)
  ffmpeg.av_read_frame(inputContainer, &pkt)
  ffmpeg.av_interleaved_write_frame(container, &pkt).
Mkv 文件输出工作完美。
但是当我试图打开 AVIOContext 到缓冲区时
ffmpeg.avio_alloc_context(avio_ctx_buffer, 32768, 1, &bd, null, write, seek)
搜索功能
unsafe long seek(void* opaque, long offset, int whence)
    {
        buffer_data* bd = (buffer_data*)opaque;
        switch (whence)
        {
            case 0:
                bd->ptr = bd->buf + offset;
                return (long)bd->ptr;
            case 1:
                bd->ptr += offset;
                break;
            case 2:
                bd->ptr = (bd->buf + bd->size) + offset;
                return (long)bd->ptr;
            case 65536:
                return bd->size;
            default:
                return -1;
        }
        return 1;
    }
写函数
 unsafe int write(void* opaque, byte* buf, int buf_size)
        {

            buffer_data* bd = (buffer_data*)opaque;
            while ((ulong)buf_size > bd->room)
            {
                long offset = bd->ptr - bd->buf;
                bd->buf = (byte*)ffmpeg.av_realloc_f(bd->buf, 2, (ulong)bd->size);
                if (bd->buf == null)
                    return ffmpeg.AVERROR(ffmpeg.ENOMEM);
                bd->size *= 2;
                bd->ptr = bd->buf + offset;
                bd->room = (ulong)(bd->size - offset);
            } 
            memcpy((IntPtr)bd->ptr, (IntPtr)buf, (UIntPtr)buf_size); 
            bd->ptr += buf_size;
            bd->room -= (ulong)buf_size;
            byte[] b = new byte[buf_size];
            Marshal.Copy((IntPtr)buf, b, 0, buf_size);
            using (var fs = new FileStream(@"D:\file1.mkv", FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
            {
                using (BinaryWriter writer = new BinaryWriter(fs))
                {
                    writer.Write(b);
                }

            }
            return buf_size;
        }
缓冲数据
public unsafe struct buffer_data
        {
            public byte* buf;
            public long size;
            public byte* ptr;
            public ulong room; ///< size left in the buffer
        };
我得到的结果是 1 秒 mkv 视频(它的大小增加但 vlc 播放器无法播放)。另外请注意,写入文件只是为了测试我试图将 mkv 数据保存在缓冲区中。谢谢!!!。如果缺少smth请评论我会添加

最佳答案

抱歉打扰:) ,Silli 错误

 switch (whence)
        {
            case 0:
                bd->ptr = (bd->buf + bd->size) + offset;
                return (long)bd->ptr;
            case 1:
                bd->ptr += offset;
                break;
            case 2:
                bd->ptr = bd->buf + offset;
                return (long)bd->ptr;
            case 65535:
                return bd->size;
            default:
                return -1;
        }

关于c# - FFmpeg av_interleaved_write_frame 缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72476888/

相关文章:

c# - 将包含非表格内容的完整 MVC View 导出到 Excel

c# - 使用 SSH.NET 流式传输私钥的问题

python - 如何使用 youtubedl 的搜索功能而不是 url 让我的不和谐机器人播放音乐? (Python)

linux - Alsa 无法设置样本格式[FFMPEG]

Windows - FFmpeg - 如何将 jpg 文件映射到视频流 0 :0 and include only audio stream 0:2 and not stream 0:1 and 0:2 together

ffmpeg - 输入链接 in1 :v0 parameters (size 640x640, SAR 16 :9) do not match the corresponding output link in0:v0 parameters (640x640, SAR 427:240)

c# - 什么是运营商 "?."?

c# - 列仅检查第一项。 Access 数据库

c# - 规定类中需要一个属性 - 编译时

ffmpeg - 与 0 异或的目的?