标签: libavcodec

ffmpeg,libav和avconv之间有什么区别和相似之处?

当我ffmpeg在Ubuntu上运行时,它显示:

$ ffmpeg 
ffmpeg version v0.8, Copyright (c) 2000-2011 the Libav developers
  built on Feb 28 2012 13:27:36 with gcc 4.6.1
This program is not developed anymore and is only provided for compatibility. Use avconv instead (see Changelog for the list of incompatible changes).
Run Code Online (Sandbox Code Playgroud)

或者它显示(取决于Ubuntu版本):

$ ffmpeg
ffmpeg version 0.8.5-6:0.8.5-0ubuntu0.12.10.1, Copyright (c) 2000-2012 the Libav developers
  built on Jan 24 2013 14:49:20 with gcc 4.7.2
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility …
Run Code Online (Sandbox Code Playgroud)

audio ubuntu ffmpeg libavcodec libav

243
推荐指数
1
解决办法
14万
查看次数

FFmpeg可以用作库而不是独立程序吗?

我想为我正在编写的程序添加视频转换功能.FFmpeg用于执行此操作的命令行界面很简单ffmpeg -i InputFile OutputFile,但是有没有办法将其用作库,所以我可以做类似的事情ffmpeg_convert(InputFile, OutputFile)

我希望我不必直接使用libavcodec,因为我认为它将比单行函数更复杂,以便在格式之间进行转换.如果FFmpeg无法轻易改装来执行此操作,是否可能有另一个基于它的库?我听说过libvlc,但这似乎只暴露了一个视频播放 API,而不是视频转换.

谢谢.

c mpeg ffmpeg ogg libavcodec

42
推荐指数
3
解决办法
3万
查看次数

使用libavcodec在mpegts容器中生成H264帧

我非常感谢以下问题的一些帮助:

我有一个带摄像头的小工具,生成H264压缩视频帧,这些帧正在发送到我的应用程序.这些框架不在容器中,只是原始数据.

我想使用ffmpeg和libav函数来创建一个视频文件,以后可以使用.

如果我解码帧,然后编码它们,一切正常,我得到一个有效的视频文件.(解码/编码步骤是通常的libav命令,这里没什么花哨的,我把它们从万能的互联网上取下来,它们坚如磐石)......但是,我通过解码和编码浪费了大量时间,所以我想跳过此步骤并直接将帧放在输出流中.现在,问题来了.

这是我提出的用于生成编码的代码:

AVFrame* picture;

avpicture_fill((AVPicture*) picture, (uint8_t*)frameData, 
                 codecContext->pix_fmt, codecContext->width,
                 codecContext->height);
int outSize = avcodec_encode_video(codecContext, videoOutBuf, 
                 sizeof(videoOutBuf), picture);
if (outSize > 0) 
{
    AVPacket packet;
    av_init_packet(&packet);
    packet.pts = av_rescale_q(codecContext->coded_frame->pts,
                  codecContext->time_base, videoStream->time_base);
    if (codecContext->coded_frame->key_frame) 
    {
        packet.flags |= PKT_FLAG_KEY;
    }
    packet.stream_index = videoStream->index;
    packet.data =  videoOutBuf;
    packet.size =  outSize;

    av_interleaved_write_frame(context, &packet);
    put_flush_packet(context->pb);
}
Run Code Online (Sandbox Code Playgroud)

变量的位置如下:

frameData是来自摄像机的解码帧数据,它是在前一步骤中解码的,videoOutBuf是用于保存数据的普通uint8_t缓冲区

我修改了应用程序以便不解码帧,而只是简单地传递数据:

    AVPacket packet;
    av_init_packet(&packet);

    packet.stream_index = videoStream->index;
    packet.data = (uint8_t*)frameData;
    packet.size = currentFrameSize;

    av_interleaved_write_frame(context, &packet);
    put_flush_packet(context->pb);
Run Code Online (Sandbox Code Playgroud)

哪里

frameData是原始的H264帧,currentFrameSize是原始H264帧的大小,即.我从每个框架的小工具中获得的字节数.

然后,应用程序突然无法正常工作,生成的视频无法播放.这很明显,因为我没有为数据包设置正确的PTS.我做的是以下(我很绝望,你可以从这种方法看到:)) …

c h.264 libavcodec libavformat

35
推荐指数
1
解决办法
3万
查看次数

使用libavformat读取位于内存中的文件

我目前正在尝试阅读从服务器发送的小型视频文件

为了使用libavformat读取文件,您应该调用

av_open_input_file(&avFormatContext, "C:\\path\\to\\video.avi", 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

问题是在这种情况下,文件不在磁盘上,而是在内存中.

我现在正在做的是下载文件,使用临时名称将其写入磁盘,然后av_open_input_file使用临时文件名调用,这不是一个非常干净的解决方案.

事实上我想要的是一个功能,av_open_custom(&avFormatContext, &myReadFunction, &mySeekFunction);但我没有在文档中找到任何.我想这在技术上是可行的,因为文件的名称不能帮助库确定它使用的格式.

那么有这样的函数,还是av_open_input_file的替代品?

c c++ file libavcodec libavformat

27
推荐指数
3
解决办法
2万
查看次数

任何人都可以帮助理解AVFrame.linesize []?

我试图找到每个细胞的AVFrame.linesize[]意思,但我没有找到.

据我所知linesize[0],宽度linesize[1]是高度.

  1. 如果我说得对,其他细胞是什么意思?
  2. 为什么avcodec_decode_video2(codecCtxDecode, frameDecoded, &frameFinished, &packet);只有lineize [0]有值,其他单元格总是0?

更新

我认为AVFrame.data [i]和AVFrame.linesize [i]是行中特定颜色的数据和行的长度,我是否正确?

video ffmpeg stride libavcodec

21
推荐指数
2
解决办法
1万
查看次数

如何用libavcodec/x264编码h.264?

我试图使用libavcodec/libavformat编码视频.音频效果很好,但当我尝试编码视频时,我收到以下错误:

[libx264 @ 0x10182a000]broken ffmpeg default settings detected  
[libx264 @ 0x10182a000]use an encoding preset (vpre)  
Run Code Online (Sandbox Code Playgroud)

使用命令行ffmpeg很容易修复,但我想在C中执行此操作.我的选项是

AVStream *pVideoOutStream = av_new_stream(pOutFormatCtx, 0);  
AVCodecContext *pVideoOutCodecCtx  = pVideoOutStream->codec;  

pVideoOutCodecCtx->codec_id        = CODEC_ID_H264;    
pVideoOutCodecCtx->codec_type      = CODEC_TYPE_VIDEO;  
pVideoOutCodecCtx->bit_rate        = pVideoInCodecCtx->bit_rate;  
pVideoOutCodecCtx->width           = pVideoInCodecCtx->width;    
pVideoOutCodecCtx->height          = pVideoInCodecCtx->height;  
pVideoOutCodecCtx->pix_fmt         = pVideoInCodecCtx->pix_fmt;    
pVideoOutCodecCtx->sample_rate     = pVideoInCodecCtx->sample_rate;    
pVideoOutCodecCtx->gop_size        = 30;  
Run Code Online (Sandbox Code Playgroud)

但是avcodec_open()失败了.

我需要设置哪些其他值才能使x264满意?

c x264 libavcodec libav libx264

19
推荐指数
3
解决办法
3万
查看次数

如何创建解码器的完整副本?

我正在编写一个视频解码器(使用FFMPEG/AVCodec)来自定义实现mpeg4视频流.这个视频流的特点是它可以分成许多"子"流,根据同一个父节点创建许多P帧.我正在尝试解码的视频流实际上是一种"视频树".像这样的东西:

I <--P <--P <---------------------P <-------------- P <------------ P
           \ <--P <--P <--P        \ <--P <--P       \ <--P <--P 
Run Code Online (Sandbox Code Playgroud)

我已经写了一个基本的解码器,当我决定遵循一条路径时工作正常,问题是当我尝试在视频树中跟随多个路径时.此时我需要"解析"我的解码器以跟随两个不同的视频流.拆分不仅可能发生在关键帧之后,甚至在P帧之后,所以我需要复制AVCodecContext(我使用avcodec_copy_context)但它似乎从干净的状态创建新的解码器..它似乎忽略了以前的视频状态因此,解码的P帧被"应用"到空视频帧.可能复制上下文使用avcodec_copy_context是不够的...任何建议?如何复制上下文和解码器的完整状态?或者,有没有其他方法使用引用解码我的流?谢谢!

ffmpeg mpeg-4 libavcodec avcodec

15
推荐指数
1
解决办法
1825
查看次数

问题:FFMPEG使用字节位置搜索av_seek_frame

我试图让av_seek_frame()函数转到我指定的字节位置.我正在为我的应用程序实现帧精确搜索机制,我看到它的方式,我将扫描整个视频文件,并在结构中存储每个关键帧的字节位置.我找到了获取当前字节位置的位置:AVPacket.pos.我现在用av_seek_frame这样测试这个位置:

av_seek_frame( pFormatCtx, videoStream, 110285594, AVSEEK_FLAG_BYTE);
Run Code Online (Sandbox Code Playgroud)

然而,这似乎没有做正确的事情,当我打电话时av_read_frame,它只是从第23帧开始.如果我不寻求,它从第1帧开始.

c++ ffmpeg libavcodec

14
推荐指数
2
解决办法
8843
查看次数

使用libavcodec将音频编码到aac

我正在使用libavcodec(截至3/3/10的最新git)将原始pcm编码为aac(启用了libfaac支持).我通过每次使用codec_context-> frame_size样本重复调用avcodec_encode_audio来完成此操作.前四个调用成功返回,但第五个调用永远不会返回.当我使用gdb中断时,堆栈已损坏.

如果我使用audacity将pcm数据导出到.wav文件,那么我可以使用命令行ffmpeg转换为aac而没有任何问题,所以我确定这是我做错了.

我写了一个小的测试程序来复制我的问题.它从文件中读取测试数据,可在此处获取:http: //birdie.protoven.com/audio.pcm(签名16位LE pcm约2秒)

如果我直接使用FAAC,我可以完成所有工作,但如果我可以使用libavcodec,那么代码会更清晰一些,因为我也编码视频,并将两者写入mp4.

ffmpeg版本信息:

FFmpeg version git-c280040, Copyright (c) 2000-2010 the FFmpeg developers
  built on Mar  3 2010 15:40:46 with gcc 4.4.1
  configuration: --enable-libfaac --enable-gpl --enable-nonfree --enable-version3 --enable-postproc --enable-pthreads --enable-debug=3 --enable-shared
  libavutil     50.10. 0 / 50.10. 0
  libavcodec    52.55. 0 / 52.55. 0
  libavformat   52.54. 0 / 52.54. 0
  libavdevice   52. 2. 0 / 52. 2. 0
  libswscale     0.10. 0 /  0.10. 0
  libpostproc   51. 2. 0 / 51. 2. 0
Run Code Online (Sandbox Code Playgroud)

有没有我没有设置的东西,或者在我的编解码器环境中设置不正确,也许?任何帮助是极大的赞赏!

这是我的测试代码: …

c audio ffmpeg aac libavcodec

13
推荐指数
1
解决办法
2万
查看次数

如何在libavcodec中设置解码像素格式?

我通过libavcodec解码视频,使用以下代码:

//Open input file
if(avformat_open_input(&ctx, filename, NULL, NULL)!=0)
    return FALSE; // Couldn't open file
if(avformat_find_stream_info(ctx, NULL)<0)
    return FALSE; // Couldn't find stream information
videoStream = -1;
//find video stream
for(i=0; i<ctx->nb_streams; i++)
{       
    if((ctx->streams[i])->codec->codec_type==AVMEDIA_TYPE_VIDEO)
    {
        videoStream=i;
        break;
    }
}
if (videoStream == -1)
    return FALSE; // Didn't find a video stream
video_codec_ctx=ctx->streams[videoStream]->codec;
//find decoder
video_codec=avcodec_find_decoder(video_codec_ctx->codec_id);
if(video_codec==NULL)
    return FALSE; // Codec not found
if(avcodec_open(video_codec_ctx, video_codec)<0)
    return -1; // Could not open codec
video_frame=avcodec_alloc_frame();
scaled_frame=avcodec_alloc_frame();
static struct SwsContext *img_convert_ctx; 
if(img_convert_ctx == NULL) …
Run Code Online (Sandbox Code Playgroud)

c c++ ffmpeg decoding libavcodec

12
推荐指数
1
解决办法
8479
查看次数

标签 统计

libavcodec ×10

ffmpeg ×7

c ×6

c++ ×3

audio ×2

libav ×2

libavformat ×2

aac ×1

avcodec ×1

decoding ×1

file ×1

h.264 ×1

libx264 ×1

mpeg ×1

mpeg-4 ×1

ogg ×1

stride ×1

ubuntu ×1

video ×1

x264 ×1