Maison > base de données > tutoriel mysql > FFmpeg封装格式处理:视音频复用器(muxer)

FFmpeg封装格式处理:视音频复用器(muxer)

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Libérer: 2016-06-07 16:05:03
original
2578 Les gens l'ont consulté

打算记录一下基于FFmpeg的封装格式处理方面的例子。包括了视音频分离,复用,封装格式转换。这是第3篇。 本文记录一个基于FFmpeg的视音频复用器(Simplest FFmpeg muxer)。视音频复用器(Muxer)即是将视频压缩数据(例如H.264)和音频压缩数据(例如AAC)合

打算记录一下基于FFmpeg的封装格式处理方面的例子。包括了视音频分离,复用,封装格式转换。这是第3篇。

本文记录一个基于FFmpeg的视音频复用器(Simplest FFmpeg muxer)。视音频复用器(Muxer)即是将视频压缩数据(例如H.264)和音频压缩数据(例如AAC)合并到一个封装格式数据(例如MKV)中去。如图所示。在这个过程中并不涉及到编码和解码。

 

\

本文记录的程序将一个H.264编码的视频码流文件和一个MP3编码的音频码流文件,合成为一个MP4封装格式的文件。
,一共初始化了3个AVFormatContext,其中2个用于输入,1个用于输出。3个AVFormatContext初始化之后,通过avcodec_copy_context()函数可以将输入视频/音频的参数拷贝至输出视频/音频的AVCodecContext结构体。然后分别调用视频输入流和音频输入流的av_read_frame(),从视频输入流中取出视频的AVPacket,音频输入流中取出音频的AVPacket,分别将取出的AVPacket写入到输出文件中即可。其间用到了一个不太常见的函数av_compare_ts(),是比较时间戳用的。通过该函数可以决定该写入视频还是音频。

本文介绍的视音频复用器,输入的视频不一定是H.264裸流文件,音频也不一定是纯音频文件。可以选择两个封装过的视音频文件作为输入。程序会从视频输入文件中“挑”出视频流,音频输入文件中“挑”出音频流,再将“挑选”出来的视音频流复用起来。 PS1:对于某些封装格式(例如MP4/FLV/MKV等)中的H.264,需要用到名称为“h264_mp4toannexb”的bitstream filter。
PS2:对于某些封装格式(例如MP4/FLV/MKV等)中的AAC,需要用到名称为“aac_adtstoasc”的bitstream filter。

简单介绍一下流程中各个重要函数的意义:

avformat_open_input():打开输入文件。
avcodec_copy_context():赋值AVCodecContext的参数。
avformat_alloc_output_context2():初始化输出文件。
avio_open():打开输出文件。
avformat_write_header():写入文件头。
av_compare_ts():比较时间戳,决定写入视频还是写入音频。这个函数相对要少见一些。
av_read_frame():从输入文件读取一个AVPacket。
av_interleaved_write_frame():写入一个AVPacket到输出文件。
av_write_trailer():写入文件尾。

代码

下面贴上代码:
<strong>[cpp]</strong> view plaincopy
Copier après la connexion
  1. /**
    Copier après la connexion
  2. * 最简单的基于FFmpeg的视音频复用器
    Copier après la connexion
  3. * Simplest FFmpeg Muxer
    Copier après la connexion
  4. *
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  5. * 雷霄骅 Lei Xiaohua
    Copier après la connexion
  6. * leixiaohua1020@126.com
    Copier après la connexion
  7. * 中国传媒大学/数字电视技术
    Copier après la connexion
  8. * Communication University of China / Digital TV Technology
    Copier après la connexion
  9. * http://blog.csdn.net/leixiaohua1020
    Copier après la connexion
  10. *
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  11. * 本程序可以将视频码流和音频码流打包到一种封装格式中。
    Copier après la connexion
  12. * 程序中将MP3编码的音频码流和H.264编码(MPEG2TS封装中)的视频码流打包成
    Copier après la connexion
  13. * MP4封装格式的文件。
    Copier après la connexion
  14. * 需要注意的是本程序并不改变视音频的编码格式。
    Copier après la connexion
  15. *
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  16. * This software mux a video bitstream and a audio bitstream
    Copier après la connexion
  17. * together into a file.
    Copier après la connexion
  18. * In this example, it mux a H.264 bitstream (in MPEG2TS) and
    Copier après la connexion
  19. * a MP3 bitstream file together into MP4 format file.
    Copier après la connexion
  20. *
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  21. */
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  22. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  23. #include <stdio.h></stdio.h>
    Copier après la connexion
  24. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  25. extern "C"
    Copier après la connexion
  26. {
    Copier après la connexion
    Copier après la connexion
  27. #include "libavformat/avformat.h"
    Copier après la connexion
  28. };
    Copier après la connexion
  29. /*
    Copier après la connexion
    Copier après la connexion
  30. FIX: H.264 in some container format (FLV, MP4, MKV etc.) need
    Copier après la connexion
  31. "h264_mp4toannexb" bitstream filter (BSF)
    Copier après la connexion
  32. *Add SPS,PPS in front of IDR frame
    Copier après la connexion
  33. *Add start code ("0,0,0,1") in front of NALU
    Copier après la connexion
  34. H.264 in some container (MPEG2TS) don't need this BSF.
    Copier après la connexion
  35. */
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  36. //'1': Use H.264 Bitstream Filter
    Copier après la connexion
  37. #define USE_H264BSF 0
    Copier après la connexion
  38. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  39. /*
    Copier après la connexion
    Copier après la connexion
  40. FIX:AAC in some container format (FLV, MP4, MKV etc.) need
    Copier après la connexion
  41. "aac_adtstoasc" bitstream filter (BSF)
    Copier après la connexion
  42. */
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  43. //'1': Use AAC Bitstream Filter
    Copier après la connexion
  44. #define USE_AACBSF 0
    Copier après la connexion
  45. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  46. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  47. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  48. int main(int argc, char* argv[])
    Copier après la connexion
  49. {
    Copier après la connexion
    Copier après la connexion
  50. AVOutputFormat *ofmt = NULL;
    Copier après la connexion
  51. //输入对应一个AVFormatContext,输出对应一个AVFormatContext
    Copier après la connexion
  52. //(Input AVFormatContext and Output AVFormatContext)
    Copier après la connexion
  53. AVFormatContext *ifmt_ctx_v = NULL, *ifmt_ctx_a = NULL,*ofmt_ctx = NULL;
    Copier après la connexion
  54. AVPacket pkt;
    Copier après la connexion
  55. int ret, i;
    Copier après la connexion
  56. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  57. char *in_filename_v = "cuc_ieschool.ts";//输入文件名(Input file URL)
    Copier après la connexion
  58. //char *in_filename_v = "cuc_ieschool.h264";
    Copier après la connexion
  59. //char *in_filename_a = "cuc_ieschool.mp3";
    Copier après la connexion
  60. //char *in_filename_a = "gowest.m4a";
    Copier après la connexion
  61. //char *in_filename_a = "gowest.aac";
    Copier après la connexion
  62. char *in_filename_a = "huoyuanjia.mp3";
    Copier après la connexion
  63. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  64. char *out_filename = "cuc_ieschool.mp4";//输出文件名(Output file URL)
    Copier après la connexion
  65. av_register_all();
    Copier après la connexion
  66. //输入(Input)
    Copier après la connexion
  67. if ((ret = avformat_open_input(&ifmt_ctx_v, in_filename_v, 0, 0)) 
    
    Copier après la connexion
  68. printf( "Could not open input file.");
    Copier après la connexion
    Copier après la connexion
  69. goto end;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  70. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  71. if ((ret = avformat_find_stream_info(ifmt_ctx_v, 0)) 
    
    Copier après la connexion
  72. printf( "Failed to retrieve input stream information");
    Copier après la connexion
    Copier après la connexion
  73. goto end;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  74. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  75. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  76. if ((ret = avformat_open_input(&ifmt_ctx_a, in_filename_a, 0, 0)) 
    
    Copier après la connexion
  77. printf( "Could not open input file.");
    Copier après la connexion
    Copier après la connexion
  78. goto end;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  79. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  80. if ((ret = avformat_find_stream_info(ifmt_ctx_a, 0)) 
    
    Copier après la connexion
  81. printf( "Failed to retrieve input stream information");
    Copier après la connexion
    Copier après la connexion
  82. goto end;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  83. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  84. printf("Input Information=====================\n");
    Copier après la connexion
  85. av_dump_format(ifmt_ctx_v, 0, in_filename_v, 0);
    Copier après la connexion
  86. av_dump_format(ifmt_ctx_a, 0, in_filename_a, 0);
    Copier après la connexion
  87. printf("======================================\n");
    Copier après la connexion
    Copier après la connexion
  88. //输出(Output)
    Copier après la connexion
  89. avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, out_filename);
    Copier après la connexion
  90. if (!ofmt_ctx) {
    Copier après la connexion
  91. printf( "Could not create output context\n");
    Copier après la connexion
  92. ret = AVERROR_UNKNOWN;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  93. goto end;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  94. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  95. ofmt = ofmt_ctx->oformat;
    Copier après la connexion
  96. int videoindex_v=-1,videoindex_out=-1;
    Copier après la connexion
  97. for (i = 0; i nb_streams; i++) {
    Copier après la connexion
    Copier après la connexion
  98. //根据输入流创建输出流(Create output AVStream according to input AVStream)
    Copier après la connexion
    Copier après la connexion
  99. if(ifmt_ctx_v->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){
    Copier après la connexion
  100. videoindex_v=i;
    Copier après la connexion
  101. AVStream *in_stream = ifmt_ctx_v->streams[i];
    Copier après la connexion
  102. AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);
    Copier après la connexion
    Copier après la connexion
  103. if (!out_stream) {
    Copier après la connexion
    Copier après la connexion
  104. printf( "Failed allocating output stream\n");
    Copier après la connexion
    Copier après la connexion
  105. ret = AVERROR_UNKNOWN;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  106. goto end;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  107. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  108. videoindex_out=out_stream->index;
    Copier après la connexion
  109. //复制AVCodecContext的设置(Copy the settings of AVCodecContext)
    Copier après la connexion
    Copier après la connexion
  110. if (avcodec_copy_context(out_stream->codec, in_stream->codec) 
    
    Copier après la connexion
    Copier après la connexion
  111. printf( "Failed to copy context from input to output stream codec context\n");
    Copier après la connexion
    Copier après la connexion
  112. goto end;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  113. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  114. out_stream->codec->codec_tag = 0;
    Copier après la connexion
    Copier après la connexion
  115. if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
    Copier après la connexion
    Copier après la connexion
  116. out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
    Copier après la connexion
    Copier après la connexion
  117. break;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  118. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  119. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  120. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  121. int audioindex_a=-1,audioindex_out=-1;
    Copier après la connexion
  122. for (i = 0; i nb_streams; i++) {
    Copier après la connexion
    Copier après la connexion
  123. //根据输入流创建输出流(Create output AVStream according to input AVStream)
    Copier après la connexion
    Copier après la connexion
  124. if(ifmt_ctx_a->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){
    Copier après la connexion
  125. audioindex_a=i;
    Copier après la connexion
  126. AVStream *in_stream = ifmt_ctx_a->streams[i];
    Copier après la connexion
  127. AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);
    Copier après la connexion
    Copier après la connexion
  128. if (!out_stream) {
    Copier après la connexion
    Copier après la connexion
  129. printf( "Failed allocating output stream\n");
    Copier après la connexion
    Copier après la connexion
  130. ret = AVERROR_UNKNOWN;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  131. goto end;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  132. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  133. audioindex_out=out_stream->index;
    Copier après la connexion
  134. //复制AVCodecContext的设置(Copy the settings of AVCodecContext)
    Copier après la connexion
    Copier après la connexion
  135. if (avcodec_copy_context(out_stream->codec, in_stream->codec) 
    
    Copier après la connexion
    Copier après la connexion
  136. printf( "Failed to copy context from input to output stream codec context\n");
    Copier après la connexion
    Copier après la connexion
  137. goto end;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  138. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  139. out_stream->codec->codec_tag = 0;
    Copier après la connexion
    Copier après la connexion
  140. if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
    Copier après la connexion
    Copier après la connexion
  141. out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
    Copier après la connexion
    Copier après la connexion
  142. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  143. break;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  144. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  145. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  146. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  147. //输出一下格式------------------
    Copier après la connexion
  148. printf("Output Information====================\n");
    Copier après la connexion
  149. av_dump_format(ofmt_ctx, 0, out_filename, 1);
    Copier après la connexion
  150. printf("======================================\n");
    Copier après la connexion
    Copier après la connexion
  151. //打开输出文件(Open output file)
    Copier après la connexion
  152. if (!(ofmt->flags & AVFMT_NOFILE)) {
    Copier après la connexion
  153. if (avio_open(&ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE) 
    
    Copier après la connexion
  154. printf( "Could not open output file '%s'", out_filename);
    Copier après la connexion
  155. goto end;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  156. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  157. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  158. //写文件头(Write file header)
    Copier après la connexion
  159. if (avformat_write_header(ofmt_ctx, NULL) 
    
    Copier après la connexion
  160. printf( "Error occurred when opening output file\n");
    Copier après la connexion
  161. goto end;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  162. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  163. int frame_index=0;
    Copier après la connexion
  164. int64_t cur_pts_v=0,cur_pts_a=0;
    Copier après la connexion
  165. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  166. //FIX
    Copier après la connexion
    Copier après la connexion
  167. #if USE_H264BSF
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  168. AVBitStreamFilterContext* h264bsfc = av_bitstream_filter_init("h264_mp4toannexb");
    Copier après la connexion
  169. #endif
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  170. #if USE_AACBSF
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  171. AVBitStreamFilterContext* aacbsfc = av_bitstream_filter_init("aac_adtstoasc");
    Copier après la connexion
  172. #endif
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  173. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  174. while (1) {
    Copier après la connexion
  175. AVFormatContext *ifmt_ctx;
    Copier après la connexion
  176. int stream_index=0;
    Copier après la connexion
  177. AVStream *in_stream, *out_stream;
    Copier après la connexion
  178. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  179. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  180. //获取一个AVPacket(Get an AVPacket)
    Copier après la connexion
  181. if(av_compare_ts(cur_pts_v,ifmt_ctx_v->streams[videoindex_v]->time_base,cur_pts_a,ifmt_ctx_a->streams[audioindex_a]->time_base) 
    
    Copier après la connexion
  182. ifmt_ctx=ifmt_ctx_v;
    Copier après la connexion
  183. stream_index=videoindex_out;
    Copier après la connexion
  184. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  185. if(av_read_frame(ifmt_ctx, &pkt) >= 0){
    Copier après la connexion
    Copier après la connexion
  186. do{
    Copier après la connexion
    Copier après la connexion
  187. if(pkt.stream_index==videoindex_v){
    Copier après la connexion
  188. cur_pts_v=pkt.pts;
    Copier après la connexion
  189. break;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  190. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  191. }while(av_read_frame(ifmt_ctx, &pkt) >= 0);
    Copier après la connexion
    Copier après la connexion
  192. }else{
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  193. break;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  194. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  195. }else{
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  196. ifmt_ctx=ifmt_ctx_a;
    Copier après la connexion
  197. stream_index=audioindex_out;
    Copier après la connexion
  198. if(av_read_frame(ifmt_ctx, &pkt) >= 0){
    Copier après la connexion
    Copier après la connexion
  199. do{
    Copier après la connexion
    Copier après la connexion
  200. if(pkt.stream_index==audioindex_a){
    Copier après la connexion
  201. cur_pts_a=pkt.pts;
    Copier après la connexion
  202. break;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  203. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  204. }while(av_read_frame(ifmt_ctx, &pkt) >= 0);
    Copier après la connexion
    Copier après la connexion
  205. }else{
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  206. break;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  207. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  208. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  209. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  210. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  211. in_stream = ifmt_ctx->streams[pkt.stream_index];
    Copier après la connexion
  212. out_stream = ofmt_ctx->streams[stream_index];
    Copier après la connexion
  213. //FIX
    Copier après la connexion
    Copier après la connexion
  214. #if USE_H264BSF
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  215. av_bitstream_filter_filter(h264bsfc, in_stream->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0);
    Copier après la connexion
  216. #endif
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  217. #if USE_AACBSF
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  218. av_bitstream_filter_filter(aacbsfc, in_stream->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0);
    Copier après la connexion
  219. #endif
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  220. //FIX:No PTS (Example: Raw H.264)
    Copier après la connexion
  221. //Simple Write PTS
    Copier après la connexion
  222. if(pkt.pts==AV_NOPTS_VALUE){
    Copier après la connexion
  223. //Write PTS
    Copier après la connexion
  224. AVRational time_base1=in_stream->time_base;
    Copier après la connexion
  225. //Duration between 2 frames (us)
    Copier après la connexion
  226. int64_t calc_duration=(double)AV_TIME_BASE/av_q2d(in_stream->r_frame_rate);
    Copier après la connexion
  227. //Parameters
    Copier après la connexion
  228. pkt.pts=(double)(frame_index*calc_duration)/(double)(av_q2d(time_base1)*AV_TIME_BASE);
    Copier après la connexion
  229. pkt.dts=pkt.pts;
    Copier après la connexion
  230. pkt.duration=(double)calc_duration/(double)(av_q2d(time_base1)*AV_TIME_BASE);
    Copier après la connexion
  231. frame_index++;
    Copier après la connexion
  232. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  233. /* copy packet */
    Copier après la connexion
  234. //转换PTS/DTS(Convert PTS/DTS)
    Copier après la connexion
  235. pkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
    Copier après la connexion
  236. pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
    Copier après la connexion
  237. pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);
    Copier après la connexion
  238. pkt.pos = -1;
    Copier après la connexion
  239. pkt.stream_index=stream_index;
    Copier après la connexion
  240. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  241. printf("Write 1 Packet. size:%5d\tpts:%8d\n",pkt.size,pkt.pts);
    Copier après la connexion
  242. //写入(Write)
    Copier après la connexion
  243. if (av_interleaved_write_frame(ofmt_ctx, &pkt) 
    
    Copier après la connexion
  244. printf( "Error muxing packet\n");
    Copier après la connexion
  245. break;
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  246. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  247. av_free_packet(&pkt);
    Copier après la connexion
  248. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  249. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  250. //写文件尾(Write file trailer)
    Copier après la connexion
  251. av_write_trailer(ofmt_ctx);
    Copier après la connexion
  252. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  253. #if USE_H264BSF
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  254. av_bitstream_filter_close(h264bsfc);
    Copier après la connexion
  255. #endif
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  256. #if USE_AACBSF
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  257. av_bitstream_filter_close(aacbsfc);
    Copier après la connexion
  258. #endif
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  259. Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  260. end:
    Copier après la connexion
  261. avformat_close_input(&ifmt_ctx_v);
    Copier après la connexion
  262. avformat_close_input(&ifmt_ctx_a);
    Copier après la connexion
  263. /* close output */
    Copier après la connexion
  264. if (ofmt_ctx && !(ofmt->flags & AVFMT_NOFILE))
    Copier après la connexion
  265. avio_close(ofmt_ctx->pb);
    Copier après la connexion
  266. avformat_free_context(ofmt_ctx);
    Copier après la connexion
  267. if (ret 
    
    Copier après la connexion
  268. printf( "Error occurred.\n");
    Copier après la connexion
  269. return -1;
    Copier après la connexion
  270. }
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
  271. return 0;
    Copier après la connexion
Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal