函数原型:

  1. int avformat_alloc_output_context2(AVFormatContext **ctx, const AVOutputFormat *oformat,
  2. 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结构

  1. static const AVOutputFormat * const muxer_list[] = {
  2. &ff_a64_muxer,
  3. &ff_ac3_muxer,
  4. &ff_adts_muxer,
  5. &ff_adx_muxer,
  6. &ff_aiff_muxer,
  7. &ff_alp_muxer,
  8. &ff_amr_muxer,
  9. &ff_amv_muxer,
  10. &ff_apm_muxer,
  11. &ff_apng_muxer,
  12. &ff_aptx_muxer,
  13. &ff_aptx_hd_muxer,
  14. &ff_argo_asf_muxer,
  15. &ff_argo_cvg_muxer,
  16. &ff_asf_muxer,
  17. &ff_ass_muxer,
  18. &ff_ast_muxer,
  19. &ff_asf_stream_muxer,
  20. &ff_au_muxer,
  21. &ff_avi_muxer,
  22. &ff_avif_muxer,
  23. &ff_avm2_muxer,
  24. &ff_avs2_muxer,
  25. &ff_avs3_muxer,
  26. &ff_bit_muxer,
  27. &ff_caf_muxer,
  28. &ff_cavsvideo_muxer,
  29. &ff_codec2_muxer,
  30. &ff_codec2raw_muxer,
  31. &ff_crc_muxer,
  32. &ff_dash_muxer,
  33. &ff_data_muxer,
  34. &ff_daud_muxer,
  35. &ff_dfpwm_muxer,
  36. &ff_dirac_muxer,
  37. &ff_dnxhd_muxer,
  38. &ff_dts_muxer,
  39. &ff_dv_muxer,
  40. &ff_eac3_muxer,
  41. &ff_f4v_muxer,
  42. &ff_ffmetadata_muxer,
  43. &ff_fifo_muxer,
  44. &ff_fifo_test_muxer,
  45. &ff_filmstrip_muxer,
  46. &ff_fits_muxer,
  47. &ff_flac_muxer,
  48. &ff_flv_muxer,
  49. &ff_framecrc_muxer,
  50. &ff_framehash_muxer,
  51. &ff_framemd5_muxer,
  52. &ff_g722_muxer,
  53. &ff_g723_1_muxer,
  54. &ff_g726_muxer,
  55. &ff_g726le_muxer,
  56. &ff_gif_muxer,
  57. &ff_gsm_muxer,
  58. &ff_gxf_muxer,
  59. &ff_h261_muxer,
  60. &ff_h263_muxer,
  61. &ff_h264_muxer,
  62. &ff_hash_muxer,
  63. &ff_hds_muxer,
  64. &ff_hevc_muxer,
  65. &ff_hls_muxer,
  66. &ff_ico_muxer,
  67. &ff_ilbc_muxer,
  68. &ff_image2_muxer,
  69. &ff_image2pipe_muxer,
  70. &ff_ipod_muxer,
  71. &ff_ircam_muxer,
  72. &ff_ismv_muxer,
  73. &ff_ivf_muxer,
  74. &ff_jacosub_muxer,
  75. &ff_kvag_muxer,
  76. &ff_latm_muxer,
  77. &ff_lrc_muxer,
  78. &ff_m4v_muxer,
  79. &ff_md5_muxer,
  80. &ff_matroska_muxer,
  81. &ff_matroska_audio_muxer,
  82. &ff_microdvd_muxer,
  83. &ff_mjpeg_muxer,
  84. &ff_mlp_muxer,
  85. &ff_mmf_muxer,
  86. &ff_mov_muxer,
  87. &ff_mp2_muxer,
  88. &ff_mp3_muxer,
  89. &ff_mp4_muxer,
  90. &ff_mpeg1system_muxer,
  91. &ff_mpeg1vcd_muxer,
  92. &ff_mpeg1video_muxer,
  93. &ff_mpeg2dvd_muxer,
  94. &ff_mpeg2svcd_muxer,
  95. &ff_mpeg2video_muxer,
  96. &ff_mpeg2vob_muxer,
  97. &ff_mpegts_muxer,
  98. &ff_mpjpeg_muxer,
  99. &ff_mxf_muxer,
  100. &ff_mxf_d10_muxer,
  101. &ff_mxf_opatom_muxer,
  102. &ff_null_muxer,
  103. &ff_nut_muxer,
  104. &ff_obu_muxer,
  105. &ff_oga_muxer,
  106. &ff_ogg_muxer,
  107. &ff_ogv_muxer,
  108. &ff_oma_muxer,
  109. &ff_opus_muxer,
  110. &ff_pcm_alaw_muxer,
  111. &ff_pcm_mulaw_muxer,
  112. &ff_pcm_vidc_muxer,
  113. &ff_pcm_f64be_muxer,
  114. &ff_pcm_f64le_muxer,
  115. &ff_pcm_f32be_muxer,
  116. &ff_pcm_f32le_muxer,
  117. &ff_pcm_s32be_muxer,
  118. &ff_pcm_s32le_muxer,
  119. &ff_pcm_s24be_muxer,
  120. &ff_pcm_s24le_muxer,
  121. &ff_pcm_s16be_muxer,
  122. &ff_pcm_s16le_muxer,
  123. &ff_pcm_s8_muxer,
  124. &ff_pcm_u32be_muxer,
  125. &ff_pcm_u32le_muxer,
  126. &ff_pcm_u24be_muxer,
  127. &ff_pcm_u24le_muxer,
  128. &ff_pcm_u16be_muxer,
  129. &ff_pcm_u16le_muxer,
  130. &ff_pcm_u8_muxer,
  131. &ff_psp_muxer,
  132. &ff_rawvideo_muxer,
  133. &ff_rm_muxer,
  134. &ff_roq_muxer,
  135. &ff_rso_muxer,
  136. &ff_rtp_muxer,
  137. &ff_rtp_mpegts_muxer,
  138. &ff_rtsp_muxer,
  139. &ff_sap_muxer,
  140. &ff_sbc_muxer,
  141. &ff_scc_muxer,
  142. &ff_segafilm_muxer,
  143. &ff_segment_muxer,
  144. &ff_stream_segment_muxer,
  145. &ff_smjpeg_muxer,
  146. &ff_smoothstreaming_muxer,
  147. &ff_sox_muxer,
  148. &ff_spx_muxer,
  149. &ff_spdif_muxer,
  150. &ff_srt_muxer,
  151. &ff_streamhash_muxer,
  152. &ff_sup_muxer,
  153. &ff_swf_muxer,
  154. &ff_tee_muxer,
  155. &ff_tg2_muxer,
  156. &ff_tgp_muxer,
  157. &ff_mkvtimestamp_v2_muxer,
  158. &ff_truehd_muxer,
  159. &ff_tta_muxer,
  160. &ff_ttml_muxer,
  161. &ff_uncodedframecrc_muxer,
  162. &ff_vc1_muxer,
  163. &ff_vc1t_muxer,
  164. &ff_voc_muxer,
  165. &ff_w64_muxer,
  166. &ff_wav_muxer,
  167. &ff_webm_muxer,
  168. &ff_webm_dash_manifest_muxer,
  169. &ff_webm_chunk_muxer,
  170. &ff_webp_muxer,
  171. &ff_webvtt_muxer,
  172. &ff_wsaud_muxer,
  173. &ff_wtv_muxer,
  174. &ff_wv_muxer,
  175. &ff_yuv4mpegpipe_muxer,
  176. NULL };

  

muxer_list的成员结构(&ff_flv_muxer为例)

  1. const AVOutputFormat ff_flv_muxer = {
  2. .name = "flv",//输出格式类型,avformat_alloc_output_context2的第三个参数(format_name)会与该字段匹配
  3. .long_name = NULL_IF_CONFIG_SMALL("FLV (Flash Video)"),
  4. .mime_type = "video/x-flv",
  5. .extensions = "flv",//输出文件的后缀,avformat_alloc_output_context2的第四个参数(filename)会与该字段匹配
  6. .priv_data_size = sizeof(FLVContext),
  7. .audio_codec = CONFIG_LIBMP3LAME ? AV_CODEC_ID_MP3 : AV_CODEC_ID_ADPCM_SWF,
  8. .video_codec = AV_CODEC_ID_FLV1,
  9. .init = flv_init,
  10. .write_header = flv_write_header,
  11. .write_packet = flv_write_packet,
  12. .write_trailer = flv_write_trailer,
  13. .deinit = flv_deinit,
  14. .check_bitstream= flv_check_bitstream,
  15. .codec_tag = (const AVCodecTag* const []) {
  16. flv_video_codec_ids, flv_audio_codec_ids, 0
  17. },
  18. .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS |
  19. AVFMT_TS_NONSTRICT,
  20. .priv_class = &flv_muxer_class,
  21. };

  

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的更多相关文章

  1. FFmpeg源代码简单分析:avformat_alloc_output_context2()

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  2. ffmpeg 内存读写相关

    需要的解码的视频数据在一段内存中.例如,通过其他系统送来的视频数据.同样,有的时候编码后的视频数据也未必要保存成一个文件.例如,要求将编码后的视频数据送给其他的系统进行下一步的处理.以上两种情况就要求 ...

  3. FFmpeg源代码结构图

    转自:http://blog.csdn.net/leixiaohua1020/article/details/44220151 FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码 ...

  4. ffmpeg 发布hls流

    本来主要讲述如何利用ffmpeg将输入视频流通过转码的方式转成m3u8文件.如何通过http的方法将切边推送给客户端,不在本文中讲述. 输入视频流可以是rtsp流,也可以是http,还可以是文件等等. ...

  5. [转载] ffmpeg超详细综合教程——摄像头直播

    本文的示例将实现:读取PC摄像头视频数据并以RTMP协议发送为直播流.示例包含了 1.ffmpeg的libavdevice的使用 2.视频解码.编码.推流的基本流程 具有较强的综合性. 要使用liba ...

  6. [转载] FFmpeg API 变更记录

    最近一两年内FFmpeg项目发展的速度很快,本来是一件好事.但是随之而来的问题就是其API(接口函数)一直在发生变动.这么一来基于旧一点版本的FFmpeg的程序的代码在最新的类库上可能就跑不通了. 例 ...

  7. ffmpeg 从内存中读取数据(或将数据输出到内存)

    更新记录(2014.7.24): 1.为了使本文更通俗易懂,更新了部分内容,将例子改为从内存中打开. 2.增加了将数据输出到内存的方法. 从内存中读取数据 ffmpeg一般情况下支持打开一个本地文件, ...

  8. [总结]FFMPEG视音频编解码零基础学习方法--转

    ffmpeg编解码学习   目录(?)[-] ffmpeg程序的使用ffmpegexeffplayexeffprobeexe 1 ffmpegexe 2 ffplayexe 3 ffprobeexe ...

  9. 使用ffmpeg实现转码样例(代码实现)

    分类: C/C++ 使用ffmpeg实现转码样例(代码实现) 使用ffmpeg转码主要工作如下: Demux -> Decoding -> Encoding -> Muxing 其中 ...

  10. 最简单的基于FFMPEG的转码程序

    本文介绍一个简单的基于FFmpeg的转码器.它可以将一种视频格式(包括封转格式和编码格式)转换为另一种视频格式.转码器在视音频编解码处理的程序中,属于一个比较复杂的东西.因为它结合了视频的解码和编码. ...

随机推荐

  1. Linux-运行级别-init

  2. 【面试题精讲】你知道MySQL中有哪些隔离级别吗

    有时博客内容会有变动,首发博客是最新的,其他博客地址可能未同步,请认准https://blog.zysicyj.top 首发博客地址 系列文章地址 脏读(Dirty Read)是指一个事务读取到了另一 ...

  3. [转帖]事务上的等待事件 —— enq: TM - contention

    执行DML期间,为防止对与DML相关的对象进行修改,执行DML的进程必须对该表获得TM锁.若在获得TM锁的过程中发生争用,则等待enq: HW - contention 事件. SQL> sel ...

  4. [转帖]《Linux性能优化实战》笔记(三)—— CPU 上下文切换(下)

    上篇介绍了三种CPU 上下文切换以及它们可能造成的问题和原因,这一篇来看看在系统中如何发现CPU 上下文切换问题. 一. 查看上下文切换情况 主要使用两个命令:vmstat以及之前用过的pidstat ...

  5. 【VictoriaMetrics源码阅读】: vm中对map的优化

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu github 公众号:一本正经的瞎扯 具体代码请看:https://github.com/ahf ...

  6. (数据科学学习手札113)Python+Dash快速web应用开发——表单控件篇(下)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 由我开源的先进Dash组件库feffery-antd-co ...

  7. js设计模式(下)

    引用:(23条消息) <Javascript设计模式与开发实践>关于设计模式典型代码的整理(下):模板方法模式.享元模式.职责链模式.中介者模式.装饰模式.状态模式.适配器模式_QQsil ...

  8. 安装和定位vimrc

    在上一篇文章中,我们简单开了一个头,阐述了下学习vim的必要性,这章开始,会慢慢由浅入深的学习它的一套完整的,高效的文本编辑方式方法.废话不多说,咱们正式开始吧 安装NeoVim 相对于vim来说,n ...

  9. 『Echarts』简介

    目录 一.前言 二.『Echarts』简介 1. 什么是『Echarts』 三.数据可视化 四.『Echarts』 1.『Echarts』的作用 2.『Echarts』能绘制哪些图表 3.『Echar ...

  10. NLP国内外大模型汇总列表[文心一言、智谱、百川、星火、通义千问、盘古等等]

    NLP国内外大模型汇总列表[文心一言.智谱.百川.星火.通义千问.盘古等等] 中国大模型列表大全,全面收集有明确来源的大模型情况,包括机构.来源信息和分类等,随时更新. Awesome family ...