- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
全部
我在win7中使用了FFmpeg.AutoGen 3.2,vs2015,从FFmpeg复制了一个示例(http://ffmpeg.org/doxygen/trunk/filtering_video_8c-example.html),
运行时
string video = @"e:\\1.avi";
FilterVideo fv = new FilterVideo();
fv.filtertest(video);
using FFmpeg.AutoGen;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace videoFFmpegAutoGen.tool
{
public unsafe class FilterVideo
{
public int open_input_file(string filename)
{
try
{
int ret;
AVCodec* dec;
fixed (AVFormatContext** at = &fmt_ctx)
{
ret = ffmpeg.avformat_open_input(at, filename, null, null);
}
if (ret < 0)
{
Console.WriteLine("Cannot open input file\n");
return ret;
}
ret = ffmpeg.avformat_find_stream_info(fmt_ctx, null);
if (ret < 0)
{
Console.WriteLine("Cannot find stream information\n");
return ret;
}
ret = ffmpeg.av_find_best_stream(fmt_ctx, AVMediaType.AVMEDIA_TYPE_VIDEO, -1, -1, &dec, 0);
if (ret < 0)
{
Console.WriteLine("Cannot find a video stream in the input file\n");
return ret;
}
video_stream_index = ret;
/* create decoding context */
dec_ctx = ffmpeg.avcodec_alloc_context3(dec);
ffmpeg.avcodec_parameters_to_context(dec_ctx, fmt_ctx->streams[video_stream_index]->codecpar);
ffmpeg.av_opt_set_int(dec_ctx, "refcounted_frames", 1, 0);
/* init the video decoder */
if ((ret = ffmpeg.avcodec_open2(dec_ctx, dec, null)) < 0)
{
Console.WriteLine("Cannot open video decoder\n");
return ret;
}
return ret;
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
}
return -1;
}
private string filters_descr = "scale=78:24,transpose=cclock";
private int video_stream_index = -1;
private AVFormatContext* fmt_ctx;
private AVFilterGraph* filter_graph;
AVFilterContext* buffersrc_ctx;
private AVCodecContext* dec_ctx;
AVFilterContext* buffersink_ctx;
public unsafe int init_filters(string filters_descr)
{
int ret = 0;
AVFilterInOut* outputs = null;
AVFilterInOut* inputs = null;
try
{
AVFilter* buffersrc = ffmpeg.avfilter_get_by_name("buffer");
AVFilter* buffersink = ffmpeg.avfilter_get_by_name("buffersink");
outputs = ffmpeg.avfilter_inout_alloc();
inputs = ffmpeg.avfilter_inout_alloc();
AVRational time_base = fmt_ctx->streams[video_stream_index]->time_base;
filter_graph = ffmpeg.avfilter_graph_alloc();
//string args = string.Format("video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d", dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt, time_base.num, time_base.den, dec_ctx->sample_aspect_ratio.num, dec_ctx->sample_aspect_ratio.den);
string args = string.Format("video_size={0}x{1}:pix_fmt={2}:time_base={3}/{4}:pixel_aspect={5}/{6}", dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt, time_base.num, time_base.den, dec_ctx->sample_aspect_ratio.num, dec_ctx->sample_aspect_ratio.den);
// string args = string.Format("video_size={0}x{1}:time_base={2}/{3}:pixel_aspect={4}/{5}", dec_ctx->width, dec_ctx->height, time_base.num, time_base.den, dec_ctx->sample_aspect_ratio.num, dec_ctx->sample_aspect_ratio.den);
// string args = string.Format("video_size={0}x{1}", dec_ctx->width, dec_ctx->height);
Console.WriteLine("args:" + args);
fixed (AVFilterContext** at= &buffersrc_ctx)
{
ret = ffmpeg.avfilter_graph_create_filter(at, buffersrc, "in", args, null, filter_graph);
}
if (ret < 0)
{
Console.WriteLine("Cannot create buffer source\n"+ret);
return ret;
}
fixed (AVFilterContext** at = &buffersink_ctx)
{
ret = ffmpeg.avfilter_graph_create_filter(at, buffersink, "out", null, null, filter_graph);
}
if (ret < 0)
{
Console.WriteLine("Cannot create buffer sink\n");
return ret;
}
// ret = ffmpeg.av_opt_set_int_list(buffersink_ctx, "pix_fmts", pix_fmts,AV_PIX_FMT_NONE, AV_OPT_SEARCH_CHILDREN);
/*
* The buffer source output must be connected to the input pad of
* the first filter described by filters_descr; since the first
* filter input label is not specified, it is set to "in" by
* default.
*/
outputs->name = ffmpeg.av_strdup("in");
outputs->filter_ctx = buffersrc_ctx;
outputs->pad_idx = 0;
outputs->next = null;
/*
* The buffer sink input must be connected to the output pad of
* the last filter described by filters_descr; since the last
* filter output label is not specified, it is set to "out" by
* default.
*/
inputs->name = ffmpeg.av_strdup("out");
inputs->filter_ctx = buffersink_ctx;
inputs->pad_idx = 0;
inputs->next = null;
ret = ffmpeg.avfilter_graph_parse_ptr(filter_graph, filters_descr, &inputs, &outputs, null);
if (ret < 0)
{
return ret;
}
ret = ffmpeg.avfilter_graph_config(filter_graph, null);
if (ret < 0)
{
return ret;
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
ffmpeg.avfilter_inout_free(&inputs);
ffmpeg.avfilter_inout_free(&outputs);
}
return ret;
}
long AV_NOPTS_VALUE = 1;
//int last_pts = AV_NOPTS_VALUE;
long last_pts = 1;
public void display_frame(AVFrame* frame, AVRational time_base)
{
int x, y;
long delay;
sbyte* p0;
sbyte* p;
AVRational cq = new AVRational();
cq.num = 1;
cq.den = 1000000;
if (frame->pts != AV_NOPTS_VALUE)
{
if (last_pts != AV_NOPTS_VALUE)
{
/* sleep roughly the right amount of time;
* usleep is in microseconds, just like AV_TIME_BASE. */
delay = ffmpeg.av_rescale_q(frame->pts - last_pts, time_base, cq);
if (delay > 0 && delay < 1000000)
Thread.Sleep((int)delay);
}
last_pts = frame->pts;
}
/* Trivial ASCII grayscale display. */
p0 = frame->data0;
//puts("\033c");
for (y = 0; y < frame->height; y++)
{
p = p0;
//for (x = 0; x < frame->width; x++)
//putchar(" .-+#"[*(p++) / 52]);
//putchar('\n');
p0 += frame->linesize[0];
}
//fflush(stdout);
}
private int AV_BUFFERSRC_FLAG_KEEP_REF = 8 ;
public unsafe void filtertest(string inputvideo)
{
AVFrame* frame = ffmpeg.av_frame_alloc();
AVFrame* filt_frame = ffmpeg.av_frame_alloc();
try
{
int ret;
AVPacket packet;
ffmpeg.av_register_all();
ffmpeg.avfilter_register_all();
ret = open_input_file(inputvideo);
if (ret < 0)
{
return;
}
ret = init_filters(filters_descr);
if (ret < 0)
{
return;
}
while (true)
{
ret = ffmpeg.av_read_frame(fmt_ctx, &packet);
if (ret < 0)
{
Console.WriteLine("Error while sending a packet to the decoder\n");
break;
}
if (packet.stream_index == video_stream_index)
{
ret = ffmpeg.avcodec_send_packet(dec_ctx, &packet);
if (ret < 0)
{
Console.WriteLine( "Error while sending a packet to the decoder\n");
break;
}
while (ret >= 0)
{
ret = ffmpeg.avcodec_receive_frame(dec_ctx, frame);
//if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
if (ret == 999)
{
break;
}
else if (ret < 0)
{
Console.WriteLine("Error while receiving a frame from the decoder\n");
return;
} else
{
Console.WriteLine("ret::"+ret);
}
if (ret >= 0)
{
frame->pts = frame->best_effort_timestamp;
/* push the decoded frame into the filtergraph */
if (ffmpeg.av_buffersrc_add_frame_flags(buffersrc_ctx, frame, AV_BUFFERSRC_FLAG_KEEP_REF) < 0)
{
Console.WriteLine("Error while feeding the filtergraph\n");
break;
}
/* pull filtered frames from the filtergraph */
while (true)
{
ret = ffmpeg.av_buffersink_get_frame(buffersink_ctx, filt_frame);
//if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
if (ret == 999)
{
break;
}
else if (ret < 0)
{
return;
}else
{
Console.WriteLine("ret2:" + ret);
}
display_frame(filt_frame, buffersink_ctx->inputs[0]->time_base);
ffmpeg.av_frame_unref(filt_frame);
}
ffmpeg.av_frame_unref(frame);
}
}
}
ffmpeg.av_packet_unref(&packet);
}
}
catch(Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
fixed (AVFilterGraph** at = &filter_graph)
{
ffmpeg.avfilter_graph_free(at);
}
ffmpeg.avcodec_close(dec_ctx);
fixed (AVFormatContext** at = &fmt_ctx)
{
ffmpeg.avformat_close_input(at);
}
ffmpeg.av_frame_free(&frame);
ffmpeg.av_frame_free(&filt_frame);
}
}
}
}
最佳答案
我敢打赌,问题出在这一行:
string args = string.Format("video_size={0}x{1}:pix_fmt={2}:time_base={3}/{4}:pixel_aspect={5}/{6}", dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt, time_base.num, time_base.den, dec_ctx->sample_aspect_ratio.num, dec_ctx->sample_aspect_ratio.den);
pix_fmt
肯定是
int
而不是作为字符串传递。
dec_ctx->pix_fmt
的整数值它应该可以工作。
关于c# - FFmpeg.AutoGen 使用 avfilter_graph_create_filter 返回 -22,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47265575/
我正在尝试使用使用 FFmpeg.AutoGen 的 FFMediaToolkit 库。 我遇到了一个错误Invalid data found when processing input调用ffmpe
是否可以在 UWP(通用 Windows 平台)项目上使用 FFmpeg.AutoGen 包? 最佳答案 不,过去一个月我一直在寻找相同的东西,但我没有在 uwp 中直接找到任何支持 FFmpeg.a
我试图调试具有很多依赖关系的Go程序包,试图跟踪依赖关系中的函数调用,以找出错误的根源。 Delve(通过CLI和VSCode GUI调试器)对函数调用进行了一定深度的跟踪,但随后突然拒绝更深入的讨论
我在 linux 上有一个 CMake 项目,我正在使用 ExternalProject构建 Google Protobuf。它工作得很好,但是任何后续构建仍然会调用外部项目中的配置步骤(这很烦人,因
我想从这里使用 FFmpeg.AutoGen 项目:https://github.com/Ruslan-B/FFmpeg.AutoGen 我不熟悉 ffmpeg API,所以我想得到一个如何将音频文件
我正在使用 FFmpeg autogen 将从 PC 实时(60 或 30 fps)捕获的图像流式传输到 Android 应用程序。当我使用 FFmpeg autogen 提供的 h.264 编码示例
我正在尝试在基于 autogen 的项目上使用 CMake ExternalProject_Add 构建 debian。该项目安装到我设置的任何前缀目录(默认为 /usr/local)。问题是,当我在
我在 git 中启动了一个新项目,并使用 ./autogen.sh 和 xfce4-dev-tools 生成配置脚本和其他文件。 我想知道仅提供 git 版本是否是一个坏主意,或者我还需要创建 dis
我正在使用 Eclipse 3.7.2 和 Pydev 2.6 开发 Django 程序。当我将 Django 从 1.3 升级到 1.4.1 时,我发现了一个关于“DJANGO_SETTINGS_M
我已经从 http://libspatialindex.github.com/ 下载了 R 树 由于运行 ./autogen.sh 我找不到文件/文件夹,因此我从下面给出的 github 存储库下载了
我见过很多 tarball 不包含 autogen.sh文件,但我在其他一些压缩包中看到过它。 包含或不包含 autogen.sh 的理由是什么?在 tarball 中? 最佳答案 如果您要从某种发布
我编写了一个视频生成器,可以为 h264 格式 (mp4) 的视频提供版权。当我从我的 Azure 服务流式传输视频时,我看到以下网络流量: 我使用的 AVCodecContext 布局如下: AVC
全部 我在win7中使用了FFmpeg.AutoGen 3.2,vs2015,从FFmpeg复制了一个示例(http://ffmpeg.org/doxygen/trunk/filtering_vide
我正在尝试使用 从我的网络摄像机读取/解码 RTSP 流FFmpeg.AutoGen 库。 当 ffmpeg 尝试通过 UDP 连接时,服务器响应错误。 当我尝试通过 ffmpeg exe 连接时,也
我一直在试验 FFmpeg.AutoGen ( https://github.com/Ruslan-B/FFmpeg.AutoGen ) 包装器。我已经成功地将 MPG 文件从 .NET 流解码为位图
我从其他 Makefile 调用一个 autogen.sh 脚本,而这个 Makefile 是从一个 shell 脚本调用的,如果我在这个更外部的脚本上设置一个变量 VAR,我可以在这个 Makefi
我正在使用 ./autogen.sh --prefix=/usr/ 构建一个 c project配置过程(以及稍后的编译和链接步骤)创建的所有文件都位于我的源文件夹中。 我想告诉你使用不同的文件夹(比
autogen.sh 失败,输出显示我需要更高版本的 autoconf。但事实上我有一个 2.6x autoconf.... 为什么还是失败了? [mirror@home 4]$ ./autogen.
我尝试在 CMakeLists.txt 中设置 ExternalProject_Add, 为此我发现了这个问题: What is the correct usage of CMake EXTERNAL
我正在尝试编写一个 C# 重新流式传输类,它将采用 HLS/m3u8 H264 编码的视频流并将它们重新流式传输为 RTMP H264 编码的视频。 我从简单的传输流记录器示例开始,并能够使其在以下场
我是一名优秀的程序员,十分优秀!