1.从MKV到MP4无论怎么压都有画质损失
2.FFmpeg源码分析: AVStream码流
3.MP4çMKVç¼ç
4.踩坑ffmpeg录制的解析解析mp4无法在浏览器上播放
从MKV到MP4无论怎么压都有画质损失
从MKV转换到MP4,造成画质损失的源码原因,主要是视频转换时的参数设置不合理造成的。一是解析解析决定画质的,是源码视频比特率(码率)。在转换时,视频remoteabc源码设置合理的解析解析视频比特率就可以了,越高越接近源视频的源码清晰度。
二是视频视频分辨率,以转换成与源视频分辨率一样大为最佳。解析解析
可以用格式工厂定完成转换。源码如图,视频第一步选MP4就可以了
FFmpeg源码分析: AVStream码流
在AVCodecContext结构体中,解析解析AVStream数组存储着所有视频、源码音频和字幕流的视频庄家建仓标志公式源码信息。每个码流包含时间基、时长、索引数组、编解码器参数、dts和元数据。索引数组用于保存帧数据包的offset、size、timestamp和flag,方便进行seek定位。
让我们通过ffprobe查看mp4文件的码流信息。该文件包含5个码流,是双音轨双字幕文件。第一个是video,编码为h,大数据源码全套帧率为.fps,分辨率为x,像素格式为yuvp。第二个和第三个都是audio,编码为aac,采样率为,立体声,语言分别为印地语和英语。第四个和第五个都是subtitle,语言为英语,编码器为mov_text和mov_text。
调试实时数据显示,stream数组包含以下信息:codec_type(媒体类型)、codec_id、主力资金量化指标源码bit_rate、profile、level、width、height、sample_rate、channels等编解码器参数。
我们关注AVCodecContext的编解码器参数,例如codec_type、codec_id、bit_rate、profile、level、width、指标源码怎么安装图解height、sample_rate和channels。具体参数如下:codec_type - 视频/音频/字幕;codec_id - 编码器ID;bit_rate - 位率;profile - 编码器配置文件;level - 编码器级别;width - 宽度;height - 高度;sample_rate - 采样率;channels - 音道数。
AVStream内部的nb_index_entries(索引数组长度)和index_entries(索引数组)记录着offset、size、timestamp、flags和min_distance信息。在seek操作中,通过二分查找timestamp数组来定位指定时间戳对应的帧。seek模式有previous、next、nearest,通常使用previous模式向前查找。
时间基time_base在ffmpeg中用于计算时间戳。在rational.h中,AVRational结构体定义为一个有理数,用于时间计算。要将时间戳转换为真实时间,只需将num分子除以den分母。
MP4çMKVç¼ç
è¿ä¸ªä½ å¯ä»¥åèä¸ä¸ç¾ç§
MKVæ å¿mkvä¸åäºDivXãXviDçè§é¢ç¼ç æ ¼å¼ï¼ä¹ä¸åäºMP3ãOggçé³é¢ç¼ç æ ¼å¼ãMKVåªæ¯ä¸ºè¿äºé³ãè§é¢æä¾å¤å£³çâç»åâåâå°è£ âæ ¼å¼ãæ¢å¥è¯è¯´å°±æ¯ä¸ç§å®¹å¨æ ¼å¼ï¼å¸¸è§ç AVlãVOBãMPEGãRM æ ¼å¼å ¶å®ä¹é½å±äºè¿ç§ç±»åãä½å®ä»¬è¦ä¹ç»æéæ§ï¼è¦ä¹ä¸å¤å¼æ¾ï¼è¿æä¿æäºMKVè¿ç±»æ°åå¤åªä½å°è£ æ ¼å¼çè¯çã Matroskaåªä½å®ä¹äºä¸ç§ç±»åçæ件ï¼MKVæ¯è§é¢æ件ï¼å®éé¢å¯è½è¿å å«æé³é¢ååå¹ï¼MKAæ¯åä¸çé³é¢æ件ï¼ä½å¯è½æå¤æ¡åå¤ç§ç±»åçé³è½¨ï¼MKSæ¯åå¹æ件ãè¿ä¸ç§æ件以MKVæ为常è§ã MKVæ大çç¹ç¹å°±æ¯è½å®¹çº³å¤ç§ä¸åç±»åç¼ç çè§é¢ãé³é¢ååå¹æµï¼çè³è¿é常å°éç RealMedia å QuickTime è¿ç±»æµåªä½ä¹è¢«å®åæ¬è¿å»ï¼å¯ä»¥è¯´æ¯å¯¹ä¼ ç»åªä½æ ¼å¼çä¸æ¬¡å¤§é¢ è¦ï¼å ä¹åæäºä¸ä¸ªä¸è½çåªä½å®¹å¨ã ææ¾MKV并ä¸éè¦ä¸ç¨çææ¾å¨ï¼ä»»ä½åºäºDirectShowçææ¾å¨é½è½ææ¾å®ï¼å¦å¸¸è§ç Media Player ClassicãBSplayerãZoomPlayer ææ¾å¨çï¼çè³å æ¬Windows Media playerï¼ä» éå®è£ ç¸åº Matroska 解ç å离å¨æ件å³å¯ãæ¨èä¸è½½HappyShowè¿ä¸ªè§£ç å¨éæ软件ã
[ç¼è¾æ¬æ®µ]ç¹ç¹
Matroskaæ大çç¹ç¹å°±æ¯è½å®¹çº³å¤ç§ä¸åç±»åç¼ç çè§é¢ãé³é¢ååå¹æµï¼çè³åæ¬äºRealMediaåQuickTimeè¿ç±»æµåªä½ï¼å¯ä»¥è¯´æ¯å¯¹ä¼ ç»åªä½å°è£ æ ¼å¼çä¸æ¬¡å¤§é¢ è¦ï¼å®ç°å¨å ä¹åæäºä¸ä¸ªä¸è½çåªä½å®¹å¨ï¼ç®åå®æè½å°è£ çè§é¢ãé³é¢ãåå¹ç±»åå æ¬ï¼ AVIæ件ï¼å æ¬éç¨DivXãXviDã3ivXãVP6è§é¢ç¼ç ï¼åPCMãMP3ãAC3çé³é¢ç¼ç çAVI RealMediaæ件ï¼å æ¬RealVideoåRealAudio QuickTimeçMOVåMP4è§é¢ Windows Mediaæ件ï¼å æ¬ASFãWMVæ ¼å¼ MPEGæ件ï¼å æ¬MPEG-1/2çM1VãM2V Ogg/OGM æ件ï¼å æ¬Ogg VorbisãOGMãFLACæ件 Matroska Mediaæ件ï¼å æ¬MKVãMKAãMKSæ件 WAVãAC3ãDTSãMP2ãMP3ãAAC/MP4é³é¢ SRTãUSFåSSA/ASSææ¬åå¹ SubVobå¾å½¢åå¹ï¼åç¼ä¸ºIDXãSUB BMPå¾å½¢åå¹ï¼ä»¥ä¸ç»BMPå¾çåæ¶é´ç ææçåå¹ ã æ¤å¤ï¼Matroskaæ件ä¸è¿å¯å æ¬ç« èãæ ç¾ï¼Tagï¼çä¿¡æ¯ï¼çè³è¿å¯å ä¸é件ï¼éè¦æåºçMatroskaæè°çå°è£ AVIãRMãMOVçåªä½ï¼ä½å®å¹¶ä¸æ¯ç®åå°å®ä»¬ä¸å æ¹åçå并å°Matroskaä¸ï¼èæ¯å°å®ä»¬çé³è§é¢æµè¿è¡äºéæ°ç»ç»ã Matroskaå å ¥AVIæ没æçEDCé误æ£æµä»£ç ï¼è¿æå³çå³ä½¿æ¯æ²¡æä¸è½½å®æ¯çMKVæ件ä¹å¯ä»¥é¡ºå©åæ¾ï¼è¿äºå¯¹AVIæ¥è¯´å®å ¨æ¯ä¸å¯æ³è±¡çãè½ç¶Matroskaå å ¥äºé误æ£æµä»£ç ï¼ä½ç±äºéç¨äºæ°çæ´é«æçç»ç»ç»æï¼ç¨MKVå°è£ åççµå½±è¿æ¯æ¯AVIæºæ件è¦å°äºçº¦1%ï¼è¿å°±æ¯è¯´å³ä½¿å ä¸äºå¤ä¸ªåå¹ï¼MKVæ件çä½ç§¯ä¹ä¸å¯è½æ¯AVIæ件大ã Matroskaæ¯æå¯å帧çï¼VFRï¼å³Variable Frame Rateï¼çè§é¢ç¼ç ï¼è¿ç§VFRè§é¢ç帧çæ¯ä¸åºå®çï¼å®å¯å¨å¨æç»é¢ä¸ä½¿ç¨è¾å¤§ç帧çï¼èå¨éæç»é¢ä¸ä½¿ç¨è¾å°ç帧çï¼è¿æ ·å¯ä»¥ææçåå°è§é¢æ件çä½ç§¯ï¼å¹¶æ¹åå¨æç»é¢çè´¨éãå®çä½ç¨æ¯ç®å广æ³ä½¿ç¨çVBRï¼å¯åç çï¼æ´ä¸ºææ¾ã ççç®åæ¯è¾æµè¡çå¤åªä½å®¹å¨ç±»åï¼ä¾å¦AVIï¼å®å¯ä»¥å®¹çº³å¤ç§ç±»åçè§é¢ç¼ç åé³é¢ç¼ç ï¼åVP6ãDivXãXviDçè§é¢ç¼ç åPCMãMP3ãAC3çé³é¢ç¼ç ï¼ VOBåæ¯å¦ä¸ç§ç¹ç¹æ´ä¸ºé²æçåªä½å®¹å¨ï¼å®å¯å®¹çº³MPEG-2è§é¢æµãå¤ä¸ªAC3ã DTSãTHXãPCMé³é¢æµãå¤ä¸ªä¸åè¯è¨çå¾å½¢åå¹æµã
[ç¼è¾æ¬æ®µ]å ¼å®¹æ§
aviçåºç°å·²ç»è¶ è¿äºå¹´ï¼æ¸æ¸ä½ç°åºèæäºï¼é¤äºè¿å¹´éè¿VDå¯ä»¥æ¥æ2个é³è½¨ï¼æ²¡æå ¶ä»çæ¹è¿ã ogmçåºç°ï¼æ å¿çå¤é³è½¨æ ¼å¼çåºç°ï¼å¯ä»¥åæ8个以ä¸çé³è½¨ï¼é³é¢ä¸èªç¶ä¹å¤äºoggè¿ä¸ªæ ¼å¼ï¼éè¦çæ¯å¯ä»¥âå æâåå¹ï¼èå¤ç§°ä¸ºâ软åå¹âï¼å¯ä»¥ä»»æå¼å ³ï¼å¯ä»¥âå æâ8个以ä¸çåå¹ï¼ç¾ä¸ä¸è¶³çæ¯ä» ä» æ¯æsrtæ ¼å¼ï¼å¹¶ä¸ä¸æ¯æUnicodeï¼å¯¹äºæ´²å符æ¯æ严éä¸è¶³ã è¿æä¸ä¸ªå°±æ¯Chapteråè½ï¼å¯ä»¥èªå®ä¹æ®µè½ï¼ææ¾æ¶å°±å¯ä»¥éæ©äºãæ¯ä¸æ¯è¶æ¥è¶åDVDå¦ï¼ä½æ¯å½æ¶çogmæºç æ¯ä¸å ¬å¼çï¼å°±é£ä¹å 个人å¨å¼åï¼èªç¶è¿åº¦æ ¢äºï¼åä¸éµå ä¹é·å ¥äºâæ»äº¡âãæè¿å®£å¸å ¬å¼æºç ï¼å å ¥Open Sourceè¡åï¼éæ°å¼å§å¼åã mkvå°±æ¯å¨ogmåæ»çé£æ®µæ¶é´åºç°çï¼ç±ä¿ç½æ¯çç¨åºåå¼åçï¼ä»ä¸å¼å§å°±æ¯Open Sourceï¼å æ¤å¾å°äºå¾å¤å ¶ä»ç¨åºåç帮å©ï¼å¼åé度ç¸å½å¿«ã ogmæçmkvé½æï¼å¦å¤è¿æå¾å¤ç¬ç¹çåè½ãå ¶ä¸æ令人æ¯å¥çå°±æ¯Gabest(å¼åvobsubçå ¬å¸)å¼åçPluginï¼ä¸ä» å¼åäºä¸é¨çææ¾å¨Media Player Classic(ä¿ç§°MPC)ï¼ è¿ä¸ªä¸è¥¿ç强大ç¸ä¿¡ç¨è¿ç人é½æä½ä¼ãè¿å¼åäºå¾å¤çMKVç¨çMux(åæå¨)ï¼å°¤å ¶æ¯Realæ ¼å¼çMuxã Realçrmvbæ¯å°éæ ¼å¼ï¼å®æ¹çHelixæ ¹æ¬å°±ä¸æ¯æå¤å£°éæ以尽管ç®æ³å¾ä¼ç§ï¼ä½å¨å£°æ大ççåç°ä¸å°±æ è½ä¸ºåäºï¼åªè½ä¹ä¹è®©ä½ç»å¯ä»¥åæAC3åDTSçavi以åogmäºã ä½Gabestå¼åçRealmedia Splitteråmkv Muxå¯ä»¥è®©rmvbæ ¼å¼çè§é¢åAC3ãDTSåæmkvï¼ä»æ ¹æ¬ä¸å æäºrmvbé³é¢ä¸çå¼±ç¹ãä¸ä» å¦æ¤ï¼è¿å¼åäºVSFilter.dllåSubtitleSource.axè¿2个Pluginï¼å®£å¸æ¯æssaåassçæ ¼å¼è½¯åå¹ã æ»ç»å°±æ¯ä¸é¢å æ¡ï¼ 1.æ¯æå¤ç§æ ¼å¼çè§é¢åé³é¢ï¼å°¤å ¶æ¯Real ï¼ 2.æ¯æå¤é³è½¨ï¼å¤è¾¾æ¡ä»¥ä¸ ï¼ 3.æ¯æssaï¼ass软åå¹ï¼å¤è¾¾æ¡ä»¥ä¸ ï¼ 4.æ¯æ段è½éå(ç±å¶ä½äººå³å®) ã
[ç¼è¾æ¬æ®µ]åå±åé
Matroskaçç®æ å°±æ¯è¦å代æ§å¼çåªä½å°è£ æ ¼å¼ï¼å ¶ä¸æ主è¦çç®æ å°±æ¯AVIã AVIå·²ç»è¯çåå å¹´äºï¼ç®åå®ä¾ç¶è¿ä¿æçæºçççå½åï¼ä½å ¶åå§æ¶æè¿äºéæ§ï¼è¿ä½¿å¾å®å¨æ¯ææ°çé³è§é¢ç¼ç ä¸é常å°é¾ï¼å¨é微软平å°ä½¿ç¨ä¹ä¸å¤æ¹ä¾¿ãèMatroska使ç¨çæ¯ä¸ç§å¼æ¾çæ¶æï¼æ¥æä¼å¤çå è¿ç¹æ§ï¼å¹¶ä¸è½è·¨å¹³å°ä½¿ç¨ï¼è¿æ¯AVIææå°è«åçã ä¸è¿AVlæ¯ç«æ å¤§æ ¹æ·±ï¼å®æ¥ææ广æ³ç软硬件æ¯æï¼èè¿ä¸ç¹æ£æ¯è¡¡éMKVæ¯å¦æåçä¸ä¸ªæ å¿ï¼ä½ç®åå®è¿åä¸å°è¿ç¹ï¼ç°å¨çè³è¿æ²¡åºç°ä¸ä¸ªè½ç´æ¥ç¼è¾å®ç软件ï¼æ¯ç«å®è¯çè¿ä¸å°ä¸å¹´ãä½å¨è¿ä¹ççæ¶é´éï¼Matroskaåå¾çè¿å±ä¹æ¯é常å¼äººæ³¨ç®çã ä½Matroskaæ¯ç«è¿æ¯ä¸ç§åå±ä¸çææ¯ï¼å®æ²¡ææ·±åçèæ¯å¯ä»¥ä¾æï¼è¿å³å®äºå®ä¸å¯è½å¨åä¸é¢å(å¦DVãæ°åçµè§)éææä½ä¸ºï¼åæ ·çéçï¼å®è¦æ³å代 AVIæ为ä¸ç§éç¨çå¤åªä½å°è£ æ ¼å¼å¹¶ä¸ä¼åå顺å©ãä¸è¿ï¼DVDRipçæ®ååç¨åè¯æ们ï¼æµè¡ææ¯ç¡¬éç!DVDææ¾æºååç°å¨ä¸æ¯ä¹å·²ç»æ¾ä¸æ¶åï¼å¯¹DVDRipæä¾æ¯æäºä¹ãæ以ï¼Matroskaç®åæéè¦åçå°±æ¯è®©æ´å¤ç人ç¥éå®ã MKVçç®æ 建ç«ä¸ä¸ªç°ä»£ãçµæ´»ã延伸æ§ãå¤å¹³å°çäºèç½æå¡å¨ï¼å¿«éæ¥æ¾æä»¶ï¼ åå±ä¸å¥åä½åç¼è¾ç¨çMatroskaæä»¶å·¥å ·ï¼å¹¶å¨GNUéç¨å ¬å ±è®¸å¯è¯ä¸åå¸ï¼ å¼åä¸ä¸ªç½ç»å¾ä¹¦é¦ï¼å 许å¼åè åMatroskaç³è¯·ï¼å°ä»ä»¬èªè¡å¼åçåºç¨è½¯ä»¶å å ¥Matroskaé³é¢æ ¼å¼ï¼å¹¶å¨GNU宽éç¨å ¬å ±è®¸å¯è¯ä¸åå¸ï¼ ä¸ç¡¬ä»¶å¶é ååä½ï¼æä»ä»¬çé³é¢æ ¼å¼åµå ¥å¤åªä½ç设å¤éï¼ æ¯æ以Matroskaå¨åç§åæ ·çæä½ç³»ç»ï¼å æ¬WindowsãDirectShowãLinuxãHaikuåå¤åªä½å¤çæ¡æ¶GStreamerï¼çè¿ä½ ã [1]
踩坑ffmpeg录制的mp4无法在浏览器上播放
在游戏引擎集成ffmpeg源码用于录制游戏视频时,遇到了一个令人困惑的问题:录制的mp4格式视频无法在浏览器上播放。初步尝试修改了代码以实现录制mp4格式,结果视频在网页端播放失败。通过一系列的调试,发现关键问题出在格式转换上。将游戏录制的mp4文件转换为h编码后,视频在浏览器上得以正常播放。然而,仅仅转换格式未能解决原始问题。
为了深入了解问题所在,我们使用了ffprobe工具来获取视频的详细信息,并通过对比原始录制的mp4文件与转换后的h文件,发现原始文件中缺少了必要的codec_tag字段。codec_tag是用于标识编解码器的标签,对于播放器识别正确的解码器至关重要。通过手动设置该字段,问题得到初步解决,但仍有其他未解决之处。
进一步分析发现,调用avcodec_find_encoder接口时,传入的格式为mpeg4,而非预期的h。解决这一问题后,我们发现pts(呈现时间戳)和dts(到达时间戳)在视频帧数据中缺失,这导致播放时出现卡顿现象。通过手动为pts和dts赋值,播放速度恢复正常。
在深入研究后,我们了解到在调用avformat_alloc_output_context2接口时,未指定输出格式,从而让ffmpeg自动选择格式。这一改变使得录制的视频包含pts和dts,解决了播放问题。然而,自动选择的格式为mpeg4,而非预期的h。修改接口以指定输出格式后,问题最终得到解决。
总结而言,录制mp4视频在浏览器播放失败的问题,关键在于ffmpeg处理视频格式、编码器选择以及视频帧数据的pts和dts标签。通过逐步调试和分析,我们不仅解决了当前问题,还加深了对ffmpeg工具的理解。这不仅涉及到编码格式的正确使用,也涉及到了视频播放所需的额外信息(如codec_tag、pts、dts等)的正确处理。在解决技术难题时,深入的调试、代码分析以及利用适当的工具进行辅助,都是至关重要的步骤。