21xrx.com
2024-12-22 16:08:02 Sunday
登录
文章检索 我的文章 写文章
使用FFmpeg编程实现TS流转换成MP4
2023-10-14 16:41:10 深夜i     --     --
FFmpeg 编程 TS流 转换 MP4

FFmpeg是一个跨平台的开源多媒体处理框架,它提供了丰富的命令行工具和库,可以用来处理音频和视频等多媒体数据。在实际应用中,经常需要将TS流(Transport Stream)转换成MP4格式,以便在不同的设备上播放。

TS流是一种常用的视频传输格式,它常用于数字电视和广播等领域。然而,在一些应用场景中,如网络直播和移动端播放,MP4格式更为常见和适用。因此,将TS流转换成MP4成为了一项常见的需求。

FFmpeg提供了丰富的接口和功能,可以方便地实现TS流到MP4格式的转换。下面是一个简单的示例代码,演示了如何使用FFmpeg进行转换。


#include <stdio.h>

#include <libavformat/avformat.h>

int main() {

  AVFormatContext *inFmtCtx = NULL;

  AVFormatContext *outFmtCtx = NULL;

  AVPacket packet;

  const char *inFilename = "input.ts";

  const char *outFilename = "output.mp4";

  av_register_all();

  if (avformat_open_input(&inFmtCtx, inFilename, NULL, NULL) < 0) {

    fprintf(stderr, "Error opening input file\n");

    return -1;

  }

  if (avformat_find_stream_info(inFmtCtx, NULL) < 0) {

    fprintf(stderr, "Error finding stream info\n");

    return -1;

  }

  avformat_alloc_output_context2(&outFmtCtx, NULL, NULL, outFilename);

  for (int i = 0; i < inFmtCtx->nb_streams; i++) {

    AVStream *inStream = inFmtCtx->streams[i];

    AVStream *outStream = avformat_new_stream(outFmtCtx, NULL);

    if (!outStream) {

      fprintf(stderr, "Error allocating stream\n");

      return -1;

    }

    avcodec_parameters_copy(outStream->codecpar, inStream->codecpar);

  }

  if (avio_open(&outFmtCtx->pb, outFilename, AVIO_FLAG_WRITE) < 0) {

    fprintf(stderr, "Error opening output file\n");

    return -1;

  }

  if (avformat_write_header(outFmtCtx, NULL) < 0) {

    fprintf(stderr, "Error writing header\n");

    return -1;

  }

  while (av_read_frame(inFmtCtx, &packet) >= 0) {

    AVStream *inStream = inFmtCtx->streams[packet.stream_index];

    AVStream *outStream = outFmtCtx->streams[packet.stream_index];

    packet.pts = av_rescale_q_rnd(packet.pts, inStream->time_base, outStream->time_base, AV_ROUND_NEAR_INF);

    packet.dts = av_rescale_q_rnd(packet.dts, inStream->time_base, outStream->time_base, AV_ROUND_NEAR_INF);

    packet.duration = av_rescale_q(packet.duration, inStream->time_base, outStream->time_base);

    packet.pos = -1;

    av_interleaved_write_frame(outFmtCtx, &packet);

    av_packet_unref(&packet);

  }

  av_write_trailer(outFmtCtx);

  avformat_close_input(&inFmtCtx);

  avformat_free_context(inFmtCtx);

  avformat_close_input(&outFmtCtx);

  avformat_free_context(outFmtCtx);

  return 0;

}

以上代码使用了FFmpeg的AVFormatContext结构体和相关函数,完成了TS流到MP4格式的转换。首先,打开输入文件和输出文件,然后读取并复制输入文件的流信息到输出文件。接着,读取输入文件中的每个AVPacket,并根据时间基准调整时间戳和时长等字段,将AVPacket写入输出文件。最后,写入文件尾并释放资源。

总的来说,使用FFmpeg编程实现TS流转换成MP4格式并不复杂。我们可以利用FFmpeg提供的丰富功能和API,完成多媒体数据的转换和处理。无论是在视频直播领域还是在移动端播放等应用场景中,FFmpeg都是一种强大且灵活的工具,可以满足我们对多媒体数据处理的需求。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复