当前位置: 首页 > 知识库问答 >
问题:

混入MPEG-TS:音频流参数错误

顾喜
2023-03-14

我正在尝试使用ffmpeg将视频(H.264)和音频(PCM_S16LE,无压缩)混合到MPEG传输流中。视频显示良好。但是,音频流无法播放。ff探针显示的音频流是AAC,这显然不是我的意图。所以我在添加音频流时一定做错了什么。知道如何纠正吗?

这是我添加音频流的代码

void add_audio_stream()
{

    CodecID codec_id = CODEC_ID_PCM_S16LE;

    AVStream *p_ast = av_new_stream(fc, 1);

    if (!p_ast) {
        fprintf(stderr, "Could not alloc audio stream\n");
        exit(1);
    }

    ai = p_ast->index;

    AVCodecContext *pcc = p_ast->codec;
    avcodec_get_context_defaults2( pcc, AVMEDIA_TYPE_AUDIO );

    pcc->codec_type = AVMEDIA_TYPE_AUDIO;
    pcc->codec_id = codec_id;
    pcc->sample_fmt = AV_SAMPLE_FMT_S16;
    //pcc->bit_rate = 44100*16*2;
    pcc->bit_rate = 0;
    pcc->sample_rate = 44100;
    pcc->channels = 2;
    pcc->time_base = (AVRational){1, 44100};


    // some formats want stream headers to be separate
    if (fc->oformat->flags & AVFMT_GLOBALHEADER)
    {
        printf(" **** 1 ****\n");
        pcc->flags |= CODEC_FLAG_GLOBAL_HEADER;
    }
    else
        printf(" **** 2 ****\n");


    AVCodec *codec;

    /* find the audio encoder */
    codec = avcodec_find_encoder(pcc->codec_id);
    if (!codec) {
        fprintf(stderr, "codec not found\n");
        exit(1);
    }


    /* open it */
    if (avcodec_open(pcc, codec) < 0) 
    {
        fprintf(stderr, "could not open codec\n");
        exit(1);
    }
}

以下是ffprobe的输出:

ffprobe version N-32405-g6337de9, Copyright (c) 2007-2011 the FFmpeg developers
  built on Sep  8 2011 11:20:12 with gcc 4.4.3
  configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-x11grab --enable-libmp3lame
  libavutil    51. 16. 0 / 51. 16. 0
  libavcodec   53. 13. 0 / 53. 13. 0
  libavformat  53. 12. 0 / 53. 12. 0
  libavdevice  53.  3. 0 / 53.  3. 0
  libavfilter   2. 39. 0 /  2. 39. 0
  libswscale    2.  1. 0 /  2.  1. 0
  libpostproc  51.  2. 0 / 51.  2. 0
[mpegts @ 0xa96daa0] Continuity Check Failed
[mpegts @ 0xa96daa0] Continuity Check Failed
[aac @ 0xa974da0] channel element 0.1 is not allocated
[aac @ 0xa974da0] More than one AAC RDB per ADTS frame is not implemented. Update your FFmpeg version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented.

.
.
lot of gobbly-gook about missing AAC parameters . . . 
.
.

[aac @ 0xa974da0] More than one AAC RDB per ADTS frame is not implemented. Update your FFmpeg version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented.
[aac @ 0xa974da0] Error decoding AAC frame header.
[mpegts @ 0xa96daa0] max_analyze_duration 5000000 reached at 5429789
[mpegts @ 0xa96daa0] Continuity Check Failed
[mpegts @ 0xa96daa0] Continuity Check Failed

Input #0, mpegts, from 'test_audio_video.mts':
  Duration: 00:00:40.35, start: 0.010000, bitrate: 1907 kb/s
  Program 1 
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
Stream #0.0[0x100]: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p, 640x480, 30 fps, 30 tbr, 90k tbn, 60 tbc

Stream #0.1[0x101]: Audio: aac ([6][0][0][0] / 0x0006), 96000 Hz, 4.0, s16, 9 kb/s

共有3个答案

劳英华
2023-03-14

不久前我也玩过。我发现:-蓝光只支持48000采样率-我总是使用大端而不是小端。

我认为ffmpeg将使用蓝光设置mpeg2_ts。

归和惬
2023-03-14

根据SMPTE 302M的规定,MPEG-TS似乎支持将AES3格式的PCM音频作为私有数据。

目前,ffmpeg中有一个s302m编码器/解码器,可以让您轻松实现目标。

沈乐邦
2023-03-14

我想我怀疑MEPG2 TS是否允许PCM音频。它可以占用MPI、MP2或AAC。AAC更多地被视为一种默认选择,而不是身份识别。

此外,与视频不同,音频标题的描述性不强。i、 e.没有开始代码和其他东西,所以除了PES头,通常没有办法找出它是什么类型的音频。

如果可能,对音频进行编码。

尝试Gspot应用程序进行交叉检查。

 类似资料:
  • 我正在使用核心音频(与swift包装)播放一些音频样本(一个简短的刺激,其中记录一个冲动)。我坚持使用核心音频,而不是更新的AVFoundation,因为我需要一些严格的定时和多设备输入,更新的框架还没有涵盖(我通过苹果代码请求他们告诉我必须使用核心音频)。 我现在创建了一个非常简单的正弦波,使用: 如果我把它写到一个wav文件并回放,音调就会按预期的方式创建。 然而,我实际上想在应用程序中触发这

  • 我正在尝试为我正在制作的游戏添加声音,但每次尝试加载声音时,我都会收到流关闭异常。我不明白为什么会这样。 加载声音: 我收到的错误消息是:“线程”main“java.io.IOException中的异常:Stream closed at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:134) at java.io.

  • 问题内容: 我正在尝试向SoundCloud API发出请求。然后,当我得到响应时,将stream_url设置为 元素的源。 这有效: http://matthiasdv.org/beta/ 但并非总是如此…例如,当您搜索“ Bo黑猩猩”时,您可以播放前几首曲目而不会出现任何问题。但是当您尝试演奏“伦敦语法-嘿,现在(bo黑猩猩混音)”时-第七名结果- 它不会播放。它不会抛出任何错误。 我一直在修

  • 需要您的帮助,我检查音频流是否当您按下按钮或当程序启动的时刻,当您按下按钮,音频流是不可用的,然后没有发生,音乐没有播放,没有任何响应从程序没有我想让您认识到如何这样的响应尽可能做吗?

  • 问题内容: 我正在另一台PC上实现从MIC到Java服务器的实时流传输。但是我只听到白噪声。 我已经附上了客户端程序和服务器程序 并且服务器端没有问题。它与android客户端AudioRecord完美运行。 问题答案: 因此,我用正弦波(或某种在某种意义上类似正弦波的东西)填充了麦克风,并且您的程序运行正常。 因此,我的具体更改是: 显然,我将其误解为一个512字节长的片段,并破坏了正弦波,但事

  • 我的问题是,我试图访问一个实时视频流,我正在以MPEG-DASH URL的形式接收它。有了这个URL,我可以分别以m4v和m4a扩展的形式获取视频和音频数据块。 我将从每个片段中获取的字节推送到服务器(目前分别用于音频和视频)。我希望当我使用MPD URL(MPEG-DASH URL)时,我可以动态地将音频和视频片段字节的小块进行多路复用,并将结果字节发送到包含混合音频和视频的服务器。 问题是我可