流媒体: FFmpeg专项
文章平均质量分 87
北雨南萍
长期专注于实时音视频通信技术、音视频处理技术,包括基于webrtc的音视频通信解决方案,基于ffmpeg的媒体处理解决方案。
展开
-
FFmpeg源码剖析-通用:ffmpeg_parse_options()
ffmpeg_parse_options()函数位于ffmpeg_opt.c1. 函数概述它的功能主要有三个,解析命令行参数;打开输入文件,并解析数据,找到匹配每一个视频,音频,数据流的解码器;打开输出文件,并设置好输出的视频,音频,数据流的编码器;2. 函数调用结构图图 ffmpeg_parse_options()函数调用结构3. 代码...原创 2022-08-06 10:58:12 · 685 阅读 · 0 评论 -
ffmpeg的avcodec_open或avcodec_open2()的线程安全问题
报出错误为:[NULL @ 0x7fffe8006ce0] insufficient thread locking around avcodec_open/close()原因:是内部有线程检查,如果同时有多个线程调用这个函数,则会出错;解决办法:对于使用ffmpeg库进行开发时,无论是否使用音频库,如aac, mp3等,还是使用视频库,如 h.264,等,还是多线程原创 2017-12-21 21:29:53 · 3356 阅读 · 0 评论 -
FFmpeg源码剖析-通用:av_register_all()
av_register_all()函数的定义在 libavformat/allformats.c,它的作用的注册ffmpeg的各种mux和demux。1. 函数主体void av_register_all(void){ static int initialized; if (initialized) return; avcod原创 2017-09-12 12:12:57 · 656 阅读 · 0 评论 -
FFmpeg源码剖析-通用:avcodec_register_all()
avcodec_register_all()的函数定义位于libavcodec/allcodecs.c。它是用来注册编解码器的函数,只有调用了该函数,才能使用编解码器、解析器、硬件加速器等。1. 函数主体如下:void avcodec_register_all(void){ static int initialized; if (init原创 2017-09-11 23:20:19 · 730 阅读 · 0 评论 -
FFmpeg源码剖析-解码:av_read_frame()
av_read_frame()函数位于libavformat/utils.c1. 函数概述读取输入流的一帧数据;2. 函数调用图3. 伪码分析4. 代码分析av_read_frame()它的声明(libavformat/avformat.h)/** * Return the next frame of a stream原创 2017-09-18 23:49:57 · 4006 阅读 · 0 评论 -
FFmpeg源码剖析-通用:get_input_packet()
get_input_packet()位于ffmpeg.c1. 函数概述调用av_read_frame()函数从文件中读取一个packet, 对视频来说,一个packet是一帧;对音频来说,一个packet是多帧;2. 函数调用图3. 代码分析static int get_input_packet(InputFile *f, AVPack原创 2017-09-18 10:53:48 · 816 阅读 · 0 评论 -
FFmpeg源码剖析-框架:process_input()
process_input()函数位于ffmpeg.c1. 函数概述它的作用的从文件中读取一个packet,并解码;2. 函数调用结构图3. 代码分析/* * 它是在open_input_file()->add_input_stream()中初始化的, * Add all the streams from the given input原创 2017-09-17 00:32:03 · 2810 阅读 · 0 评论 -
FFmpeg源码剖析-框架:transcode()
transcode()函数位于ffmpeg.c1. 函数概述它是ffmpeg的转码的主函数。工作模式是每次读取一个packet,并处理。可见《 FFmpeg情景分析 1. FFmpeg转码框架解析》2. 函数框架图3. 函数伪码解析static int transcode(void){ /* 对每个输出流,计算出正确的编码原创 2017-09-14 15:54:08 · 1304 阅读 · 0 评论 -
FFmpeg源码剖析-通用:ffmpeg_parse_options()
ffmpeg_parse_options()函数位于ffmpeg_opt.c1. 函数概述它的功能主要有三个,解析命令行参数;打开输入文件,并解析数据,找到匹配每一个视频,音频,数据流的解码器;打开输出文件,并设置好输出的视频,音频,数据流的编码器;2. 函数调用结构图图 ffmpeg_parse_options()函数调用结构原创 2017-09-14 14:09:55 · 7677 阅读 · 0 评论 -
ffmpeg的转码延时测试与设置优化
我测试了下ffmpeg直播流的转码延时,这些参数对文件的转码也是通用的;测试环境: . ffmpeg 版本为v3.0.2 . 从同一台服务器拉流,转码再推送到同一台服务器上,这样减少了服务器与网络影响; . 播放器使用实时模式,不缓冲1. 设置slow参数$ ./ffmpeg -i rtmp://192.168.1.12/live/src -vcodec libx2原创 2016-07-13 22:12:07 · 15982 阅读 · 3 评论 -
ffmpeg 静态链接第三方库
动态(共享)链接库自是有诸多优于静态链接库的特点:如能共享内存空间; 节约整个系统的存储空间,从而使整个系统速度提高; 当只有某个动态链接库有更新时--便于维护--只用更新这个库。 但在有些情况下,如,服务器并不是你一个人独享;服务器上不止有一个版本的ffmpeg要用; 有一个集群的服务器需要你部署和维护,更新。这时能使用静态链接库就再好不过啦。 FFmpeg对第三方库通常是优...原创 2013-02-25 08:12:40 · 11848 阅读 · 2 评论 -
mpeg4ip.h:126: error: new declaration ‘char*
编译FAAC-1.28时遇到错误:mpeg4ip.h:126: error: new declaration ‘char* strcasestr(const char*, const char*)’解决方法:从123行开始修改此文件mpeg4ip.h,到129行结束。修改前:#ifdef __cplusplusextern "C" {#endifchar转载 2016-02-28 11:48:01 · 747 阅读 · 0 评论 -
使用ffmpeg将jpeg转成mp4
本文使用的ffmpeg版本是:ffmpeg-3.0-release1. 将单个jpeg转码生成mp4$ ./ffmpeg -f image2 -i ../test.jpg -vcodec libx264 -b:v 200k -r 10 -s 640x480 -acodec libfaac -y single_jpg.mp4该命令生成只有一个I帧的mp4; 原创 2016-03-06 10:05:14 · 11667 阅读 · 2 评论 -
Ubuntu下为AndroidStudio编译并使用FFmpeg(三)源码分析
android-ffmpeg-tutorial01的源码分析1. java的入口函数android APK的Java入口函数位于:app->src->java->roman10.tutorial.android_ffmpeg_tutorial01。在这个文件目录下有两个java程序文件,分别是:MainActivity.javaUtils.java其中,MainActi原创 2015-12-21 22:56:06 · 912 阅读 · 0 评论 -
使用FFmpeg的SDK库实现将H.264流封装进MP4文件时全局SPS、PPS与流中SPS、PPS冲突的问题
一、问题1. 使用FFmpeg的SDK库实现将H.264流封装进MP4文件的源码大致如下:char* filename = "./test.mp4"AVOutputFormat *fmt;AVStream* video_st;AVFormatContext *av_context; /* 初始化资源 */av_register_all();int iret = avformat_alloc_out...原创 2018-06-16 10:07:00 · 2081 阅读 · 1 评论 -
如何开启ffmpeg库中的日志
2. 在C++类中,实现ffmpeg库日志的打开// ffmpeg_sdk.h#pragma once#include <stdio.h>#include <stdlib.h> ...原创 2018-06-16 11:53:44 · 4242 阅读 · 0 评论 -
如何将libavcodec也静态编译并可链接到.so中
1 问题与解决使用ffmpeg SDK的静态库进行链接到动态库时,会出现如下的报错:/usr/bin/ld: /usr/local/lib/libavformat.a(allformats.o): relocation R_X86_64_32 against `ff_a64_muxer' can not be used when making a shared object; recomp...原创 2019-05-21 19:35:22 · 3151 阅读 · 0 评论 -
FFmpeg新旧接口对照使用一览
从FFmpeg 3.0 开始 , 使用了很多新接口,在一些基本用法上,编译会看见很多的warning,类似“ warning: ‘AVStream::codec’ is deprecated (declared at /usr/local/ffmpeg/include/libavformat/avformat.h:880) [-Wdeprecated-declarations]out_...原创 2019-05-24 15:59:51 · 3343 阅读 · 1 评论 -
FFmpeg-4.0 的filter机制的架构与实现.之三 Filter实现的源码分析
五、Filter实现的源码分析5.1 滤镜的回调函数的调用流程,以单滤镜设置(如 -vf "delogo")为例init()query_format(); // 输入输出的格式查询: 列出滤镜支持的格式列表config_input();config_output();for (;;) {request_frame();filter_frame();}unin...原创 2018-12-28 11:18:29 · 1957 阅读 · 2 评论 -
FFmpeg-4.0 的filter机制的架构与实现.之二 结构体关系与定义
4. Filter的结构体关系图与定义4.1 结构体间的关系图filter涉及的结构体,主要包括:> FilterGraph, AVFilterGraph> InputFilter, InputStream, OutputFilter, OutputStream> AVFilter, AVFilterContext> AVFilterLink&g...原创 2018-12-28 11:09:36 · 1768 阅读 · 2 评论 -
FFmpeg-4.0 的filter机制的架构与实现.之一 Filter原理
一、FFmpeg filter的原理1. 引言及示例FFmpeg中的libavfilter提供了一整套的基于filter的机制。filter本身是一个插件的形式,可以快速的组装需要的效果。比如下面的filter,可以实现视频的水平镜像效果。ffplay.exe sample.rmvb -vf hflip 1.1 FFmpeg为什么重新定义filter API?FFm...原创 2018-12-28 09:26:56 · 3726 阅读 · 0 评论 -
使用speex对pcm,wav进行降噪处理
1. speex的降噪模块的简介speex的语音处理模块要使用独立于 speex codec库的libspeexdsp 库。这个分离的库是在1.2版本后实现;它这库包括了: 预处理,回声消除,jitter buffer 和重采样模块;在Unix/Linux环境下,使用 -lspeexdsp -lm 来编译和链接。 和libspeex一样,库libspeexdsp的库函数都是...原创 2018-10-24 17:44:54 · 7973 阅读 · 17 评论 -
基于ffmpeg-4.0 SDK的音频重采样
/* * Copyright (c) 2012 Stefano Sabatini * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), t...原创 2018-10-09 19:37:01 · 838 阅读 · 2 评论 -
基于ffmpeg-0.10 SDK的音频重采样
这个示例代码实现了基于FFmpeg-0.10 SDK的音频重采样,也可用于实现定点转浮点计算。 1. 声明/* ffmpeg_sdk.h */#include <stdio.h>#include <stdlib.h>#ifdef __cplusplusextern "C" {#endif#include "libavutil/imguti...原创 2018-10-09 19:33:48 · 361 阅读 · 0 评论 -
基于FFmpeg-4.0 SDK的PCM编码成AAC
1. 初始化 AVCodecContext *m_avctx; AVCodec *m_codec; /* Init ffmpeg log */ ffmpeg_log_callback pcb_log = libffmpeg_log_callback; av_log_set_level(AV_LO...原创 2018-10-12 20:11:41 · 1393 阅读 · 0 评论 -
FFmpeg的音频处理详解
一、基本概念1. 音频简介数码音频系统是通过将声波波形转换成一连串的二进制数据来再现原始声音的,实现这个步骤使用的设备是模/数转换器(A/D)它以每秒上万次的速率对声波进行采样,每一次采样都记录下了原始模拟声波在某一时刻的状态,称之为样本。将一串的样本连接起来,就可以描述一段声波了,把每一秒钟所采样的数目称为采样频率或采率,单位为HZ(赫兹)。采样频率越高所能描述的声波频率...原创 2018-10-12 20:10:08 · 28370 阅读 · 6 评论 -
FFmpeg命令行应用备忘录
三、将PCM转格式,并编码成AAC: ./ffmpeg -f s16le -ar 16000 -ac 1 -i input-s16le.pcm -f f32le -ar 16000 -ac 1 -y input-f32le.pcm ./ffmpeg -f f32le -ar 16000 -ac 1 -i input-f32le.pcm -strict -2 -a:b 64000...原创 2018-09-18 12:15:46 · 756 阅读 · 0 评论 -
FFmpeg中的时间戳表示方法
ffmpeg中的时间单位1. AV_TIME_BASEffmpeg中的内部计时单位(时钟基),ffmepg中的所有时间表示的单位,比如AVStream中的duration, 即表示这个流的长度为duration个AV_TIME_BASE。AV_TIME_BASE定义为:#define AV_TIME_BASE 1000000 2. AV_TIME_BASE_Qffmpeg内部时...原创 2018-06-16 11:55:35 · 1965 阅读 · 0 评论 -
Ubuntu下为AndroidStudio编译并使用FFmpeg(一)ndk部分
Ubuntu下为AndroidStudio编译并使用FFmpeg(一)ndk部分1.1 下载ndk,并编译,做示例程序测试1、下载Android NDK自解压包,官方地址:https://developer.android.com/ndk/downloads/index.html#download下载:$ wget -c http://dl.google.com/an原创 2015-12-21 22:47:41 · 1402 阅读 · 0 评论 -
error while loading shared libraries xxx.so.x 错误的原因和解决办法
一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如:tmux: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory原因一般有两个:一个是操作系统里确实没有包含该共享库(转载 2015-11-13 10:30:40 · 866 阅读 · 0 评论 -
FFmpeg SDK开发手册(以output_example为示例)
FFmpeg 中比较重要的函数以及数据结构如下:1. 数据结构:(1) AVFormatContext(2) AVOutputFormat(3) AVInputFormat(4) AVCodecContext(5) AVCodec(6) AVFrame(7) AVPacket(8) AVPicture(9) AVStream2. 初始化函数:转载 2015-11-13 11:02:31 · 2506 阅读 · 0 评论 -
ffmpeg解析出输入中的原始音视频数据
从输入文件中抽取出原始的音频,视频数据# ffmpeg -i test.mp4 -vcodec copy -an video.h264# ffmpeg -i test.wmv -acodec copy -vn audio.wma# ffmpeg -i infile.mp4 -vcodec copy -an -f h264 video.h264# ffmpeg -i infi原创 2014-04-29 17:57:36 · 1151 阅读 · 0 评论 -
FFMpeg处理RTMP流的总结
FFMpeg处理RTMP流有两种方式: 一个是使用自带的RTMP代码功能; 一个是使用第三方库librtmp;下面就这两种方式的一些使用和差异做了个总结;一、自带RTMP代码功能FFmpeg自带的RTMP代码只支持RTMP协议,不支持rtmpt,rtmpe,rtmpte和rtmps协议;命令行设置如下:1. 将RTMP流原样保存成文件# ./ffmpeg -原创 2014-02-02 12:09:59 · 24471 阅读 · 2 评论 -
ffmpeg参数详解
Table of Contents1. Synopsis2. Description3. Detailed description3.1 Filtering3.1.1 Simple filtergraphs3.1.2 Complex filtergraphs3.2 Stream copy4. Stream selection5. Options5.1转载 2014-01-29 22:27:30 · 6919 阅读 · 1 评论 -
ffmpeg的logo, delogo滤镜参数设置
FFmpeg的添加logo,去logo滤镜的组合共有三种方式:1. 只有添加logo滤镜$ ./ffmpeg -i INPUT.FLV \-vf movie=/opt/logo.png[logo]\;[in][logo]overlay=main_w-overlay_w-100:0[out] \-vcodec ... -acodec ... -f flv -y OUT.FL原创 2013-12-02 09:44:31 · 8739 阅读 · 0 评论 -
从ffmpeg中取出YUV数据
有时需要从ffmpeg中提取出YUV数据用作预览,另存什么的。ffmpeg是先解码成YUV, 再以这个YUV作为输入进行编码,所以YUV数据有两种: 解码后的YUV数据, 以及 编码重建的YUV数据。下面分别讲两个YUV数据从哪儿?以及如何取?1. 解码后的YUV数据在ffmpeg/libavcodec/utils_codec.c的avcodec_decod原创 2013-04-08 11:12:24 · 3227 阅读 · 0 评论 -
为ffmpeg添加自定义滤镜
前言FFmpeg的优秀在于它的功能强大和良好的系统框架,而滤镜就是其中之一。ffmpeg的自带滤镜不但能对视频进行裁剪,添加logo,还能将多个滤镜组全使用。更妙之处在于它还可以方便地添加自己定义的各种滤镜。这种可扩展性对于实际应用来说就颇有价值了。闲言少述,书归正传!本文第一部分是我对wiki上的一篇教程的翻译和解释,但是它并没有讲解如何将写好的滤镜添加到ffmpeg中编译并原创 2013-02-25 08:11:29 · 4509 阅读 · 0 评论 -
ffmpeg对mpeg2-TS解析的最详细分析
介绍: MPEG的系统层编码为不同的应用场景设计了两种格式: TS(Transport Stream) 和PS(Program Stream),它们两者之间不具有层级关系,在逻辑上,它们两者都是由PES(Packetized Elementary Stream)包组成的,所以可以很方便地实现相互转换.TS(Transport Stream): 是将具有一个或原创 2013-02-25 07:53:41 · 4584 阅读 · 1 评论 -
ffmpeg 的 tbr tbc 和 tbn的意义
ffmpeg -i video.flvStream #0.0[0x1e0]: Video: mpeg2video, yuv420p, 704x576 [PAR 12:11 DAR 4:3], 9578 kb/s, 25 tbr, 90k tbn, 50 tbctbn = the time base in AVStream that has come from t转载 2013-02-25 08:10:14 · 7994 阅读 · 0 评论 -
FFmpeg滤镜代码级分析
前一篇文章《为FFmpeg添加自定义滤镜》详细讲述了FFmpeg的滤镜添加步骤,并给出了代码实例。本文将以FFmpeg自带的deinterlace滤镜”yadif – yet another deinterlace filter”为例分析FFmpeg滤镜的代码级实现机制。总的来说,FFmpeg的滤镜机制和MicroSoft Directshow机制基本相同——不知道谁学了谁的,原创 2013-02-25 07:56:01 · 3101 阅读 · 0 评论