嗨,我正在使用 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/