FFmpeg封装格式处理:视音频复用器(muxer)
打算记录一下基于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
-
/**
Nach dem Login kopieren -
* 最简单的基于FFmpeg的视音频复用器
Nach dem Login kopieren -
* Simplest FFmpeg Muxer
Nach dem Login kopieren -
*
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
* 雷霄骅 Lei Xiaohua
Nach dem Login kopieren -
* leixiaohua1020@126.com
Nach dem Login kopieren -
* 中国传媒大学/数字电视技术
Nach dem Login kopieren -
* Communication University of China / Digital TV Technology
Nach dem Login kopieren -
* http://blog.csdn.net/leixiaohua1020
Nach dem Login kopieren -
*
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
* 本程序可以将视频码流和音频码流打包到一种封装格式中。
Nach dem Login kopieren -
* 程序中将MP3编码的音频码流和H.264编码(MPEG2TS封装中)的视频码流打包成
Nach dem Login kopieren -
* MP4封装格式的文件。
Nach dem Login kopieren -
* 需要注意的是本程序并不改变视音频的编码格式。
Nach dem Login kopieren -
*
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
* This software mux a video bitstream and a audio bitstream
Nach dem Login kopieren -
* together into a file.
Nach dem Login kopieren -
* In this example, it mux a H.264 bitstream (in MPEG2TS) and
Nach dem Login kopieren -
* a MP3 bitstream file together into MP4 format file.
Nach dem Login kopieren -
*
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
*/
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
#include <stdio.h></stdio.h>
Nach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
extern "C"
Nach dem Login kopieren -
{
Nach dem Login kopierenNach dem Login kopieren -
#include "libavformat/avformat.h"
Nach dem Login kopieren -
};
Nach dem Login kopieren -
/*
Nach dem Login kopierenNach dem Login kopieren -
FIX: H.264 in some container format (FLV, MP4, MKV etc.) need
Nach dem Login kopieren -
"h264_mp4toannexb" bitstream filter (BSF)
Nach dem Login kopieren -
*Add SPS,PPS in front of IDR frame
Nach dem Login kopieren -
*Add start code ("0,0,0,1") in front of NALU
Nach dem Login kopieren -
H.264 in some container (MPEG2TS) don't need this BSF.
Nach dem Login kopieren -
*/
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
//'1': Use H.264 Bitstream Filter
Nach dem Login kopieren -
#define USE_H264BSF 0
Nach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
/*
Nach dem Login kopierenNach dem Login kopieren -
FIX:AAC in some container format (FLV, MP4, MKV etc.) need
Nach dem Login kopieren -
"aac_adtstoasc" bitstream filter (BSF)
Nach dem Login kopieren -
*/
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
//'1': Use AAC Bitstream Filter
Nach dem Login kopieren -
#define USE_AACBSF 0
Nach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
int main(int argc, char* argv[])
Nach dem Login kopieren -
{
Nach dem Login kopierenNach dem Login kopieren -
AVOutputFormat *ofmt = NULL;
Nach dem Login kopieren -
//输入对应一个AVFormatContext,输出对应一个AVFormatContext
Nach dem Login kopieren -
//(Input AVFormatContext and Output AVFormatContext)
Nach dem Login kopieren -
AVFormatContext *ifmt_ctx_v = NULL, *ifmt_ctx_a = NULL,*ofmt_ctx = NULL;
Nach dem Login kopieren -
AVPacket pkt;
Nach dem Login kopieren -
int ret, i;
Nach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
char *in_filename_v = "cuc_ieschool.ts";//输入文件名(Input file URL)
Nach dem Login kopieren -
//char *in_filename_v = "cuc_ieschool.h264";
Nach dem Login kopieren -
//char *in_filename_a = "cuc_ieschool.mp3";
Nach dem Login kopieren -
//char *in_filename_a = "gowest.m4a";
Nach dem Login kopieren -
//char *in_filename_a = "gowest.aac";
Nach dem Login kopieren -
char *in_filename_a = "huoyuanjia.mp3";
Nach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
char *out_filename = "cuc_ieschool.mp4";//输出文件名(Output file URL)
Nach dem Login kopieren -
av_register_all();
Nach dem Login kopieren -
//输入(Input)
Nach dem Login kopieren -
if ((ret = avformat_open_input(&ifmt_ctx_v, in_filename_v, 0, 0))
Nach dem Login kopieren -
printf( "Could not open input file.");
Nach dem Login kopierenNach dem Login kopieren -
goto end;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
if ((ret = avformat_find_stream_info(ifmt_ctx_v, 0))
Nach dem Login kopieren -
printf( "Failed to retrieve input stream information");
Nach dem Login kopierenNach dem Login kopieren -
goto end;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
if ((ret = avformat_open_input(&ifmt_ctx_a, in_filename_a, 0, 0))
Nach dem Login kopieren -
printf( "Could not open input file.");
Nach dem Login kopierenNach dem Login kopieren -
goto end;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
if ((ret = avformat_find_stream_info(ifmt_ctx_a, 0))
Nach dem Login kopieren -
printf( "Failed to retrieve input stream information");
Nach dem Login kopierenNach dem Login kopieren -
goto end;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
printf("Input Information=====================\n");
Nach dem Login kopieren -
av_dump_format(ifmt_ctx_v, 0, in_filename_v, 0);
Nach dem Login kopieren -
av_dump_format(ifmt_ctx_a, 0, in_filename_a, 0);
Nach dem Login kopieren -
printf("======================================\n");
Nach dem Login kopierenNach dem Login kopieren -
//输出(Output)
Nach dem Login kopieren -
avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, out_filename);
Nach dem Login kopieren -
if (!ofmt_ctx) {
Nach dem Login kopieren -
printf( "Could not create output context\n");
Nach dem Login kopieren -
ret = AVERROR_UNKNOWN;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
goto end;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
ofmt = ofmt_ctx->oformat;
Nach dem Login kopieren -
int videoindex_v=-1,videoindex_out=-1;
Nach dem Login kopieren -
for (i = 0; i nb_streams; i++) {
Nach dem Login kopierenNach dem Login kopieren -
//根据输入流创建输出流(Create output AVStream according to input AVStream)
Nach dem Login kopierenNach dem Login kopieren -
if(ifmt_ctx_v->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){
Nach dem Login kopieren -
videoindex_v=i;
Nach dem Login kopieren -
AVStream *in_stream = ifmt_ctx_v->streams[i];
Nach dem Login kopieren -
AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);
Nach dem Login kopierenNach dem Login kopieren -
if (!out_stream) {
Nach dem Login kopierenNach dem Login kopieren -
printf( "Failed allocating output stream\n");
Nach dem Login kopierenNach dem Login kopieren -
ret = AVERROR_UNKNOWN;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
goto end;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
videoindex_out=out_stream->index;
Nach dem Login kopieren -
//复制AVCodecContext的设置(Copy the settings of AVCodecContext)
Nach dem Login kopierenNach dem Login kopieren -
if (avcodec_copy_context(out_stream->codec, in_stream->codec)
Nach dem Login kopierenNach dem Login kopieren -
printf( "Failed to copy context from input to output stream codec context\n");
Nach dem Login kopierenNach dem Login kopieren -
goto end;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
out_stream->codec->codec_tag = 0;
Nach dem Login kopierenNach dem Login kopieren -
if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
Nach dem Login kopierenNach dem Login kopieren -
out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
Nach dem Login kopierenNach dem Login kopieren -
break;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
int audioindex_a=-1,audioindex_out=-1;
Nach dem Login kopieren -
for (i = 0; i nb_streams; i++) {
Nach dem Login kopierenNach dem Login kopieren -
//根据输入流创建输出流(Create output AVStream according to input AVStream)
Nach dem Login kopierenNach dem Login kopieren -
if(ifmt_ctx_a->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){
Nach dem Login kopieren -
audioindex_a=i;
Nach dem Login kopieren -
AVStream *in_stream = ifmt_ctx_a->streams[i];
Nach dem Login kopieren -
AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);
Nach dem Login kopierenNach dem Login kopieren -
if (!out_stream) {
Nach dem Login kopierenNach dem Login kopieren -
printf( "Failed allocating output stream\n");
Nach dem Login kopierenNach dem Login kopieren -
ret = AVERROR_UNKNOWN;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
goto end;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
audioindex_out=out_stream->index;
Nach dem Login kopieren -
//复制AVCodecContext的设置(Copy the settings of AVCodecContext)
Nach dem Login kopierenNach dem Login kopieren -
if (avcodec_copy_context(out_stream->codec, in_stream->codec)
Nach dem Login kopierenNach dem Login kopieren -
printf( "Failed to copy context from input to output stream codec context\n");
Nach dem Login kopierenNach dem Login kopieren -
goto end;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
out_stream->codec->codec_tag = 0;
Nach dem Login kopierenNach dem Login kopieren -
if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
Nach dem Login kopierenNach dem Login kopieren -
out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
Nach dem Login kopierenNach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
break;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
//输出一下格式------------------
Nach dem Login kopieren -
printf("Output Information====================\n");
Nach dem Login kopieren -
av_dump_format(ofmt_ctx, 0, out_filename, 1);
Nach dem Login kopieren -
printf("======================================\n");
Nach dem Login kopierenNach dem Login kopieren -
//打开输出文件(Open output file)
Nach dem Login kopieren -
if (!(ofmt->flags & AVFMT_NOFILE)) {
Nach dem Login kopieren -
if (avio_open(&ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE)
Nach dem Login kopieren -
printf( "Could not open output file '%s'", out_filename);
Nach dem Login kopieren -
goto end;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
//写文件头(Write file header)
Nach dem Login kopieren -
if (avformat_write_header(ofmt_ctx, NULL)
Nach dem Login kopieren -
printf( "Error occurred when opening output file\n");
Nach dem Login kopieren -
goto end;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
int frame_index=0;
Nach dem Login kopieren -
int64_t cur_pts_v=0,cur_pts_a=0;
Nach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
//FIX
Nach dem Login kopierenNach dem Login kopieren -
#if USE_H264BSF
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
AVBitStreamFilterContext* h264bsfc = av_bitstream_filter_init("h264_mp4toannexb");
Nach dem Login kopieren -
#endif
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
#if USE_AACBSF
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
AVBitStreamFilterContext* aacbsfc = av_bitstream_filter_init("aac_adtstoasc");
Nach dem Login kopieren -
#endif
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
while (1) {
Nach dem Login kopieren -
AVFormatContext *ifmt_ctx;
Nach dem Login kopieren -
int stream_index=0;
Nach dem Login kopieren -
AVStream *in_stream, *out_stream;
Nach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
//获取一个AVPacket(Get an AVPacket)
Nach dem Login kopieren -
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)
Nach dem Login kopieren -
ifmt_ctx=ifmt_ctx_v;
Nach dem Login kopieren -
stream_index=videoindex_out;
Nach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
if(av_read_frame(ifmt_ctx, &pkt) >= 0){
Nach dem Login kopierenNach dem Login kopieren -
do{
Nach dem Login kopierenNach dem Login kopieren -
if(pkt.stream_index==videoindex_v){
Nach dem Login kopieren -
cur_pts_v=pkt.pts;
Nach dem Login kopieren -
break;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}while(av_read_frame(ifmt_ctx, &pkt) >= 0);
Nach dem Login kopierenNach dem Login kopieren -
}else{
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
break;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}else{
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
ifmt_ctx=ifmt_ctx_a;
Nach dem Login kopieren -
stream_index=audioindex_out;
Nach dem Login kopieren -
if(av_read_frame(ifmt_ctx, &pkt) >= 0){
Nach dem Login kopierenNach dem Login kopieren -
do{
Nach dem Login kopierenNach dem Login kopieren -
if(pkt.stream_index==audioindex_a){
Nach dem Login kopieren -
cur_pts_a=pkt.pts;
Nach dem Login kopieren -
break;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}while(av_read_frame(ifmt_ctx, &pkt) >= 0);
Nach dem Login kopierenNach dem Login kopieren -
}else{
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
break;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
in_stream = ifmt_ctx->streams[pkt.stream_index];
Nach dem Login kopieren -
out_stream = ofmt_ctx->streams[stream_index];
Nach dem Login kopieren -
//FIX
Nach dem Login kopierenNach dem Login kopieren -
#if USE_H264BSF
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
av_bitstream_filter_filter(h264bsfc, in_stream->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0);
Nach dem Login kopieren -
#endif
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
#if USE_AACBSF
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
av_bitstream_filter_filter(aacbsfc, in_stream->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0);
Nach dem Login kopieren -
#endif
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
//FIX:No PTS (Example: Raw H.264)
Nach dem Login kopieren -
//Simple Write PTS
Nach dem Login kopieren -
if(pkt.pts==AV_NOPTS_VALUE){
Nach dem Login kopieren -
//Write PTS
Nach dem Login kopieren -
AVRational time_base1=in_stream->time_base;
Nach dem Login kopieren -
//Duration between 2 frames (us)
Nach dem Login kopieren -
int64_t calc_duration=(double)AV_TIME_BASE/av_q2d(in_stream->r_frame_rate);
Nach dem Login kopieren -
//Parameters
Nach dem Login kopieren -
pkt.pts=(double)(frame_index*calc_duration)/(double)(av_q2d(time_base1)*AV_TIME_BASE);
Nach dem Login kopieren -
pkt.dts=pkt.pts;
Nach dem Login kopieren -
pkt.duration=(double)calc_duration/(double)(av_q2d(time_base1)*AV_TIME_BASE);
Nach dem Login kopieren -
frame_index++;
Nach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
/* copy packet */
Nach dem Login kopieren -
//转换PTS/DTS(Convert PTS/DTS)
Nach dem Login kopieren -
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));
Nach dem Login kopieren -
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));
Nach dem Login kopieren -
pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);
Nach dem Login kopieren -
pkt.pos = -1;
Nach dem Login kopieren -
pkt.stream_index=stream_index;
Nach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
printf("Write 1 Packet. size:%5d\tpts:%8d\n",pkt.size,pkt.pts);
Nach dem Login kopieren -
//写入(Write)
Nach dem Login kopieren -
if (av_interleaved_write_frame(ofmt_ctx, &pkt)
Nach dem Login kopieren -
printf( "Error muxing packet\n");
Nach dem Login kopieren -
break;
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
av_free_packet(&pkt);
Nach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
//写文件尾(Write file trailer)
Nach dem Login kopieren -
av_write_trailer(ofmt_ctx);
Nach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
#if USE_H264BSF
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
av_bitstream_filter_close(h264bsfc);
Nach dem Login kopieren -
#endif
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
#if USE_AACBSF
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
av_bitstream_filter_close(aacbsfc);
Nach dem Login kopieren -
#endif
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren
-
end:
Nach dem Login kopieren -
avformat_close_input(&ifmt_ctx_v);
Nach dem Login kopieren -
avformat_close_input(&ifmt_ctx_a);
Nach dem Login kopieren -
/* close output */
Nach dem Login kopieren -
if (ofmt_ctx && !(ofmt->flags & AVFMT_NOFILE))
Nach dem Login kopieren -
avio_close(ofmt_ctx->pb);
Nach dem Login kopieren -
avformat_free_context(ofmt_ctx);
Nach dem Login kopieren -
if (ret
Nach dem Login kopieren -
printf( "Error occurred.\n");
Nach dem Login kopieren -
return -1;
Nach dem Login kopieren -
}
Nach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopierenNach dem Login kopieren -
return 0;
Nach dem Login kopieren

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Wenn beim Musikhören oder Ansehen von Filmen auf einem Win11-Computer die Lautsprecher oder Kopfhörer unausgewogen klingen, können Benutzer den Balancepegel manuell entsprechend ihren Bedürfnissen anpassen. Wie passen wir uns an? Als Reaktion auf dieses Problem hat der Herausgeber ein detailliertes Bedienungs-Tutorial mitgebracht, in der Hoffnung, allen zu helfen. Wie gleicht man den linken und rechten Audiokanal in Windows 11 aus? Methode 1: Tippen Sie in der App „Einstellungen“ auf die Taste und klicken Sie auf „Einstellungen“. Klicken Sie unter Windows auf „System“ und wählen Sie „Sound“ aus. Wählen Sie weitere Toneinstellungen aus. Klicken Sie auf Ihre Lautsprecher/Kopfhörer und wählen Sie Eigenschaften. Navigieren Sie zur Registerkarte „Ebenen“ und klicken Sie auf „Balance“. Stellen Sie sicher, dass „links“ und

Solange ich mich erinnern kann, habe ich zu Hause ein Paar große Standlautsprecher gehabt. Ich bin der Meinung gewesen, dass ein Fernseher nur dann als Fernseher bezeichnet werden kann, wenn er mit einem kompletten Soundsystem ausgestattet ist. Aber als ich anfing zu arbeiten, konnte ich mir professionelles Home-Audio nicht leisten. Nachdem ich mich erkundigt und die Produktpositionierung verstanden hatte, stellte ich fest, dass die Soundbar-Kategorie für mich sehr gut geeignet ist. Sie erfüllt meine Bedürfnisse in Bezug auf Klangqualität, Größe und Preis. Deshalb habe ich mich für die Soundbar entschieden. Nach sorgfältiger Auswahl habe ich mich für dieses Panorama-Soundbar-Produkt entschieden, das Anfang 2024 von Bose auf den Markt gebracht wurde: den Bose Home-Entertainment-Lautsprecher Ultra. (Fotoquelle: Fotografiert von Lei Technology) Wenn wir den „originalen“ Dolby Atmos-Effekt erleben wollen, müssen wir im Allgemeinen eine gemessene und kalibrierte Surround-Sound-Decke zu Hause installieren.

1. Zuerst klicken wir mit der rechten Maustaste auf die leere Stelle der Taskleiste und wählen die Option [Task-Manager] oder klicken mit der rechten Maustaste auf das Startlogo und wählen dann die Option [Task-Manager]. 2. In der geöffneten Task-Manager-Oberfläche klicken wir ganz rechts auf die Registerkarte [Dienste]. 3. Klicken Sie in der geöffneten Registerkarte [Dienst] unten auf die Option [Dienst öffnen]. 4. Klicken Sie im sich öffnenden Fenster [Dienste] mit der rechten Maustaste auf den Dienst [InternetConnectionSharing(ICS)] und wählen Sie dann die Option [Eigenschaften]. 5. Ändern Sie im sich öffnenden Eigenschaftenfenster die Option „Öffnen mit“ in „Deaktiviert“, klicken Sie auf „Übernehmen“ und dann auf „OK“. 6. Klicken Sie auf das Startlogo, dann auf die Schaltfläche zum Herunterfahren, wählen Sie [Neustart] und schließen Sie den Neustart des Computers ab.

QQ-E-Mail: QQ-Nummer@qq.com, Englisch QQ-E-Mail: Englisch oder Numbers@qq.com, Foxmail-E-Mail-Konto: Richten Sie Ihr eigenes Konto ein@foxmail.com, Mobiltelefon-E-Mail-Konto: Mobiltelefonnummer@qq.com. Tutorial Anwendbares Modell: iPhone13 System: IOS15.3 Version: QQ Mailbox 6.3.3 Analyse 1QQ Mailbox hat vier Formate, häufig verwendete QQ Mailbox: QQ Nummer@qq.com, Englisch QQ Mailbox: Englisch oder Numbers@qq.com, Foxmail E-Mail Konto: Richten Sie Ihr eigenes Konto@foxmail.com ein, E-Mail-Konto für Mobiltelefone: Mobiltelefonnummer@qq.com. Ergänzung: Was ist QQ-Postfach 1? Das früheste QQ-Postfach befand sich nur zwischen QQ-Benutzern

Wenn auf einem Windows 11/10-PC der Fehlercode 0x00005b3 für den RealtekHD-Audiotreiberfehler auftritt, befolgen Sie bitte die folgenden Schritte, um das Problem zu beheben. Wir begleiten Sie bei der Fehlerbehebung und Behebung des Fehlers. Der Fehlercode 0x00005b3 kann durch Probleme bei der Installation des Audiotreibers verursacht werden. Möglicherweise ist der aktuelle Treiber beschädigt oder teilweise deinstalliert, was sich auf die Installation des neuen Treibers auswirkt. Dieses Problem kann auch durch unzureichenden Speicherplatz oder einen Audiotreiber verursacht werden, der mit Ihrer Windows-Version nicht kompatibel ist. Die Installation des RealtekHD-Audiotreibers ist fehlgeschlagen! ! [Fehlercode: 0x00005B3] Wenn ein Problem mit dem Realtek Audio Driver Installation Wizard auftritt, lesen Sie weiter

Im PHP-Entwicklungsprozess ist der Umgang mit Sonderzeichen ein häufiges Problem, insbesondere bei der Zeichenfolgenverarbeitung werden Sonderzeichen häufig mit Escapezeichen versehen. Unter diesen ist die Umwandlung von Sonderzeichen in einfache Anführungszeichen eine relativ häufige Anforderung, da einfache Anführungszeichen in PHP eine gängige Methode zum Umschließen von Zeichenfolgen sind. In diesem Artikel erklären wir, wie man in PHP mit einfachen Anführungszeichen bei der Konvertierung von Sonderzeichen umgeht, und stellen spezifische Codebeispiele bereit. Zu den Sonderzeichen in PHP gehören unter anderem einfache Anführungszeichen ('), doppelte Anführungszeichen ("), Backslash () usw. In Zeichenfolgen

Laut Nachrichten dieser Website vom 17. April hat TrendForce kürzlich einen Bericht veröffentlicht, in dem es davon ausgeht, dass die Nachfrage nach den neuen Blackwell-Plattformprodukten von Nvidia optimistisch ist und die gesamte CoWoS-Verpackungsproduktionskapazität von TSMC im Jahr 2024 voraussichtlich um mehr als 150 % steigen wird. Zu den neuen Blackwell-Plattformprodukten von NVIDIA gehören GPUs der B-Serie und GB200-Beschleunigerkarten, die NVIDIAs eigene GraceArm-CPU integrieren. TrendForce bestätigt, dass die Lieferkette derzeit sehr optimistisch in Bezug auf GB200 ist. Es wird geschätzt, dass die Auslieferungen im Jahr 2025 eine Million Einheiten überschreiten werden, was 40-50 % der High-End-GPUs von Nvidia ausmacht. Nvidia plant, in der zweiten Jahreshälfte Produkte wie GB200 und B100 auszuliefern, aber vorgelagerte Waferverpackungen müssen noch komplexere Produkte einführen.

Wie installiere ich die PHPFFmpeg-Erweiterung auf dem Server? Die Installation der PHPFFmpeg-Erweiterung auf dem Server kann uns dabei helfen, Audio- und Videodateien in PHP-Projekten zu verarbeiten und Funktionen wie Kodierung, Dekodierung, Bearbeitung und Verarbeitung von Audio- und Videodateien zu implementieren. In diesem Artikel erfahren Sie, wie Sie die PHPFFmpeg-Erweiterung auf dem Server installieren, sowie spezifische Codebeispiele. Zunächst müssen wir sicherstellen, dass PHP und FFmpeg auf dem Server installiert sind. Wenn FFmpeg nicht installiert ist, können Sie die folgenden Schritte ausführen, um FFmpe zu installieren
