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

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Lorsqu'ils écoutent de la musique ou regardent des films sur un ordinateur Win11, si le son des haut-parleurs ou des écouteurs est déséquilibré, les utilisateurs peuvent régler manuellement le niveau de balance en fonction de leurs besoins. Alors comment s’ajuster ? En réponse à ce problème, l'éditeur a proposé un tutoriel de fonctionnement détaillé, dans l'espoir d'aider tout le monde. Comment équilibrer les canaux audio gauche et droit dans Windows 11 ? Méthode 1 : utilisez l'application Paramètres pour appuyer sur la touche et cliquez sur Paramètres. Windows, cliquez sur Système et sélectionnez Son. Sélectionnez plus de paramètres sonores. Cliquez sur vos haut-parleurs/écouteurs et sélectionnez Propriétés. Accédez à l'onglet Niveaux et cliquez sur Solde. Assurez-vous que "à gauche" et

D'aussi loin que je me souvienne, j'ai eu une paire de grandes enceintes sur pied chez moi. J'ai toujours pensé qu'un téléviseur ne pouvait être appelé téléviseur que s'il était équipé d'un système audio complet. Mais lorsque j’ai commencé à travailler, je ne pouvais pas me permettre un son professionnel à domicile. Après m'être renseigné et compris le positionnement du produit, j'ai trouvé que la catégorie barre de son me convient très bien. Elle répond à mes besoins en termes de qualité sonore, de taille et de prix. J’ai donc décidé d’opter pour la barre de son. Après une sélection minutieuse, j'ai sélectionné ce produit de barre de son panoramique lancé par Bose début 2024 : l'enceinte de divertissement à domicile Bose Ultra. (Source photo : photographié par Lei Technology) De manière générale, si nous voulons expérimenter l'effet Dolby Atmos « original », nous devons installer chez nous un son surround + plafond mesuré et calibré.

1. Tout d'abord, nous cliquons avec le bouton droit sur l'espace vide de la barre des tâches et sélectionnons l'option [Gestionnaire des tâches], ou cliquons avec le bouton droit sur le logo de démarrage, puis sélectionnons l'option [Gestionnaire des tâches]. 2. Dans l'interface du Gestionnaire des tâches ouverte, nous cliquons sur l'onglet [Services] à l'extrême droite. 3. Dans l'onglet [Service] ouvert, cliquez sur l'option [Ouvrir le service] ci-dessous. 4. Dans la fenêtre [Services] qui s'ouvre, cliquez avec le bouton droit sur le service [InternetConnectionSharing(ICS)], puis sélectionnez l'option [Propriétés]. 5. Dans la fenêtre des propriétés qui s'ouvre, remplacez [Ouvrir avec] par [Désactivé], cliquez sur [Appliquer] puis cliquez sur [OK]. 6. Cliquez sur le logo Démarrer, puis cliquez sur le bouton d'arrêt, sélectionnez [Redémarrer] et terminez le redémarrage de l'ordinateur.

E-mail QQ : QQ number@qq.com, anglais QQ email : anglais ou number@qq.com, compte de messagerie foxmail : créez votre propre compte@foxmail.com, compte de messagerie de téléphone mobile : numéro de téléphone mobile@qq.com. Tutoriel Modèle applicable : iPhone13 Système : IOS15.3 Version : QQ Mailbox 6.3.3 Analyse La boîte aux lettres 1QQ a quatre formats, boîte aux lettres QQ couramment utilisée : QQ number@qq.com, anglais Boîte aux lettres QQ : anglais ou number@qq.com, foxmail Email compte : créez votre propre compte@foxmail.com, compte de messagerie de téléphone mobile : numéro de téléphone mobile@qq.com. Supplément : Qu'est-ce que la boîte aux lettres QQ ? 1 La première boîte aux lettres QQ était réservée aux utilisateurs QQ.

Dans le processus de développement PHP, la gestion des caractères spéciaux est un problème courant, en particulier dans le traitement des chaînes, les caractères spéciaux sont souvent échappés. Parmi eux, la conversion de caractères spéciaux en guillemets simples est une exigence relativement courante, car en PHP, les guillemets simples sont un moyen courant d'encapsuler des chaînes. Dans cet article, nous expliquerons comment gérer les guillemets simples de conversion de caractères spéciaux en PHP et fournirons des exemples de code spécifiques. En PHP, les caractères spéciaux incluent, sans s'y limiter, les guillemets simples ('), les guillemets doubles ("), la barre oblique inverse (), etc. Dans les chaînes

Si vous rencontrez le code d'erreur d'échec du pilote audio RealtekHD 0x00005b3 sur un PC Windows 11/10, veuillez vous référer aux étapes suivantes pour résoudre le problème. Nous vous guiderons tout au long du dépannage et de la résolution de l'erreur. Le code d'erreur 0x00005b3 peut être dû à des problèmes d'installation du pilote audio. Il se peut que le pilote actuel soit corrompu ou partiellement désinstallé, affectant l'installation du nouveau pilote. Ce problème peut également être dû à un espace disque insuffisant ou à un pilote audio incompatible avec votre version de Windows. L'installation du pilote audio RealtekHD a échoué ! ! [Code d'erreur : 0x00005B3] S'il y a un problème avec l'assistant d'installation du pilote audio Realtek, continuez à lire

Selon les informations de ce site du 17 avril, TrendForce a récemment publié un rapport estimant que la demande pour les nouveaux produits de la plate-forme Blackwell de Nvidia est haussière et devrait entraîner une augmentation de la capacité totale de production d'emballages CoWoS de TSMC de plus de 150 % en 2024. Les nouveaux produits de la plate-forme Blackwell de NVIDIA comprennent des GPU de série B et des cartes accélératrices GB200 intégrant le propre processeur GraceArm de NVIDIA. TrendForce confirme que la chaîne d'approvisionnement est actuellement très optimiste quant au GB200. On estime que les livraisons en 2025 devraient dépasser le million d'unités, représentant 40 à 50 % des GPU haut de gamme de Nvidia. Nvidia prévoit de livrer des produits tels que le GB200 et le B100 au second semestre, mais le conditionnement des plaquettes en amont doit encore adopter des produits plus complexes.

Comment installer l’extension PHPFFmpeg sur le serveur ? L'installation de l'extension PHPFFmpeg sur le serveur peut nous aider à traiter les fichiers audio et vidéo dans les projets PHP et à implémenter des fonctions telles que l'encodage, le décodage, l'édition et le traitement des fichiers audio et vidéo. Cet article explique comment installer l'extension PHPFFmpeg sur le serveur, ainsi que des exemples de code spécifiques. Tout d’abord, nous devons nous assurer que PHP et FFmpeg sont installés sur le serveur. Si FFmpeg n'est pas installé, vous pouvez suivre les étapes ci-dessous pour installer FFmpe
