ffmpeg之avformat_alloc_output_context2
函数原型:
- int avformat_alloc_output_context2(AVFormatContext **ctx, const AVOutputFormat *oformat,
- const char *format_name, const char *filename);
功能:
查找根据format_name或者filename或者oformat输出类型,并且初始化ctx结构。
参数:
ctx: AVFormatContext结构体,ffmpeg核心结构体,会在函数内部给ctx分配AVFormatContext空间并初始化。
oformat: 指定输出格式的 AVOutputFormat 结构体指针。可以使用 NULL,此时将根据 format_name 自动选择输出格式。
format_name: 输出格式名称
filename: 输出文件/URL名称
返回值:
成功:0;失败:非0
工作流程:
1. 首先判断oformat是否为NULL;
2. 如果oformat不为NULL;
直接初始化ctx结构((*ctx)->oformat, 保存filename到(*ctx)->url);
3. 如果oformat为NULL:
format_name不为NULL:会循环查找muxer_list结构成员的name成员是否与format_name相同;
filename不为NULL:会循环查找muxer_list结构成员的extensions成员与filename的后缀是否相同;
找到后初始化ctx结构((*ctx)->oformat, 保存filename到(*ctx)->url); 如果没找到的话释放分配的ctx空间,返回错误码!
有关muxer_list的信息参考后续代码;
注意:
那么会产生一个问题:如果format_name和filename都不为NULL呢?当然如果format_name = "flv"和filename="file.flv"这是没问题的,肯定找到同一个结构;那么如果format_name = "flv"和filename="file.mp4"呢?到底以谁为准呢?
其实在avformat_alloc_output_context2函数内部有一个评分机制:format_name是100分;filename是5分;
如果匹配到filename会获得5分,继续循环匹配;如果又匹配到format_name获得100分;100分大于5分所以以format_name的类型为准;
也就是以format_name类型优先,mime_type次之(avformat_alloc_output_context2不考虑),filename最后。
附件
muxer_list结构
- static const AVOutputFormat * const muxer_list[] = {
- &ff_a64_muxer,
- &ff_ac3_muxer,
- &ff_adts_muxer,
- &ff_adx_muxer,
- &ff_aiff_muxer,
- &ff_alp_muxer,
- &ff_amr_muxer,
- &ff_amv_muxer,
- &ff_apm_muxer,
- &ff_apng_muxer,
- &ff_aptx_muxer,
- &ff_aptx_hd_muxer,
- &ff_argo_asf_muxer,
- &ff_argo_cvg_muxer,
- &ff_asf_muxer,
- &ff_ass_muxer,
- &ff_ast_muxer,
- &ff_asf_stream_muxer,
- &ff_au_muxer,
- &ff_avi_muxer,
- &ff_avif_muxer,
- &ff_avm2_muxer,
- &ff_avs2_muxer,
- &ff_avs3_muxer,
- &ff_bit_muxer,
- &ff_caf_muxer,
- &ff_cavsvideo_muxer,
- &ff_codec2_muxer,
- &ff_codec2raw_muxer,
- &ff_crc_muxer,
- &ff_dash_muxer,
- &ff_data_muxer,
- &ff_daud_muxer,
- &ff_dfpwm_muxer,
- &ff_dirac_muxer,
- &ff_dnxhd_muxer,
- &ff_dts_muxer,
- &ff_dv_muxer,
- &ff_eac3_muxer,
- &ff_f4v_muxer,
- &ff_ffmetadata_muxer,
- &ff_fifo_muxer,
- &ff_fifo_test_muxer,
- &ff_filmstrip_muxer,
- &ff_fits_muxer,
- &ff_flac_muxer,
- &ff_flv_muxer,
- &ff_framecrc_muxer,
- &ff_framehash_muxer,
- &ff_framemd5_muxer,
- &ff_g722_muxer,
- &ff_g723_1_muxer,
- &ff_g726_muxer,
- &ff_g726le_muxer,
- &ff_gif_muxer,
- &ff_gsm_muxer,
- &ff_gxf_muxer,
- &ff_h261_muxer,
- &ff_h263_muxer,
- &ff_h264_muxer,
- &ff_hash_muxer,
- &ff_hds_muxer,
- &ff_hevc_muxer,
- &ff_hls_muxer,
- &ff_ico_muxer,
- &ff_ilbc_muxer,
- &ff_image2_muxer,
- &ff_image2pipe_muxer,
- &ff_ipod_muxer,
- &ff_ircam_muxer,
- &ff_ismv_muxer,
- &ff_ivf_muxer,
- &ff_jacosub_muxer,
- &ff_kvag_muxer,
- &ff_latm_muxer,
- &ff_lrc_muxer,
- &ff_m4v_muxer,
- &ff_md5_muxer,
- &ff_matroska_muxer,
- &ff_matroska_audio_muxer,
- &ff_microdvd_muxer,
- &ff_mjpeg_muxer,
- &ff_mlp_muxer,
- &ff_mmf_muxer,
- &ff_mov_muxer,
- &ff_mp2_muxer,
- &ff_mp3_muxer,
- &ff_mp4_muxer,
- &ff_mpeg1system_muxer,
- &ff_mpeg1vcd_muxer,
- &ff_mpeg1video_muxer,
- &ff_mpeg2dvd_muxer,
- &ff_mpeg2svcd_muxer,
- &ff_mpeg2video_muxer,
- &ff_mpeg2vob_muxer,
- &ff_mpegts_muxer,
- &ff_mpjpeg_muxer,
- &ff_mxf_muxer,
- &ff_mxf_d10_muxer,
- &ff_mxf_opatom_muxer,
- &ff_null_muxer,
- &ff_nut_muxer,
- &ff_obu_muxer,
- &ff_oga_muxer,
- &ff_ogg_muxer,
- &ff_ogv_muxer,
- &ff_oma_muxer,
- &ff_opus_muxer,
- &ff_pcm_alaw_muxer,
- &ff_pcm_mulaw_muxer,
- &ff_pcm_vidc_muxer,
- &ff_pcm_f64be_muxer,
- &ff_pcm_f64le_muxer,
- &ff_pcm_f32be_muxer,
- &ff_pcm_f32le_muxer,
- &ff_pcm_s32be_muxer,
- &ff_pcm_s32le_muxer,
- &ff_pcm_s24be_muxer,
- &ff_pcm_s24le_muxer,
- &ff_pcm_s16be_muxer,
- &ff_pcm_s16le_muxer,
- &ff_pcm_s8_muxer,
- &ff_pcm_u32be_muxer,
- &ff_pcm_u32le_muxer,
- &ff_pcm_u24be_muxer,
- &ff_pcm_u24le_muxer,
- &ff_pcm_u16be_muxer,
- &ff_pcm_u16le_muxer,
- &ff_pcm_u8_muxer,
- &ff_psp_muxer,
- &ff_rawvideo_muxer,
- &ff_rm_muxer,
- &ff_roq_muxer,
- &ff_rso_muxer,
- &ff_rtp_muxer,
- &ff_rtp_mpegts_muxer,
- &ff_rtsp_muxer,
- &ff_sap_muxer,
- &ff_sbc_muxer,
- &ff_scc_muxer,
- &ff_segafilm_muxer,
- &ff_segment_muxer,
- &ff_stream_segment_muxer,
- &ff_smjpeg_muxer,
- &ff_smoothstreaming_muxer,
- &ff_sox_muxer,
- &ff_spx_muxer,
- &ff_spdif_muxer,
- &ff_srt_muxer,
- &ff_streamhash_muxer,
- &ff_sup_muxer,
- &ff_swf_muxer,
- &ff_tee_muxer,
- &ff_tg2_muxer,
- &ff_tgp_muxer,
- &ff_mkvtimestamp_v2_muxer,
- &ff_truehd_muxer,
- &ff_tta_muxer,
- &ff_ttml_muxer,
- &ff_uncodedframecrc_muxer,
- &ff_vc1_muxer,
- &ff_vc1t_muxer,
- &ff_voc_muxer,
- &ff_w64_muxer,
- &ff_wav_muxer,
- &ff_webm_muxer,
- &ff_webm_dash_manifest_muxer,
- &ff_webm_chunk_muxer,
- &ff_webp_muxer,
- &ff_webvtt_muxer,
- &ff_wsaud_muxer,
- &ff_wtv_muxer,
- &ff_wv_muxer,
- &ff_yuv4mpegpipe_muxer,
- NULL };
muxer_list的成员结构(&ff_flv_muxer为例)
- const AVOutputFormat ff_flv_muxer = {
- .name = "flv",//输出格式类型,avformat_alloc_output_context2的第三个参数(format_name)会与该字段匹配
- .long_name = NULL_IF_CONFIG_SMALL("FLV (Flash Video)"),
- .mime_type = "video/x-flv",
- .extensions = "flv",//输出文件的后缀,avformat_alloc_output_context2的第四个参数(filename)会与该字段匹配
- .priv_data_size = sizeof(FLVContext),
- .audio_codec = CONFIG_LIBMP3LAME ? AV_CODEC_ID_MP3 : AV_CODEC_ID_ADPCM_SWF,
- .video_codec = AV_CODEC_ID_FLV1,
- .init = flv_init,
- .write_header = flv_write_header,
- .write_packet = flv_write_packet,
- .write_trailer = flv_write_trailer,
- .deinit = flv_deinit,
- .check_bitstream= flv_check_bitstream,
- .codec_tag = (const AVCodecTag* const []) {
- flv_video_codec_ids, flv_audio_codec_ids, 0
- },
- .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS |
- AVFMT_TS_NONSTRICT,
- .priv_class = &flv_muxer_class,
- };
mime_type
MIME类型:是一种标准化的互联网媒体类型,用于标识在互联网上传输的数据的格式。每种文件都有一个唯一的 MIME 类型,它描述了文件的内容和格式。MIME 类型通常由两个部分组成:主类型和子类型,中间由斜杠分隔。avformat_alloc_output_context2函数不作考虑!
常见的 MIME 类型包括:
文本文件:text/plain
HTML 文件:text/html
图片文件:image/jpeg、image/png
音频文件:audio/mpeg
视频文件:video/mp4
应用程序文件:application/pdf、application/json
ffmpeg之avformat_alloc_output_context2的更多相关文章
- FFmpeg源代码简单分析:avformat_alloc_output_context2()
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- ffmpeg 内存读写相关
需要的解码的视频数据在一段内存中.例如,通过其他系统送来的视频数据.同样,有的时候编码后的视频数据也未必要保存成一个文件.例如,要求将编码后的视频数据送给其他的系统进行下一步的处理.以上两种情况就要求 ...
- FFmpeg源代码结构图
转自:http://blog.csdn.net/leixiaohua1020/article/details/44220151 FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码 ...
- ffmpeg 发布hls流
本来主要讲述如何利用ffmpeg将输入视频流通过转码的方式转成m3u8文件.如何通过http的方法将切边推送给客户端,不在本文中讲述. 输入视频流可以是rtsp流,也可以是http,还可以是文件等等. ...
- [转载] ffmpeg超详细综合教程——摄像头直播
本文的示例将实现:读取PC摄像头视频数据并以RTMP协议发送为直播流.示例包含了 1.ffmpeg的libavdevice的使用 2.视频解码.编码.推流的基本流程 具有较强的综合性. 要使用liba ...
- [转载] FFmpeg API 变更记录
最近一两年内FFmpeg项目发展的速度很快,本来是一件好事.但是随之而来的问题就是其API(接口函数)一直在发生变动.这么一来基于旧一点版本的FFmpeg的程序的代码在最新的类库上可能就跑不通了. 例 ...
- ffmpeg 从内存中读取数据(或将数据输出到内存)
更新记录(2014.7.24): 1.为了使本文更通俗易懂,更新了部分内容,将例子改为从内存中打开. 2.增加了将数据输出到内存的方法. 从内存中读取数据 ffmpeg一般情况下支持打开一个本地文件, ...
- [总结]FFMPEG视音频编解码零基础学习方法--转
ffmpeg编解码学习 目录(?)[-] ffmpeg程序的使用ffmpegexeffplayexeffprobeexe 1 ffmpegexe 2 ffplayexe 3 ffprobeexe ...
- 使用ffmpeg实现转码样例(代码实现)
分类: C/C++ 使用ffmpeg实现转码样例(代码实现) 使用ffmpeg转码主要工作如下: Demux -> Decoding -> Encoding -> Muxing 其中 ...
- 最简单的基于FFMPEG的转码程序
本文介绍一个简单的基于FFmpeg的转码器.它可以将一种视频格式(包括封转格式和编码格式)转换为另一种视频格式.转码器在视音频编解码处理的程序中,属于一个比较复杂的东西.因为它结合了视频的解码和编码. ...
随机推荐
- Linux-运行级别-init
- 【面试题精讲】你知道MySQL中有哪些隔离级别吗
有时博客内容会有变动,首发博客是最新的,其他博客地址可能未同步,请认准https://blog.zysicyj.top 首发博客地址 系列文章地址 脏读(Dirty Read)是指一个事务读取到了另一 ...
- [转帖]事务上的等待事件 —— enq: TM - contention
执行DML期间,为防止对与DML相关的对象进行修改,执行DML的进程必须对该表获得TM锁.若在获得TM锁的过程中发生争用,则等待enq: HW - contention 事件. SQL> sel ...
- [转帖]《Linux性能优化实战》笔记(三)—— CPU 上下文切换(下)
上篇介绍了三种CPU 上下文切换以及它们可能造成的问题和原因,这一篇来看看在系统中如何发现CPU 上下文切换问题. 一. 查看上下文切换情况 主要使用两个命令:vmstat以及之前用过的pidstat ...
- 【VictoriaMetrics源码阅读】: vm中对map的优化
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu github 公众号:一本正经的瞎扯 具体代码请看:https://github.com/ahf ...
- (数据科学学习手札113)Python+Dash快速web应用开发——表单控件篇(下)
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 由我开源的先进Dash组件库feffery-antd-co ...
- js设计模式(下)
引用:(23条消息) <Javascript设计模式与开发实践>关于设计模式典型代码的整理(下):模板方法模式.享元模式.职责链模式.中介者模式.装饰模式.状态模式.适配器模式_QQsil ...
- 安装和定位vimrc
在上一篇文章中,我们简单开了一个头,阐述了下学习vim的必要性,这章开始,会慢慢由浅入深的学习它的一套完整的,高效的文本编辑方式方法.废话不多说,咱们正式开始吧 安装NeoVim 相对于vim来说,n ...
- 『Echarts』简介
目录 一.前言 二.『Echarts』简介 1. 什么是『Echarts』 三.数据可视化 四.『Echarts』 1.『Echarts』的作用 2.『Echarts』能绘制哪些图表 3.『Echar ...
- NLP国内外大模型汇总列表[文心一言、智谱、百川、星火、通义千问、盘古等等]
NLP国内外大模型汇总列表[文心一言.智谱.百川.星火.通义千问.盘古等等] 中国大模型列表大全,全面收集有明确来源的大模型情况,包括机构.来源信息和分类等,随时更新. Awesome family ...