Tag: ffmpeg

我怎么知道任何h264文件的持续时间?

我有一个文件,其中只有h264帧以NAL单位的forms存在。 那么现在是否有任何方法可以计算该文件的持续时间? 我不知道文件中有多少帧。 我只有文件大小。 PS:我想做的就是使用C语言和Linux平台。

如果我更改扬声器配置,ffmpeg avcodec_open2将返回-22

我最近一直有一个奇怪的问题。 根据我在Windows(立体声/四/ 5.1)中设置音频配置的方式,对avcodec_open2()的ffmpeg调用失败,错误-22或只是工作。 我无法找到很多关于这个错误,我想我应该在这里问一下。 主要流程如下: c = st->codec; avformat_alloc_output_context2(&oc, NULL, NULL, “video.mpeg”); oc->fmt->audio_codec = AV_CODEC_ID_MP2; AVDictionary* dict = NULL; ret = av_dict_set(&dict, “ac”, “2”, 0); c->request_channels = 2; ret = avcodec_open2(c, codec, &dict); //HERE IT FAILS WITH -22 if speaker configuration is not stereo 编解码器上下文’c’在流中设置如下: st = avformat_new_stream(oc, *codec); c = st->codec; c->channels = 2; […]

FFMPEG寻求带来音频伪像

我正在使用ffmpeg实现音频解码器。 在阅读音频甚至寻找已经有效的时候,我无法找到一种方法来清除缓冲区后寻求所以当应用程序在搜索后立即开始读取音频时我没有任何文物。 avcodec_flush_buffers似乎对内部缓冲区没有任何影响。 所有解码器(mp3,aac,wma,…)都会出现此问题,但PCM / WAV(由于未压缩音频,因此不使用内部缓冲区来保存数据以进行解码)。 代码片段很简单: av_seek_frame(audioFilePack->avContext, audioFilePack->stream, posInTimeFrame, AVSEEK_FLAG_ANY); avcodec_flush_buffers(audioFilePack->avContext->streams[audioFilePack->stream]->codec); 解释: audioFilePack->avContext = FormatContext audioFilePack->stream = Stream Position (also used to read audio packets) audioFilePack->avContext->streams[audioFilePack->stream]->codec = CodecContext for the codec used 关于我应该做什么的任何想法,我可以寻求并获得没有剩余音频? 谢谢!

如果我在FFmpeg中使用av_read_frame,则会丢失多个帧

我有一个3500帧的HEVC序列,我正在写一个解码器来读取它(逐帧读取并转储到yuv)。 在我的main()中,我有一个for循环调用一个解码器()3500次(我假设在这个阶段main()知道有多少帧)。 因此,对于每次调用decoder(),我都需要返回一个完整的帧。 这就是解码器()的样子。 bool decode(pFormatCtx, pCodecCtx) { int gotaFrame=0; while (gotaFrame==0) { printf(“1\t”); if ( !av_read_frame(pFormatCtx, &packet) ) { if(packet.stream_index==videoStreamIndex) { // try decoding avcodec_decode_video2(pCodecCtx, pFrame, &gotaFrame, &packet); if (gotaFrame) { // decode success. printf(“2\t”); // dump to yuv … not shown here. // cleanup av_frame_unref(pFrame); av_frame_free(&pFrame); av_free_packet(&packet); return true; } } } } […]

FFMPEG无法显示video的持续时间

我正在尝试使用ffmpeg从video文件中捕获帧,但我甚至无法获得video的持续时间。 每次当我尝试使用pFormatCtx->duration来访问它时我得到0.我知道指针初始化并包含正确的持续时间,因为如果我使用av_dump_format(pFormatCtx, 0, videoName, 0); 那么我实际上得到了持续时间数据以及有关video的其他信息。 这是我使用av_dump_format(pFormatCtx, 0, videoName, 0); : 输入#0,avi,来自’futurama.avi’: 持续时间:00:21:36.28,开始:0.000000,比特率:1135 kb / s 流#0.0:video:mpeg4(高级简单配置文件),yuv420p,512×384 [PAR 1:1 DAR 4:3],25 tbr,25 tbn,25 tbc 流#0.1:音频:ac3,48000Hz,立体声,s16,192kb / s 我不明白为什么av_dum_format可以显示持续时间而我不能。 我检查了函数定义,显示持续时间,该函数也使用pFormatCtx-> duration。 当我在main.cpp中调用它们时,其他成员变量也不会显示正确的数据 这是我的main.cpp: extern “C” { #include #include #include } int main(int argc, char *argv[]) { AVFormatContext *pFormatCtx = NULL; const char videoName[] = “futurama.avi”; // […]

我在哪里可以找到libav,ffmpeg等的现代教程?

我想在C中制作一个快速程序,它将打开一个video,将每个帧保存为ppm,并转储运动矢量。 我能找到的所有教程都是差不多十年前的,并且调用了已弃用或不存在的函数。 是否有任何良好的在线资源,网站,video或教科书涵盖了做这类事情的现代方法?

使用ffmpeg 2.1.1 for Android时未定义的引用

我正在按照与halfninja构建相同的模式构建 ffmpeg:通过JNI从Java获取ffmpeg的main 。 我使用以下选项构建了ffmpeg: ./configure \ –prefix=$PREFIX \ –disable-shared \ –enable-static \ –disable-doc \ –disable-ffmpeg \ –disable-ffplay \ –disable-ffprobe \ –disable-ffserver \ –disable-doc \ –disable-symver \ –cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ –target-os=linux \ –arch=arm \ –enable-cross-compile \ –sysroot=$SYSROOT \ –extra-cflags=”-Os -fpic $ADDI_CFLAGS” \ –extra-ldflags=”$ADDI_LDFLAGS” $PREFIX , TOOLCHAIN ,…从我的NDK设置为相应的文件夹。 $ADDI_CFLAGS设置为-marm , $ADDI_LDFLAGS和$ADDITIONAL_CONFIGURE_FLAGS $ADDI_LDFLAGS设置。 生成的静态库: $ ls -1 android / […]

如何使用FFmpeg C API对H.264video进行编码,然后使用媒体播放器打开输出?

我正在尝试使用FFMPEG C API对H.264video进行编码。 我已经成功编译并执行了FFMPEG提供的解码/编码示例 。 我面临的问题是.mpg文件(用AV_CODEC_ID_MPEG1VIDEO编码)这个例子创建了作品。 Windows会创建缩略图和所有内容。 另一方面,.h264(用AV_CODEC_ID_H264编码)文件没有。 当我尝试在VLC中播放文件时,播放/暂停按钮只是闪烁,窗口中没有缩略图,没有任何内容。 在编码期间,libx264报告以下内容: [libx264 @ 004b81a0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX [libx264 @ 004b81a0] profile High, level 1.3 [libx264 @ 004b81a0] frame I:3 Avg QP:26.79 size: 2116 [libx264 @ 004b81a0] frame P:12 Avg QP:26.60 size: 789 [libx264 @ 004b81a0] frame B:10 Avg QP:31.39 size: 499 […]

对于libx264 Codec,将忽略通过ffmpeg API设置video比特率

我正在使用c代码中的FFMPEG API对video进行转码。 我正在尝试使用ffmpeg API设置video比特率,如下所示: ovCodecCtx->bit_rate = 100 * 1000; 我使用的编码器是libx264。 但是这个参数没有生效,结果video质量很差。 我甚至尝试过设置相关参数,如rc_min_rate,rc_max_rate等。但video质量仍然很低,因为这些相关参数没有生效。 任何专家都能告诉我们如何使用FFMPEG API正确设置比特率吗? 谢谢

如何在Android中使用FFMPEG缩小默认摄像头捕获的video大小?

我正在尝试减少Android中默认摄像头捕获的video大小(它生成高分辨率video)。 FFMPEG是否具有对具有给定分辨率的video进行编码的属性? 我尝试使用Google,但所有示例都使用FFMPEG的命令行模式。 我的问题是: 我们可以在Android中使用ffmpeg命令行吗? 如果没有那么我们将如何实现它? 我们能否在Android中使用ffmpeg直接录制video? 还有其他解决方案吗?