Tag: ffmpeg

如何从Golang访问C指针数组

我正在使用FFmpeg编写一个用于Windows平台的应用程序,它是golang包装器goav,但我无法理解如何使用C指针来获取对数组的访问权限。 我正在尝试将存储在AVFormatContext类中的流用于go,并最终将帧添加到OpenGl中的纹理以使video播放器具有很酷的过渡。 我认为理解如何投射和访问C数据将使编码变得更加容易。 我已经删除了C代码的所有相关部分,包装器和我的代码,如下所示: C代码 – libavformat / avformat.h typedef struct AVFormatContext { unsigned int nb_streams; AVStream **streams; } Golang goav包装纸 package avutil //#cgo pkg-config: libavformat //#include import “C” import ( “unsafe” ) type Context C.struct_AVFormatContext; func (ctxt *Context) StreamsGet(i uintptr) *Stream { streams := (**Stream)(unsafe.Pointer(ctxt.streams)); // I think this is where it’s going wrong, […]

在FFMPEG中将数据流与video一起编码

我想将一些专有数据(它是每帧的序列化无符号64位整数)编码为video容器(mp4)作为数据流,但我无法找到任何人这样做的任何指令/教程。 我唯一能找到的是这个,它描述了如何创建数据流(用户似乎没有成功)显然https://lists.libav.org/pipermail/ffmpeg-user/2006-November/005070 .html ) 这是我目前创建流的代码: ff_data_stream = avformat_new_stream(ff_output_context, NULL); ff_data_stream->codec->codec_type = AVMEDIA_TYPE_DATA; ff_data_stream->codec->codec_id = AV_CODEC_ID_NONE; ff_data_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER; 但是当我调用avformat_write_header它会将以下输出错误地发送到控制台: [mp4 @ 0x7fff68000900] track 1:找不到容器中当前不支持的标签,编解码器 所以我的问题如下: 是否可以使用mp4容器创建数据流? 如果没有,有没有容器呢? 这可能不是正确的方法,但我还没有遇到任何这样做的方法。 如果是这样,我该如何正确配置流? (无论是这个容器还是其他容器) 那么在写入文件时会使用AVPacket吗? 并使用av_interleaved_write_frame将其写入文件? 谢谢

如何使用指向C数据的指针在Golang中写入文件?

我正在使用FFmpeg编写一个用于Windows平台的应用程序,它是golang包装器goav,但我无法理解如何使用C指针来获取对数组的访问权限。 我正在尝试将来自C的uint8指针指向的帧数据写入golang中的.ppm文件。 一旦我完成了这个,为了certificateFFmpeg正在做我期望的概念,我想在OpenGl中将帧设置为纹理,以使video播放器具有很酷的过渡; 任何指向做得好而有效的指针将非常有帮助! 我猜我需要写一些着色器代码来绘制ppm作为纹理…… PPM文件结构看起来非常简单,只有标题,然后是从左上角到右下角的帧中每个像素的每个红色,绿色和蓝色值的数据字节 我开始理解如何在C和Go类型之间转换指针,但是我如何访问数据并在Go中写入与C相同的结果? 在CI中,只需设置数据的指针偏移量并说明要写入多少: for (y = 0; y data[0]+y*pFrame->linesize[0], 1, width*3, pFile); } 我已经删除了C代码的所有相关部分,包装器和我的代码,如下所示: C代码 – libavutil / frame.h #include typedef struct AVFrame { #define AV_NUM_DATA_POINTERS 8 uint8_t *data[AV_NUM_DATA_POINTERS]; int linesize[AV_NUM_DATA_POINTERS]; } Golang goav包装纸 package avutil /* #cgo pkg-config: libavutil #include #include */ import “C” import ( “unsafe” ) type […]

C api使用ffmpeg从网络摄像头捕获video流

我是ffmpeg的新用户。 Ffmpeg有一个很好的文档,在命令行中使用它,但我正在寻找一些C API代码。 我想用C制作一个软件,它可以捕获来自网络摄像头的video流并以原始格式给我video流,我将在稍后的编解码器中编码。 我访问了这个给定的链接,但它只提供了命令行使用,而不是使用ffmpeg提供的库: http : //ffmpeg.org/trac/ffmpeg/wiki/How%20to%20capture%20a%20webcam% 20input 我也访问了这个链接,这给了我很好的使用libavcodec的想法,但没有其他教程可用: ffmpeg C API文档/教程 请有人帮助我使用ffmpeg的库从网络摄像头中捕获video流中的C api。 提前致谢。

FFmpeg:协议不在白名单’文件’上!

我想从RTP流中读取,但是当我将“test.sdp”指定为avformat_open_input()我收到以下消息: [rtp @ 03928900] Protocol not on whitelist ‘file’! Failed: cannot open input. avformat_open_input() fail: Invalid data found when processing input 通常,如果我在控制台上使用-protocol_whitelist file,udp,rtp ,我会添加选项-protocol_whitelist file,udp,rtp ,它会正常工作。 所以我尝试了这个: AVDictionary *d = NULL; av_dict_set(&d, “protocol_whitelist”, “file, udp, rtp”, 0); ret = avformat_open_input(&inFormatCtx, filename, NULL, &d); 但同样的消息仍然会出现。 有任何想法吗?

编译器是否注意像if(0)这样无用的代码?

最近,我正在编译Windows下的ffmpeg代码使用带有intel编译器的VS2010。 对于以下代码: void ff_dcadsp_init(DCADSPContext *s) { s->lfe_fir = dca_lfe_fir_c; if (ARCH_ARM) ff_dcadsp_init_arm(s); } 宏ARCH_ARM定义为0 。 当我在linux下编译它时,目标文件中的ff_dcadsp_init_arm()中没有函数,而它在windows下呢? 所以我想确定编译器是否会对无用的代码做些什么,以及如何为INTEL编译器设置它。

Android如何增加ffmpeg mp4的性能?

我已经检测到函数avcodec_decode_audio3在mp4格式下运行缓慢,这里是解码音频的代码周期: while (av_read_frame(av_format_context, &packet) >= 0 && is_play == 1) { if (av_codec_context->codec_type == AVMEDIA_TYPE_AUDIO && is_play == 1) { int out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE; int size = packet.size; int n; int dataLength = size; int decoded = 0; while (size > 0) { //start measure time gettimeofday(&tvBegin, NULL); int len = avcodec_decode_audio3(av_codec_context, (int16_t *) pAudioBuffer, […]

使用ffmpeg或OpenCV处理.Raw图像

阅读原始图像格式的维基百科页面后 ,这是任何图像的数字否定。 要观看或打印,必须处理相机图像传感器的输出,即转换为场景的照片渲染,然后以标准光栅图形格式(如JPEG)存储。 无论是在相机内还是稍后在原始文件转换器中完成,该处理涉及许多操作,通常包括 我使用v4l2示例从我的Logitech c920中抓取了一些.raw文件但是当我显示图像时它看起来像这样: 原始图像在其他帧中我可以看到我的影子 有谁知道如何处理这些文件以查看完整的框架? 这是原始.raw文件的链接

使用libav转换mp4-ts

我正在尝试使用libav将mp4文件转换为mpegts。 代码有效,但输出的文件无法由任何播放器播放。 这是输入文件 (它只是video,没有音频) 这是我到目前为止的代码: int convert(const char *input, const char *output) { AVFormatContext *inputContext = NULL; AVFormatContext *outputContext = NULL; AVCodecContext *input_codec_context = NULL; AVCodecContext *output_codec_context = NULL; AVCodec *output_codec = NULL; AVCodec *input_codec = NULL; AVStream *stream = NULL; AVIOContext *avioContext = NULL; av_register_all(); avformat_network_init(); avformat_alloc_output_context2(&outputContext, NULL, “mpegts”, output); avio_open(&avioContext, output, AVIO_FLAG_WRITE); outputContext->pb […]

如何将AVFrame转换为glTexImage2D使用的纹理?

如你所知AVFrame有2个属性:pFrame-> data,pFrame-> linesize。 我从video/sdcard/test.mp4(android平台)读取帧后,转换为RGB AVFrame副: img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, target_width, target_height, PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL); if(img_convert_ctx == NULL) { LOGE(“could not initialize conversion context\n”); return; } sws_scale(img_convert_ctx, (const uint8_t* const*)pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize); 我转换后得到了pFrameRGB。 我需要使用glTextImage2D在opengl中对其进行纹理处理: // Create The Texture glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, data); //我不知道这里的数据是pFrameRGB->数据与否,如果没有,如何将其转换为glTextImage的适当格式,这样我就可以使用AVFrame和gltextImage2D在opengl中显示video。 非常感谢你的所有帮助。