ffmepg C++ 编码后 混合 aac h264 数据流 到文件 pts
时间: 2023-08-05 20:10:00 浏览: 107
ffmpeg构造声音和图像输出到Mp4
4星 · 用户满意度95%
在C++中使用ffmpeg进行AAC和H.264数据流混合到文件中并保留PTS,可以使用以下步骤:
1. 打开视频和音频输入流:
```
AVFormatContext *videoFormatCtx = avformat_alloc_context();
avformat_open_input(&videoFormatCtx, "video.h264", NULL, NULL);
avformat_find_stream_info(videoFormatCtx, NULL);
AVFormatContext *audioFormatCtx = avformat_alloc_context();
avformat_open_input(&audioFormatCtx, "audio.aac", NULL, NULL);
avformat_find_stream_info(audioFormatCtx, NULL);
```
2. 查找H.264和AAC数据流的视频流和音频流索引:
```
int videoStreamIndex = av_find_best_stream(videoFormatCtx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);
int audioStreamIndex = av_find_best_stream(audioFormatCtx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);
```
3. 分别打开视频和音频解码器:
```
AVCodecContext *videoCodecCtx = avcodec_alloc_context3(NULL);
avcodec_parameters_to_context(videoCodecCtx, videoFormatCtx->streams[videoStreamIndex]->codecpar);
AVCodec *videoCodec = avcodec_find_decoder(videoCodecCtx->codec_id);
avcodec_open2(videoCodecCtx, videoCodec, NULL);
AVCodecContext *audioCodecCtx = avcodec_alloc_context3(NULL);
avcodec_parameters_to_context(audioCodecCtx, audioFormatCtx->streams[audioStreamIndex]->codecpar);
AVCodec *audioCodec = avcodec_find_decoder(audioCodecCtx->codec_id);
avcodec_open2(audioCodecCtx, audioCodec, NULL);
```
4. 创建输出文件并打开视频和音频编码器:
```
AVFormatContext *outputFormatCtx = avformat_alloc_context();
avformat_alloc_output_context2(&outputFormatCtx, NULL, NULL, "output.mp4");
AVStream *outputVideoStream = avformat_new_stream(outputFormatCtx, NULL);
AVStream *outputAudioStream = avformat_new_stream(outputFormatCtx, NULL);
AVCodecContext *outputVideoCodecCtx = avcodec_alloc_context3(NULL);
avcodec_parameters_to_context(outputVideoCodecCtx, outputVideoStream->codecpar);
AVCodec *outputVideoCodec = avcodec_find_encoder(outputVideoCodecCtx->codec_id);
avcodec_open2(outputVideoCodecCtx, outputVideoCodec, NULL);
AVCodecContext *outputAudioCodecCtx = avcodec_alloc_context3(NULL);
avcodec_parameters_to_context(outputAudioCodecCtx, outputAudioStream->codecpar);
AVCodec *outputAudioCodec = avcodec_find_encoder(outputAudioCodecCtx->codec_id);
avcodec_open2(outputAudioCodecCtx, outputAudioCodec, NULL);
avio_open(&outputFormatCtx->pb, "output.mp4", AVIO_FLAG_WRITE);
avformat_write_header(outputFormatCtx, NULL);
```
5. 读取视频和音频数据流,进行编码和写入输出文件:
```
AVPacket videoPacket, audioPacket;
int videoFrameCount = 0, audioFrameCount = 0;
while (av_read_frame(videoFormatCtx, &videoPacket) >= 0 || av_read_frame(audioFormatCtx, &audioPacket) >= 0) {
if (videoPacket.stream_index == videoStreamIndex) {
AVFrame *videoFrame = av_frame_alloc();
avcodec_send_packet(videoCodecCtx, &videoPacket);
avcodec_receive_frame(videoCodecCtx, videoFrame);
// 对视频帧进行编码
av_packet_unref(&videoPacket);
av_frame_free(&videoFrame);
} else if (audioPacket.stream_index == audioStreamIndex) {
AVFrame *audioFrame = av_frame_alloc();
avcodec_send_packet(audioCodecCtx, &audioPacket);
avcodec_receive_frame(audioCodecCtx, audioFrame);
// 对音频帧进行编码
av_packet_unref(&audioPacket);
av_frame_free(&audioFrame);
}
// 将编码后的视频帧和音频帧写入输出文件
av_write_frame(outputFormatCtx, &outputPacket);
av_packet_unref(&outputPacket);
}
// 写入文件尾信息
av_write_trailer(outputFormatCtx);
```
这个C++代码片段演示了如何使用ffmpeg将AAC和H.264数据流混合到文件中并保留PTS。注意,在代码中省略了一些错误处理和释放资源的步骤,确保在实际使用时进行处理。
阅读全文