目录
代码
首页 数据库 mysql教程 FFmpeg封装格式处理:视音频复用器(muxer)

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

Jun 07, 2016 pm 04:05 PM
ffmpeg 处理 封装 格式 音频

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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Win11如何调节音频平衡?(Win11调整音量的左右声道) Win11如何调节音频平衡?(Win11调整音量的左右声道) Feb 11, 2024 pm 05:57 PM

Win11如何调节音频平衡?(Win11调整音量的左右声道)

Bose Soundbar Ultra首发体验:开箱即用的家庭影院? Bose Soundbar Ultra首发体验:开箱即用的家庭影院? Feb 06, 2024 pm 05:30 PM

Bose Soundbar Ultra首发体验:开箱即用的家庭影院?

WIN10服务主机太占cpu的处理操作过程 WIN10服务主机太占cpu的处理操作过程 Mar 27, 2024 pm 02:41 PM

WIN10服务主机太占cpu的处理操作过程

qq邮箱格式怎么写 qq邮箱格式是什么样的 qq邮箱格式怎么写 qq邮箱格式是什么样的 Feb 22, 2024 pm 03:40 PM

qq邮箱格式怎么写 qq邮箱格式是什么样的

安装Realtek HD音频驱动程序失败,错误0x00005b3 安装Realtek HD音频驱动程序失败,错误0x00005b3 Feb 19, 2024 am 10:42 AM

安装Realtek HD音频驱动程序失败,错误0x00005b3

如何在服务器上安装 PHP FFmpeg 扩展? 如何在服务器上安装 PHP FFmpeg 扩展? Mar 28, 2024 pm 02:39 PM

如何在服务器上安装 PHP FFmpeg 扩展?

学习PHP中如何处理特殊字符转换单引号 学习PHP中如何处理特殊字符转换单引号 Mar 27, 2024 pm 12:39 PM

学习PHP中如何处理特殊字符转换单引号

集邦咨询:英伟达 Blackwell 平台产品带动台积电今年 CoWoS 产能提高 150% 集邦咨询:英伟达 Blackwell 平台产品带动台积电今年 CoWoS 产能提高 150% Apr 17, 2024 pm 08:00 PM

集邦咨询:英伟达 Blackwell 平台产品带动台积电今年 CoWoS 产能提高 150%

See all articles