Я хотел бы добиться того же результата, что и этот вызов командной строки ffmpeg из кода:
ffmpeg -i CAMERARTSPLINK -c:v copy -an -movflags +frag_keyframe+empty_moov -f mp4
Когда я запускаю приведенную выше команду, она дает этот двоичный результат:
got 36 bytes: 0, 0, 0, 36, 102, 116, 121, 112, ..., 111, 54, 109, 112, 52, 49,
got 512 bytes: 0, 0, 3, 76, 109, 111, 111, 118, 0, 0, 0, ..., 132, 0, 0, 3, 0, 4, 0, 0, 3, 0, 202,
Код может использовать библиотеки и включения ffmpeg, но я не хочу использовать ffmpeg в качестве вызова программы (т.е. функции exec* не предпочтительны).
Я создал небольшой демонстрационный пример кода с avformat
для ремуксирования RTSP H264 в MP4. В коде широко используется хорошая библиотека videostreamer от Horgh.
Я разместил пример кода на pastebin.com (400 loc). Он успешно строится, но вам нужно связать его с avformat
, avdevice
, avcodec
и avutil
.
Я старался изо всех сил, чтобы добиться того же результата, однако, когда я запускаю этот код, первые несколько байтов после байта #38 отличаются (может быть, не только они, я ничего не сравнивал после байта #548):
writeOutput: writing 36 bytes: 0, 0, 0, 36, 102, 116, 121, 112, ..., 111, 54, 109, 112, 52, 49,
writeOutput: writing 512 bytes: 0, 0, 0, 0, 109, 111, 111, 118, 0, 0, 0, ..., 132, 0, 0, 3, 0, 4, 0, 0, 3, 0, 202,
Вы можете видеть, что вторая строка вывода моего кода начинается с 0
0
0
0
109
,
тогда как ffmpeg дал 0
0
3
76
109
.
Все остальные (даже байты здесь не вставлены) полностью совпадают (по крайней мере, для первых 548 байт).
Что не так с моим кодом? Эти 2 байта кажутся очень важными для декодирования этого потока.