把mediacodec编码后的数据通过av_interleaved_write_frame 输出ts格式
时间: 2023-08-05 15:09:06 浏览: 119
好的,针对您的问题,我可以提供以下步骤:
1. 初始化 FFmpeg 的 AVFormatContext 和 AVOutputFormat。
```
AVFormatContext *fmt_ctx = NULL;
AVOutputFormat *out_fmt = NULL;
avformat_alloc_output_context2(&fmt_ctx, NULL, "mpegts", NULL);
out_fmt = fmt_ctx->oformat;
```
2. 打开输出文件。
```
if (!(out_fmt->flags & AVFMT_NOFILE)) {
if (avio_open(&fmt_ctx->pb, output_filename, AVIO_FLAG_WRITE) < 0) {
fprintf(stderr, "Could not open '%s'\n", output_filename);
return -1;
}
}
```
3. 添加音视频流。
```
AVStream *video_stream = avformat_new_stream(fmt_ctx, NULL);
AVStream *audio_stream = avformat_new_stream(fmt_ctx, NULL);
```
4. 配置视频流的编码器参数。
```
video_stream->codecpar->codec_id = AV_CODEC_ID_H264;
video_stream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
video_stream->codecpar->width = width;
video_stream->codecpar->height = height;
video_stream->codecpar->format = AV_PIX_FMT_YUV420P;
video_stream->codecpar->codec_tag = 0;
```
5. 配置音频流的编码器参数。
```
audio_stream->codecpar->codec_id = AV_CODEC_ID_AAC;
audio_stream->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
audio_stream->codecpar->sample_rate = sample_rate;
audio_stream->codecpar->channels = channels;
audio_stream->codecpar->channel_layout = av_get_default_channel_layout(channels);
audio_stream->codecpar->format = AV_SAMPLE_FMT_FLTP;
audio_stream->codecpar->codec_tag = 0;
```
6. 打开视频和音频编码器。
```
AVCodec *video_codec = avcodec_find_encoder(video_stream->codecpar->codec_id);
AVCodec *audio_codec = avcodec_find_encoder(audio_stream->codecpar->codec_id);
AVCodecContext *video_codec_ctx = avcodec_alloc_context3(video_codec);
AVCodecContext *audio_codec_ctx = avcodec_alloc_context3(audio_codec);
avcodec_parameters_to_context(video_codec_ctx, video_stream->codecpar);
avcodec_parameters_to_context(audio_codec_ctx, audio_stream->codecpar);
avcodec_open2(video_codec_ctx, video_codec, NULL);
avcodec_open2(audio_codec_ctx, audio_codec, NULL);
```
7. 循环读取视频数据,编码并写入输出文件。
```
while (has_video_data) {
// 读取视频数据到 buffer
...
// 编码 buffer
AVPacket *pkt = av_packet_alloc();
avcodec_send_frame(video_codec_ctx, frame);
ret = avcodec_receive_packet(video_codec_ctx, pkt);
if (ret == 0) {
// 写入输出文件
av_interleaved_write_frame(fmt_ctx, pkt);
}
av_packet_free(&pkt);
}
```
8. 循环读取音频数据,编码并写入输出文件。
```
while (has_audio_data) {
// 读取音频数据到 buffer
...
// 编码 buffer
AVPacket *pkt = av_packet_alloc();
avcodec_send_frame(audio_codec_ctx, frame);
ret = avcodec_receive_packet(audio_codec_ctx, pkt);
if (ret == 0) {
// 写入输出文件
av_interleaved_write_frame(fmt_ctx, pkt);
}
av_packet_free(&pkt);
}
```
9. 写入文件尾部。
```
av_write_trailer(fmt_ctx);
```
以上就是将 mediacodec 编码后的数据通过 FFmpeg 的 av_interleaved_write_frame 输出 ts 格式的大致步骤。具体实现时,需要根据自己的需求进行更改。
阅读全文